From 03519cc9c8f44a551c7714a365bc5b46f26190f5 Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 23 Dec 2004 13:16:30 +0000 Subject: [PATCH 001/739] Initial revision --- AUTHORS | 2 + COPYING | 340 ++++++++++++++++++++++++++++++++++ ChangeLog | 159 ++++++++++++++++ Makefile.am | 2 + cmph.spec | 39 ++++ configure.ac | 23 +++ src/Makefile.am | 22 +++ src/bmz.c | 439 ++++++++++++++++++++++++++++++++++++++++++++ src/bmz.h | 18 ++ src/bmz_structs.h | 24 +++ src/cmph.c | 169 +++++++++++++++++ src/cmph.h | 44 +++++ src/cmph_structs.c | 68 +++++++ src/cmph_structs.h | 32 ++++ src/cmph_types.h | 13 ++ src/czech.c | 320 ++++++++++++++++++++++++++++++++ src/czech.h | 18 ++ src/czech_structs.h | 24 +++ src/debug.h | 15 ++ src/djb2_hash.c | 42 +++++ src/djb2_hash.h | 17 ++ src/fnv_hash.c | 46 +++++ src/fnv_hash.h | 17 ++ src/graph.c | 329 +++++++++++++++++++++++++++++++++ src/graph.h | 39 ++++ src/hash.c | 139 ++++++++++++++ src/hash.h | 14 ++ src/hash_state.h | 18 ++ src/jenkins_hash.c | 191 +++++++++++++++++++ src/jenkins_hash.h | 20 ++ src/main.c | 282 ++++++++++++++++++++++++++++ src/sdbm_hash.c | 42 +++++ src/sdbm_hash.h | 17 ++ src/vqueue.c | 49 +++++ src/vqueue.h | 18 ++ src/vstack.c | 79 ++++++++ src/vstack.h | 18 ++ tests/Makefile.am | 4 + tests/graph_tests.c | 67 +++++++ 39 files changed, 3219 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 cmph.spec create mode 100644 configure.ac create mode 100644 src/Makefile.am create mode 100644 src/bmz.c create mode 100644 src/bmz.h create mode 100644 src/bmz_structs.h create mode 100644 src/cmph.c create mode 100644 src/cmph.h create mode 100644 src/cmph_structs.c create mode 100644 src/cmph_structs.h create mode 100644 src/cmph_types.h create mode 100644 src/czech.c create mode 100644 src/czech.h create mode 100644 src/czech_structs.h create mode 100644 src/debug.h create mode 100644 src/djb2_hash.c create mode 100644 src/djb2_hash.h create mode 100644 src/fnv_hash.c create mode 100644 src/fnv_hash.h create mode 100644 src/graph.c create mode 100644 src/graph.h create mode 100644 src/hash.c create mode 100644 src/hash.h create mode 100644 src/hash_state.h create mode 100644 src/jenkins_hash.c create mode 100644 src/jenkins_hash.h create mode 100644 src/main.c create mode 100644 src/sdbm_hash.c create mode 100644 src/sdbm_hash.h create mode 100644 src/vqueue.c create mode 100644 src/vqueue.h create mode 100644 src/vstack.c create mode 100644 src/vstack.h create mode 100644 tests/Makefile.am create mode 100644 tests/graph_tests.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..427eedb --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Davi de Castro Reis +Fabiano Cupertino Botelho diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..b7626b7 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,159 @@ +2004-11-24 12:42 davi + + * src/czech.c: Fixed some leaks. + +2004-11-24 11:34 davi + + * src/: Makefile.am, cmph.h, cmph_types.h, czech.h, graph.h, + hash.h, jenkins_hash.h, types.h, vstack.h: Better header layout. + +2004-11-23 15:15 davi + + * src/jenkins_hash.c: Fixed trivial bug. + +2004-11-04 00:56 davi + + * src/: czech.c, graph.c: Forgot. + +2004-11-04 00:09 davi + + * src/: cmph.c, cmph.h, czech.c, czech.h, graph.c, main.c: Fixed + small bug due to fgets trick. + +2004-11-03 23:15 davi + + * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, + main.c: Added verbosity option + +2004-11-03 22:42 davi + + * src/czech.c: [no log message] + +2004-11-03 20:57 davi + + * src/: Makefile.am, fnv_hash.c, fnv_hash.h, hash.c, hash_state.h: + Added fnv hash function. + +2004-11-03 18:10 davi + + * src/: Makefile.am, cmph.c, cmph.h, czech.c, czech.h, djb2_hash.c, + hash.c, hash_state.h, jenkins_hash.c, main.c, sdbm_hash.c, + sdbm_hash.h: Added sdbm hash function. + +2004-11-03 15:53 davi + + * src/cmph.c, src/cmph.h, src/cmph_structs.c, src/cmph_structs.h, + src/czech.c, src/czech.h, src/czech_structs.h, src/main.c, + tests/Makefile.am, tests/czech_tests.c: Added callback structure to + retrieve keys in disk. + +2004-10-31 22:57 davi + + * src/: Makefile.am, djb2_hash.c, djb2_hash.h, hash.c, hash.h, + hash_funcs.h, jenkins_hash.h: Added new hash function. + +2004-10-31 20:53 davi + + * src/main.c: Added random seed. + +2004-10-31 20:48 davi + + * src/main.c, tests/czech_tests.c: Better getopt code. + +2004-10-31 19:27 davi + + * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, + czech.h, czech_structs.h, hash.c, hash.h, jenkins_hash.c, + jenkins_hash.h, main.c: Everything working flawlessly. + +2004-10-30 20:12 davi + + * src/cmph_structs.c: Added missing file. + +2004-10-30 20:09 davi + + * src/main.c: forgot. + +2004-10-29 19:02 davi + + * src/: Makefile.am, cmph.c, cmph.h, cmph_structs.h, czech.c, + czech.h, czech_structs.h, graph.c, hash.c, hash.h, jenkins_hash.c, + jenkins_hash.h, main.c: Cleaned some warnings. + +2004-10-29 16:14 davi + + * src/: hash.c, hash_state.h: Missing file. + +2004-10-29 14:18 davi + + * src/: Makefile.am, cmph.c, cmph.h, czech.c, graph.c, hash.h, + jenkins_hash.c, jenkins_hash.h, jenkinshash.c, jenkinshash.h: + Working nice. Serialization almost there. + +2004-10-28 11:21 davi + + * Makefile.am, src/cmph.c, src/cmph_structs.h, src/czech.c, + src/czech_structs.h, src/jenkinshash.c: Hash generation seems to be + working fine. + +2004-10-27 15:19 davi + + * src/hash.h: Added hash header. + +2004-10-27 15:06 davi + + * COPYING, INSTALL, Makefile.am, src/czech.c, src/czech_structs.h, + src/graph.c, src/graph.h, src/vstack.c, tests/Makefile.am, + tests/czech_tests.c, tests/graph_tests.c: Cool. Now it is + serialization time. + +2004-10-27 13:06 davi + + * tests/: czech_tests.c, keys: Added missing files. + +2004-10-26 21:23 davi + + * src/graph.c, tests/Makefile.am: Still working on f*cking graph + implementation. + +2004-10-25 20:05 davi + + * src/: cmph.c, cmph.h, cmph_structs.h, czech.c, czech.h, + czech_structs.h, graph.c, graph.h, jenkinshash.c, jenkinshash.h, + vstack.c: Added some new files. + +2004-10-25 00:27 davi + + * src/: czech.c, czech.h, graph.c, graph.h, jenkinshash.c: Some + random code. + +2004-10-24 23:07 davi + + * src/: Makefile.am, debug.h, graph.c, main.c, vstack.c, vstack.h: + Added stack implementation. + +2004-10-24 21:57 davi + + * src/list.h: Added missing file. + +2004-10-24 21:50 davi + + * src/types.h: Added missing file. + +2004-10-22 20:30 davi + + * src/: Makefile.am, cmph.h, czech.c, czech.h, graph.c, graph.h, + jenkinshash.c, jenkinshash.h: Added a lot of files. + +2004-10-19 17:08 davi + + * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, + src/main.c, tests/Makefile.am: Initial revision + +2004-10-19 17:08 davi + + * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, + src/main.c, tests/Makefile.am: Minimum perfect hashing library + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..c735106 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = src tests +EXTRA_DIST = cmph.spec configure.ac diff --git a/cmph.spec b/cmph.spec new file mode 100644 index 0000000..19e796b --- /dev/null +++ b/cmph.spec @@ -0,0 +1,39 @@ +%define name cmph +%define version 0.2 +%define release 1 + +Name: %{name} +Version: %{version} +Release: %{release} +Summary: C Minimal perfect hash library +Source: %{name}-%{version}.tar.gz +License: Proprietary +URL: http://www.akwan.com.br +BuildArch: i386 +Group: Sitesearch +BuildRoot: %{_tmppath}/%{name}-root + +%description +C Minimal perfect hash library + +%prep +rm -Rf $RPM_BUILD_ROOT +rm -rf $RPM_BUILD_ROOT +%setup +mkdir $RPM_BUILD_ROOT +mkdir $RPM_BUILD_ROOT/usr +CXXFLAGS="-O2" ./configure --prefix=/usr/ + +%build +make + +%install +DESTDIR=$RPM_BUILD_ROOT make install + +%files +%defattr(755,root,root) +/ + +%changelog +* Tue Jun 1 2004 Davi de Castro Reis ++ Initial build diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..dcea170 --- /dev/null +++ b/configure.ac @@ -0,0 +1,23 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(Makefile.am) +AM_INIT_AUTOMAKE(cmph, 0.2) +AM_CONFIG_HEADER(config.h) + +dnl Checks for programs. +AC_PROG_AWK +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_LIBTOOL + +dnl Checks for headers +AC_CHECK_HEADERS([getopt.h math.h]) + +dnl Checks for libraries. +AC_CHECK_LIBM +LDFLAGS="$LIBM $LDFLAGS" + +dnl Checks for library functions. + +dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) +AC_OUTPUT(Makefile src/Makefile tests/Makefile) diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..8a56ad1 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,22 @@ +bin_PROGRAMS = cmph +lib_LTLIBRARIES = libcmph.la +include_HEADERS = cmph.h cmph_types.h +libcmph_la_SOURCES = debug.h\ + cmph_types.h\ + hash.h hash_state.h hash.c\ + jenkins_hash.h jenkins_hash.c\ + djb2_hash.h djb2_hash.c\ + sdbm_hash.h sdbm_hash.c\ + fnv_hash.h fnv_hash.c\ + vstack.h vstack.c\ + vqueue.h vqueue.c\ + graph.h graph.c\ + cmph.h cmph.c\ + cmph_structs.h cmph_structs.c\ + czech.h czech_structs.h czech.c\ + bmz.h bmz_structs.h bmz.c + +libcmph_la_LDFLAGS = -version-info 0:0:0 + +cmph_SOURCES = main.c +cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c new file mode 100644 index 0000000..61a1b5b --- /dev/null +++ b/src/bmz.c @@ -0,0 +1,439 @@ +#include "bmz.h" +#include "cmph_structs.h" +#include "bmz_structs.h" +#include "hash.h" +#include "vqueue.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static uint32 UNDEFINED = UINT_MAX; + +static int bmz_gen_edges(mph_t *mph); +static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges); +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges); + +mph_t *bmz_mph_new(key_source_t *key_source) +{ + mph_t *mph = NULL; + bmz_mph_data_t *bmz = NULL; + mph = __mph_new(MPH_BMZ, key_source); + if (mph == NULL) return NULL; + bmz = (bmz_mph_data_t *)malloc(sizeof(bmz_mph_data_t)); + if (bmz == NULL) + { + __mph_destroy(mph); + return NULL; + } + bmz->hashfuncs[0] = HASH_JENKINS; + bmz->hashfuncs[1] = HASH_JENKINS; + bmz->g = NULL; + bmz->graph = NULL; + bmz->hashes = NULL; + mph->data = bmz; + assert(mph->data); + return mph; +} +void bmz_mph_destroy(mph_t *mph) +{ + bmz_mph_data_t *data = (bmz_mph_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); + __mph_destroy(mph); +} + +void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +{ + bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + uint32 i = 0; + while(*hashptr != HASH_COUNT) + { + if (i >= 2) break; //bmz only uses two hash functions + bmz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) +{ + mphf_t *mphf = NULL; + bmz_mphf_data_t *bmzf = NULL; + + uint32 i; + uint32 iterations = 10; + uint8 *used_edges = NULL; + uint32 unused_edge_index = 0; + uint32 biggest_g_value = 0; + uint32 biggest_edge_value = 1; + DEBUGP("bmz_c: %f\n", bmz_c); + bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + bmz->m = mph->key_source->nkeys; + bmz->n = ceil(bmz_c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u bmz_c: %f\n", bmz->m, bmz->n, bmz_c); + bmz->graph = graph_new(bmz->n, bmz->m); + DEBUGP("Created graph\n"); + + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; + + // Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); + DEBUGP("hash function 2\n"); + bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); + DEBUGP("Generating edges\n"); + ok = bmz_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz->hashes[0]); + bmz->hashes[0] = NULL; + hash_state_destroy(bmz->hashes[1]); + bmz->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + used_edges = (uint8 *)malloc(bmz->m*sizeof(uint8)); + memset(used_edges, 0, bmz->m); + free(bmz->g); + bmz->g = malloc(bmz->n * sizeof(uint32)); + assert(bmz->g); + for (i = 0; i < bmz->n; ++i) bmz->g[i] = UNDEFINED; + + for (i = 0; i < bmz->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz->graph, i) && (bmz->g[i] == UNDEFINED)) + { + bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges); + } + } + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + + bmz_traverse_non_critical_nodes(bmz, used_edges); // non_critical_nodes + graph_destroy(bmz->graph); + free(used_edges); + bmz->graph = NULL; + + mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf->algo = mph->algo; + bmzf = (bmz_mphf_data_t *)malloc(sizeof(bmz_mph_data_t)); + bmzf->g = bmz->g; + bmz->g = NULL; //transfer memory ownership + bmzf->hashes = bmz->hashes; + bmz->hashes = NULL; //transfer memory ownership + bmzf->n = bmz->n; + bmzf->m = bmz->m; + mphf->data = bmzf; + mphf->size = bmz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges) +{ + uint32 next_g; + uint32 u; /* Auxiliary vertex */ + uint32 lav; /* lookahead vertex */ + uint8 collision; + vqueue_t * q = vqueue_new(graph_ncritical_nodes(bmz->graph)); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + *biggest_g_value = next_g; + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, u) && (bmz->g[u] == UNDEFINED)) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + { + assert(next_g + bmz->g[lav] < bmz->m); + if (used_edges[next_g + bmz->g[lav]]) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + { + used_edges[next_g + bmz->g[lav]] = 1; + if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; + } + } + bmz->g[u] = next_g; // Labelling vertex u. + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + +} + +static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz->m); + if(used_edges[unused_edge_index]) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index) +{ + graph_iterator_t it = graph_neighbors_it(bmz->graph, v); + uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(bmz->g[neighbor] != UNDEFINED) continue; + *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index + 1); + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + bmz_traverse(bmz, used_edges, neighbor, unused_edge_index); + } +} + +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges) +{ + + uint32 i, v1, v2, unused_edge_index = -1; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz->m; i++) + { + v1 = graph_vertex_id(bmz->graph, i, 0); + v2 = graph_vertex_id(bmz->graph, i, 1); + if((bmz->g[v1] != UNDEFINED && bmz->g[v2] != UNDEFINED) || (bmz->g[v1] == UNDEFINED && bmz->g[v2] == UNDEFINED)) continue; + if(bmz->g[v1] != UNDEFINED) bmz_traverse(bmz, used_edges, v1, &unused_edge_index); + else bmz_traverse(bmz, used_edges, v2, &unused_edge_index); + } + + for(i = 0; i < bmz->n; i++) + { + if(bmz->g[i] == UNDEFINED) + { + bmz->g[i] = 0; + bmz_traverse(bmz, used_edges, i, &unused_edge_index); + } + } + +} + +static int bmz_gen_edges(mph_t *mph) +{ + uint32 e; + bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + uint8 multiple_edges = 0; + + DEBUGP("Generating edges for %u vertices\n", bmz->n); + graph_clear_edges(bmz->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + uint32 h1, h2; + uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + multiple_edges = graph_contains_edge(bmz->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz_mphf_dump(mphf_t *mphf, FILE *fd) +{ + char *buf = NULL; + uint32 buflen; + uint32 nbuflen; + uint32 i; + uint32 two = htonl(2); //number of hash functions + bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; + uint32 nn, nm; + __mphf_dump(mphf, fd); + + fwrite(&two, sizeof(uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + nn = htonl(data->n); + fwrite(&nn, sizeof(uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(uint32), 1, fd); + + for (i = 0; i < data->n; ++i) + { + uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(uint32), 1, fd); + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz_mphf_load(FILE *f, mphf_t *mphf) +{ + uint32 nhashes; + char fbuf[BUFSIZ]; + char *buf = NULL; + uint32 buflen; + uint32 i; + hash_state_t *state; + bmz_mphf_data_t *bmz = (bmz_mphf_data_t *)malloc(sizeof(bmz_mphf_data_t)); + + DEBUGP("Loading bmz mphf\n"); + mphf->data = bmz; + fread(&nhashes, sizeof(uint32), 1, f); + nhashes = ntohl(nhashes); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(uint32), 1, f); + buflen = ntohl(buflen); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + bmz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(bmz->n), sizeof(uint32), 1, f); + bmz->n = ntohl(bmz->n); + fread(&(bmz->m), sizeof(uint32), 1, f); + bmz->m = ntohl(bmz->m); + + bmz->g = (uint32 *)malloc(sizeof(uint32)*bmz->n); + fread(bmz->g, bmz->n*sizeof(uint32), 1, f); + for (i = 0; i < bmz->n; ++i) bmz->g[i] = ntohl(bmz->g[i]); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +{ + bmz_mphf_data_t *bmz = mphf->data; + uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); + return bmz->g[h1] + bmz->g[h2]; +} +void bmz_mphf_destroy(mphf_t *mphf) +{ + bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/bmz.h b/src/bmz.h new file mode 100644 index 0000000..6dc3ca2 --- /dev/null +++ b/src/bmz.h @@ -0,0 +1,18 @@ +#ifndef __BMZ_H__ +#define __BMZ_H__ + +#include "graph.h" +#include "cmph.h" + +typedef struct __bmz_mphf_data_t bmz_mphf_data_t; +typedef struct __bmz_mph_data_t bmz_mph_data_t; + +mph_t *bmz_mph_new(key_source_t *key_source); +void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); +void bmz_mph_destroy(mph_t *mph); +mphf_t *bmz_mph_create(mph_t *mph, float bmz_c); + +void bmz_mphf_load(FILE *f, mphf_t *mphf); +int bmz_mphf_dump(mphf_t *mphf, FILE *f); +uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +#endif diff --git a/src/bmz_structs.h b/src/bmz_structs.h new file mode 100644 index 0000000..4f6d131 --- /dev/null +++ b/src/bmz_structs.h @@ -0,0 +1,24 @@ +#ifndef __BMZ_STRUCTS_H__ +#define __BMZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz_mphf_data_t +{ + uint32 m; //edges (words) count + uint32 n; //vertex count + uint32 *g; + hash_state_t **hashes; +}; + +struct __bmz_mph_data_t +{ + CMPH_HASH hashfuncs[2]; + uint32 m; //edges (words) count + uint32 n; //vertex count + graph_t *graph; + uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c new file mode 100644 index 0000000..5432924 --- /dev/null +++ b/src/cmph.c @@ -0,0 +1,169 @@ +#include "cmph.h" +#include "cmph_structs.h" +#include "czech.h" +#include "bmz.h" +//#include "bmz.h" /* included -- Fabiano */ + +#include +#include + +//#define DEBUG +#include "debug.h" + +const char *mph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ + +mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source) +{ + mph_t *mph = NULL; + DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + switch (algo) + { + case MPH_CZECH: + mph = czech_mph_new(key_source); + break; + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("new bmz algorithm \n"); + mph = bmz_mph_new(key_source); + break; + default: + assert(0); + } + assert(mph); + return mph; +} + +void mph_destroy(mph_t *mph) +{ + DEBUGP("Destroying mph with algo %s\n", mph_names[mph->algo]); + switch (mph->algo) + { + case MPH_CZECH: + czech_mph_destroy(mph); + break; + case MPH_BMZ: /* included -- Fabiano */ + bmz_mph_destroy(mph); + break; + default: + assert(0); + } +} + +void mph_set_verbosity(mph_t *mph, uint32 verbosity) +{ + mph->verbosity = verbosity; +} + +void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +{ + switch (mph->algo) + { + case MPH_CZECH: + czech_mph_set_hashfuncs(mph, hashfuncs); + break; + case MPH_BMZ: /* included -- Fabiano */ + bmz_mph_set_hashfuncs(mph, hashfuncs); + break; + default: + break; + } + return; +} + +mphf_t *mph_create(mph_t *mph) +{ + mphf_t *mphf = NULL; + switch (mph->algo) + { + case MPH_CZECH: + DEBUGP("Creating czech hash\n"); + mphf = czech_mph_create(mph, 2.09); + break; + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("Creating bmz hash\n"); + mphf = bmz_mph_create(mph, 1.10); + break; + default: + assert(0); + } + return mphf; +} + +int mphf_dump(mphf_t *mphf, FILE *f) +{ + switch (mphf->algo) + { + case MPH_CZECH: + return czech_mphf_dump(mphf, f); + break; + case MPH_BMZ: /* included -- Fabiano */ + return bmz_mphf_dump(mphf, f); + break; + default: + assert(0); + } + assert(0); + return 0; +} +mphf_t *mphf_load(FILE *f) +{ + mphf_t *mphf = NULL; + DEBUGP("Loading mphf generic parts\n"); + mphf = __mphf_load(f); + if (mphf == NULL) return NULL; + DEBUGP("Loading mphf algorithm dependent parts\n"); + + switch (mphf->algo) + { + case MPH_CZECH: + czech_mphf_load(f, mphf); + break; + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("Loading bmz algorithm dependent parts\n"); + bmz_mphf_load(f, mphf); + break; + default: + assert(0); + } + DEBUGP("Loaded mphf\n"); + return mphf; +} + + +uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +{ + DEBUGP("mphf algorithm: %u \n", mphf->algo); + switch(mphf->algo) + { + case MPH_CZECH: + return czech_mphf_search(mphf, key, keylen); + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("bmz algorithm search\n"); + return bmz_mphf_search(mphf, key, keylen); + default: + assert(0); + } + assert(0); + return; +} + +uint32 mphf_size(mphf_t *mphf) +{ + return mphf->size; +} + +void mphf_destroy(mphf_t *mphf) +{ + switch(mphf->algo) + { + case MPH_CZECH: + czech_mphf_destroy(mphf); + return; + case MPH_BMZ: /* included -- Fabiano */ + bmz_mphf_destroy(mphf); + return; + default: + assert(0); + } + assert(0); + return; +} diff --git a/src/cmph.h b/src/cmph.h new file mode 100644 index 0000000..2224a42 --- /dev/null +++ b/src/cmph.h @@ -0,0 +1,44 @@ +#ifndef __CMPH_H__ +#define __CMPH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cmph_types.h" + +typedef struct __mph_t mph_t; +typedef struct __mphf_t mphf_t; + +typedef struct +{ + void *data; + uint32 nkeys; + int (*read)(void *, char **, uint32 *); + void (*dispose)(void *, char *, uint32); + void (*rewind)(void *); +} key_source_t; + +/** Hash generation API **/ +mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); +void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); +void mph_set_verbosity(mph_t *mph, uint32 verbosity); +void mph_destroy(mph_t *mph); +mphf_t *mph_create(mph_t *mph); + +/** Hash querying API **/ +mphf_t *mphf_load(FILE *f); +int mphf_dump(mphf_t *mphf, FILE *f); +uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +uint32 mphf_size(mphf_t *mphf); +void mphf_destroy(mphf_t *mphf); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cmph_structs.c b/src/cmph_structs.c new file mode 100644 index 0000000..6c2f6dc --- /dev/null +++ b/src/cmph_structs.c @@ -0,0 +1,68 @@ +#include "cmph_structs.h" + +#include + +#define DEBUG +#include "debug.h" + +mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) +{ + mph_t *mph = (mph_t *)malloc(sizeof(mph_t)); + DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + if (mph == NULL) return NULL; + mph->algo = algo; + mph->key_source = key_source; + mph->verbosity = 0; + return mph; +} + +void __mph_destroy(mph_t *mph) +{ + free(mph); +} + +void __mphf_dump(mphf_t *mphf, FILE *fd) +{ + uint32 nsize = htonl(mphf->size); + fwrite(mph_names[mphf->algo], strlen(mph_names[mphf->algo]) + 1, 1, fd); + fwrite(&nsize, sizeof(mphf->size), 1, fd); +} +mphf_t *__mphf_load(FILE *f) +{ + mphf_t *mphf = NULL; + uint32 i; + char algo_name[BUFSIZ]; + char *ptr = algo_name; + MPH_ALGO algo = MPH_COUNT; + + DEBUGP("Loading mphf\n"); + while(1) + { + uint32 c = fread(ptr, 1, 1, f); + if (c != 1) return NULL; + if (*ptr == 0) break; + ++ptr; + } + for(i = 0; i < MPH_COUNT; ++i) + { + if (strcmp(algo_name, mph_names[i]) == 0) + { + algo = i; + } + } + if (algo == MPH_COUNT) + { + DEBUGP("Algorithm %s not found\n", algo_name); + return NULL; + } + mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf->algo = algo; + fread(&(mphf->size), sizeof(mphf->size), 1, f); + mphf->size = ntohl(mphf->size); + mphf->data = NULL; + DEBUGP("Algorithm is %s and mphf is sized %u\n", mph_names[algo], mphf->size); + + return mphf; +} + + diff --git a/src/cmph_structs.h b/src/cmph_structs.h new file mode 100644 index 0000000..9b1e634 --- /dev/null +++ b/src/cmph_structs.h @@ -0,0 +1,32 @@ +#ifndef __CMPH_STRUCTS_H__ +#define __CMPH_STRUCTS_H__ + +#include "cmph.h" + +/** Hash generation algorithm data + */ +struct __mph_t +{ + MPH_ALGO algo; + key_source_t *key_source; + uint32 verbosity; + void *data; //algorithm dependent data +}; + +/** Hash querying algorithm data + */ +struct __mphf_t +{ + MPH_ALGO algo; + uint32 size; + key_source_t *key_source; + void *data; //algorithm dependent data +}; + +mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source); +void __mph_destroy(); +void __mphf_dump(mphf_t *mphf, FILE *); +mphf_t *__mphf_load(FILE *f); + + +#endif diff --git a/src/cmph_types.h b/src/cmph_types.h new file mode 100644 index 0000000..84b6a22 --- /dev/null +++ b/src/cmph_types.h @@ -0,0 +1,13 @@ +#ifndef __CMPH_TYPES_H__ +#define __CMPH_TYPES_H__ + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; + +typedef enum { HASH_JENKINS, HASH_DJB2, HASH_SDBM, HASH_FNV, HASH_GLIB, HASH_PJW, HASH_COUNT } CMPH_HASH; +extern const char *hash_names[]; +typedef enum { MPH_CZECH, MPH_BMZ, MPH_COUNT } MPH_ALGO; /* included -- Fabiano */ +extern const char *mph_names[]; + +#endif diff --git a/src/czech.c b/src/czech.c new file mode 100644 index 0000000..d699e84 --- /dev/null +++ b/src/czech.c @@ -0,0 +1,320 @@ +#include "czech.h" +#include "cmph_structs.h" +#include "czech_structs.h" +#include "hash.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int czech_gen_edges(mph_t *mph); +static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v); + +mph_t *czech_mph_new(key_source_t *key_source) +{ + mph_t *mph = NULL; + czech_mph_data_t *czech = NULL; + mph = __mph_new(MPH_CZECH, key_source); + if (mph == NULL) return NULL; + czech = (czech_mph_data_t *)malloc(sizeof(czech_mph_data_t)); + if (czech == NULL) + { + __mph_destroy(mph); + return NULL; + } + czech->hashfuncs[0] = HASH_JENKINS; + czech->hashfuncs[1] = HASH_JENKINS; + czech->g = NULL; + czech->graph = NULL; + czech->hashes = NULL; + mph->data = czech; + assert(mph->data); + return mph; +} +void czech_mph_destroy(mph_t *mph) +{ + czech_mph_data_t *data = (czech_mph_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); + __mph_destroy(mph); +} + +void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +{ + czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + uint32 i = 0; + while(*hashptr != HASH_COUNT) + { + if (i >= 2) break; //czech only uses two hash functions + czech->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +mphf_t *czech_mph_create(mph_t *mph, float c) +{ + mphf_t *mphf = NULL; + czech_mphf_data_t *czechf = NULL; + + uint32 i; + uint32 iterations = 10; + char *visited = NULL; + czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + czech->m = mph->key_source->nkeys; + czech->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); + czech->graph = graph_new(czech->n, czech->m); + DEBUGP("Created graph\n"); + + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", czech->m, czech->n); + } + while(1) + { + int ok; + czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); + czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); + ok = czech_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(czech->hashes[0]); + czech->hashes[0] = NULL; + hash_state_destroy(czech->hashes[1]); + czech->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(czech->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(czech->n); + memset(visited, 0, czech->n); + free(czech->g); + czech->g = malloc(czech->n * sizeof(uint32)); + assert(czech->g); + for (i = 0; i < czech->n; ++i) + { + if (!visited[i]) + { + czech->g[i] = 0; + czech_traverse(czech, visited, i); + } + } + graph_destroy(czech->graph); + free(visited); + czech->graph = NULL; + + mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf->algo = mph->algo; + czechf = (czech_mphf_data_t *)malloc(sizeof(czech_mph_data_t)); + czechf->g = czech->g; + czech->g = NULL; //transfer memory ownership + czechf->hashes = czech->hashes; + czech->hashes = NULL; //transfer memory ownership + czechf->n = czech->n; + czechf->m = czech->m; + mphf->data = czechf; + mphf->size = czech->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(czech->graph, v); + uint32 neighbor = 0; + visited[v] = 1; + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(visited[neighbor]) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); + czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); + czech_traverse(czech, visited, neighbor); + } +} + +static int czech_gen_edges(mph_t *mph) +{ + uint32 e; + czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices\n", czech->n); + graph_clear_edges(czech->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + uint32 h1, h2; + uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(czech->hashes[0], key, keylen) % czech->n; + h2 = hash(czech->hashes[1], key, keylen) % czech->n; + if (h1 == h2) if (++h2 >= czech->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(czech->graph, h1, h2); + } + cycles = graph_is_cyclic(czech->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int czech_mphf_dump(mphf_t *mphf, FILE *fd) +{ + char *buf = NULL; + uint32 buflen; + uint32 nbuflen; + uint32 i; + uint32 two = htonl(2); //number of hash functions + czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + uint32 nn, nm; + __mphf_dump(mphf, fd); + + fwrite(&two, sizeof(uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + nn = htonl(data->n); + fwrite(&nn, sizeof(uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(uint32), 1, fd); + + for (i = 0; i < data->n; ++i) + { + uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(uint32), 1, fd); + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void czech_mphf_load(FILE *f, mphf_t *mphf) +{ + uint32 nhashes; + char fbuf[BUFSIZ]; + char *buf = NULL; + uint32 buflen; + uint32 i; + hash_state_t *state; + czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); + + DEBUGP("Loading czech mphf\n"); + mphf->data = czech; + fread(&nhashes, sizeof(uint32), 1, f); + nhashes = ntohl(nhashes); + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + czech->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(uint32), 1, f); + buflen = ntohl(buflen); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + czech->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(czech->n), sizeof(uint32), 1, f); + czech->n = ntohl(czech->n); + fread(&(czech->m), sizeof(uint32), 1, f); + czech->m = ntohl(czech->m); + + czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); + fread(czech->g, czech->n*sizeof(uint32), 1, f); + for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +{ + czech_mphf_data_t *czech = mphf->data; + uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; + uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > czech->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); + return (czech->g[h1] + czech->g[h2]) % czech->m; +} +void czech_mphf_destroy(mphf_t *mphf) +{ + czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/czech.h b/src/czech.h new file mode 100644 index 0000000..9bb758f --- /dev/null +++ b/src/czech.h @@ -0,0 +1,18 @@ +#ifndef __CZECH_H__ +#define __CZECH_H__ + +#include "graph.h" +#include "cmph.h" + +typedef struct __czech_mphf_data_t czech_mphf_data_t; +typedef struct __czech_mph_data_t czech_mph_data_t; + +mph_t *czech_mph_new(key_source_t *key_source); +void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); +void czech_mph_destroy(mph_t *mph); +mphf_t *czech_mph_create(mph_t *mph, float c); + +void czech_mphf_load(FILE *f, mphf_t *mphf); +int czech_mphf_dump(mphf_t *mphf, FILE *f); +uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +#endif diff --git a/src/czech_structs.h b/src/czech_structs.h new file mode 100644 index 0000000..3db81c8 --- /dev/null +++ b/src/czech_structs.h @@ -0,0 +1,24 @@ +#ifndef __CZECH_STRUCTS_H__ +#define __CZECH_STRUCTS_H__ + +#include "hash_state.h" + +struct __czech_mphf_data_t +{ + uint32 m; //edges (words) count + uint32 n; //vertex count + uint32 *g; + hash_state_t **hashes; +}; + +struct __czech_mph_data_t +{ + CMPH_HASH hashfuncs[2]; + uint32 m; //edges (words) count + uint32 n; //vertex count + graph_t *graph; + uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..49b564e --- /dev/null +++ b/src/debug.h @@ -0,0 +1,15 @@ +#ifndef __MY_DEBUGC__ +#define __MY_DEBUGC__ + +#ifdef __cplusplus +#include +#else +#include +#endif +#ifdef DEBUG +#define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) +#else +#define DEBUGP(args...) +#endif + +#endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c new file mode 100644 index 0000000..433452b --- /dev/null +++ b/src/djb2_hash.c @@ -0,0 +1,42 @@ +#include "djb2_hash.h" +#include + +djb2_state_t *djb2_state_new() +{ + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + state->hashfunc = HASH_DJB2; + return state; +} + +void djb2_state_destroy(djb2_state_t *state) +{ + free(state); +} + +uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) +{ + register unsigned int hash = 5381; + const unsigned char *ptr = k; + int i = 0; + while (i < keylen) + { + hash = hash*33 ^ *ptr; + ++ptr, ++i; + } + return hash; +} + + +void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +djb2_state_t *djb2_state_load(const char *buf, uint32 buflen) +{ + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + state->hashfunc = HASH_DJB2; + return state; +} diff --git a/src/djb2_hash.h b/src/djb2_hash.h new file mode 100644 index 0000000..0ea3998 --- /dev/null +++ b/src/djb2_hash.h @@ -0,0 +1,17 @@ +#ifndef __DJB2_HASH_H__ +#define __DJB2_HASH_H__ + +#include "hash.h" + +typedef struct __djb2_state_t +{ + CMPH_HASH hashfunc; +} djb2_state_t; + +djb2_state_t *djb2_state_new(); +uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen); +void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen); +djb2_state_t *djb2_state_load(const char *buf, uint32 buflen); +void djb2_state_destroy(djb2_state_t *state); + +#endif diff --git a/src/fnv_hash.c b/src/fnv_hash.c new file mode 100644 index 0000000..513fc56 --- /dev/null +++ b/src/fnv_hash.c @@ -0,0 +1,46 @@ +#include "fnv_hash.h" +#include + +fnv_state_t *fnv_state_new() +{ + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + state->hashfunc = HASH_FNV; + return state; +} + +void fnv_state_destroy(fnv_state_t *state) +{ + free(state); +} + +uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen) +{ + const unsigned char *bp = (const unsigned char *)k; + const unsigned char *be = bp + keylen; + static unsigned int hval = 0; + + while (bp < be) + { + + //hval *= 0x01000193; good for non-gcc compiler + hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); //good for gcc + + hval ^= *bp++; + } + return hval; +} + + +void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +fnv_state_t *fnv_state_load(const char *buf, uint32 buflen) +{ + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + state->hashfunc = HASH_FNV; + return state; +} diff --git a/src/fnv_hash.h b/src/fnv_hash.h new file mode 100644 index 0000000..a17717e --- /dev/null +++ b/src/fnv_hash.h @@ -0,0 +1,17 @@ +#ifndef __FNV_HASH_H__ +#define __FNV_HASH_H__ + +#include "hash.h" + +typedef struct __fnv_state_t +{ + CMPH_HASH hashfunc; +} fnv_state_t; + +fnv_state_t *fnv_state_new(); +uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen); +void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen); +fnv_state_t *fnv_state_load(const char *buf, uint32 buflen); +void fnv_state_destroy(fnv_state_t *state); + +#endif diff --git a/src/graph.c b/src/graph.c new file mode 100644 index 0000000..a2a927a --- /dev/null +++ b/src/graph.c @@ -0,0 +1,329 @@ +#include "graph.h" + +#include +#include +#include +#include +#include +#include "vstack.h" + +//#define DEBUG +#include "debug.h" + +#define abs_edge(e, i) (e % g->nedges + i * g->nedges) + +struct __graph_t +{ + uint32 nnodes; + uint32 nedges; + uint32 *edges; + uint32 *first; + uint32 *next; + uint8 *critical_nodes; /* included -- Fabiano*/ + uint32 ncritical_nodes; /* included -- Fabiano*/ + uint32 cedges; + int shrinking; +}; + +static uint32 EMPTY = UINT_MAX; + +graph_t *graph_new(uint32 nnodes, uint32 nedges) +{ + graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); + if (!graph) return NULL; + + graph->edges = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); + graph->next = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); + graph->first = (uint32 *)malloc(sizeof(uint32) * nnodes); + graph->critical_nodes = NULL; /* included -- Fabiano*/ + graph->ncritical_nodes = 0; /* included -- Fabiano*/ + graph->nnodes = nnodes; + graph->nedges = nedges; + + graph_clear_edges(graph); + return graph; +} + + +void graph_destroy(graph_t *graph) +{ + DEBUGP("Destroying graph\n"); + free(graph->edges); + free(graph->first); + free(graph->next); + free(graph->critical_nodes); /* included -- Fabiano*/ + free(graph); + return; +} + +void graph_print(graph_t *g) +{ + uint32 i, e; + for (i = 0; i < g->nnodes; ++i) + { + DEBUGP("Printing edges connected to %u\n", i); + e = g->first[i]; + if (e != EMPTY) + { + printf("%u -> %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + while ((e = g->next[e]) != EMPTY) + { + printf("%u -> %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + } + } + + } + return; +} + +void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) +{ + uint32 e = g->cedges; + + assert(v1 < g->nnodes); + assert(v2 < g->nnodes); + assert(e < g->nedges); + assert(!g->shrinking); + + g->next[e] = g->first[v1]; + g->first[v1] = e; + g->edges[e] = v2; + + g->next[e + g->nedges] = g->first[v2]; + g->first[v2] = e + g->nedges; + g->edges[e + g->nedges] = v1; + + ++(g->cedges); +} + +static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) +{ + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; + if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; + return 0; +} + +uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2) +{ + uint32 e; + e = g->first[v1]; + assert(e != EMPTY); + if (check_edge(g, e, v1, v2)) return abs_edge(e, 0); + do + { + e = g->next[e]; + assert(e != EMPTY); + } + while (!check_edge(g, e, v1, v2)); + return abs_edge(e, 0); +} +static void del_edge_point(graph_t *g, uint32 v1, uint32 v2) +{ + uint32 e, prev; + + DEBUGP("Deleting edge point %u %u\n", v1, v2); + e = g->first[v1]; + if (check_edge(g, e, v1, v2)) + { + g->first[v1] = g->next[e]; + //g->edges[e] = EMPTY; + DEBUGP("Deleted\n"); + return; + } + DEBUGP("Checking linked list\n"); + do + { + prev = e; + e = g->next[e]; + assert(e != EMPTY); + } + while (!check_edge(g, e, v1, v2)); + + g->next[prev] = g->next[e]; + //g->edges[e] = EMPTY; + DEBUGP("Deleted\n"); +} + + +void graph_del_edge(graph_t *g, uint32 v1, uint32 v2) +{ + g->shrinking = 1; + del_edge_point(g, v1, v2); + del_edge_point(g, v2, v1); +} + +void graph_clear_edges(graph_t *g) +{ + uint32 i; + for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; + for (i = 0; i < g->nedges*2; ++i) + { + g->edges[i] = EMPTY; + g->next[i] = EMPTY; + } + g->cedges = 0; + g->shrinking = 0; +} + +static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) +{ + uint32 edge = g->first[v]; + char found = 0; + DEBUGP("Checking degree of vertex %u\n", v); + if (edge == EMPTY) return 0; + else if (!deleted[abs_edge(edge, 0)]) + { + found = 1; + *e = edge; + } + while(1) + { + edge = g->next[edge]; + if (edge == EMPTY) break; + if (deleted[abs_edge(edge, 0)]) continue; + if (found) return 0; + DEBUGP("Found first edge\n"); + *e = edge; + found = 1; + } + return found; +} + +static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) +{ + + uint32 e; + char degree1; + uint32 v1 = v; + uint32 v2 = 0; + + degree1 = find_degree1_edge(g, v1, deleted, &e); + if (!degree1) return; + while(1) + { + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + deleted[abs_edge(e, 0)] = 1; + + v2 = g->edges[abs_edge(e, 0)]; + if (v2 == v1) v2 = g->edges[abs_edge(e, 1)]; + + DEBUGP("Checking if second endpoint %u has degree 1\n", v2); + degree1 = find_degree1_edge(g, v2, deleted, &e); + if (degree1) + { + DEBUGP("Inspecting vertex %u\n", v2); + v1 = v2; + } + else break; + } +} + +int graph_is_cyclic(graph_t *g) +{ + uint32 i; + uint32 v; + char *deleted = (char *)malloc(g->nedges*sizeof(char)); + memset(deleted, 0, g->nedges); + + DEBUGP("Looking for cycles in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); + for (v = 0; v < g->nnodes; ++v) + { + cyclic_del_edge(g, v, deleted); + } + for (i = 0; i < g->nedges; ++i) + { + if (!(deleted[i])) + { + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + free(deleted); + return 1; + } + } + free(deleted); + return 0; +} + +uint8 graph_node_is_critical(graph_t * g, uint32 v) /* included -- Fabiano */ +{ + return g->critical_nodes[v]; +} + +void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ +{ + uint32 i; + uint32 v; + char *deleted = (char *)malloc(g->nedges*sizeof(char)); + memset(deleted, 0, g->nedges); +/* g->critical_nodes = (uint8 *)malloc((size_t)(ceil(g->nnodes*sizeof(uint8)/8.))); */ + g->critical_nodes = (uint8 *)malloc(g->nnodes*sizeof(uint8)); + g->ncritical_nodes = 0; + DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); + for (v = 0; v < g->nnodes; ++v) + { + cyclic_del_edge(g, v, deleted); + } + + for (i = 0; i < g->nedges; ++i) + { + if (!(deleted[i])) + { + DEBUGP("Edge %u %u->%u belongs to the 2-core\n", i, g->edges[i], g->edges[i + g->nedges]); + if(!(g->critical_nodes[g->edges[i]])) + { + g->ncritical_nodes ++; + g->critical_nodes[g->edges[i]] = 1; + } + if(!(g->critical_nodes[g->edges[i + g->nedges]])) + { + g->ncritical_nodes ++; + g->critical_nodes[g->edges[i + g->nedges]] = 1; + } + } + } + free(deleted); +} + +uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2) /* included -- Fabiano*/ +{ + uint32 e; + e = g->first[v1]; + if(e == EMPTY) return 0; + if (check_edge(g, e, v1, v2)) return 1; + do + { + e = g->next[e]; + if(e == EMPTY) return 0; + } + while (!check_edge(g, e, v1, v2)); + return 1; +} + +uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id) /* included -- Fabiano*/ +{ + return (g->edges[e + id*g->nedges]); +} + +uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ +{ + return g->ncritical_nodes; +} + +graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v) +{ + graph_iterator_t it; + it.vertex = v; + it.edge = g->first[v]; + return it; +} +uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) +{ + uint32 ret; + if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; + if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; + else ret = g->edges[it->edge]; + it->edge = g->next[it->edge]; + return ret; +} + + diff --git a/src/graph.h b/src/graph.h new file mode 100644 index 0000000..c512746 --- /dev/null +++ b/src/graph.h @@ -0,0 +1,39 @@ +#ifndef _CMPH_GRAPH_H__ +#define _CMPH_GRAPH_H__ + +#include +#include "cmph_types.h" + +#define GRAPH_NO_NEIGHBOR UINT_MAX + +typedef struct __graph_t graph_t; +typedef struct __graph_iterator_t graph_iterator_t; +struct __graph_iterator_t +{ + uint32 vertex; + uint32 edge; +}; + + + +graph_t *graph_new(uint32 nnodes, uint32 nedges); +void graph_destroy(graph_t *graph); + +void graph_add_edge(graph_t *g, uint32 v1, uint32 v2); +//void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); +void graph_clear_edges(graph_t *g); +uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2); + +graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v); +uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); + +void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ +uint8 graph_node_is_critical(graph_t * g, uint32 v); /* included -- Fabiano */ +uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ +uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id); /* included -- Fabiano*/ + +int graph_is_cyclic(graph_t *g); + +void graph_print(graph_t *); + +#endif diff --git a/src/hash.c b/src/hash.c new file mode 100644 index 0000000..896c9fb --- /dev/null +++ b/src/hash.c @@ -0,0 +1,139 @@ +#include "hash_state.h" +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +const char *hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; + +hash_state_t *hash_state_new(CMPH_HASH hashfunc, uint32 hashsize) +{ + hash_state_t *state = NULL; + switch (hashfunc) + { + case HASH_JENKINS: + DEBUGP("Jenkins function - %u\n", hashsize); + state = (hash_state_t *)jenkins_state_new(hashsize); + DEBUGP("Jenkins function created\n"); + break; + case HASH_DJB2: + state = (hash_state_t *)djb2_state_new(); + break; + case HASH_SDBM: + state = (hash_state_t *)sdbm_state_new(); + break; + case HASH_FNV: + state = (hash_state_t *)fnv_state_new(); + break; + default: + assert(0); + } + state->hashfunc = hashfunc; + return state; +} +uint32 hash(hash_state_t *state, const char *key, uint32 keylen) +{ + switch (state->hashfunc) + { + case HASH_JENKINS: + return jenkins_hash((jenkins_state_t *)state, key, keylen); + case HASH_DJB2: + return djb2_hash((djb2_state_t *)state, key, keylen); + case HASH_SDBM: + return sdbm_hash((sdbm_state_t *)state, key, keylen); + case HASH_FNV: + return fnv_hash((fnv_state_t *)state, key, keylen); + default: + assert(0); + } + assert(0); + return 0; +} + +void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen) +{ + char *algobuf; + switch (state->hashfunc) + { + case HASH_JENKINS: + jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + case HASH_DJB2: + djb2_state_dump((djb2_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + case HASH_SDBM: + sdbm_state_dump((sdbm_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + case HASH_FNV: + fnv_state_dump((fnv_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + default: + assert(0); + } + *buf = malloc(strlen(hash_names[state->hashfunc]) + 1 + *buflen); + memcpy(*buf, hash_names[state->hashfunc], strlen(hash_names[state->hashfunc]) + 1); + DEBUGP("Algobuf is %u\n", *(uint32 *)algobuf); + memcpy(*buf + strlen(hash_names[state->hashfunc]) + 1, algobuf, *buflen); + *buflen = strlen(hash_names[state->hashfunc]) + 1 + *buflen; + free(algobuf); + return; +} + +hash_state_t *hash_state_load(const char *buf, uint32 buflen) +{ + uint32 i; + uint32 offset; + CMPH_HASH hashfunc = HASH_COUNT; + for (i = 0; i < HASH_COUNT; ++i) + { + if (strcmp(buf, hash_names[i]) == 0) + { + hashfunc = i; + break; + } + } + if (hashfunc == HASH_COUNT) return NULL; + offset = strlen(hash_names[hashfunc]) + 1; + switch (hashfunc) + { + case HASH_JENKINS: + return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); + case HASH_DJB2: + return (hash_state_t *)djb2_state_load(buf + offset, buflen - offset); + case HASH_SDBM: + return (hash_state_t *)sdbm_state_load(buf + offset, buflen - offset); + case HASH_FNV: + return (hash_state_t *)fnv_state_load(buf + offset, buflen - offset); + default: + return NULL; + } + return NULL; +} +void hash_state_destroy(hash_state_t *state) +{ + switch (state->hashfunc) + { + case HASH_JENKINS: + jenkins_state_destroy((jenkins_state_t *)state); + break; + case HASH_DJB2: + djb2_state_destroy((djb2_state_t *)state); + break; + case HASH_SDBM: + sdbm_state_destroy((sdbm_state_t *)state); + break; + case HASH_FNV: + fnv_state_destroy((fnv_state_t *)state); + break; + default: + assert(0); + } + return; +} diff --git a/src/hash.h b/src/hash.h new file mode 100644 index 0000000..90b8e37 --- /dev/null +++ b/src/hash.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_HASH_H__ +#define __CMPH_HASH_H__ + +#include "cmph_types.h" + +typedef union __hash_state_t hash_state_t; + +hash_state_t *hash_state_new(CMPH_HASH, uint32 hashsize); +uint32 hash(hash_state_t *state, const char *key, uint32 keylen); +void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen); +hash_state_t *hash_state_load(const char *buf, uint32 buflen); +void hash_state_destroy(hash_state_t *state); + +#endif diff --git a/src/hash_state.h b/src/hash_state.h new file mode 100644 index 0000000..67dcd77 --- /dev/null +++ b/src/hash_state.h @@ -0,0 +1,18 @@ +#ifndef __HASH_STATE_H__ +#define __HASH_STATE_H__ + +#include "hash.h" +#include "jenkins_hash.h" +#include "djb2_hash.h" +#include "sdbm_hash.h" +#include "fnv_hash.h" +union __hash_state_t +{ + CMPH_HASH hashfunc; + jenkins_state_t jenkins; + djb2_state_t djb2; + sdbm_state_t sdbm; + fnv_state_t fnv; +}; + +#endif diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c new file mode 100644 index 0000000..65ab7f3 --- /dev/null +++ b/src/jenkins_hash.c @@ -0,0 +1,191 @@ +#include "jenkins_hash.h" +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +#define hashsize(n) ((uint32)1<<(n)) +#define hashmask(n) (hashsize(n)-1) + + + +//#define NM2 /* Define this if you do not want power of 2 table sizes*/ + + +/* + -------------------------------------------------------------------- + mix -- mix 3 32-bit values reversibly. + For every delta with one or two bits set, and the deltas of all three + high bits or all three low bits, whether the original value of a,b,c + is almost all zero or is uniformly distributed, + * If mix() is run forward or backward, at least 32 bits in a,b,c + have at least 1/4 probability of changing. + * If mix() is run forward, every bit of c will change between 1/3 and + 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) + mix() was built out of 36 single-cycle latency instructions in a + structure that could supported 2x parallelism, like so: + a -= b; + a -= c; x = (c>>13); + b -= c; a ^= x; + b -= a; x = (a<<8); + c -= a; b ^= x; + c -= b; x = (b>>13); + ... + Unfortunately, superscalar Pentiums and Sparcs can't take advantage + of that parallelism. They've also turned some of those single-cycle + latency instructions into multi-cycle latency instructions. Still, + this is the fastest good hash I could find. There were about 2^^68 + to choose from. I only looked at a billion or so. + -------------------------------------------------------------------- + */ +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<<8); \ + c -= a; c -= b; c ^= (b>>13); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<16); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>3); \ + b -= c; b -= a; b ^= (a<<10); \ + c -= a; c -= b; c ^= (b>>15); \ +} + +/* + -------------------------------------------------------------------- + hash() -- hash a variable-length key into a 32-bit value +k : the key (the unaligned variable-length array of bytes) +len : the length of the key, counting by bytes +initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Every 1-bit and 2-bit delta achieves avalanche. +About 6*len+35 instructions. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do +h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8 **)k, do it like this: +for (i=0, h=0; iseed = rand() % size; + state->nbits = ceil(log(size)/M_LOG2E); + state->size = size; + DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); + return state; +} +void jenkins_state_destroy(jenkins_state_t *state) +{ + free(state); +} + +uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) +{ + uint32 a, b, c; + uint32 len, length; + + /* Set up the internal state */ + length = keylen; + len = length; + a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + c = state->seed; /* the previous hash value - seed in our case */ + + /*---------------------------------------- handle most of the key */ + while (len >= 12) + { + a += (k[0] +((uint32)k[1]<<8) +((uint32)k[2]<<16) +((uint32)k[3]<<24)); + b += (k[4] +((uint32)k[5]<<8) +((uint32)k[6]<<16) +((uint32)k[7]<<24)); + c += (k[8] +((uint32)k[9]<<8) +((uint32)k[10]<<16)+((uint32)k[11]<<24)); + mix(a,b,c); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + c += length; + switch(len) /* all the case statements fall through */ + { + case 11: + c +=((uint32)k[10]<<24); + case 10: + c +=((uint32)k[9]<<16); + case 9 : + c +=((uint32)k[8]<<8); + /* the first byte of c is reserved for the length */ + case 8 : + b +=((uint32)k[7]<<24); + case 7 : + b +=((uint32)k[6]<<16); + case 6 : + b +=((uint32)k[5]<<8); + case 5 : + b +=k[4]; + case 4 : + a +=((uint32)k[3]<<24); + case 3 : + a +=((uint32)k[2]<<16); + case 2 : + a +=((uint32)k[1]<<8); + case 1 : + a +=k[0]; + /* case 0: nothing left to add */ + } + + mix(a,b,c); + + /*-------------------------------------------- report the result */ + + //c = (c & hashmask(state->size)); + //c = (c >= state->size) ? c ^ state->size: c; + + //state->last_hash = c; Do not update last_hash because we use a fixed + //seed + return c; +} + +void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) +{ + uint32 nseed = htonl(state->seed); + uint32 nnbits = htonl(state->nbits); + uint32 nsize = htonl(state->size); + *buflen = sizeof(uint32)*3; + *buf = malloc(*buflen); + if (!*buf) + { + *buflen = UINT_MAX; + return; + } + memcpy(*buf, &nseed, sizeof(uint32)); + memcpy(*buf + sizeof(uint32), &nnbits, sizeof(uint32)); + memcpy(*buf + sizeof(uint32)*2, &nsize, sizeof(uint32)); + DEBUGP("Dumped jenkins state with seed %u\n", state->seed); + + return; +} +jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen) +{ + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + state->seed = ntohl(*(uint32 *)buf); + state->nbits = ntohl(*(((uint32 *)buf) + 1)); + state->size = ntohl(*(((uint32 *)buf) + 2)); + state->hashfunc = HASH_JENKINS; + DEBUGP("Loaded jenkins state with seed %u\n", state->seed); + return state; +} diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h new file mode 100644 index 0000000..1a84080 --- /dev/null +++ b/src/jenkins_hash.h @@ -0,0 +1,20 @@ +#ifndef __JEKINS_HASH_H__ +#define __JEKINS_HASH_H__ + +#include "hash.h" + +typedef struct __jenkins_state_t +{ + CMPH_HASH hashfunc; + uint32 seed; + uint32 nbits; + uint32 size; +} jenkins_state_t; + +jenkins_state_t *jenkins_state_new(uint32 size); //size of hash table +uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen); +void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen); +jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen); +void jenkins_state_destroy(jenkins_state_t *state); + +#endif diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..bab4c97 --- /dev/null +++ b/src/main.c @@ -0,0 +1,282 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "cmph.h" +#include "hash.h" +#include "../config.h" + +void usage(const char *prg) +{ + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); +} +void usage_long(const char *prg) +{ + uint32 i; + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "Minimum perfect hashing tool\n\n"); + fprintf(stderr, " -h\t print this help message\n"); + fprintf(stderr, " -a\t algorithm - valid values are\n"); + for (i = 0; i < MPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", mph_names[i]); + fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); + for (i = 0; i < HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", hash_names[i]); + fprintf(stderr, " -V\t print version number and exit\n"); + fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); + fprintf(stderr, " -g\t generation mode\n"); + fprintf(stderr, " -s\t random seed\n"); + fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " keysfile\t line separated file with keys\n"); +} + +static int key_read(void *data, char **key, uint32 *keylen) +{ + FILE *fd = (FILE *)data; + *key = NULL; + *keylen = 0; + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (c == NULL) return -1; + if (feof(fd)) return -1; + *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); + memcpy(*key + *keylen, buf, strlen(buf)); + *keylen += strlen(buf); + if (buf[strlen(buf) - 1] != '\n') continue; + break; + } + if ((*keylen) && (*key)[*keylen - 1] == '\n') + { + (*key)[(*keylen) - 1] = 0; + --(*keylen); + } + return *keylen; +} + +static void key_dispose(void *data, char *key, uint32 keylen) +{ + free(key); +} +static void key_rewind(void *data) +{ + FILE *fd = (FILE *)data; + rewind(fd); +} + +static uint32 count_keys(FILE *fd) +{ + uint32 count = 0; + rewind(fd); + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (feof(fd)) break; + if (buf[strlen(buf) - 1] != '\n') continue; + ++count; + } + rewind(fd); + return count; +} + +int main(int argc, char **argv) +{ + char verbosity = 0; + char generate = 0; + char *mphf_file = NULL; + FILE *mphf_fd = stdout; + const char *keys_file = NULL; + FILE *keys_fd; + uint32 seed = UINT_MAX; + CMPH_HASH *hashes = NULL; + uint32 nhashes = 0; + uint32 i; + MPH_ALGO mph_algo = MPH_CZECH; + mph_t *mph = NULL; + mphf_t *mphf = NULL; + + key_source_t source; + + while (1) + { + char c = getopt(argc, argv, "hVva:f:gm:s:"); + if (c == -1) break; + switch (c) + { + case 's': + { + char *cptr; + seed = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid seed %s\n", optarg); + exit(1); + } + } + break; + case 'g': + generate = 1; + break; + case 'm': + mphf_file = strdup(optarg); + break; + case 'v': + ++verbosity; + break; + case 'V': + printf("%s\n", VERSION); + return 0; + case 'h': + usage_long(argv[0]); + return 0; + case 'a': + { + char valid = 0; + for (i = 0; i < MPH_COUNT; ++i) + { + if (strcmp(mph_names[i], optarg) == 0) + { + mph_algo = i; + valid = 1; + break; + } + } + if (!valid) + { + fprintf(stderr, "Invalid mph algorithm: %s\n", optarg); + return -1; + } + } + break; + case 'f': + { + char valid = 0; + for (i = 0; i < HASH_COUNT; ++i) + { + if (strcmp(hash_names[i], optarg) == 0) + { + hashes = (CMPH_HASH *)realloc(hashes, sizeof(CMPH_HASH) * ( nhashes + 2 )); + hashes[nhashes] = i; + hashes[nhashes + 1] = HASH_COUNT; + ++nhashes; + valid = 1; + break; + } + } + if (!valid) + { + fprintf(stderr, "Invalid hash function: %s\n", optarg); + return -1; + } + } + break; + default: + usage(argv[0]); + return 1; + } + } + + if (optind != argc - 1) + { + usage(argv[0]); + return 1; + } + keys_file = argv[optind]; + if (seed == UINT_MAX) seed = time(NULL); + srand(seed); + + if (mphf_file == NULL) + { + mphf_file = (char *)malloc(strlen(keys_file) + 5); + memcpy(mphf_file, keys_file, strlen(keys_file)); + memcpy(mphf_file + strlen(keys_file), ".mph\0", 5); + } + + keys_fd = fopen(keys_file, "r"); + if (keys_fd == NULL) + { + fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); + return -1; + } + + source.data = (void *)keys_fd; + source.nkeys = count_keys(keys_fd); + source.read = key_read; + source.dispose = key_dispose; + source.rewind = key_rewind; + + if (generate) + { + //Create mphf + + mph = mph_new(mph_algo, &source); + if (nhashes) mph_set_hashfuncs(mph, hashes); + mph_set_verbosity(mph, verbosity); + mphf = mph_create(mph); + + if (mphf == NULL) + { + fprintf(stderr, "Unable to create minimum perfect hashing function\n"); + mph_destroy(mph); + free(mphf_file); + return -1; + } + + mphf_fd = fopen(mphf_file, "w"); + if (mphf_fd == NULL) + { + fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); + free(mphf_file); + return -1; + } + mphf_dump(mphf, mphf_fd); + mphf_destroy(mphf); + fclose(mphf_fd); + } + else + { + uint8 * hashtable = NULL; + mphf_fd = fopen(mphf_file, "r"); + if (mphf_fd == NULL) + { + fprintf(stderr, "Unable to open input file %s: %s\n", mphf_file, strerror(errno)); + free(mphf_file); + return -1; + } + mphf = mphf_load(mphf_fd); + fclose(mphf_fd); + if (!mphf) + { + fprintf(stderr, "Unable to parser input file %s\n", mphf_file); + free(mphf_file); + return -1; + } + hashtable = (uint8*)malloc(source.nkeys*sizeof(uint8)); + memset(hashtable, 0, source.nkeys); + //check all keys + for (i = 0; i < source.nkeys; ++i) + { + uint32 h; + char *buf; + uint32 buflen = 0; + source.read(source.data, &buf, &buflen); + h = mphf_search(mphf, buf, buflen); + if(hashtable[h])fprintf(stderr, "collision: %u\n",h); + assert(hashtable[h]==0); + hashtable[h] = 1; + if (verbosity) + { + printf("%s -> %u\n", buf, h); + } + source.dispose(source.data, buf, buflen); + } + mphf_destroy(mphf); + free(hashtable); + } + fclose(keys_fd); + free(mphf_file); + return 0; +} diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c new file mode 100644 index 0000000..391d912 --- /dev/null +++ b/src/sdbm_hash.c @@ -0,0 +1,42 @@ +#include "sdbm_hash.h" +#include + +sdbm_state_t *sdbm_state_new() +{ + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + state->hashfunc = HASH_SDBM; + return state; +} + +void sdbm_state_destroy(sdbm_state_t *state) +{ + free(state); +} + +uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) +{ + register unsigned int hash = 0; + const unsigned char *ptr = k; + int i = 0; + + while(i < keylen) { + hash = *ptr + (hash << 6) + (hash << 16) - hash; + ++ptr, ++i; + } + return hash; +} + + +void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen) +{ + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + state->hashfunc = HASH_SDBM; + return state; +} diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h new file mode 100644 index 0000000..9e27f0f --- /dev/null +++ b/src/sdbm_hash.h @@ -0,0 +1,17 @@ +#ifndef __SDBM_HASH_H__ +#define __SDBM_HASH_H__ + +#include "hash.h" + +typedef struct __sdbm_state_t +{ + CMPH_HASH hashfunc; +} sdbm_state_t; + +sdbm_state_t *sdbm_state_new(); +uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen); +void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen); +sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen); +void sdbm_state_destroy(sdbm_state_t *state); + +#endif diff --git a/src/vqueue.c b/src/vqueue.c new file mode 100644 index 0000000..af07e0a --- /dev/null +++ b/src/vqueue.c @@ -0,0 +1,49 @@ +#include "vqueue.h" +#include +#include +struct __vqueue_t +{ + uint32 * values; + uint32 beg, end, capacity; +}; + +vqueue_t * vqueue_new(uint32 capacity) +{ + vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); + assert(q); + q->values = (uint32 *)calloc(capacity+1, sizeof(uint32)); + q->beg = q->end = 0; + q->capacity = capacity+1; + return q; +} + +uint8 vqueue_is_empty(vqueue_t * q) +{ + return (q->beg == q->end); +} + +void vqueue_insert(vqueue_t * q, uint32 val) +{ + assert((q->end + 1)%q->capacity != q->beg); // Is queue full? + q->end = (q->end + 1)%q->capacity; + q->values[q->end] = val; +} + +uint32 vqueue_remove(vqueue_t * q) +{ + assert(!vqueue_is_empty(q)); // Is queue empty? + q->beg = (q->beg + 1)%q->capacity; + return q->values[q->beg]; +} + +void vqueue_print(vqueue_t * q) +{ + uint32 i; + for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) + fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); +} + +void vqueue_destroy(vqueue_t *q) +{ + free(q->values); q->values = NULL; +} diff --git a/src/vqueue.h b/src/vqueue.h new file mode 100644 index 0000000..cd870bb --- /dev/null +++ b/src/vqueue.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_VQUEUE_H__ +#define __CMPH_VQUEUE_H__ + +#include "cmph_types.h" +typedef struct __vqueue_t vqueue_t; + +vqueue_t * vqueue_new(uint32 capacity); + +uint8 vqueue_is_empty(vqueue_t * q); + +void vqueue_insert(vqueue_t * q, uint32 val); + +uint32 vqueue_remove(vqueue_t * q); + +void vqueue_print(vqueue_t * q); + +void vqueue_destroy(vqueue_t * q); +#endif diff --git a/src/vstack.c b/src/vstack.c new file mode 100644 index 0000000..67b2945 --- /dev/null +++ b/src/vstack.c @@ -0,0 +1,79 @@ +#include "vstack.h" + +#include +#include + +//#define DEBUG +#include "debug.h" + +struct __vstack_t +{ + uint32 pointer; + uint32 *values; + uint32 capacity; +}; + +vstack_t *vstack_new() +{ + vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); + assert(stack); + stack->pointer = 0; + stack->values = NULL; + stack->capacity = 0; + return stack; +} + +void vstack_destroy(vstack_t *stack) +{ + assert(stack); + free(stack->values); + free(stack); +} + +void vstack_push(vstack_t *stack, uint32 val) +{ + assert(stack); + vstack_reserve(stack, stack->pointer + 1); + stack->values[stack->pointer] = val; + ++(stack->pointer); +} +void vstack_pop(vstack_t *stack) +{ + assert(stack); + assert(stack->pointer > 0); + --(stack->pointer); +} + +uint32 vstack_top(vstack_t *stack) +{ + assert(stack); + assert(stack->pointer > 0); + return stack->values[(stack->pointer - 1)]; +} +int vstack_empty(vstack_t *stack) +{ + assert(stack); + return stack->pointer == 0; +} +uint32 vstack_size(vstack_t *stack) +{ + return stack->pointer; +} +void vstack_reserve(vstack_t *stack, uint32 size) +{ + assert(stack); + if (stack->capacity < size) + { + uint32 new_capacity = stack->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + stack->values = (uint32 *)realloc(stack->values, sizeof(uint32)*new_capacity); + assert(stack->values); + stack->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + diff --git a/src/vstack.h b/src/vstack.h new file mode 100644 index 0000000..85893c4 --- /dev/null +++ b/src/vstack.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_VSTACK_H__ +#define __CMPH_VSTACK_H__ + +#include "cmph_types.h" +typedef struct __vstack_t vstack_t; + +vstack_t *vstack_new(); +void vstack_destroy(vstack_t *stack); + +void vstack_push(vstack_t *stack, uint32 val); +uint32 vstack_top(vstack_t *stack); +void vstack_pop(vstack_t *stack); +int vstack_empty(vstack_t *stack); +uint32 vstack_size(vstack_t *stack); + +void vstack_reserve(vstack_t *stack, uint32 size); + +#endif diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..50cfcd6 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,4 @@ +noinst_PROGRAMS = graph_tests + +graph_tests_SOURCES = graph_tests.c +graph_tests_LDADD = ../src/libcmph.la diff --git a/tests/graph_tests.c b/tests/graph_tests.c new file mode 100644 index 0000000..35476aa --- /dev/null +++ b/tests/graph_tests.c @@ -0,0 +1,67 @@ +#include "../src/graph.h" + +#define DEBUG +#include "../src/debug.h" + +int main(int argc, char **argv) +{ + graph_iterator_t it; + uint32 i, neighbor; + graph_t *g = graph_new(5, 10); + + fprintf(stderr, "Building random graph\n"); + for (i = 0; i < 10; ++i) + { + uint32 v1 = i % 5; + uint32 v2 = (i*2) % 5; + if (v1 == v2) continue; + graph_add_edge(g, v1, v2); + DEBUGP("Added edge %u %u\n", v1, v2); + } + graph_print(g); + graph_del_edge(g, 4, 3); + graph_print(g); + graph_clear_edges(g); + graph_print(g); + graph_destroy(g); + + fprintf(stderr, "Building cyclic graph\n"); + g = graph_new(4, 5); + graph_add_edge(g, 0, 3); + graph_add_edge(g, 0, 1); + graph_add_edge(g, 1, 2); + graph_add_edge(g, 2, 0); + if (!graph_is_cyclic(g)) + { + return 1; + } + graph_destroy(g); + + fprintf(stderr, "Building non-cyclic graph\n"); + g = graph_new(5, 4); + graph_add_edge(g, 0, 1); + graph_add_edge(g, 1, 2); + graph_add_edge(g, 2, 3); + graph_add_edge(g, 3, 4); + + if (graph_is_cyclic(g)) + { + return 1; + } + + fprintf(stderr, "Checking neighbors iterator\n"); + it = graph_neighbors_it(g, 1); + neighbor = graph_next_neighbor(g, &it); + DEBUGP("Neighbor is %u\n", neighbor); + if (neighbor != 0 && neighbor != 2) return 1; + neighbor = graph_next_neighbor(g, &it); + DEBUGP("Neighbor is %u\n", neighbor); + if (neighbor != 0 && neighbor != 2) return 1; + neighbor = graph_next_neighbor(g, &it); + DEBUGP("Neighbor is %u\n", neighbor); + if (neighbor != GRAPH_NO_NEIGHBOR) return 1; + + + graph_destroy(g); + return 0; +} From b3f008eb40c64707366c83c5da2530517cef6a8c Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 23 Dec 2004 13:16:30 +0000 Subject: [PATCH 002/739] Initial revision --- AUTHORS | 2 + COPYING | 340 ++++++++++++++++++++++++++++++++++ ChangeLog | 159 ++++++++++++++++ INSTALL | 229 +++++++++++++++++++++++ Makefile.am | 2 + NEWS | 0 README | 0 cmph.spec | 39 ++++ configure.ac | 23 +++ src/Makefile.am | 22 +++ src/bmz.c | 439 ++++++++++++++++++++++++++++++++++++++++++++ src/bmz.h | 18 ++ src/bmz_structs.h | 24 +++ src/cmph.c | 169 +++++++++++++++++ src/cmph.h | 44 +++++ src/cmph_structs.c | 68 +++++++ src/cmph_structs.h | 32 ++++ src/cmph_types.h | 13 ++ src/czech.c | 320 ++++++++++++++++++++++++++++++++ src/czech.h | 18 ++ src/czech_structs.h | 24 +++ src/debug.h | 15 ++ src/djb2_hash.c | 42 +++++ src/djb2_hash.h | 17 ++ src/fnv_hash.c | 46 +++++ src/fnv_hash.h | 17 ++ src/graph.c | 329 +++++++++++++++++++++++++++++++++ src/graph.h | 39 ++++ src/hash.c | 139 ++++++++++++++ src/hash.h | 14 ++ src/hash_state.h | 18 ++ src/jenkins_hash.c | 191 +++++++++++++++++++ src/jenkins_hash.h | 20 ++ src/main.c | 282 ++++++++++++++++++++++++++++ src/sdbm_hash.c | 42 +++++ src/sdbm_hash.h | 17 ++ src/vqueue.c | 49 +++++ src/vqueue.h | 18 ++ src/vstack.c | 79 ++++++++ src/vstack.h | 18 ++ tests/Makefile.am | 4 + tests/graph_tests.c | 67 +++++++ 42 files changed, 3448 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 cmph.spec create mode 100644 configure.ac create mode 100644 src/Makefile.am create mode 100644 src/bmz.c create mode 100644 src/bmz.h create mode 100644 src/bmz_structs.h create mode 100644 src/cmph.c create mode 100644 src/cmph.h create mode 100644 src/cmph_structs.c create mode 100644 src/cmph_structs.h create mode 100644 src/cmph_types.h create mode 100644 src/czech.c create mode 100644 src/czech.h create mode 100644 src/czech_structs.h create mode 100644 src/debug.h create mode 100644 src/djb2_hash.c create mode 100644 src/djb2_hash.h create mode 100644 src/fnv_hash.c create mode 100644 src/fnv_hash.h create mode 100644 src/graph.c create mode 100644 src/graph.h create mode 100644 src/hash.c create mode 100644 src/hash.h create mode 100644 src/hash_state.h create mode 100644 src/jenkins_hash.c create mode 100644 src/jenkins_hash.h create mode 100644 src/main.c create mode 100644 src/sdbm_hash.c create mode 100644 src/sdbm_hash.h create mode 100644 src/vqueue.c create mode 100644 src/vqueue.h create mode 100644 src/vstack.c create mode 100644 src/vstack.h create mode 100644 tests/Makefile.am create mode 100644 tests/graph_tests.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..427eedb --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Davi de Castro Reis +Fabiano Cupertino Botelho diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..b7626b7 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,159 @@ +2004-11-24 12:42 davi + + * src/czech.c: Fixed some leaks. + +2004-11-24 11:34 davi + + * src/: Makefile.am, cmph.h, cmph_types.h, czech.h, graph.h, + hash.h, jenkins_hash.h, types.h, vstack.h: Better header layout. + +2004-11-23 15:15 davi + + * src/jenkins_hash.c: Fixed trivial bug. + +2004-11-04 00:56 davi + + * src/: czech.c, graph.c: Forgot. + +2004-11-04 00:09 davi + + * src/: cmph.c, cmph.h, czech.c, czech.h, graph.c, main.c: Fixed + small bug due to fgets trick. + +2004-11-03 23:15 davi + + * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, + main.c: Added verbosity option + +2004-11-03 22:42 davi + + * src/czech.c: [no log message] + +2004-11-03 20:57 davi + + * src/: Makefile.am, fnv_hash.c, fnv_hash.h, hash.c, hash_state.h: + Added fnv hash function. + +2004-11-03 18:10 davi + + * src/: Makefile.am, cmph.c, cmph.h, czech.c, czech.h, djb2_hash.c, + hash.c, hash_state.h, jenkins_hash.c, main.c, sdbm_hash.c, + sdbm_hash.h: Added sdbm hash function. + +2004-11-03 15:53 davi + + * src/cmph.c, src/cmph.h, src/cmph_structs.c, src/cmph_structs.h, + src/czech.c, src/czech.h, src/czech_structs.h, src/main.c, + tests/Makefile.am, tests/czech_tests.c: Added callback structure to + retrieve keys in disk. + +2004-10-31 22:57 davi + + * src/: Makefile.am, djb2_hash.c, djb2_hash.h, hash.c, hash.h, + hash_funcs.h, jenkins_hash.h: Added new hash function. + +2004-10-31 20:53 davi + + * src/main.c: Added random seed. + +2004-10-31 20:48 davi + + * src/main.c, tests/czech_tests.c: Better getopt code. + +2004-10-31 19:27 davi + + * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, + czech.h, czech_structs.h, hash.c, hash.h, jenkins_hash.c, + jenkins_hash.h, main.c: Everything working flawlessly. + +2004-10-30 20:12 davi + + * src/cmph_structs.c: Added missing file. + +2004-10-30 20:09 davi + + * src/main.c: forgot. + +2004-10-29 19:02 davi + + * src/: Makefile.am, cmph.c, cmph.h, cmph_structs.h, czech.c, + czech.h, czech_structs.h, graph.c, hash.c, hash.h, jenkins_hash.c, + jenkins_hash.h, main.c: Cleaned some warnings. + +2004-10-29 16:14 davi + + * src/: hash.c, hash_state.h: Missing file. + +2004-10-29 14:18 davi + + * src/: Makefile.am, cmph.c, cmph.h, czech.c, graph.c, hash.h, + jenkins_hash.c, jenkins_hash.h, jenkinshash.c, jenkinshash.h: + Working nice. Serialization almost there. + +2004-10-28 11:21 davi + + * Makefile.am, src/cmph.c, src/cmph_structs.h, src/czech.c, + src/czech_structs.h, src/jenkinshash.c: Hash generation seems to be + working fine. + +2004-10-27 15:19 davi + + * src/hash.h: Added hash header. + +2004-10-27 15:06 davi + + * COPYING, INSTALL, Makefile.am, src/czech.c, src/czech_structs.h, + src/graph.c, src/graph.h, src/vstack.c, tests/Makefile.am, + tests/czech_tests.c, tests/graph_tests.c: Cool. Now it is + serialization time. + +2004-10-27 13:06 davi + + * tests/: czech_tests.c, keys: Added missing files. + +2004-10-26 21:23 davi + + * src/graph.c, tests/Makefile.am: Still working on f*cking graph + implementation. + +2004-10-25 20:05 davi + + * src/: cmph.c, cmph.h, cmph_structs.h, czech.c, czech.h, + czech_structs.h, graph.c, graph.h, jenkinshash.c, jenkinshash.h, + vstack.c: Added some new files. + +2004-10-25 00:27 davi + + * src/: czech.c, czech.h, graph.c, graph.h, jenkinshash.c: Some + random code. + +2004-10-24 23:07 davi + + * src/: Makefile.am, debug.h, graph.c, main.c, vstack.c, vstack.h: + Added stack implementation. + +2004-10-24 21:57 davi + + * src/list.h: Added missing file. + +2004-10-24 21:50 davi + + * src/types.h: Added missing file. + +2004-10-22 20:30 davi + + * src/: Makefile.am, cmph.h, czech.c, czech.h, graph.c, graph.h, + jenkinshash.c, jenkinshash.h: Added a lot of files. + +2004-10-19 17:08 davi + + * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, + src/main.c, tests/Makefile.am: Initial revision + +2004-10-19 17:08 davi + + * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, + src/main.c, tests/Makefile.am: Minimum perfect hashing library + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..54caf7c --- /dev/null +++ b/INSTALL @@ -0,0 +1,229 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..c735106 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = src tests +EXTRA_DIST = cmph.spec configure.ac diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/cmph.spec b/cmph.spec new file mode 100644 index 0000000..19e796b --- /dev/null +++ b/cmph.spec @@ -0,0 +1,39 @@ +%define name cmph +%define version 0.2 +%define release 1 + +Name: %{name} +Version: %{version} +Release: %{release} +Summary: C Minimal perfect hash library +Source: %{name}-%{version}.tar.gz +License: Proprietary +URL: http://www.akwan.com.br +BuildArch: i386 +Group: Sitesearch +BuildRoot: %{_tmppath}/%{name}-root + +%description +C Minimal perfect hash library + +%prep +rm -Rf $RPM_BUILD_ROOT +rm -rf $RPM_BUILD_ROOT +%setup +mkdir $RPM_BUILD_ROOT +mkdir $RPM_BUILD_ROOT/usr +CXXFLAGS="-O2" ./configure --prefix=/usr/ + +%build +make + +%install +DESTDIR=$RPM_BUILD_ROOT make install + +%files +%defattr(755,root,root) +/ + +%changelog +* Tue Jun 1 2004 Davi de Castro Reis ++ Initial build diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..dcea170 --- /dev/null +++ b/configure.ac @@ -0,0 +1,23 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(Makefile.am) +AM_INIT_AUTOMAKE(cmph, 0.2) +AM_CONFIG_HEADER(config.h) + +dnl Checks for programs. +AC_PROG_AWK +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_LIBTOOL + +dnl Checks for headers +AC_CHECK_HEADERS([getopt.h math.h]) + +dnl Checks for libraries. +AC_CHECK_LIBM +LDFLAGS="$LIBM $LDFLAGS" + +dnl Checks for library functions. + +dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) +AC_OUTPUT(Makefile src/Makefile tests/Makefile) diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..8a56ad1 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,22 @@ +bin_PROGRAMS = cmph +lib_LTLIBRARIES = libcmph.la +include_HEADERS = cmph.h cmph_types.h +libcmph_la_SOURCES = debug.h\ + cmph_types.h\ + hash.h hash_state.h hash.c\ + jenkins_hash.h jenkins_hash.c\ + djb2_hash.h djb2_hash.c\ + sdbm_hash.h sdbm_hash.c\ + fnv_hash.h fnv_hash.c\ + vstack.h vstack.c\ + vqueue.h vqueue.c\ + graph.h graph.c\ + cmph.h cmph.c\ + cmph_structs.h cmph_structs.c\ + czech.h czech_structs.h czech.c\ + bmz.h bmz_structs.h bmz.c + +libcmph_la_LDFLAGS = -version-info 0:0:0 + +cmph_SOURCES = main.c +cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c new file mode 100644 index 0000000..61a1b5b --- /dev/null +++ b/src/bmz.c @@ -0,0 +1,439 @@ +#include "bmz.h" +#include "cmph_structs.h" +#include "bmz_structs.h" +#include "hash.h" +#include "vqueue.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static uint32 UNDEFINED = UINT_MAX; + +static int bmz_gen_edges(mph_t *mph); +static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges); +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges); + +mph_t *bmz_mph_new(key_source_t *key_source) +{ + mph_t *mph = NULL; + bmz_mph_data_t *bmz = NULL; + mph = __mph_new(MPH_BMZ, key_source); + if (mph == NULL) return NULL; + bmz = (bmz_mph_data_t *)malloc(sizeof(bmz_mph_data_t)); + if (bmz == NULL) + { + __mph_destroy(mph); + return NULL; + } + bmz->hashfuncs[0] = HASH_JENKINS; + bmz->hashfuncs[1] = HASH_JENKINS; + bmz->g = NULL; + bmz->graph = NULL; + bmz->hashes = NULL; + mph->data = bmz; + assert(mph->data); + return mph; +} +void bmz_mph_destroy(mph_t *mph) +{ + bmz_mph_data_t *data = (bmz_mph_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); + __mph_destroy(mph); +} + +void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +{ + bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + uint32 i = 0; + while(*hashptr != HASH_COUNT) + { + if (i >= 2) break; //bmz only uses two hash functions + bmz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) +{ + mphf_t *mphf = NULL; + bmz_mphf_data_t *bmzf = NULL; + + uint32 i; + uint32 iterations = 10; + uint8 *used_edges = NULL; + uint32 unused_edge_index = 0; + uint32 biggest_g_value = 0; + uint32 biggest_edge_value = 1; + DEBUGP("bmz_c: %f\n", bmz_c); + bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + bmz->m = mph->key_source->nkeys; + bmz->n = ceil(bmz_c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u bmz_c: %f\n", bmz->m, bmz->n, bmz_c); + bmz->graph = graph_new(bmz->n, bmz->m); + DEBUGP("Created graph\n"); + + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; + + // Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); + DEBUGP("hash function 2\n"); + bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); + DEBUGP("Generating edges\n"); + ok = bmz_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz->hashes[0]); + bmz->hashes[0] = NULL; + hash_state_destroy(bmz->hashes[1]); + bmz->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + used_edges = (uint8 *)malloc(bmz->m*sizeof(uint8)); + memset(used_edges, 0, bmz->m); + free(bmz->g); + bmz->g = malloc(bmz->n * sizeof(uint32)); + assert(bmz->g); + for (i = 0; i < bmz->n; ++i) bmz->g[i] = UNDEFINED; + + for (i = 0; i < bmz->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz->graph, i) && (bmz->g[i] == UNDEFINED)) + { + bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges); + } + } + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + + bmz_traverse_non_critical_nodes(bmz, used_edges); // non_critical_nodes + graph_destroy(bmz->graph); + free(used_edges); + bmz->graph = NULL; + + mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf->algo = mph->algo; + bmzf = (bmz_mphf_data_t *)malloc(sizeof(bmz_mph_data_t)); + bmzf->g = bmz->g; + bmz->g = NULL; //transfer memory ownership + bmzf->hashes = bmz->hashes; + bmz->hashes = NULL; //transfer memory ownership + bmzf->n = bmz->n; + bmzf->m = bmz->m; + mphf->data = bmzf; + mphf->size = bmz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges) +{ + uint32 next_g; + uint32 u; /* Auxiliary vertex */ + uint32 lav; /* lookahead vertex */ + uint8 collision; + vqueue_t * q = vqueue_new(graph_ncritical_nodes(bmz->graph)); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + *biggest_g_value = next_g; + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, u) && (bmz->g[u] == UNDEFINED)) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + { + assert(next_g + bmz->g[lav] < bmz->m); + if (used_edges[next_g + bmz->g[lav]]) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + { + used_edges[next_g + bmz->g[lav]] = 1; + if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; + } + } + bmz->g[u] = next_g; // Labelling vertex u. + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + +} + +static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz->m); + if(used_edges[unused_edge_index]) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index) +{ + graph_iterator_t it = graph_neighbors_it(bmz->graph, v); + uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(bmz->g[neighbor] != UNDEFINED) continue; + *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index + 1); + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + bmz_traverse(bmz, used_edges, neighbor, unused_edge_index); + } +} + +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges) +{ + + uint32 i, v1, v2, unused_edge_index = -1; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz->m; i++) + { + v1 = graph_vertex_id(bmz->graph, i, 0); + v2 = graph_vertex_id(bmz->graph, i, 1); + if((bmz->g[v1] != UNDEFINED && bmz->g[v2] != UNDEFINED) || (bmz->g[v1] == UNDEFINED && bmz->g[v2] == UNDEFINED)) continue; + if(bmz->g[v1] != UNDEFINED) bmz_traverse(bmz, used_edges, v1, &unused_edge_index); + else bmz_traverse(bmz, used_edges, v2, &unused_edge_index); + } + + for(i = 0; i < bmz->n; i++) + { + if(bmz->g[i] == UNDEFINED) + { + bmz->g[i] = 0; + bmz_traverse(bmz, used_edges, i, &unused_edge_index); + } + } + +} + +static int bmz_gen_edges(mph_t *mph) +{ + uint32 e; + bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + uint8 multiple_edges = 0; + + DEBUGP("Generating edges for %u vertices\n", bmz->n); + graph_clear_edges(bmz->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + uint32 h1, h2; + uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + multiple_edges = graph_contains_edge(bmz->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz_mphf_dump(mphf_t *mphf, FILE *fd) +{ + char *buf = NULL; + uint32 buflen; + uint32 nbuflen; + uint32 i; + uint32 two = htonl(2); //number of hash functions + bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; + uint32 nn, nm; + __mphf_dump(mphf, fd); + + fwrite(&two, sizeof(uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + nn = htonl(data->n); + fwrite(&nn, sizeof(uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(uint32), 1, fd); + + for (i = 0; i < data->n; ++i) + { + uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(uint32), 1, fd); + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz_mphf_load(FILE *f, mphf_t *mphf) +{ + uint32 nhashes; + char fbuf[BUFSIZ]; + char *buf = NULL; + uint32 buflen; + uint32 i; + hash_state_t *state; + bmz_mphf_data_t *bmz = (bmz_mphf_data_t *)malloc(sizeof(bmz_mphf_data_t)); + + DEBUGP("Loading bmz mphf\n"); + mphf->data = bmz; + fread(&nhashes, sizeof(uint32), 1, f); + nhashes = ntohl(nhashes); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(uint32), 1, f); + buflen = ntohl(buflen); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + bmz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(bmz->n), sizeof(uint32), 1, f); + bmz->n = ntohl(bmz->n); + fread(&(bmz->m), sizeof(uint32), 1, f); + bmz->m = ntohl(bmz->m); + + bmz->g = (uint32 *)malloc(sizeof(uint32)*bmz->n); + fread(bmz->g, bmz->n*sizeof(uint32), 1, f); + for (i = 0; i < bmz->n; ++i) bmz->g[i] = ntohl(bmz->g[i]); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +{ + bmz_mphf_data_t *bmz = mphf->data; + uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); + return bmz->g[h1] + bmz->g[h2]; +} +void bmz_mphf_destroy(mphf_t *mphf) +{ + bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/bmz.h b/src/bmz.h new file mode 100644 index 0000000..6dc3ca2 --- /dev/null +++ b/src/bmz.h @@ -0,0 +1,18 @@ +#ifndef __BMZ_H__ +#define __BMZ_H__ + +#include "graph.h" +#include "cmph.h" + +typedef struct __bmz_mphf_data_t bmz_mphf_data_t; +typedef struct __bmz_mph_data_t bmz_mph_data_t; + +mph_t *bmz_mph_new(key_source_t *key_source); +void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); +void bmz_mph_destroy(mph_t *mph); +mphf_t *bmz_mph_create(mph_t *mph, float bmz_c); + +void bmz_mphf_load(FILE *f, mphf_t *mphf); +int bmz_mphf_dump(mphf_t *mphf, FILE *f); +uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +#endif diff --git a/src/bmz_structs.h b/src/bmz_structs.h new file mode 100644 index 0000000..4f6d131 --- /dev/null +++ b/src/bmz_structs.h @@ -0,0 +1,24 @@ +#ifndef __BMZ_STRUCTS_H__ +#define __BMZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz_mphf_data_t +{ + uint32 m; //edges (words) count + uint32 n; //vertex count + uint32 *g; + hash_state_t **hashes; +}; + +struct __bmz_mph_data_t +{ + CMPH_HASH hashfuncs[2]; + uint32 m; //edges (words) count + uint32 n; //vertex count + graph_t *graph; + uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c new file mode 100644 index 0000000..5432924 --- /dev/null +++ b/src/cmph.c @@ -0,0 +1,169 @@ +#include "cmph.h" +#include "cmph_structs.h" +#include "czech.h" +#include "bmz.h" +//#include "bmz.h" /* included -- Fabiano */ + +#include +#include + +//#define DEBUG +#include "debug.h" + +const char *mph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ + +mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source) +{ + mph_t *mph = NULL; + DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + switch (algo) + { + case MPH_CZECH: + mph = czech_mph_new(key_source); + break; + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("new bmz algorithm \n"); + mph = bmz_mph_new(key_source); + break; + default: + assert(0); + } + assert(mph); + return mph; +} + +void mph_destroy(mph_t *mph) +{ + DEBUGP("Destroying mph with algo %s\n", mph_names[mph->algo]); + switch (mph->algo) + { + case MPH_CZECH: + czech_mph_destroy(mph); + break; + case MPH_BMZ: /* included -- Fabiano */ + bmz_mph_destroy(mph); + break; + default: + assert(0); + } +} + +void mph_set_verbosity(mph_t *mph, uint32 verbosity) +{ + mph->verbosity = verbosity; +} + +void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +{ + switch (mph->algo) + { + case MPH_CZECH: + czech_mph_set_hashfuncs(mph, hashfuncs); + break; + case MPH_BMZ: /* included -- Fabiano */ + bmz_mph_set_hashfuncs(mph, hashfuncs); + break; + default: + break; + } + return; +} + +mphf_t *mph_create(mph_t *mph) +{ + mphf_t *mphf = NULL; + switch (mph->algo) + { + case MPH_CZECH: + DEBUGP("Creating czech hash\n"); + mphf = czech_mph_create(mph, 2.09); + break; + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("Creating bmz hash\n"); + mphf = bmz_mph_create(mph, 1.10); + break; + default: + assert(0); + } + return mphf; +} + +int mphf_dump(mphf_t *mphf, FILE *f) +{ + switch (mphf->algo) + { + case MPH_CZECH: + return czech_mphf_dump(mphf, f); + break; + case MPH_BMZ: /* included -- Fabiano */ + return bmz_mphf_dump(mphf, f); + break; + default: + assert(0); + } + assert(0); + return 0; +} +mphf_t *mphf_load(FILE *f) +{ + mphf_t *mphf = NULL; + DEBUGP("Loading mphf generic parts\n"); + mphf = __mphf_load(f); + if (mphf == NULL) return NULL; + DEBUGP("Loading mphf algorithm dependent parts\n"); + + switch (mphf->algo) + { + case MPH_CZECH: + czech_mphf_load(f, mphf); + break; + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("Loading bmz algorithm dependent parts\n"); + bmz_mphf_load(f, mphf); + break; + default: + assert(0); + } + DEBUGP("Loaded mphf\n"); + return mphf; +} + + +uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +{ + DEBUGP("mphf algorithm: %u \n", mphf->algo); + switch(mphf->algo) + { + case MPH_CZECH: + return czech_mphf_search(mphf, key, keylen); + case MPH_BMZ: /* included -- Fabiano */ + DEBUGP("bmz algorithm search\n"); + return bmz_mphf_search(mphf, key, keylen); + default: + assert(0); + } + assert(0); + return; +} + +uint32 mphf_size(mphf_t *mphf) +{ + return mphf->size; +} + +void mphf_destroy(mphf_t *mphf) +{ + switch(mphf->algo) + { + case MPH_CZECH: + czech_mphf_destroy(mphf); + return; + case MPH_BMZ: /* included -- Fabiano */ + bmz_mphf_destroy(mphf); + return; + default: + assert(0); + } + assert(0); + return; +} diff --git a/src/cmph.h b/src/cmph.h new file mode 100644 index 0000000..2224a42 --- /dev/null +++ b/src/cmph.h @@ -0,0 +1,44 @@ +#ifndef __CMPH_H__ +#define __CMPH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cmph_types.h" + +typedef struct __mph_t mph_t; +typedef struct __mphf_t mphf_t; + +typedef struct +{ + void *data; + uint32 nkeys; + int (*read)(void *, char **, uint32 *); + void (*dispose)(void *, char *, uint32); + void (*rewind)(void *); +} key_source_t; + +/** Hash generation API **/ +mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); +void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); +void mph_set_verbosity(mph_t *mph, uint32 verbosity); +void mph_destroy(mph_t *mph); +mphf_t *mph_create(mph_t *mph); + +/** Hash querying API **/ +mphf_t *mphf_load(FILE *f); +int mphf_dump(mphf_t *mphf, FILE *f); +uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +uint32 mphf_size(mphf_t *mphf); +void mphf_destroy(mphf_t *mphf); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cmph_structs.c b/src/cmph_structs.c new file mode 100644 index 0000000..6c2f6dc --- /dev/null +++ b/src/cmph_structs.c @@ -0,0 +1,68 @@ +#include "cmph_structs.h" + +#include + +#define DEBUG +#include "debug.h" + +mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) +{ + mph_t *mph = (mph_t *)malloc(sizeof(mph_t)); + DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + if (mph == NULL) return NULL; + mph->algo = algo; + mph->key_source = key_source; + mph->verbosity = 0; + return mph; +} + +void __mph_destroy(mph_t *mph) +{ + free(mph); +} + +void __mphf_dump(mphf_t *mphf, FILE *fd) +{ + uint32 nsize = htonl(mphf->size); + fwrite(mph_names[mphf->algo], strlen(mph_names[mphf->algo]) + 1, 1, fd); + fwrite(&nsize, sizeof(mphf->size), 1, fd); +} +mphf_t *__mphf_load(FILE *f) +{ + mphf_t *mphf = NULL; + uint32 i; + char algo_name[BUFSIZ]; + char *ptr = algo_name; + MPH_ALGO algo = MPH_COUNT; + + DEBUGP("Loading mphf\n"); + while(1) + { + uint32 c = fread(ptr, 1, 1, f); + if (c != 1) return NULL; + if (*ptr == 0) break; + ++ptr; + } + for(i = 0; i < MPH_COUNT; ++i) + { + if (strcmp(algo_name, mph_names[i]) == 0) + { + algo = i; + } + } + if (algo == MPH_COUNT) + { + DEBUGP("Algorithm %s not found\n", algo_name); + return NULL; + } + mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf->algo = algo; + fread(&(mphf->size), sizeof(mphf->size), 1, f); + mphf->size = ntohl(mphf->size); + mphf->data = NULL; + DEBUGP("Algorithm is %s and mphf is sized %u\n", mph_names[algo], mphf->size); + + return mphf; +} + + diff --git a/src/cmph_structs.h b/src/cmph_structs.h new file mode 100644 index 0000000..9b1e634 --- /dev/null +++ b/src/cmph_structs.h @@ -0,0 +1,32 @@ +#ifndef __CMPH_STRUCTS_H__ +#define __CMPH_STRUCTS_H__ + +#include "cmph.h" + +/** Hash generation algorithm data + */ +struct __mph_t +{ + MPH_ALGO algo; + key_source_t *key_source; + uint32 verbosity; + void *data; //algorithm dependent data +}; + +/** Hash querying algorithm data + */ +struct __mphf_t +{ + MPH_ALGO algo; + uint32 size; + key_source_t *key_source; + void *data; //algorithm dependent data +}; + +mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source); +void __mph_destroy(); +void __mphf_dump(mphf_t *mphf, FILE *); +mphf_t *__mphf_load(FILE *f); + + +#endif diff --git a/src/cmph_types.h b/src/cmph_types.h new file mode 100644 index 0000000..84b6a22 --- /dev/null +++ b/src/cmph_types.h @@ -0,0 +1,13 @@ +#ifndef __CMPH_TYPES_H__ +#define __CMPH_TYPES_H__ + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; + +typedef enum { HASH_JENKINS, HASH_DJB2, HASH_SDBM, HASH_FNV, HASH_GLIB, HASH_PJW, HASH_COUNT } CMPH_HASH; +extern const char *hash_names[]; +typedef enum { MPH_CZECH, MPH_BMZ, MPH_COUNT } MPH_ALGO; /* included -- Fabiano */ +extern const char *mph_names[]; + +#endif diff --git a/src/czech.c b/src/czech.c new file mode 100644 index 0000000..d699e84 --- /dev/null +++ b/src/czech.c @@ -0,0 +1,320 @@ +#include "czech.h" +#include "cmph_structs.h" +#include "czech_structs.h" +#include "hash.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int czech_gen_edges(mph_t *mph); +static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v); + +mph_t *czech_mph_new(key_source_t *key_source) +{ + mph_t *mph = NULL; + czech_mph_data_t *czech = NULL; + mph = __mph_new(MPH_CZECH, key_source); + if (mph == NULL) return NULL; + czech = (czech_mph_data_t *)malloc(sizeof(czech_mph_data_t)); + if (czech == NULL) + { + __mph_destroy(mph); + return NULL; + } + czech->hashfuncs[0] = HASH_JENKINS; + czech->hashfuncs[1] = HASH_JENKINS; + czech->g = NULL; + czech->graph = NULL; + czech->hashes = NULL; + mph->data = czech; + assert(mph->data); + return mph; +} +void czech_mph_destroy(mph_t *mph) +{ + czech_mph_data_t *data = (czech_mph_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); + __mph_destroy(mph); +} + +void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +{ + czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + uint32 i = 0; + while(*hashptr != HASH_COUNT) + { + if (i >= 2) break; //czech only uses two hash functions + czech->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +mphf_t *czech_mph_create(mph_t *mph, float c) +{ + mphf_t *mphf = NULL; + czech_mphf_data_t *czechf = NULL; + + uint32 i; + uint32 iterations = 10; + char *visited = NULL; + czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + czech->m = mph->key_source->nkeys; + czech->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); + czech->graph = graph_new(czech->n, czech->m); + DEBUGP("Created graph\n"); + + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", czech->m, czech->n); + } + while(1) + { + int ok; + czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); + czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); + ok = czech_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(czech->hashes[0]); + czech->hashes[0] = NULL; + hash_state_destroy(czech->hashes[1]); + czech->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(czech->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(czech->n); + memset(visited, 0, czech->n); + free(czech->g); + czech->g = malloc(czech->n * sizeof(uint32)); + assert(czech->g); + for (i = 0; i < czech->n; ++i) + { + if (!visited[i]) + { + czech->g[i] = 0; + czech_traverse(czech, visited, i); + } + } + graph_destroy(czech->graph); + free(visited); + czech->graph = NULL; + + mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf->algo = mph->algo; + czechf = (czech_mphf_data_t *)malloc(sizeof(czech_mph_data_t)); + czechf->g = czech->g; + czech->g = NULL; //transfer memory ownership + czechf->hashes = czech->hashes; + czech->hashes = NULL; //transfer memory ownership + czechf->n = czech->n; + czechf->m = czech->m; + mphf->data = czechf; + mphf->size = czech->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(czech->graph, v); + uint32 neighbor = 0; + visited[v] = 1; + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(visited[neighbor]) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); + czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); + czech_traverse(czech, visited, neighbor); + } +} + +static int czech_gen_edges(mph_t *mph) +{ + uint32 e; + czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices\n", czech->n); + graph_clear_edges(czech->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + uint32 h1, h2; + uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(czech->hashes[0], key, keylen) % czech->n; + h2 = hash(czech->hashes[1], key, keylen) % czech->n; + if (h1 == h2) if (++h2 >= czech->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(czech->graph, h1, h2); + } + cycles = graph_is_cyclic(czech->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int czech_mphf_dump(mphf_t *mphf, FILE *fd) +{ + char *buf = NULL; + uint32 buflen; + uint32 nbuflen; + uint32 i; + uint32 two = htonl(2); //number of hash functions + czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + uint32 nn, nm; + __mphf_dump(mphf, fd); + + fwrite(&two, sizeof(uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + nn = htonl(data->n); + fwrite(&nn, sizeof(uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(uint32), 1, fd); + + for (i = 0; i < data->n; ++i) + { + uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(uint32), 1, fd); + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void czech_mphf_load(FILE *f, mphf_t *mphf) +{ + uint32 nhashes; + char fbuf[BUFSIZ]; + char *buf = NULL; + uint32 buflen; + uint32 i; + hash_state_t *state; + czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); + + DEBUGP("Loading czech mphf\n"); + mphf->data = czech; + fread(&nhashes, sizeof(uint32), 1, f); + nhashes = ntohl(nhashes); + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + czech->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(uint32), 1, f); + buflen = ntohl(buflen); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + czech->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(czech->n), sizeof(uint32), 1, f); + czech->n = ntohl(czech->n); + fread(&(czech->m), sizeof(uint32), 1, f); + czech->m = ntohl(czech->m); + + czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); + fread(czech->g, czech->n*sizeof(uint32), 1, f); + for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +{ + czech_mphf_data_t *czech = mphf->data; + uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; + uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > czech->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); + return (czech->g[h1] + czech->g[h2]) % czech->m; +} +void czech_mphf_destroy(mphf_t *mphf) +{ + czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/czech.h b/src/czech.h new file mode 100644 index 0000000..9bb758f --- /dev/null +++ b/src/czech.h @@ -0,0 +1,18 @@ +#ifndef __CZECH_H__ +#define __CZECH_H__ + +#include "graph.h" +#include "cmph.h" + +typedef struct __czech_mphf_data_t czech_mphf_data_t; +typedef struct __czech_mph_data_t czech_mph_data_t; + +mph_t *czech_mph_new(key_source_t *key_source); +void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); +void czech_mph_destroy(mph_t *mph); +mphf_t *czech_mph_create(mph_t *mph, float c); + +void czech_mphf_load(FILE *f, mphf_t *mphf); +int czech_mphf_dump(mphf_t *mphf, FILE *f); +uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +#endif diff --git a/src/czech_structs.h b/src/czech_structs.h new file mode 100644 index 0000000..3db81c8 --- /dev/null +++ b/src/czech_structs.h @@ -0,0 +1,24 @@ +#ifndef __CZECH_STRUCTS_H__ +#define __CZECH_STRUCTS_H__ + +#include "hash_state.h" + +struct __czech_mphf_data_t +{ + uint32 m; //edges (words) count + uint32 n; //vertex count + uint32 *g; + hash_state_t **hashes; +}; + +struct __czech_mph_data_t +{ + CMPH_HASH hashfuncs[2]; + uint32 m; //edges (words) count + uint32 n; //vertex count + graph_t *graph; + uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..49b564e --- /dev/null +++ b/src/debug.h @@ -0,0 +1,15 @@ +#ifndef __MY_DEBUGC__ +#define __MY_DEBUGC__ + +#ifdef __cplusplus +#include +#else +#include +#endif +#ifdef DEBUG +#define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) +#else +#define DEBUGP(args...) +#endif + +#endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c new file mode 100644 index 0000000..433452b --- /dev/null +++ b/src/djb2_hash.c @@ -0,0 +1,42 @@ +#include "djb2_hash.h" +#include + +djb2_state_t *djb2_state_new() +{ + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + state->hashfunc = HASH_DJB2; + return state; +} + +void djb2_state_destroy(djb2_state_t *state) +{ + free(state); +} + +uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) +{ + register unsigned int hash = 5381; + const unsigned char *ptr = k; + int i = 0; + while (i < keylen) + { + hash = hash*33 ^ *ptr; + ++ptr, ++i; + } + return hash; +} + + +void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +djb2_state_t *djb2_state_load(const char *buf, uint32 buflen) +{ + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + state->hashfunc = HASH_DJB2; + return state; +} diff --git a/src/djb2_hash.h b/src/djb2_hash.h new file mode 100644 index 0000000..0ea3998 --- /dev/null +++ b/src/djb2_hash.h @@ -0,0 +1,17 @@ +#ifndef __DJB2_HASH_H__ +#define __DJB2_HASH_H__ + +#include "hash.h" + +typedef struct __djb2_state_t +{ + CMPH_HASH hashfunc; +} djb2_state_t; + +djb2_state_t *djb2_state_new(); +uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen); +void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen); +djb2_state_t *djb2_state_load(const char *buf, uint32 buflen); +void djb2_state_destroy(djb2_state_t *state); + +#endif diff --git a/src/fnv_hash.c b/src/fnv_hash.c new file mode 100644 index 0000000..513fc56 --- /dev/null +++ b/src/fnv_hash.c @@ -0,0 +1,46 @@ +#include "fnv_hash.h" +#include + +fnv_state_t *fnv_state_new() +{ + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + state->hashfunc = HASH_FNV; + return state; +} + +void fnv_state_destroy(fnv_state_t *state) +{ + free(state); +} + +uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen) +{ + const unsigned char *bp = (const unsigned char *)k; + const unsigned char *be = bp + keylen; + static unsigned int hval = 0; + + while (bp < be) + { + + //hval *= 0x01000193; good for non-gcc compiler + hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); //good for gcc + + hval ^= *bp++; + } + return hval; +} + + +void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +fnv_state_t *fnv_state_load(const char *buf, uint32 buflen) +{ + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + state->hashfunc = HASH_FNV; + return state; +} diff --git a/src/fnv_hash.h b/src/fnv_hash.h new file mode 100644 index 0000000..a17717e --- /dev/null +++ b/src/fnv_hash.h @@ -0,0 +1,17 @@ +#ifndef __FNV_HASH_H__ +#define __FNV_HASH_H__ + +#include "hash.h" + +typedef struct __fnv_state_t +{ + CMPH_HASH hashfunc; +} fnv_state_t; + +fnv_state_t *fnv_state_new(); +uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen); +void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen); +fnv_state_t *fnv_state_load(const char *buf, uint32 buflen); +void fnv_state_destroy(fnv_state_t *state); + +#endif diff --git a/src/graph.c b/src/graph.c new file mode 100644 index 0000000..a2a927a --- /dev/null +++ b/src/graph.c @@ -0,0 +1,329 @@ +#include "graph.h" + +#include +#include +#include +#include +#include +#include "vstack.h" + +//#define DEBUG +#include "debug.h" + +#define abs_edge(e, i) (e % g->nedges + i * g->nedges) + +struct __graph_t +{ + uint32 nnodes; + uint32 nedges; + uint32 *edges; + uint32 *first; + uint32 *next; + uint8 *critical_nodes; /* included -- Fabiano*/ + uint32 ncritical_nodes; /* included -- Fabiano*/ + uint32 cedges; + int shrinking; +}; + +static uint32 EMPTY = UINT_MAX; + +graph_t *graph_new(uint32 nnodes, uint32 nedges) +{ + graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); + if (!graph) return NULL; + + graph->edges = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); + graph->next = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); + graph->first = (uint32 *)malloc(sizeof(uint32) * nnodes); + graph->critical_nodes = NULL; /* included -- Fabiano*/ + graph->ncritical_nodes = 0; /* included -- Fabiano*/ + graph->nnodes = nnodes; + graph->nedges = nedges; + + graph_clear_edges(graph); + return graph; +} + + +void graph_destroy(graph_t *graph) +{ + DEBUGP("Destroying graph\n"); + free(graph->edges); + free(graph->first); + free(graph->next); + free(graph->critical_nodes); /* included -- Fabiano*/ + free(graph); + return; +} + +void graph_print(graph_t *g) +{ + uint32 i, e; + for (i = 0; i < g->nnodes; ++i) + { + DEBUGP("Printing edges connected to %u\n", i); + e = g->first[i]; + if (e != EMPTY) + { + printf("%u -> %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + while ((e = g->next[e]) != EMPTY) + { + printf("%u -> %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + } + } + + } + return; +} + +void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) +{ + uint32 e = g->cedges; + + assert(v1 < g->nnodes); + assert(v2 < g->nnodes); + assert(e < g->nedges); + assert(!g->shrinking); + + g->next[e] = g->first[v1]; + g->first[v1] = e; + g->edges[e] = v2; + + g->next[e + g->nedges] = g->first[v2]; + g->first[v2] = e + g->nedges; + g->edges[e + g->nedges] = v1; + + ++(g->cedges); +} + +static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) +{ + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; + if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; + return 0; +} + +uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2) +{ + uint32 e; + e = g->first[v1]; + assert(e != EMPTY); + if (check_edge(g, e, v1, v2)) return abs_edge(e, 0); + do + { + e = g->next[e]; + assert(e != EMPTY); + } + while (!check_edge(g, e, v1, v2)); + return abs_edge(e, 0); +} +static void del_edge_point(graph_t *g, uint32 v1, uint32 v2) +{ + uint32 e, prev; + + DEBUGP("Deleting edge point %u %u\n", v1, v2); + e = g->first[v1]; + if (check_edge(g, e, v1, v2)) + { + g->first[v1] = g->next[e]; + //g->edges[e] = EMPTY; + DEBUGP("Deleted\n"); + return; + } + DEBUGP("Checking linked list\n"); + do + { + prev = e; + e = g->next[e]; + assert(e != EMPTY); + } + while (!check_edge(g, e, v1, v2)); + + g->next[prev] = g->next[e]; + //g->edges[e] = EMPTY; + DEBUGP("Deleted\n"); +} + + +void graph_del_edge(graph_t *g, uint32 v1, uint32 v2) +{ + g->shrinking = 1; + del_edge_point(g, v1, v2); + del_edge_point(g, v2, v1); +} + +void graph_clear_edges(graph_t *g) +{ + uint32 i; + for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; + for (i = 0; i < g->nedges*2; ++i) + { + g->edges[i] = EMPTY; + g->next[i] = EMPTY; + } + g->cedges = 0; + g->shrinking = 0; +} + +static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) +{ + uint32 edge = g->first[v]; + char found = 0; + DEBUGP("Checking degree of vertex %u\n", v); + if (edge == EMPTY) return 0; + else if (!deleted[abs_edge(edge, 0)]) + { + found = 1; + *e = edge; + } + while(1) + { + edge = g->next[edge]; + if (edge == EMPTY) break; + if (deleted[abs_edge(edge, 0)]) continue; + if (found) return 0; + DEBUGP("Found first edge\n"); + *e = edge; + found = 1; + } + return found; +} + +static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) +{ + + uint32 e; + char degree1; + uint32 v1 = v; + uint32 v2 = 0; + + degree1 = find_degree1_edge(g, v1, deleted, &e); + if (!degree1) return; + while(1) + { + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + deleted[abs_edge(e, 0)] = 1; + + v2 = g->edges[abs_edge(e, 0)]; + if (v2 == v1) v2 = g->edges[abs_edge(e, 1)]; + + DEBUGP("Checking if second endpoint %u has degree 1\n", v2); + degree1 = find_degree1_edge(g, v2, deleted, &e); + if (degree1) + { + DEBUGP("Inspecting vertex %u\n", v2); + v1 = v2; + } + else break; + } +} + +int graph_is_cyclic(graph_t *g) +{ + uint32 i; + uint32 v; + char *deleted = (char *)malloc(g->nedges*sizeof(char)); + memset(deleted, 0, g->nedges); + + DEBUGP("Looking for cycles in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); + for (v = 0; v < g->nnodes; ++v) + { + cyclic_del_edge(g, v, deleted); + } + for (i = 0; i < g->nedges; ++i) + { + if (!(deleted[i])) + { + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + free(deleted); + return 1; + } + } + free(deleted); + return 0; +} + +uint8 graph_node_is_critical(graph_t * g, uint32 v) /* included -- Fabiano */ +{ + return g->critical_nodes[v]; +} + +void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ +{ + uint32 i; + uint32 v; + char *deleted = (char *)malloc(g->nedges*sizeof(char)); + memset(deleted, 0, g->nedges); +/* g->critical_nodes = (uint8 *)malloc((size_t)(ceil(g->nnodes*sizeof(uint8)/8.))); */ + g->critical_nodes = (uint8 *)malloc(g->nnodes*sizeof(uint8)); + g->ncritical_nodes = 0; + DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); + for (v = 0; v < g->nnodes; ++v) + { + cyclic_del_edge(g, v, deleted); + } + + for (i = 0; i < g->nedges; ++i) + { + if (!(deleted[i])) + { + DEBUGP("Edge %u %u->%u belongs to the 2-core\n", i, g->edges[i], g->edges[i + g->nedges]); + if(!(g->critical_nodes[g->edges[i]])) + { + g->ncritical_nodes ++; + g->critical_nodes[g->edges[i]] = 1; + } + if(!(g->critical_nodes[g->edges[i + g->nedges]])) + { + g->ncritical_nodes ++; + g->critical_nodes[g->edges[i + g->nedges]] = 1; + } + } + } + free(deleted); +} + +uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2) /* included -- Fabiano*/ +{ + uint32 e; + e = g->first[v1]; + if(e == EMPTY) return 0; + if (check_edge(g, e, v1, v2)) return 1; + do + { + e = g->next[e]; + if(e == EMPTY) return 0; + } + while (!check_edge(g, e, v1, v2)); + return 1; +} + +uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id) /* included -- Fabiano*/ +{ + return (g->edges[e + id*g->nedges]); +} + +uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ +{ + return g->ncritical_nodes; +} + +graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v) +{ + graph_iterator_t it; + it.vertex = v; + it.edge = g->first[v]; + return it; +} +uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) +{ + uint32 ret; + if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; + if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; + else ret = g->edges[it->edge]; + it->edge = g->next[it->edge]; + return ret; +} + + diff --git a/src/graph.h b/src/graph.h new file mode 100644 index 0000000..c512746 --- /dev/null +++ b/src/graph.h @@ -0,0 +1,39 @@ +#ifndef _CMPH_GRAPH_H__ +#define _CMPH_GRAPH_H__ + +#include +#include "cmph_types.h" + +#define GRAPH_NO_NEIGHBOR UINT_MAX + +typedef struct __graph_t graph_t; +typedef struct __graph_iterator_t graph_iterator_t; +struct __graph_iterator_t +{ + uint32 vertex; + uint32 edge; +}; + + + +graph_t *graph_new(uint32 nnodes, uint32 nedges); +void graph_destroy(graph_t *graph); + +void graph_add_edge(graph_t *g, uint32 v1, uint32 v2); +//void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); +void graph_clear_edges(graph_t *g); +uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2); + +graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v); +uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); + +void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ +uint8 graph_node_is_critical(graph_t * g, uint32 v); /* included -- Fabiano */ +uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ +uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id); /* included -- Fabiano*/ + +int graph_is_cyclic(graph_t *g); + +void graph_print(graph_t *); + +#endif diff --git a/src/hash.c b/src/hash.c new file mode 100644 index 0000000..896c9fb --- /dev/null +++ b/src/hash.c @@ -0,0 +1,139 @@ +#include "hash_state.h" +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +const char *hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; + +hash_state_t *hash_state_new(CMPH_HASH hashfunc, uint32 hashsize) +{ + hash_state_t *state = NULL; + switch (hashfunc) + { + case HASH_JENKINS: + DEBUGP("Jenkins function - %u\n", hashsize); + state = (hash_state_t *)jenkins_state_new(hashsize); + DEBUGP("Jenkins function created\n"); + break; + case HASH_DJB2: + state = (hash_state_t *)djb2_state_new(); + break; + case HASH_SDBM: + state = (hash_state_t *)sdbm_state_new(); + break; + case HASH_FNV: + state = (hash_state_t *)fnv_state_new(); + break; + default: + assert(0); + } + state->hashfunc = hashfunc; + return state; +} +uint32 hash(hash_state_t *state, const char *key, uint32 keylen) +{ + switch (state->hashfunc) + { + case HASH_JENKINS: + return jenkins_hash((jenkins_state_t *)state, key, keylen); + case HASH_DJB2: + return djb2_hash((djb2_state_t *)state, key, keylen); + case HASH_SDBM: + return sdbm_hash((sdbm_state_t *)state, key, keylen); + case HASH_FNV: + return fnv_hash((fnv_state_t *)state, key, keylen); + default: + assert(0); + } + assert(0); + return 0; +} + +void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen) +{ + char *algobuf; + switch (state->hashfunc) + { + case HASH_JENKINS: + jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + case HASH_DJB2: + djb2_state_dump((djb2_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + case HASH_SDBM: + sdbm_state_dump((sdbm_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + case HASH_FNV: + fnv_state_dump((fnv_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + default: + assert(0); + } + *buf = malloc(strlen(hash_names[state->hashfunc]) + 1 + *buflen); + memcpy(*buf, hash_names[state->hashfunc], strlen(hash_names[state->hashfunc]) + 1); + DEBUGP("Algobuf is %u\n", *(uint32 *)algobuf); + memcpy(*buf + strlen(hash_names[state->hashfunc]) + 1, algobuf, *buflen); + *buflen = strlen(hash_names[state->hashfunc]) + 1 + *buflen; + free(algobuf); + return; +} + +hash_state_t *hash_state_load(const char *buf, uint32 buflen) +{ + uint32 i; + uint32 offset; + CMPH_HASH hashfunc = HASH_COUNT; + for (i = 0; i < HASH_COUNT; ++i) + { + if (strcmp(buf, hash_names[i]) == 0) + { + hashfunc = i; + break; + } + } + if (hashfunc == HASH_COUNT) return NULL; + offset = strlen(hash_names[hashfunc]) + 1; + switch (hashfunc) + { + case HASH_JENKINS: + return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); + case HASH_DJB2: + return (hash_state_t *)djb2_state_load(buf + offset, buflen - offset); + case HASH_SDBM: + return (hash_state_t *)sdbm_state_load(buf + offset, buflen - offset); + case HASH_FNV: + return (hash_state_t *)fnv_state_load(buf + offset, buflen - offset); + default: + return NULL; + } + return NULL; +} +void hash_state_destroy(hash_state_t *state) +{ + switch (state->hashfunc) + { + case HASH_JENKINS: + jenkins_state_destroy((jenkins_state_t *)state); + break; + case HASH_DJB2: + djb2_state_destroy((djb2_state_t *)state); + break; + case HASH_SDBM: + sdbm_state_destroy((sdbm_state_t *)state); + break; + case HASH_FNV: + fnv_state_destroy((fnv_state_t *)state); + break; + default: + assert(0); + } + return; +} diff --git a/src/hash.h b/src/hash.h new file mode 100644 index 0000000..90b8e37 --- /dev/null +++ b/src/hash.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_HASH_H__ +#define __CMPH_HASH_H__ + +#include "cmph_types.h" + +typedef union __hash_state_t hash_state_t; + +hash_state_t *hash_state_new(CMPH_HASH, uint32 hashsize); +uint32 hash(hash_state_t *state, const char *key, uint32 keylen); +void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen); +hash_state_t *hash_state_load(const char *buf, uint32 buflen); +void hash_state_destroy(hash_state_t *state); + +#endif diff --git a/src/hash_state.h b/src/hash_state.h new file mode 100644 index 0000000..67dcd77 --- /dev/null +++ b/src/hash_state.h @@ -0,0 +1,18 @@ +#ifndef __HASH_STATE_H__ +#define __HASH_STATE_H__ + +#include "hash.h" +#include "jenkins_hash.h" +#include "djb2_hash.h" +#include "sdbm_hash.h" +#include "fnv_hash.h" +union __hash_state_t +{ + CMPH_HASH hashfunc; + jenkins_state_t jenkins; + djb2_state_t djb2; + sdbm_state_t sdbm; + fnv_state_t fnv; +}; + +#endif diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c new file mode 100644 index 0000000..65ab7f3 --- /dev/null +++ b/src/jenkins_hash.c @@ -0,0 +1,191 @@ +#include "jenkins_hash.h" +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +#define hashsize(n) ((uint32)1<<(n)) +#define hashmask(n) (hashsize(n)-1) + + + +//#define NM2 /* Define this if you do not want power of 2 table sizes*/ + + +/* + -------------------------------------------------------------------- + mix -- mix 3 32-bit values reversibly. + For every delta with one or two bits set, and the deltas of all three + high bits or all three low bits, whether the original value of a,b,c + is almost all zero or is uniformly distributed, + * If mix() is run forward or backward, at least 32 bits in a,b,c + have at least 1/4 probability of changing. + * If mix() is run forward, every bit of c will change between 1/3 and + 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) + mix() was built out of 36 single-cycle latency instructions in a + structure that could supported 2x parallelism, like so: + a -= b; + a -= c; x = (c>>13); + b -= c; a ^= x; + b -= a; x = (a<<8); + c -= a; b ^= x; + c -= b; x = (b>>13); + ... + Unfortunately, superscalar Pentiums and Sparcs can't take advantage + of that parallelism. They've also turned some of those single-cycle + latency instructions into multi-cycle latency instructions. Still, + this is the fastest good hash I could find. There were about 2^^68 + to choose from. I only looked at a billion or so. + -------------------------------------------------------------------- + */ +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<<8); \ + c -= a; c -= b; c ^= (b>>13); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<16); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>3); \ + b -= c; b -= a; b ^= (a<<10); \ + c -= a; c -= b; c ^= (b>>15); \ +} + +/* + -------------------------------------------------------------------- + hash() -- hash a variable-length key into a 32-bit value +k : the key (the unaligned variable-length array of bytes) +len : the length of the key, counting by bytes +initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Every 1-bit and 2-bit delta achieves avalanche. +About 6*len+35 instructions. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do +h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8 **)k, do it like this: +for (i=0, h=0; iseed = rand() % size; + state->nbits = ceil(log(size)/M_LOG2E); + state->size = size; + DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); + return state; +} +void jenkins_state_destroy(jenkins_state_t *state) +{ + free(state); +} + +uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) +{ + uint32 a, b, c; + uint32 len, length; + + /* Set up the internal state */ + length = keylen; + len = length; + a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + c = state->seed; /* the previous hash value - seed in our case */ + + /*---------------------------------------- handle most of the key */ + while (len >= 12) + { + a += (k[0] +((uint32)k[1]<<8) +((uint32)k[2]<<16) +((uint32)k[3]<<24)); + b += (k[4] +((uint32)k[5]<<8) +((uint32)k[6]<<16) +((uint32)k[7]<<24)); + c += (k[8] +((uint32)k[9]<<8) +((uint32)k[10]<<16)+((uint32)k[11]<<24)); + mix(a,b,c); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + c += length; + switch(len) /* all the case statements fall through */ + { + case 11: + c +=((uint32)k[10]<<24); + case 10: + c +=((uint32)k[9]<<16); + case 9 : + c +=((uint32)k[8]<<8); + /* the first byte of c is reserved for the length */ + case 8 : + b +=((uint32)k[7]<<24); + case 7 : + b +=((uint32)k[6]<<16); + case 6 : + b +=((uint32)k[5]<<8); + case 5 : + b +=k[4]; + case 4 : + a +=((uint32)k[3]<<24); + case 3 : + a +=((uint32)k[2]<<16); + case 2 : + a +=((uint32)k[1]<<8); + case 1 : + a +=k[0]; + /* case 0: nothing left to add */ + } + + mix(a,b,c); + + /*-------------------------------------------- report the result */ + + //c = (c & hashmask(state->size)); + //c = (c >= state->size) ? c ^ state->size: c; + + //state->last_hash = c; Do not update last_hash because we use a fixed + //seed + return c; +} + +void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) +{ + uint32 nseed = htonl(state->seed); + uint32 nnbits = htonl(state->nbits); + uint32 nsize = htonl(state->size); + *buflen = sizeof(uint32)*3; + *buf = malloc(*buflen); + if (!*buf) + { + *buflen = UINT_MAX; + return; + } + memcpy(*buf, &nseed, sizeof(uint32)); + memcpy(*buf + sizeof(uint32), &nnbits, sizeof(uint32)); + memcpy(*buf + sizeof(uint32)*2, &nsize, sizeof(uint32)); + DEBUGP("Dumped jenkins state with seed %u\n", state->seed); + + return; +} +jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen) +{ + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + state->seed = ntohl(*(uint32 *)buf); + state->nbits = ntohl(*(((uint32 *)buf) + 1)); + state->size = ntohl(*(((uint32 *)buf) + 2)); + state->hashfunc = HASH_JENKINS; + DEBUGP("Loaded jenkins state with seed %u\n", state->seed); + return state; +} diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h new file mode 100644 index 0000000..1a84080 --- /dev/null +++ b/src/jenkins_hash.h @@ -0,0 +1,20 @@ +#ifndef __JEKINS_HASH_H__ +#define __JEKINS_HASH_H__ + +#include "hash.h" + +typedef struct __jenkins_state_t +{ + CMPH_HASH hashfunc; + uint32 seed; + uint32 nbits; + uint32 size; +} jenkins_state_t; + +jenkins_state_t *jenkins_state_new(uint32 size); //size of hash table +uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen); +void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen); +jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen); +void jenkins_state_destroy(jenkins_state_t *state); + +#endif diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..bab4c97 --- /dev/null +++ b/src/main.c @@ -0,0 +1,282 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "cmph.h" +#include "hash.h" +#include "../config.h" + +void usage(const char *prg) +{ + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); +} +void usage_long(const char *prg) +{ + uint32 i; + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "Minimum perfect hashing tool\n\n"); + fprintf(stderr, " -h\t print this help message\n"); + fprintf(stderr, " -a\t algorithm - valid values are\n"); + for (i = 0; i < MPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", mph_names[i]); + fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); + for (i = 0; i < HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", hash_names[i]); + fprintf(stderr, " -V\t print version number and exit\n"); + fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); + fprintf(stderr, " -g\t generation mode\n"); + fprintf(stderr, " -s\t random seed\n"); + fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " keysfile\t line separated file with keys\n"); +} + +static int key_read(void *data, char **key, uint32 *keylen) +{ + FILE *fd = (FILE *)data; + *key = NULL; + *keylen = 0; + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (c == NULL) return -1; + if (feof(fd)) return -1; + *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); + memcpy(*key + *keylen, buf, strlen(buf)); + *keylen += strlen(buf); + if (buf[strlen(buf) - 1] != '\n') continue; + break; + } + if ((*keylen) && (*key)[*keylen - 1] == '\n') + { + (*key)[(*keylen) - 1] = 0; + --(*keylen); + } + return *keylen; +} + +static void key_dispose(void *data, char *key, uint32 keylen) +{ + free(key); +} +static void key_rewind(void *data) +{ + FILE *fd = (FILE *)data; + rewind(fd); +} + +static uint32 count_keys(FILE *fd) +{ + uint32 count = 0; + rewind(fd); + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (feof(fd)) break; + if (buf[strlen(buf) - 1] != '\n') continue; + ++count; + } + rewind(fd); + return count; +} + +int main(int argc, char **argv) +{ + char verbosity = 0; + char generate = 0; + char *mphf_file = NULL; + FILE *mphf_fd = stdout; + const char *keys_file = NULL; + FILE *keys_fd; + uint32 seed = UINT_MAX; + CMPH_HASH *hashes = NULL; + uint32 nhashes = 0; + uint32 i; + MPH_ALGO mph_algo = MPH_CZECH; + mph_t *mph = NULL; + mphf_t *mphf = NULL; + + key_source_t source; + + while (1) + { + char c = getopt(argc, argv, "hVva:f:gm:s:"); + if (c == -1) break; + switch (c) + { + case 's': + { + char *cptr; + seed = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid seed %s\n", optarg); + exit(1); + } + } + break; + case 'g': + generate = 1; + break; + case 'm': + mphf_file = strdup(optarg); + break; + case 'v': + ++verbosity; + break; + case 'V': + printf("%s\n", VERSION); + return 0; + case 'h': + usage_long(argv[0]); + return 0; + case 'a': + { + char valid = 0; + for (i = 0; i < MPH_COUNT; ++i) + { + if (strcmp(mph_names[i], optarg) == 0) + { + mph_algo = i; + valid = 1; + break; + } + } + if (!valid) + { + fprintf(stderr, "Invalid mph algorithm: %s\n", optarg); + return -1; + } + } + break; + case 'f': + { + char valid = 0; + for (i = 0; i < HASH_COUNT; ++i) + { + if (strcmp(hash_names[i], optarg) == 0) + { + hashes = (CMPH_HASH *)realloc(hashes, sizeof(CMPH_HASH) * ( nhashes + 2 )); + hashes[nhashes] = i; + hashes[nhashes + 1] = HASH_COUNT; + ++nhashes; + valid = 1; + break; + } + } + if (!valid) + { + fprintf(stderr, "Invalid hash function: %s\n", optarg); + return -1; + } + } + break; + default: + usage(argv[0]); + return 1; + } + } + + if (optind != argc - 1) + { + usage(argv[0]); + return 1; + } + keys_file = argv[optind]; + if (seed == UINT_MAX) seed = time(NULL); + srand(seed); + + if (mphf_file == NULL) + { + mphf_file = (char *)malloc(strlen(keys_file) + 5); + memcpy(mphf_file, keys_file, strlen(keys_file)); + memcpy(mphf_file + strlen(keys_file), ".mph\0", 5); + } + + keys_fd = fopen(keys_file, "r"); + if (keys_fd == NULL) + { + fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); + return -1; + } + + source.data = (void *)keys_fd; + source.nkeys = count_keys(keys_fd); + source.read = key_read; + source.dispose = key_dispose; + source.rewind = key_rewind; + + if (generate) + { + //Create mphf + + mph = mph_new(mph_algo, &source); + if (nhashes) mph_set_hashfuncs(mph, hashes); + mph_set_verbosity(mph, verbosity); + mphf = mph_create(mph); + + if (mphf == NULL) + { + fprintf(stderr, "Unable to create minimum perfect hashing function\n"); + mph_destroy(mph); + free(mphf_file); + return -1; + } + + mphf_fd = fopen(mphf_file, "w"); + if (mphf_fd == NULL) + { + fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); + free(mphf_file); + return -1; + } + mphf_dump(mphf, mphf_fd); + mphf_destroy(mphf); + fclose(mphf_fd); + } + else + { + uint8 * hashtable = NULL; + mphf_fd = fopen(mphf_file, "r"); + if (mphf_fd == NULL) + { + fprintf(stderr, "Unable to open input file %s: %s\n", mphf_file, strerror(errno)); + free(mphf_file); + return -1; + } + mphf = mphf_load(mphf_fd); + fclose(mphf_fd); + if (!mphf) + { + fprintf(stderr, "Unable to parser input file %s\n", mphf_file); + free(mphf_file); + return -1; + } + hashtable = (uint8*)malloc(source.nkeys*sizeof(uint8)); + memset(hashtable, 0, source.nkeys); + //check all keys + for (i = 0; i < source.nkeys; ++i) + { + uint32 h; + char *buf; + uint32 buflen = 0; + source.read(source.data, &buf, &buflen); + h = mphf_search(mphf, buf, buflen); + if(hashtable[h])fprintf(stderr, "collision: %u\n",h); + assert(hashtable[h]==0); + hashtable[h] = 1; + if (verbosity) + { + printf("%s -> %u\n", buf, h); + } + source.dispose(source.data, buf, buflen); + } + mphf_destroy(mphf); + free(hashtable); + } + fclose(keys_fd); + free(mphf_file); + return 0; +} diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c new file mode 100644 index 0000000..391d912 --- /dev/null +++ b/src/sdbm_hash.c @@ -0,0 +1,42 @@ +#include "sdbm_hash.h" +#include + +sdbm_state_t *sdbm_state_new() +{ + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + state->hashfunc = HASH_SDBM; + return state; +} + +void sdbm_state_destroy(sdbm_state_t *state) +{ + free(state); +} + +uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) +{ + register unsigned int hash = 0; + const unsigned char *ptr = k; + int i = 0; + + while(i < keylen) { + hash = *ptr + (hash << 6) + (hash << 16) - hash; + ++ptr, ++i; + } + return hash; +} + + +void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen) +{ + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + state->hashfunc = HASH_SDBM; + return state; +} diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h new file mode 100644 index 0000000..9e27f0f --- /dev/null +++ b/src/sdbm_hash.h @@ -0,0 +1,17 @@ +#ifndef __SDBM_HASH_H__ +#define __SDBM_HASH_H__ + +#include "hash.h" + +typedef struct __sdbm_state_t +{ + CMPH_HASH hashfunc; +} sdbm_state_t; + +sdbm_state_t *sdbm_state_new(); +uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen); +void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen); +sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen); +void sdbm_state_destroy(sdbm_state_t *state); + +#endif diff --git a/src/vqueue.c b/src/vqueue.c new file mode 100644 index 0000000..af07e0a --- /dev/null +++ b/src/vqueue.c @@ -0,0 +1,49 @@ +#include "vqueue.h" +#include +#include +struct __vqueue_t +{ + uint32 * values; + uint32 beg, end, capacity; +}; + +vqueue_t * vqueue_new(uint32 capacity) +{ + vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); + assert(q); + q->values = (uint32 *)calloc(capacity+1, sizeof(uint32)); + q->beg = q->end = 0; + q->capacity = capacity+1; + return q; +} + +uint8 vqueue_is_empty(vqueue_t * q) +{ + return (q->beg == q->end); +} + +void vqueue_insert(vqueue_t * q, uint32 val) +{ + assert((q->end + 1)%q->capacity != q->beg); // Is queue full? + q->end = (q->end + 1)%q->capacity; + q->values[q->end] = val; +} + +uint32 vqueue_remove(vqueue_t * q) +{ + assert(!vqueue_is_empty(q)); // Is queue empty? + q->beg = (q->beg + 1)%q->capacity; + return q->values[q->beg]; +} + +void vqueue_print(vqueue_t * q) +{ + uint32 i; + for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) + fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); +} + +void vqueue_destroy(vqueue_t *q) +{ + free(q->values); q->values = NULL; +} diff --git a/src/vqueue.h b/src/vqueue.h new file mode 100644 index 0000000..cd870bb --- /dev/null +++ b/src/vqueue.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_VQUEUE_H__ +#define __CMPH_VQUEUE_H__ + +#include "cmph_types.h" +typedef struct __vqueue_t vqueue_t; + +vqueue_t * vqueue_new(uint32 capacity); + +uint8 vqueue_is_empty(vqueue_t * q); + +void vqueue_insert(vqueue_t * q, uint32 val); + +uint32 vqueue_remove(vqueue_t * q); + +void vqueue_print(vqueue_t * q); + +void vqueue_destroy(vqueue_t * q); +#endif diff --git a/src/vstack.c b/src/vstack.c new file mode 100644 index 0000000..67b2945 --- /dev/null +++ b/src/vstack.c @@ -0,0 +1,79 @@ +#include "vstack.h" + +#include +#include + +//#define DEBUG +#include "debug.h" + +struct __vstack_t +{ + uint32 pointer; + uint32 *values; + uint32 capacity; +}; + +vstack_t *vstack_new() +{ + vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); + assert(stack); + stack->pointer = 0; + stack->values = NULL; + stack->capacity = 0; + return stack; +} + +void vstack_destroy(vstack_t *stack) +{ + assert(stack); + free(stack->values); + free(stack); +} + +void vstack_push(vstack_t *stack, uint32 val) +{ + assert(stack); + vstack_reserve(stack, stack->pointer + 1); + stack->values[stack->pointer] = val; + ++(stack->pointer); +} +void vstack_pop(vstack_t *stack) +{ + assert(stack); + assert(stack->pointer > 0); + --(stack->pointer); +} + +uint32 vstack_top(vstack_t *stack) +{ + assert(stack); + assert(stack->pointer > 0); + return stack->values[(stack->pointer - 1)]; +} +int vstack_empty(vstack_t *stack) +{ + assert(stack); + return stack->pointer == 0; +} +uint32 vstack_size(vstack_t *stack) +{ + return stack->pointer; +} +void vstack_reserve(vstack_t *stack, uint32 size) +{ + assert(stack); + if (stack->capacity < size) + { + uint32 new_capacity = stack->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + stack->values = (uint32 *)realloc(stack->values, sizeof(uint32)*new_capacity); + assert(stack->values); + stack->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + diff --git a/src/vstack.h b/src/vstack.h new file mode 100644 index 0000000..85893c4 --- /dev/null +++ b/src/vstack.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_VSTACK_H__ +#define __CMPH_VSTACK_H__ + +#include "cmph_types.h" +typedef struct __vstack_t vstack_t; + +vstack_t *vstack_new(); +void vstack_destroy(vstack_t *stack); + +void vstack_push(vstack_t *stack, uint32 val); +uint32 vstack_top(vstack_t *stack); +void vstack_pop(vstack_t *stack); +int vstack_empty(vstack_t *stack); +uint32 vstack_size(vstack_t *stack); + +void vstack_reserve(vstack_t *stack, uint32 size); + +#endif diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..50cfcd6 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,4 @@ +noinst_PROGRAMS = graph_tests + +graph_tests_SOURCES = graph_tests.c +graph_tests_LDADD = ../src/libcmph.la diff --git a/tests/graph_tests.c b/tests/graph_tests.c new file mode 100644 index 0000000..35476aa --- /dev/null +++ b/tests/graph_tests.c @@ -0,0 +1,67 @@ +#include "../src/graph.h" + +#define DEBUG +#include "../src/debug.h" + +int main(int argc, char **argv) +{ + graph_iterator_t it; + uint32 i, neighbor; + graph_t *g = graph_new(5, 10); + + fprintf(stderr, "Building random graph\n"); + for (i = 0; i < 10; ++i) + { + uint32 v1 = i % 5; + uint32 v2 = (i*2) % 5; + if (v1 == v2) continue; + graph_add_edge(g, v1, v2); + DEBUGP("Added edge %u %u\n", v1, v2); + } + graph_print(g); + graph_del_edge(g, 4, 3); + graph_print(g); + graph_clear_edges(g); + graph_print(g); + graph_destroy(g); + + fprintf(stderr, "Building cyclic graph\n"); + g = graph_new(4, 5); + graph_add_edge(g, 0, 3); + graph_add_edge(g, 0, 1); + graph_add_edge(g, 1, 2); + graph_add_edge(g, 2, 0); + if (!graph_is_cyclic(g)) + { + return 1; + } + graph_destroy(g); + + fprintf(stderr, "Building non-cyclic graph\n"); + g = graph_new(5, 4); + graph_add_edge(g, 0, 1); + graph_add_edge(g, 1, 2); + graph_add_edge(g, 2, 3); + graph_add_edge(g, 3, 4); + + if (graph_is_cyclic(g)) + { + return 1; + } + + fprintf(stderr, "Checking neighbors iterator\n"); + it = graph_neighbors_it(g, 1); + neighbor = graph_next_neighbor(g, &it); + DEBUGP("Neighbor is %u\n", neighbor); + if (neighbor != 0 && neighbor != 2) return 1; + neighbor = graph_next_neighbor(g, &it); + DEBUGP("Neighbor is %u\n", neighbor); + if (neighbor != 0 && neighbor != 2) return 1; + neighbor = graph_next_neighbor(g, &it); + DEBUGP("Neighbor is %u\n", neighbor); + if (neighbor != GRAPH_NO_NEIGHBOR) return 1; + + + graph_destroy(g); + return 0; +} From bda9c466182c5917c12405e834c5e3967a7692a9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Jan 2005 20:47:21 +0000 Subject: [PATCH 003/739] using less space to store the used_edges and critical_nodes arrays --- src/bmz.c | 26 +++++++++++++++++--------- src/graph.c | 36 ++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 61a1b5b..c0bfd0c 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -16,10 +16,16 @@ static uint32 UNDEFINED = UINT_MAX; +static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + static int bmz_gen_edges(mph_t *mph); static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges); static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges); + mph_t *bmz_mph_new(key_source_t *key_source) { mph_t *mph = NULL; @@ -70,7 +76,6 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) uint32 i; uint32 iterations = 10; uint8 *used_edges = NULL; - uint32 unused_edge_index = 0; uint32 biggest_g_value = 0; uint32 biggest_edge_value = 1; DEBUGP("bmz_c: %f\n", bmz_c); @@ -131,12 +136,13 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) // Searching step if (mph->verbosity) { - fprintf(stderr, "Starting Searching step\n"); + fprintf(stderr, "Starting Searching step.\n"); fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - used_edges = (uint8 *)malloc(bmz->m*sizeof(uint8)); - memset(used_edges, 0, bmz->m); + + used_edges = (uint8 *)malloc((bmz->m*sizeof(uint8))/8 + 1); + memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); bmz->g = malloc(bmz->n * sizeof(uint32)); assert(bmz->g); @@ -211,7 +217,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) { assert(next_g + bmz->g[lav] < bmz->m); - if (used_edges[next_g + bmz->g[lav]]) + if (GETBIT(used_edges, next_g + bmz->g[lav])) { collision = 1; break; @@ -226,7 +232,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * { if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) { - used_edges[next_g + bmz->g[lav]] = 1; + SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; } } @@ -245,7 +251,7 @@ static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 u while(1) { assert(unused_edge_index < bmz->m); - if(used_edges[unused_edge_index]) unused_edge_index ++; + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; else break; } return unused_edge_index; @@ -259,16 +265,18 @@ static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint { DEBUGP("Visiting neighbor %u\n", neighbor); if(bmz->g[neighbor] != UNDEFINED) continue; - *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index + 1); + *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index); + } } static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges) { - uint32 i, v1, v2, unused_edge_index = -1; + uint32 i, v1, v2, unused_edge_index = 0; DEBUGP("Labelling non critical vertices\n"); for(i = 0; i < bmz->m; i++) { diff --git a/src/graph.c b/src/graph.c index a2a927a..00b3fca 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,6 +10,11 @@ //#define DEBUG #include "debug.h" +static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + #define abs_edge(e, i) (e % g->nedges + i * g->nedges) struct __graph_t @@ -172,7 +177,7 @@ static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) char found = 0; DEBUGP("Checking degree of vertex %u\n", v); if (edge == EMPTY) return 0; - else if (!deleted[abs_edge(edge, 0)]) + else if (!(GETBIT(deleted, abs_edge(edge, 0)))) { found = 1; *e = edge; @@ -181,7 +186,7 @@ static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) { edge = g->next[edge]; if (edge == EMPTY) break; - if (deleted[abs_edge(edge, 0)]) continue; + if (GETBIT(deleted, abs_edge(edge, 0))) continue; if (found) return 0; DEBUGP("Found first edge\n"); *e = edge; @@ -203,7 +208,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) while(1) { DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); - deleted[abs_edge(e, 0)] = 1; + SETBIT(deleted, abs_edge(e, 0)); v2 = g->edges[abs_edge(e, 0)]; if (v2 == v1) v2 = g->edges[abs_edge(e, 1)]; @@ -223,8 +228,8 @@ int graph_is_cyclic(graph_t *g) { uint32 i; uint32 v; - char *deleted = (char *)malloc(g->nedges*sizeof(char)); - memset(deleted, 0, g->nedges); + char *deleted = (char *)malloc((g->nedges*sizeof(char))/8 + 1); + memset(deleted, 0, g->nedges/8 + 1); DEBUGP("Looking for cycles in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) @@ -233,7 +238,7 @@ int graph_is_cyclic(graph_t *g) } for (i = 0; i < g->nedges; ++i) { - if (!(deleted[i])) + if (!(GETBIT(deleted, i))) { DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); free(deleted); @@ -246,17 +251,16 @@ int graph_is_cyclic(graph_t *g) uint8 graph_node_is_critical(graph_t * g, uint32 v) /* included -- Fabiano */ { - return g->critical_nodes[v]; + return GETBIT(g->critical_nodes,v); } void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ { uint32 i; uint32 v; - char *deleted = (char *)malloc(g->nedges*sizeof(char)); - memset(deleted, 0, g->nedges); -/* g->critical_nodes = (uint8 *)malloc((size_t)(ceil(g->nnodes*sizeof(uint8)/8.))); */ - g->critical_nodes = (uint8 *)malloc(g->nnodes*sizeof(uint8)); + char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); + memset(deleted, 0, g->nedges/8 + 1); + g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); g->ncritical_nodes = 0; DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) @@ -266,18 +270,18 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ for (i = 0; i < g->nedges; ++i) { - if (!(deleted[i])) + if (!(GETBIT(deleted,i))) { DEBUGP("Edge %u %u->%u belongs to the 2-core\n", i, g->edges[i], g->edges[i + g->nedges]); - if(!(g->critical_nodes[g->edges[i]])) + if(!(GETBIT(g->critical_nodes,g->edges[i]))) { g->ncritical_nodes ++; - g->critical_nodes[g->edges[i]] = 1; + SETBIT(g->critical_nodes,g->edges[i]); } - if(!(g->critical_nodes[g->edges[i + g->nedges]])) + if(!(GETBIT(g->critical_nodes,g->edges[i + g->nedges]))) { g->ncritical_nodes ++; - g->critical_nodes[g->edges[i + g->nedges]] = 1; + SETBIT(g->critical_nodes,g->edges[i + g->nedges]); } } } From 77ce0aaddf44c2adcbc75fb56b52b972e1622abe Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Jan 2005 20:47:21 +0000 Subject: [PATCH 004/739] using less space to store the used_edges and critical_nodes arrays --- src/bmz.c | 26 +++++++++++++++++--------- src/graph.c | 36 ++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 61a1b5b..c0bfd0c 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -16,10 +16,16 @@ static uint32 UNDEFINED = UINT_MAX; +static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + static int bmz_gen_edges(mph_t *mph); static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges); static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges); + mph_t *bmz_mph_new(key_source_t *key_source) { mph_t *mph = NULL; @@ -70,7 +76,6 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) uint32 i; uint32 iterations = 10; uint8 *used_edges = NULL; - uint32 unused_edge_index = 0; uint32 biggest_g_value = 0; uint32 biggest_edge_value = 1; DEBUGP("bmz_c: %f\n", bmz_c); @@ -131,12 +136,13 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) // Searching step if (mph->verbosity) { - fprintf(stderr, "Starting Searching step\n"); + fprintf(stderr, "Starting Searching step.\n"); fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - used_edges = (uint8 *)malloc(bmz->m*sizeof(uint8)); - memset(used_edges, 0, bmz->m); + + used_edges = (uint8 *)malloc((bmz->m*sizeof(uint8))/8 + 1); + memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); bmz->g = malloc(bmz->n * sizeof(uint32)); assert(bmz->g); @@ -211,7 +217,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) { assert(next_g + bmz->g[lav] < bmz->m); - if (used_edges[next_g + bmz->g[lav]]) + if (GETBIT(used_edges, next_g + bmz->g[lav])) { collision = 1; break; @@ -226,7 +232,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * { if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) { - used_edges[next_g + bmz->g[lav]] = 1; + SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; } } @@ -245,7 +251,7 @@ static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 u while(1) { assert(unused_edge_index < bmz->m); - if(used_edges[unused_edge_index]) unused_edge_index ++; + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; else break; } return unused_edge_index; @@ -259,16 +265,18 @@ static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint { DEBUGP("Visiting neighbor %u\n", neighbor); if(bmz->g[neighbor] != UNDEFINED) continue; - *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index + 1); + *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index); + } } static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges) { - uint32 i, v1, v2, unused_edge_index = -1; + uint32 i, v1, v2, unused_edge_index = 0; DEBUGP("Labelling non critical vertices\n"); for(i = 0; i < bmz->m; i++) { diff --git a/src/graph.c b/src/graph.c index a2a927a..00b3fca 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,6 +10,11 @@ //#define DEBUG #include "debug.h" +static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + #define abs_edge(e, i) (e % g->nedges + i * g->nedges) struct __graph_t @@ -172,7 +177,7 @@ static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) char found = 0; DEBUGP("Checking degree of vertex %u\n", v); if (edge == EMPTY) return 0; - else if (!deleted[abs_edge(edge, 0)]) + else if (!(GETBIT(deleted, abs_edge(edge, 0)))) { found = 1; *e = edge; @@ -181,7 +186,7 @@ static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) { edge = g->next[edge]; if (edge == EMPTY) break; - if (deleted[abs_edge(edge, 0)]) continue; + if (GETBIT(deleted, abs_edge(edge, 0))) continue; if (found) return 0; DEBUGP("Found first edge\n"); *e = edge; @@ -203,7 +208,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) while(1) { DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); - deleted[abs_edge(e, 0)] = 1; + SETBIT(deleted, abs_edge(e, 0)); v2 = g->edges[abs_edge(e, 0)]; if (v2 == v1) v2 = g->edges[abs_edge(e, 1)]; @@ -223,8 +228,8 @@ int graph_is_cyclic(graph_t *g) { uint32 i; uint32 v; - char *deleted = (char *)malloc(g->nedges*sizeof(char)); - memset(deleted, 0, g->nedges); + char *deleted = (char *)malloc((g->nedges*sizeof(char))/8 + 1); + memset(deleted, 0, g->nedges/8 + 1); DEBUGP("Looking for cycles in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) @@ -233,7 +238,7 @@ int graph_is_cyclic(graph_t *g) } for (i = 0; i < g->nedges; ++i) { - if (!(deleted[i])) + if (!(GETBIT(deleted, i))) { DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); free(deleted); @@ -246,17 +251,16 @@ int graph_is_cyclic(graph_t *g) uint8 graph_node_is_critical(graph_t * g, uint32 v) /* included -- Fabiano */ { - return g->critical_nodes[v]; + return GETBIT(g->critical_nodes,v); } void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ { uint32 i; uint32 v; - char *deleted = (char *)malloc(g->nedges*sizeof(char)); - memset(deleted, 0, g->nedges); -/* g->critical_nodes = (uint8 *)malloc((size_t)(ceil(g->nnodes*sizeof(uint8)/8.))); */ - g->critical_nodes = (uint8 *)malloc(g->nnodes*sizeof(uint8)); + char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); + memset(deleted, 0, g->nedges/8 + 1); + g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); g->ncritical_nodes = 0; DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) @@ -266,18 +270,18 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ for (i = 0; i < g->nedges; ++i) { - if (!(deleted[i])) + if (!(GETBIT(deleted,i))) { DEBUGP("Edge %u %u->%u belongs to the 2-core\n", i, g->edges[i], g->edges[i + g->nedges]); - if(!(g->critical_nodes[g->edges[i]])) + if(!(GETBIT(g->critical_nodes,g->edges[i]))) { g->ncritical_nodes ++; - g->critical_nodes[g->edges[i]] = 1; + SETBIT(g->critical_nodes,g->edges[i]); } - if(!(g->critical_nodes[g->edges[i + g->nedges]])) + if(!(GETBIT(g->critical_nodes,g->edges[i + g->nedges]))) { g->ncritical_nodes ++; - g->critical_nodes[g->edges[i + g->nedges]] = 1; + SETBIT(g->critical_nodes,g->edges[i + g->nedges]); } } } From 900e0a62f21150fa3b99b8de81ed9413c69c6c6a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Jan 2005 21:38:59 +0000 Subject: [PATCH 005/739] using less memory --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index c0bfd0c..98b8ec6 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -190,7 +190,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * uint32 u; /* Auxiliary vertex */ uint32 lav; /* lookahead vertex */ uint8 collision; - vqueue_t * q = vqueue_new(graph_ncritical_nodes(bmz->graph)); + vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From b63e04ee0909c1e59ecb361964848e17c541f013 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Jan 2005 21:38:59 +0000 Subject: [PATCH 006/739] using less memory --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index c0bfd0c..98b8ec6 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -190,7 +190,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * uint32 u; /* Auxiliary vertex */ uint32 lav; /* lookahead vertex */ uint8 collision; - vqueue_t * q = vqueue_new(graph_ncritical_nodes(bmz->graph)); + vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From c0928fd9f083e91c2b042b795700947289faccdb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 5 Jan 2005 19:48:23 +0000 Subject: [PATCH 007/739] included option -k to specify the number of keys to use --- src/cmph.c | 2 +- src/main.c | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/cmph.c b/src/cmph.c index 5432924..06d2a56 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -80,7 +80,7 @@ mphf_t *mph_create(mph_t *mph) break; case MPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - mphf = bmz_mph_create(mph, 1.10); + mphf = bmz_mph_create(mph, 1.15); break; default: assert(0); diff --git a/src/main.c b/src/main.c index bab4c97..ea93e3b 100644 --- a/src/main.c +++ b/src/main.c @@ -12,12 +12,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); } void usage_long(const char *prg) { uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -a\t algorithm - valid values are\n"); @@ -26,6 +26,7 @@ void usage_long(const char *prg) for (i = 0; i < HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", hash_names[i]); fprintf(stderr, " -V\t print version number and exit\n"); fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); + fprintf(stderr, " -k\t number of keys\n"); fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); @@ -91,6 +92,7 @@ int main(int argc, char **argv) FILE *mphf_fd = stdout; const char *keys_file = NULL; FILE *keys_fd; + uint32 nkeys = UINT_MAX; uint32 seed = UINT_MAX; CMPH_HASH *hashes = NULL; uint32 nhashes = 0; @@ -103,7 +105,7 @@ int main(int argc, char **argv) while (1) { - char c = getopt(argc, argv, "hVva:f:gm:s:"); + char c = getopt(argc, argv, "hVvk:a:f:gm:s:"); if (c == -1) break; switch (c) { @@ -120,6 +122,16 @@ int main(int argc, char **argv) case 'g': generate = 1; break; + case 'k': + { + char *endptr; + nkeys = strtoul(optarg, &endptr, 10); + if(*endptr != 0) { + fprintf(stderr, "Invalid number of keys %s\n", optarg); + exit(1); + } + } + break; case 'm': mphf_file = strdup(optarg); break; @@ -195,7 +207,7 @@ int main(int argc, char **argv) memcpy(mphf_file + strlen(keys_file), ".mph\0", 5); } - keys_fd = fopen(keys_file, "r"); + keys_fd = fopen64(keys_file, "r"); if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -203,7 +215,9 @@ int main(int argc, char **argv) } source.data = (void *)keys_fd; - source.nkeys = count_keys(keys_fd); + if (seed == UINT_MAX) seed = time(NULL); + if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); + else source.nkeys = nkeys; source.read = key_read; source.dispose = key_dispose; source.rewind = key_rewind; From 30d7a654f0b545bc0e833c5b8a11632aa2a54417 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 5 Jan 2005 19:48:23 +0000 Subject: [PATCH 008/739] included option -k to specify the number of keys to use --- src/cmph.c | 2 +- src/main.c | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/cmph.c b/src/cmph.c index 5432924..06d2a56 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -80,7 +80,7 @@ mphf_t *mph_create(mph_t *mph) break; case MPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - mphf = bmz_mph_create(mph, 1.10); + mphf = bmz_mph_create(mph, 1.15); break; default: assert(0); diff --git a/src/main.c b/src/main.c index bab4c97..ea93e3b 100644 --- a/src/main.c +++ b/src/main.c @@ -12,12 +12,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); } void usage_long(const char *prg) { uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -a\t algorithm - valid values are\n"); @@ -26,6 +26,7 @@ void usage_long(const char *prg) for (i = 0; i < HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", hash_names[i]); fprintf(stderr, " -V\t print version number and exit\n"); fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); + fprintf(stderr, " -k\t number of keys\n"); fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); @@ -91,6 +92,7 @@ int main(int argc, char **argv) FILE *mphf_fd = stdout; const char *keys_file = NULL; FILE *keys_fd; + uint32 nkeys = UINT_MAX; uint32 seed = UINT_MAX; CMPH_HASH *hashes = NULL; uint32 nhashes = 0; @@ -103,7 +105,7 @@ int main(int argc, char **argv) while (1) { - char c = getopt(argc, argv, "hVva:f:gm:s:"); + char c = getopt(argc, argv, "hVvk:a:f:gm:s:"); if (c == -1) break; switch (c) { @@ -120,6 +122,16 @@ int main(int argc, char **argv) case 'g': generate = 1; break; + case 'k': + { + char *endptr; + nkeys = strtoul(optarg, &endptr, 10); + if(*endptr != 0) { + fprintf(stderr, "Invalid number of keys %s\n", optarg); + exit(1); + } + } + break; case 'm': mphf_file = strdup(optarg); break; @@ -195,7 +207,7 @@ int main(int argc, char **argv) memcpy(mphf_file + strlen(keys_file), ".mph\0", 5); } - keys_fd = fopen(keys_file, "r"); + keys_fd = fopen64(keys_file, "r"); if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -203,7 +215,9 @@ int main(int argc, char **argv) } source.data = (void *)keys_fd; - source.nkeys = count_keys(keys_fd); + if (seed == UINT_MAX) seed = time(NULL); + if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); + else source.nkeys = nkeys; source.read = key_read; source.dispose = key_dispose; source.rewind = key_rewind; From 66501e5ecaefcb5f332500dceb2b4654adb8d4c1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 5 Jan 2005 20:45:33 +0000 Subject: [PATCH 009/739] included option -k to specify the number of keys to use --- src/cmph_structs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 6c2f6dc..dc38f89 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -2,7 +2,7 @@ #include -#define DEBUG +//#define DEBUG #include "debug.h" mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) From e88eb681ac16d618bf047f78b09526f413a383b9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 5 Jan 2005 20:45:33 +0000 Subject: [PATCH 010/739] included option -k to specify the number of keys to use --- src/cmph_structs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 6c2f6dc..dc38f89 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -2,7 +2,7 @@ #include -#define DEBUG +//#define DEBUG #include "debug.h" mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) From 2e002e78ecc997c9e60343223e9211b68975f764 Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 13 Jan 2005 23:56:54 +0000 Subject: [PATCH 011/739] Better error handling in czech.c. --- src/czech.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/czech.c b/src/czech.c index d699e84..fb422c0 100644 --- a/src/czech.c +++ b/src/czech.c @@ -119,6 +119,13 @@ mphf_t *czech_mph_create(mph_t *mph, float c) free(czech->g); czech->g = malloc(czech->n * sizeof(uint32)); assert(czech->g); + if (!czech->g) + { + fprintf(stderr, "out of memory"); + free(visited); + graph_destroy(czech->graph); + return NULL; + } for (i = 0; i < czech->n; ++i) { if (!visited[i]) @@ -289,11 +296,13 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); fread(czech->g, czech->n*sizeof(uint32), 1, f); for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); + /* #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); fprintf(stderr, "\n"); #endif + */ return; } From 1cfaf691bd763b7164b38fdb3d51baa02dd3198e Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 13 Jan 2005 23:56:54 +0000 Subject: [PATCH 012/739] Better error handling in czech.c. --- src/czech.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/czech.c b/src/czech.c index d699e84..fb422c0 100644 --- a/src/czech.c +++ b/src/czech.c @@ -119,6 +119,13 @@ mphf_t *czech_mph_create(mph_t *mph, float c) free(czech->g); czech->g = malloc(czech->n * sizeof(uint32)); assert(czech->g); + if (!czech->g) + { + fprintf(stderr, "out of memory"); + free(visited); + graph_destroy(czech->graph); + return NULL; + } for (i = 0; i < czech->n; ++i) { if (!visited[i]) @@ -289,11 +296,13 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); fread(czech->g, czech->n*sizeof(uint32), 1, f); for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); + /* #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); fprintf(stderr, "\n"); #endif + */ return; } From eea53e77f0903d54952b0dbc4363474957000eff Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 17 Jan 2005 17:58:43 +0000 Subject: [PATCH 013/739] stable version --- src/bmz.c | 245 ++++++++++++++++++++++++++++++++++++++-------------- src/cmph.c | 6 +- src/cmph.h | 2 +- src/graph.c | 14 +-- src/main.c | 23 +++-- 5 files changed, 212 insertions(+), 78 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 98b8ec6..124f4a3 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -22,8 +22,9 @@ static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) static int bmz_gen_edges(mph_t *mph); -static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges); -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges); +static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); +static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited); mph_t *bmz_mph_new(key_source_t *key_source) @@ -72,12 +73,13 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) { mphf_t *mphf = NULL; bmz_mphf_data_t *bmzf = NULL; - uint32 i; - uint32 iterations = 10; + uint32 iterations; + uint32 iterations_map = 20; uint8 *used_edges = NULL; - uint32 biggest_g_value = 0; - uint32 biggest_edge_value = 1; + uint8 restart_mapping = 0; + uint8 * visited = NULL; + DEBUGP("bmz_c: %f\n", bmz_c); bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; bmz->m = mph->key_source->nkeys; @@ -89,13 +91,18 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; - // Mapping step - if (mph->verbosity) + do { + // Mapping step + uint32 biggest_g_value = 0; + uint32 biggest_edge_value = 1; + iterations = 20; + if (mph->verbosity) + { fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); - } - while(1) - { + } + while(1) + { int ok; DEBUGP("hash function 1\n"); bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); @@ -118,53 +125,63 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) if (iterations == 0) break; } else break; - } - if (iterations == 0) - { + } + if (iterations == 0) + { graph_destroy(bmz->graph); return NULL; - } + } - // Ordering step - if (mph->verbosity) - { + // Ordering step + if (mph->verbosity) + { fprintf(stderr, "Starting ordering step\n"); - } + } - graph_obtain_critical_nodes(bmz->graph); + graph_obtain_critical_nodes(bmz->graph); - // Searching step - if (mph->verbosity) - { + // Searching step + if (mph->verbosity) + { fprintf(stderr, "Starting Searching step.\n"); fprintf(stderr, "\tTraversing critical vertices.\n"); - } - DEBUGP("Searching step\n"); - - used_edges = (uint8 *)malloc((bmz->m*sizeof(uint8))/8 + 1); - memset(used_edges, 0, bmz->m/8 + 1); - free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(uint32)); - assert(bmz->g); - for (i = 0; i < bmz->n; ++i) bmz->g[i] = UNDEFINED; - - for (i = 0; i < bmz->n; ++i) // critical nodes - { - if (graph_node_is_critical(bmz->graph, i) && (bmz->g[i] == UNDEFINED)) + } + DEBUGP("Searching step\n"); + visited = (char *)malloc(bmz->n/8 + 1); + memset(visited, 0, bmz->n/8 + 1); + used_edges = (uint8 *)malloc(bmz->m/8 + 1); + memset(used_edges, 0, bmz->m/8 + 1); + free(bmz->g); + bmz->g = malloc(bmz->n * sizeof(uint32)); + assert(bmz->g); + for (i = 0; i < bmz->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) { - bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges); + if(bmz_c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; } - } - if (mph->verbosity) - { - fprintf(stderr, "\tTraversing non critical vertices.\n"); - } - - bmz_traverse_non_critical_nodes(bmz, used_edges); // non_critical_nodes + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz_traverse_non_critical_nodes(bmz, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); graph_destroy(bmz->graph); - free(used_edges); bmz->graph = NULL; - + if (iterations_map == 0) return NULL; mphf = (mphf_t *)malloc(sizeof(mphf_t)); mphf->algo = mph->algo; bmzf = (bmz_mphf_data_t *)malloc(sizeof(bmz_mph_data_t)); @@ -184,19 +201,19 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) return mphf; } -static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges) +static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) { uint32 next_g; uint32 u; /* Auxiliary vertex */ uint32 lav; /* lookahead vertex */ uint8 collision; - vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))); + vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - *biggest_g_value = next_g; vqueue_insert(q, v); while(!vqueue_is_empty(q)) { @@ -204,7 +221,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * it = graph_neighbors_it(bmz->graph, v); while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, u) && (bmz->g[u] == UNDEFINED)) + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { collision = 1; while(collision) // lookahead to resolve collisions @@ -214,9 +231,13 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * collision = 0; while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { - assert(next_g + bmz->g[lav] < bmz->m); + if(next_g + bmz->g[lav] >= bmz->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } if (GETBIT(used_edges, next_g + bmz->g[lav])) { collision = 1; @@ -230,20 +251,115 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * it1 = graph_neighbors_it(bmz->graph, u); while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; } } bmz->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); vqueue_insert(q, u); } } } vqueue_destroy(q); - + return 0; +} + +static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) +{ + uint32 next_g; + uint32 u; /* Auxiliary vertex */ + uint32 lav; /* lookahead vertex */ + uint8 collision; + uint32 * unused_g_values = NULL; + uint32 unused_g_values_capacity = 0; + uint32 nunused_g_values = 0; + vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + { + uint32 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = UINT_MAX; + } + it1 = graph_neighbors_it(bmz->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz->g[lav] >= bmz->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz->g[lav])) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(uint32)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz->g[lav]); + if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; + } + } + bmz->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; } static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 unused_edge_index) @@ -257,23 +373,24 @@ static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 u return unused_edge_index; } -static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index) +static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index, uint8 * visited) { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); uint32 neighbor = 0; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { + if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - if(bmz->g[neighbor] != UNDEFINED) continue; *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + SETBIT(visited, neighbor); (*unused_edge_index)++; - bmz_traverse(bmz, used_edges, neighbor, unused_edge_index); + bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); } } -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges) +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited) { uint32 i, v1, v2, unused_edge_index = 0; @@ -282,17 +399,19 @@ static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_ed { v1 = graph_vertex_id(bmz->graph, i, 0); v2 = graph_vertex_id(bmz->graph, i, 1); - if((bmz->g[v1] != UNDEFINED && bmz->g[v2] != UNDEFINED) || (bmz->g[v1] == UNDEFINED && bmz->g[v2] == UNDEFINED)) continue; - if(bmz->g[v1] != UNDEFINED) bmz_traverse(bmz, used_edges, v1, &unused_edge_index); - else bmz_traverse(bmz, used_edges, v2, &unused_edge_index); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); + else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); + } for(i = 0; i < bmz->n; i++) { - if(bmz->g[i] == UNDEFINED) + if(!GETBIT(visited,i)) { bmz->g[i] = 0; - bmz_traverse(bmz, used_edges, i, &unused_edge_index); + SETBIT(visited, i); + bmz_traverse(bmz, used_edges, i, &unused_edge_index, visited); } } diff --git a/src/cmph.c b/src/cmph.c index 06d2a56..9b9bb3c 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -69,18 +69,18 @@ void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) return; } -mphf_t *mph_create(mph_t *mph) +mphf_t *mph_create(mph_t *mph, float c) { mphf_t *mphf = NULL; switch (mph->algo) { case MPH_CZECH: DEBUGP("Creating czech hash\n"); - mphf = czech_mph_create(mph, 2.09); + mphf = czech_mph_create(mph, c); break; case MPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - mphf = bmz_mph_create(mph, 1.15); + mphf = bmz_mph_create(mph, c); break; default: assert(0); diff --git a/src/cmph.h b/src/cmph.h index 2224a42..c8cdbf2 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -28,7 +28,7 @@ mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); void mph_set_verbosity(mph_t *mph, uint32 verbosity); void mph_destroy(mph_t *mph); -mphf_t *mph_create(mph_t *mph); +mphf_t *mph_create(mph_t *mph, float c); /** Hash querying API **/ mphf_t *mphf_load(FILE *f); diff --git a/src/graph.c b/src/graph.c index 00b3fca..c41f2c9 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +static uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) @@ -52,7 +52,7 @@ graph_t *graph_new(uint32 nnodes, uint32 nedges) void graph_destroy(graph_t *graph) { - DEBUGP("Destroying graph\n"); + DEBUGP("Destroying graph\n"); free(graph->edges); free(graph->first); free(graph->next); @@ -103,7 +103,7 @@ void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) { - DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; return 0; @@ -207,7 +207,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) if (!degree1) return; while(1) { - DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); SETBIT(deleted, abs_edge(e, 0)); v2 = g->edges[abs_edge(e, 0)]; @@ -217,7 +217,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) degree1 = find_degree1_edge(g, v2, deleted, &e); if (degree1) { - DEBUGP("Inspecting vertex %u\n", v2); + DEBUGP("Inspecting vertex %u\n", v2); v1 = v2; } else break; @@ -240,7 +240,7 @@ int graph_is_cyclic(graph_t *g) { if (!(GETBIT(deleted, i))) { - DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); free(deleted); return 1; } @@ -260,8 +260,10 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ uint32 v; char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); memset(deleted, 0, g->nedges/8 + 1); + free(g->critical_nodes); g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); g->ncritical_nodes = 0; + memset(g->critical_nodes, 0, (g->nnodes*sizeof(uint8))/8 + 1); DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) { diff --git a/src/main.c b/src/main.c index ea93e3b..d092473 100644 --- a/src/main.c +++ b/src/main.c @@ -12,7 +12,7 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); } void usage_long(const char *prg) { @@ -20,6 +20,7 @@ void usage_long(const char *prg) fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); + fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); fprintf(stderr, " -a\t algorithm - valid values are\n"); for (i = 0; i < MPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", mph_names[i]); fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); @@ -98,6 +99,7 @@ int main(int argc, char **argv) uint32 nhashes = 0; uint32 i; MPH_ALGO mph_algo = MPH_CZECH; + float c = 2.09; mph_t *mph = NULL; mphf_t *mphf = NULL; @@ -105,9 +107,9 @@ int main(int argc, char **argv) while (1) { - char c = getopt(argc, argv, "hVvk:a:f:gm:s:"); - if (c == -1) break; - switch (c) + char ch = getopt(argc, argv, "hVvgc:k:a:f:m:s:"); + if (ch == -1) break; + switch (ch) { case 's': { @@ -119,6 +121,16 @@ int main(int argc, char **argv) } } break; + case 'c': + { + char *endptr; + c = strtod(optarg, &endptr); + if(*endptr != 0) { + fprintf(stderr, "Invalid c value %s\n", optarg); + exit(1); + } + } + break; case 'g': generate = 1; break; @@ -229,7 +241,8 @@ int main(int argc, char **argv) mph = mph_new(mph_algo, &source); if (nhashes) mph_set_hashfuncs(mph, hashes); mph_set_verbosity(mph, verbosity); - mphf = mph_create(mph); + if(mph_algo == MPH_BMZ && c >= 2.0) c=1.15; + mphf = mph_create(mph, c); if (mphf == NULL) { From 69c177a494813ac99c939779e2f89ba68ee9fe6e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 17 Jan 2005 17:58:43 +0000 Subject: [PATCH 014/739] stable version --- src/bmz.c | 245 ++++++++++++++++++++++++++++++++++++++-------------- src/cmph.c | 6 +- src/cmph.h | 2 +- src/graph.c | 14 +-- src/main.c | 23 +++-- 5 files changed, 212 insertions(+), 78 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 98b8ec6..124f4a3 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -22,8 +22,9 @@ static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) static int bmz_gen_edges(mph_t *mph); -static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges); -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges); +static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); +static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited); mph_t *bmz_mph_new(key_source_t *key_source) @@ -72,12 +73,13 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) { mphf_t *mphf = NULL; bmz_mphf_data_t *bmzf = NULL; - uint32 i; - uint32 iterations = 10; + uint32 iterations; + uint32 iterations_map = 20; uint8 *used_edges = NULL; - uint32 biggest_g_value = 0; - uint32 biggest_edge_value = 1; + uint8 restart_mapping = 0; + uint8 * visited = NULL; + DEBUGP("bmz_c: %f\n", bmz_c); bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; bmz->m = mph->key_source->nkeys; @@ -89,13 +91,18 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; - // Mapping step - if (mph->verbosity) + do { + // Mapping step + uint32 biggest_g_value = 0; + uint32 biggest_edge_value = 1; + iterations = 20; + if (mph->verbosity) + { fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); - } - while(1) - { + } + while(1) + { int ok; DEBUGP("hash function 1\n"); bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); @@ -118,53 +125,63 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) if (iterations == 0) break; } else break; - } - if (iterations == 0) - { + } + if (iterations == 0) + { graph_destroy(bmz->graph); return NULL; - } + } - // Ordering step - if (mph->verbosity) - { + // Ordering step + if (mph->verbosity) + { fprintf(stderr, "Starting ordering step\n"); - } + } - graph_obtain_critical_nodes(bmz->graph); + graph_obtain_critical_nodes(bmz->graph); - // Searching step - if (mph->verbosity) - { + // Searching step + if (mph->verbosity) + { fprintf(stderr, "Starting Searching step.\n"); fprintf(stderr, "\tTraversing critical vertices.\n"); - } - DEBUGP("Searching step\n"); - - used_edges = (uint8 *)malloc((bmz->m*sizeof(uint8))/8 + 1); - memset(used_edges, 0, bmz->m/8 + 1); - free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(uint32)); - assert(bmz->g); - for (i = 0; i < bmz->n; ++i) bmz->g[i] = UNDEFINED; - - for (i = 0; i < bmz->n; ++i) // critical nodes - { - if (graph_node_is_critical(bmz->graph, i) && (bmz->g[i] == UNDEFINED)) + } + DEBUGP("Searching step\n"); + visited = (char *)malloc(bmz->n/8 + 1); + memset(visited, 0, bmz->n/8 + 1); + used_edges = (uint8 *)malloc(bmz->m/8 + 1); + memset(used_edges, 0, bmz->m/8 + 1); + free(bmz->g); + bmz->g = malloc(bmz->n * sizeof(uint32)); + assert(bmz->g); + for (i = 0; i < bmz->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) { - bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges); + if(bmz_c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; } - } - if (mph->verbosity) - { - fprintf(stderr, "\tTraversing non critical vertices.\n"); - } - - bmz_traverse_non_critical_nodes(bmz, used_edges); // non_critical_nodes + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz_traverse_non_critical_nodes(bmz, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); graph_destroy(bmz->graph); - free(used_edges); bmz->graph = NULL; - + if (iterations_map == 0) return NULL; mphf = (mphf_t *)malloc(sizeof(mphf_t)); mphf->algo = mph->algo; bmzf = (bmz_mphf_data_t *)malloc(sizeof(bmz_mph_data_t)); @@ -184,19 +201,19 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) return mphf; } -static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges) +static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) { uint32 next_g; uint32 u; /* Auxiliary vertex */ uint32 lav; /* lookahead vertex */ uint8 collision; - vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))); + vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - *biggest_g_value = next_g; vqueue_insert(q, v); while(!vqueue_is_empty(q)) { @@ -204,7 +221,7 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * it = graph_neighbors_it(bmz->graph, v); while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, u) && (bmz->g[u] == UNDEFINED)) + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { collision = 1; while(collision) // lookahead to resolve collisions @@ -214,9 +231,13 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * collision = 0; while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { - assert(next_g + bmz->g[lav] < bmz->m); + if(next_g + bmz->g[lav] >= bmz->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } if (GETBIT(used_edges, next_g + bmz->g[lav])) { collision = 1; @@ -230,20 +251,115 @@ static void bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * it1 = graph_neighbors_it(bmz->graph, u); while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && (bmz->g[lav] != UNDEFINED)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; } } bmz->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); vqueue_insert(q, u); } } } vqueue_destroy(q); - + return 0; +} + +static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) +{ + uint32 next_g; + uint32 u; /* Auxiliary vertex */ + uint32 lav; /* lookahead vertex */ + uint8 collision; + uint32 * unused_g_values = NULL; + uint32 unused_g_values_capacity = 0; + uint32 nunused_g_values = 0; + vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + { + uint32 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = UINT_MAX; + } + it1 = graph_neighbors_it(bmz->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz->g[lav] >= bmz->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz->g[lav])) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(uint32)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz->g[lav]); + if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; + } + } + bmz->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; } static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 unused_edge_index) @@ -257,23 +373,24 @@ static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 u return unused_edge_index; } -static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index) +static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index, uint8 * visited) { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); uint32 neighbor = 0; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { + if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - if(bmz->g[neighbor] != UNDEFINED) continue; *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + SETBIT(visited, neighbor); (*unused_edge_index)++; - bmz_traverse(bmz, used_edges, neighbor, unused_edge_index); + bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); } } -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges) +static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited) { uint32 i, v1, v2, unused_edge_index = 0; @@ -282,17 +399,19 @@ static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_ed { v1 = graph_vertex_id(bmz->graph, i, 0); v2 = graph_vertex_id(bmz->graph, i, 1); - if((bmz->g[v1] != UNDEFINED && bmz->g[v2] != UNDEFINED) || (bmz->g[v1] == UNDEFINED && bmz->g[v2] == UNDEFINED)) continue; - if(bmz->g[v1] != UNDEFINED) bmz_traverse(bmz, used_edges, v1, &unused_edge_index); - else bmz_traverse(bmz, used_edges, v2, &unused_edge_index); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); + else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); + } for(i = 0; i < bmz->n; i++) { - if(bmz->g[i] == UNDEFINED) + if(!GETBIT(visited,i)) { bmz->g[i] = 0; - bmz_traverse(bmz, used_edges, i, &unused_edge_index); + SETBIT(visited, i); + bmz_traverse(bmz, used_edges, i, &unused_edge_index, visited); } } diff --git a/src/cmph.c b/src/cmph.c index 06d2a56..9b9bb3c 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -69,18 +69,18 @@ void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) return; } -mphf_t *mph_create(mph_t *mph) +mphf_t *mph_create(mph_t *mph, float c) { mphf_t *mphf = NULL; switch (mph->algo) { case MPH_CZECH: DEBUGP("Creating czech hash\n"); - mphf = czech_mph_create(mph, 2.09); + mphf = czech_mph_create(mph, c); break; case MPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - mphf = bmz_mph_create(mph, 1.15); + mphf = bmz_mph_create(mph, c); break; default: assert(0); diff --git a/src/cmph.h b/src/cmph.h index 2224a42..c8cdbf2 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -28,7 +28,7 @@ mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); void mph_set_verbosity(mph_t *mph, uint32 verbosity); void mph_destroy(mph_t *mph); -mphf_t *mph_create(mph_t *mph); +mphf_t *mph_create(mph_t *mph, float c); /** Hash querying API **/ mphf_t *mphf_load(FILE *f); diff --git a/src/graph.c b/src/graph.c index 00b3fca..c41f2c9 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +static uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) @@ -52,7 +52,7 @@ graph_t *graph_new(uint32 nnodes, uint32 nedges) void graph_destroy(graph_t *graph) { - DEBUGP("Destroying graph\n"); + DEBUGP("Destroying graph\n"); free(graph->edges); free(graph->first); free(graph->next); @@ -103,7 +103,7 @@ void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) { - DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; return 0; @@ -207,7 +207,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) if (!degree1) return; while(1) { - DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); SETBIT(deleted, abs_edge(e, 0)); v2 = g->edges[abs_edge(e, 0)]; @@ -217,7 +217,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) degree1 = find_degree1_edge(g, v2, deleted, &e); if (degree1) { - DEBUGP("Inspecting vertex %u\n", v2); + DEBUGP("Inspecting vertex %u\n", v2); v1 = v2; } else break; @@ -240,7 +240,7 @@ int graph_is_cyclic(graph_t *g) { if (!(GETBIT(deleted, i))) { - DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); free(deleted); return 1; } @@ -260,8 +260,10 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ uint32 v; char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); memset(deleted, 0, g->nedges/8 + 1); + free(g->critical_nodes); g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); g->ncritical_nodes = 0; + memset(g->critical_nodes, 0, (g->nnodes*sizeof(uint8))/8 + 1); DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) { diff --git a/src/main.c b/src/main.c index ea93e3b..d092473 100644 --- a/src/main.c +++ b/src/main.c @@ -12,7 +12,7 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); } void usage_long(const char *prg) { @@ -20,6 +20,7 @@ void usage_long(const char *prg) fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); + fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); fprintf(stderr, " -a\t algorithm - valid values are\n"); for (i = 0; i < MPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", mph_names[i]); fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); @@ -98,6 +99,7 @@ int main(int argc, char **argv) uint32 nhashes = 0; uint32 i; MPH_ALGO mph_algo = MPH_CZECH; + float c = 2.09; mph_t *mph = NULL; mphf_t *mphf = NULL; @@ -105,9 +107,9 @@ int main(int argc, char **argv) while (1) { - char c = getopt(argc, argv, "hVvk:a:f:gm:s:"); - if (c == -1) break; - switch (c) + char ch = getopt(argc, argv, "hVvgc:k:a:f:m:s:"); + if (ch == -1) break; + switch (ch) { case 's': { @@ -119,6 +121,16 @@ int main(int argc, char **argv) } } break; + case 'c': + { + char *endptr; + c = strtod(optarg, &endptr); + if(*endptr != 0) { + fprintf(stderr, "Invalid c value %s\n", optarg); + exit(1); + } + } + break; case 'g': generate = 1; break; @@ -229,7 +241,8 @@ int main(int argc, char **argv) mph = mph_new(mph_algo, &source); if (nhashes) mph_set_hashfuncs(mph, hashes); mph_set_verbosity(mph, verbosity); - mphf = mph_create(mph); + if(mph_algo == MPH_BMZ && c >= 2.0) c=1.15; + mphf = mph_create(mph, c); if (mphf == NULL) { From d24b968de4c190721d31b044f352c2b01000e880 Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 18 Jan 2005 12:18:51 +0000 Subject: [PATCH 015/739] Fixed a lot of warnings. Added visual studio project. Make needed changes to work with windows. --- COPYING | 6 +++--- src/Makefile.am | 2 +- src/bmz.c | 32 ++++++++------------------------ src/bmz.h | 1 + src/cmph.c | 14 +++++++++++--- src/cmph.h | 3 ++- src/cmph_structs.c | 3 ++- src/cmph_structs.h | 1 + src/czech.c | 38 ++++++++++---------------------------- src/czech.h | 1 + src/debug.h | 44 +++++++++++++++++++++++++++++++++++++++++--- src/djb2_hash.c | 4 ++-- src/graph.c | 14 +++++++------- src/graph.h | 3 ++- src/hash.c | 4 ++-- src/jenkins_hash.c | 21 ++++++++++----------- src/main.c | 24 ++++++++++++++++-------- src/sdbm_hash.c | 4 ++-- src/vqueue.c | 1 + 19 files changed, 123 insertions(+), 97 deletions(-) diff --git a/COPYING b/COPYING index d60c31a..60549be 100644 --- a/COPYING +++ b/COPYING @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -291,7 +291,7 @@ convey 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) + Copyright (C) 19yy 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 @@ -313,7 +313,7 @@ Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author + Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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. diff --git a/src/Makefile.am b/src/Makefile.am index 8a56ad1..98aef25 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,5 +18,5 @@ libcmph_la_SOURCES = debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c +cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c index 124f4a3..5c8aff3 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -9,12 +9,11 @@ #include #include #include -#include //#define DEBUG #include "debug.h" -static uint32 UNDEFINED = UINT_MAX; +//static uint32 UNDEFINED = UINT_MAX; static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) @@ -437,7 +436,7 @@ static int bmz_gen_edges(mph_t *mph) if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -457,7 +456,7 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) uint32 buflen; uint32 nbuflen; uint32 i; - uint32 two = htonl(2); //number of hash functions + uint32 two = 2; //number of hash functions bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; uint32 nn, nm; __mphf_dump(mphf, fd); @@ -466,28 +465,20 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - nn = htonl(data->n); - fwrite(&nn, sizeof(uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(uint32), 1, fd); + fwrite(&(data->n), sizeof(uint32), 1, fd); + fwrite(&(data->m), sizeof(uint32), 1, fd); - for (i = 0; i < data->n; ++i) - { - uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(uint32), 1, fd); - } + fwrite(data->g, sizeof(uint32)*(data->n), 1, fd); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -499,17 +490,14 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) void bmz_mphf_load(FILE *f, mphf_t *mphf) { uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; uint32 buflen; uint32 i; - hash_state_t *state; bmz_mphf_data_t *bmz = (bmz_mphf_data_t *)malloc(sizeof(bmz_mphf_data_t)); DEBUGP("Loading bmz mphf\n"); mphf->data = bmz; fread(&nhashes, sizeof(uint32), 1, f); - nhashes = ntohl(nhashes); bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); bmz->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -517,7 +505,6 @@ void bmz_mphf_load(FILE *f, mphf_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(uint32), 1, f); - buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -528,13 +515,10 @@ void bmz_mphf_load(FILE *f, mphf_t *mphf) DEBUGP("Reading m and n\n"); fread(&(bmz->n), sizeof(uint32), 1, f); - bmz->n = ntohl(bmz->n); fread(&(bmz->m), sizeof(uint32), 1, f); - bmz->m = ntohl(bmz->m); bmz->g = (uint32 *)malloc(sizeof(uint32)*bmz->n); fread(bmz->g, bmz->n*sizeof(uint32), 1, f); - for (i = 0; i < bmz->n; ++i) bmz->g[i] = ntohl(bmz->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); diff --git a/src/bmz.h b/src/bmz.h index 6dc3ca2..f815029 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -14,5 +14,6 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c); void bmz_mphf_load(FILE *f, mphf_t *mphf); int bmz_mphf_dump(mphf_t *mphf, FILE *f); +void bmz_mphf_destroy(mphf_t *mphf); uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); #endif diff --git a/src/cmph.c b/src/cmph.c index 9b9bb3c..7a67193 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -61,25 +61,33 @@ void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) czech_mph_set_hashfuncs(mph, hashfuncs); break; case MPH_BMZ: /* included -- Fabiano */ - bmz_mph_set_hashfuncs(mph, hashfuncs); + bmz_mph_set_hashfuncs(mph, hashfuncs); break; default: break; } return; } +void mph_set_graphsize(mph_t *mph, float c) +{ + mph->c = c; + return; +} -mphf_t *mph_create(mph_t *mph, float c) +mphf_t *mph_create(mph_t *mph) { mphf_t *mphf = NULL; + float c = mph->c; switch (mph->algo) { case MPH_CZECH: DEBUGP("Creating czech hash\n"); + if (c == 0) c = 2.09; mphf = czech_mph_create(mph, c); break; case MPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); + if (c == 0) c = 1.15; mphf = bmz_mph_create(mph, c); break; default: @@ -143,7 +151,7 @@ uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) assert(0); } assert(0); - return; + return 0; } uint32 mphf_size(mphf_t *mphf) diff --git a/src/cmph.h b/src/cmph.h index c8cdbf2..4d828bb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,8 +27,9 @@ typedef struct mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); void mph_set_verbosity(mph_t *mph, uint32 verbosity); +void mph_set_graphsize(mph_t *mph, float c); void mph_destroy(mph_t *mph); -mphf_t *mph_create(mph_t *mph, float c); +mphf_t *mph_create(mph_t *mph); /** Hash querying API **/ mphf_t *mphf_load(FILE *f); diff --git a/src/cmph_structs.c b/src/cmph_structs.c index dc38f89..9629815 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -13,6 +13,7 @@ mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) mph->algo = algo; mph->key_source = key_source; mph->verbosity = 0; + float c = 0; return mph; } @@ -24,7 +25,7 @@ void __mph_destroy(mph_t *mph) void __mphf_dump(mphf_t *mphf, FILE *fd) { uint32 nsize = htonl(mphf->size); - fwrite(mph_names[mphf->algo], strlen(mph_names[mphf->algo]) + 1, 1, fd); + fwrite(mph_names[mphf->algo], (uint32)(strlen(mph_names[mphf->algo]) + 1), 1, fd); fwrite(&nsize, sizeof(mphf->size), 1, fd); } mphf_t *__mphf_load(FILE *f) diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 9b1e634..4b9f879 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -10,6 +10,7 @@ struct __mph_t MPH_ALGO algo; key_source_t *key_source; uint32 verbosity; + float c; void *data; //algorithm dependent data }; diff --git a/src/czech.c b/src/czech.c index fb422c0..f526127 100644 --- a/src/czech.c +++ b/src/czech.c @@ -8,7 +8,6 @@ #include #include #include -#include //#define DEBUG #include "debug.h" @@ -68,7 +67,7 @@ mphf_t *czech_mph_create(mph_t *mph, float c) char *visited = NULL; czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; czech->m = mph->key_source->nkeys; - czech->n = ceil(c * mph->key_source->nkeys); + czech->n = (uint32)ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); czech->graph = graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); @@ -197,7 +196,7 @@ static int czech_gen_edges(mph_t *mph) if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -216,39 +215,29 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) { char *buf = NULL; uint32 buflen; - uint32 nbuflen; - uint32 i; - uint32 two = htonl(2); //number of hash functions + uint32 two = 2; //number of hash functions czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; - uint32 nn, nm; __mphf_dump(mphf, fd); fwrite(&two, sizeof(uint32), 1, fd); hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - nn = htonl(data->n); - fwrite(&nn, sizeof(uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(uint32), 1, fd); + fwrite(&(data->n), sizeof(uint32), 1, fd); + fwrite(&(data->m), sizeof(uint32), 1, fd); + + fwrite(data->g, sizeof(uint32)*data->n, 1, fd); - for (i = 0; i < data->n; ++i) - { - uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(uint32), 1, fd); - } #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -260,17 +249,14 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) void czech_mphf_load(FILE *f, mphf_t *mphf) { uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; uint32 buflen; uint32 i; - hash_state_t *state; czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; fread(&nhashes, sizeof(uint32), 1, f); - nhashes = ntohl(nhashes); czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -278,7 +264,6 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(uint32), 1, f); - buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -289,13 +274,10 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) DEBUGP("Reading m and n\n"); fread(&(czech->n), sizeof(uint32), 1, f); - czech->n = ntohl(czech->n); fread(&(czech->m), sizeof(uint32), 1, f); - czech->m = ntohl(czech->m); - + czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); fread(czech->g, czech->n*sizeof(uint32), 1, f); - for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); /* #ifdef DEBUG fprintf(stderr, "G: "); diff --git a/src/czech.h b/src/czech.h index 9bb758f..f83d224 100644 --- a/src/czech.h +++ b/src/czech.h @@ -14,5 +14,6 @@ mphf_t *czech_mph_create(mph_t *mph, float c); void czech_mphf_load(FILE *f, mphf_t *mphf); int czech_mphf_dump(mphf_t *mphf, FILE *f); +void czech_mphf_destroy(mphf_t *mphf); uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); #endif diff --git a/src/debug.h b/src/debug.h index 49b564e..daab6c7 100644 --- a/src/debug.h +++ b/src/debug.h @@ -1,15 +1,53 @@ -#ifndef __MY_DEBUGC__ -#define __MY_DEBUGC__ +#ifdef DEBUGP +#undef DEBUGP +#endif #ifdef __cplusplus #include +#ifdef WIN32 +#include +#endif #else #include +#ifdef WIN32 +#include #endif +#endif + +#ifdef WIN32 +#ifndef __DEBUG_H__ +#define __DEBUG_H__ +#include +static void debugprintf(const char *format, ...) +{ + va_list ap; + char *f = NULL; + const char *p="%s:%d "; + size_t plen = strlen(p); + va_start(ap, format); + f = (char *)malloc(plen + strlen(format) + 1); + if (!f) return; + memcpy(f, p, plen); + memcpy(f + plen, format, strlen(format) + 1); + vfprintf(stderr, f, ap); + va_end(ap); + free(f); +} +static void dummyprintf(const char *format, ...) +{} +#endif +#endif + #ifdef DEBUG +#ifdef WIN32 +#define DEBUGP debugprintf +#else #define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) +#endif +#else +#ifdef WIN32 +#define DEBUGP dummyprintf #else #define DEBUGP(args...) #endif - #endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 433452b..bb67e42 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -15,9 +15,9 @@ void djb2_state_destroy(djb2_state_t *state) uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) { - register unsigned int hash = 5381; + register uint32 hash = 5381; const unsigned char *ptr = k; - int i = 0; + uint32 i = 0; while (i < keylen) { hash = hash*33 ^ *ptr; diff --git a/src/graph.c b/src/graph.c index c41f2c9..cb75516 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -static uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +static const uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) @@ -52,7 +52,7 @@ graph_t *graph_new(uint32 nnodes, uint32 nedges) void graph_destroy(graph_t *graph) { - DEBUGP("Destroying graph\n"); + DEBUGP("Destroying graph\n"); free(graph->edges); free(graph->first); free(graph->next); @@ -103,7 +103,7 @@ void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) { - DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; return 0; @@ -207,7 +207,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) if (!degree1) return; while(1) { - DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); SETBIT(deleted, abs_edge(e, 0)); v2 = g->edges[abs_edge(e, 0)]; @@ -217,7 +217,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) degree1 = find_degree1_edge(g, v2, deleted, &e); if (degree1) { - DEBUGP("Inspecting vertex %u\n", v2); + DEBUGP("Inspecting vertex %u\n", v2); v1 = v2; } else break; @@ -240,7 +240,7 @@ int graph_is_cyclic(graph_t *g) { if (!(GETBIT(deleted, i))) { - DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); free(deleted); return 1; } @@ -261,7 +261,7 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); memset(deleted, 0, g->nedges/8 + 1); free(g->critical_nodes); - g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); + g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); g->ncritical_nodes = 0; memset(g->critical_nodes, 0, (g->nnodes*sizeof(uint8))/8 + 1); DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); diff --git a/src/graph.h b/src/graph.h index c512746..4856d1c 100644 --- a/src/graph.h +++ b/src/graph.h @@ -20,9 +20,10 @@ graph_t *graph_new(uint32 nnodes, uint32 nedges); void graph_destroy(graph_t *graph); void graph_add_edge(graph_t *g, uint32 v1, uint32 v2); -//void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); +void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); void graph_clear_edges(graph_t *g); uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2); +uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2); graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v); uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); diff --git a/src/hash.c b/src/hash.c index 896c9fb..2ab3619 100644 --- a/src/hash.c +++ b/src/hash.c @@ -81,7 +81,7 @@ void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen) memcpy(*buf, hash_names[state->hashfunc], strlen(hash_names[state->hashfunc]) + 1); DEBUGP("Algobuf is %u\n", *(uint32 *)algobuf); memcpy(*buf + strlen(hash_names[state->hashfunc]) + 1, algobuf, *buflen); - *buflen = strlen(hash_names[state->hashfunc]) + 1 + *buflen; + *buflen = (uint32)strlen(hash_names[state->hashfunc]) + 1 + *buflen; free(algobuf); return; } @@ -100,7 +100,7 @@ hash_state_t *hash_state_load(const char *buf, uint32 buflen) } } if (hashfunc == HASH_COUNT) return NULL; - offset = strlen(hash_names[hashfunc]) + 1; + offset = (uint32)strlen(hash_names[hashfunc]) + 1; switch (hashfunc) { case HASH_JENKINS: diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 65ab7f3..7b9f662 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -1,9 +1,11 @@ #include "jenkins_hash.h" #include +#ifdef WIN32 +#define _USE_MATH_DEFINES //For M_LOG2E +#endif #include #include #include -#include //#define DEBUG #include "debug.h" @@ -87,7 +89,7 @@ jenkins_state_t *jenkins_state_new(uint32 size) //size of hash table jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; - state->nbits = ceil(log(size)/M_LOG2E); + state->nbits = (uint32)ceil(log(size)/M_LOG2E); state->size = size; DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; @@ -162,9 +164,6 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) { - uint32 nseed = htonl(state->seed); - uint32 nnbits = htonl(state->nbits); - uint32 nsize = htonl(state->size); *buflen = sizeof(uint32)*3; *buf = malloc(*buflen); if (!*buf) @@ -172,9 +171,9 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) *buflen = UINT_MAX; return; } - memcpy(*buf, &nseed, sizeof(uint32)); - memcpy(*buf + sizeof(uint32), &nnbits, sizeof(uint32)); - memcpy(*buf + sizeof(uint32)*2, &nsize, sizeof(uint32)); + memcpy(*buf, &(state->seed), sizeof(uint32)); + memcpy(*buf + sizeof(uint32), &(state->nbits), sizeof(uint32)); + memcpy(*buf + sizeof(uint32)*2, &(state->size), sizeof(uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); return; @@ -182,9 +181,9 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); - state->seed = ntohl(*(uint32 *)buf); - state->nbits = ntohl(*(((uint32 *)buf) + 1)); - state->size = ntohl(*(((uint32 *)buf) + 2)); + state->seed = *(uint32 *)buf; + state->nbits = *(((uint32 *)buf) + 1); + state->size = *(((uint32 *)buf) + 2); state->hashfunc = HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; diff --git a/src/main.c b/src/main.c index d092473..a133de7 100644 --- a/src/main.c +++ b/src/main.c @@ -8,7 +8,14 @@ #include #include "cmph.h" #include "hash.h" -#include "../config.h" +#include "../wingetopt.h" + +#ifdef WIN32 +#define VERSION "0.2" +#else +#include "config.h" +#endif + void usage(const char *prg) { @@ -47,7 +54,7 @@ static int key_read(void *data, char **key, uint32 *keylen) if (feof(fd)) return -1; *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); memcpy(*key + *keylen, buf, strlen(buf)); - *keylen += strlen(buf); + *keylen += (uint32)strlen(buf); if (buf[strlen(buf) - 1] != '\n') continue; break; } @@ -76,7 +83,7 @@ static uint32 count_keys(FILE *fd) while(1) { char buf[BUFSIZ]; - char *c = fgets(buf, BUFSIZ, fd); + fgets(buf, BUFSIZ, fd); if (feof(fd)) break; if (buf[strlen(buf) - 1] != '\n') continue; ++count; @@ -209,7 +216,7 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; - if (seed == UINT_MAX) seed = time(NULL); + if (seed == UINT_MAX) seed = (uint32)time(NULL); srand(seed); if (mphf_file == NULL) @@ -219,7 +226,7 @@ int main(int argc, char **argv) memcpy(mphf_file + strlen(keys_file), ".mph\0", 5); } - keys_fd = fopen64(keys_file, "r"); + keys_fd = fopen(keys_file, "r"); if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -227,7 +234,7 @@ int main(int argc, char **argv) } source.data = (void *)keys_fd; - if (seed == UINT_MAX) seed = time(NULL); + if (seed == UINT_MAX) seed = (uint32)time(NULL); if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); else source.nkeys = nkeys; source.read = key_read; @@ -242,7 +249,8 @@ int main(int argc, char **argv) if (nhashes) mph_set_hashfuncs(mph, hashes); mph_set_verbosity(mph, verbosity); if(mph_algo == MPH_BMZ && c >= 2.0) c=1.15; - mphf = mph_create(mph, c); + if (c != 0) mph_set_graphsize(mph, c); + mphf = mph_create(mph); if (mphf == NULL) { @@ -265,7 +273,7 @@ int main(int argc, char **argv) } else { - uint8 * hashtable = NULL; + uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index 391d912..c9c6943 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -15,9 +15,9 @@ void sdbm_state_destroy(sdbm_state_t *state) uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) { - register unsigned int hash = 0; + register uint32 hash = 0; const unsigned char *ptr = k; - int i = 0; + uint32 i = 0; while(i < keylen) { hash = *ptr + (hash << 6) + (hash << 16) - hash; diff --git a/src/vqueue.c b/src/vqueue.c index af07e0a..4be3481 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -1,6 +1,7 @@ #include "vqueue.h" #include #include +#include struct __vqueue_t { uint32 * values; From edcd5b670a598f0f5e3066dbf8b439addd3700a8 Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 18 Jan 2005 12:18:51 +0000 Subject: [PATCH 016/739] Fixed a lot of warnings. Added visual studio project. Make needed changes to work with windows. --- COPYING | 6 +-- INSTALL | 131 +++++++++++++++------------------------------ src/Makefile.am | 2 +- src/bmz.c | 32 +++-------- src/bmz.h | 1 + src/cmph.c | 14 +++-- src/cmph.h | 3 +- src/cmph_structs.c | 3 +- src/cmph_structs.h | 1 + src/czech.c | 38 ++++--------- src/czech.h | 1 + src/debug.h | 44 +++++++++++++-- src/djb2_hash.c | 4 +- src/graph.c | 14 ++--- src/graph.h | 3 +- src/hash.c | 4 +- src/jenkins_hash.c | 21 ++++---- src/main.c | 24 ++++++--- src/sdbm_hash.c | 4 +- src/vqueue.c | 1 + 20 files changed, 165 insertions(+), 186 deletions(-) diff --git a/COPYING b/COPYING index d60c31a..60549be 100644 --- a/COPYING +++ b/COPYING @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -291,7 +291,7 @@ convey 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) + Copyright (C) 19yy 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 @@ -313,7 +313,7 @@ Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author + Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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. diff --git a/INSTALL b/INSTALL index 54caf7c..b42a17a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,9 +1,3 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. - - This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - Basic Installation ================== @@ -14,27 +8,20 @@ various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: @@ -68,16 +55,14 @@ Compilers and Options ===================== Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== @@ -90,11 +75,11 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. Installation Names ================== @@ -137,32 +122,22 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If +See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't -need to know the machine type. +need to know the host type. - If you are _building_ compiler tools for cross-compiling, you should + If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. Sharing Defaults ================ @@ -175,43 +150,19 @@ default values for variables like `CC', `cache_file', and `prefix'. `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Defining Variables +Operation Controls ================== - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - `configure' recognizes the following options to control how it operates. -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - `--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +`--help' + Print a summary of the options to `configure', and exit. `--quiet' `--silent' @@ -224,6 +175,8 @@ operates. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. +`configure' also accepts some other, not widely useful, options. diff --git a/src/Makefile.am b/src/Makefile.am index 8a56ad1..98aef25 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,5 +18,5 @@ libcmph_la_SOURCES = debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c +cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c index 124f4a3..5c8aff3 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -9,12 +9,11 @@ #include #include #include -#include //#define DEBUG #include "debug.h" -static uint32 UNDEFINED = UINT_MAX; +//static uint32 UNDEFINED = UINT_MAX; static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) @@ -437,7 +436,7 @@ static int bmz_gen_edges(mph_t *mph) if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -457,7 +456,7 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) uint32 buflen; uint32 nbuflen; uint32 i; - uint32 two = htonl(2); //number of hash functions + uint32 two = 2; //number of hash functions bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; uint32 nn, nm; __mphf_dump(mphf, fd); @@ -466,28 +465,20 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - nn = htonl(data->n); - fwrite(&nn, sizeof(uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(uint32), 1, fd); + fwrite(&(data->n), sizeof(uint32), 1, fd); + fwrite(&(data->m), sizeof(uint32), 1, fd); - for (i = 0; i < data->n; ++i) - { - uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(uint32), 1, fd); - } + fwrite(data->g, sizeof(uint32)*(data->n), 1, fd); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -499,17 +490,14 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) void bmz_mphf_load(FILE *f, mphf_t *mphf) { uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; uint32 buflen; uint32 i; - hash_state_t *state; bmz_mphf_data_t *bmz = (bmz_mphf_data_t *)malloc(sizeof(bmz_mphf_data_t)); DEBUGP("Loading bmz mphf\n"); mphf->data = bmz; fread(&nhashes, sizeof(uint32), 1, f); - nhashes = ntohl(nhashes); bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); bmz->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -517,7 +505,6 @@ void bmz_mphf_load(FILE *f, mphf_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(uint32), 1, f); - buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -528,13 +515,10 @@ void bmz_mphf_load(FILE *f, mphf_t *mphf) DEBUGP("Reading m and n\n"); fread(&(bmz->n), sizeof(uint32), 1, f); - bmz->n = ntohl(bmz->n); fread(&(bmz->m), sizeof(uint32), 1, f); - bmz->m = ntohl(bmz->m); bmz->g = (uint32 *)malloc(sizeof(uint32)*bmz->n); fread(bmz->g, bmz->n*sizeof(uint32), 1, f); - for (i = 0; i < bmz->n; ++i) bmz->g[i] = ntohl(bmz->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); diff --git a/src/bmz.h b/src/bmz.h index 6dc3ca2..f815029 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -14,5 +14,6 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c); void bmz_mphf_load(FILE *f, mphf_t *mphf); int bmz_mphf_dump(mphf_t *mphf, FILE *f); +void bmz_mphf_destroy(mphf_t *mphf); uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); #endif diff --git a/src/cmph.c b/src/cmph.c index 9b9bb3c..7a67193 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -61,25 +61,33 @@ void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) czech_mph_set_hashfuncs(mph, hashfuncs); break; case MPH_BMZ: /* included -- Fabiano */ - bmz_mph_set_hashfuncs(mph, hashfuncs); + bmz_mph_set_hashfuncs(mph, hashfuncs); break; default: break; } return; } +void mph_set_graphsize(mph_t *mph, float c) +{ + mph->c = c; + return; +} -mphf_t *mph_create(mph_t *mph, float c) +mphf_t *mph_create(mph_t *mph) { mphf_t *mphf = NULL; + float c = mph->c; switch (mph->algo) { case MPH_CZECH: DEBUGP("Creating czech hash\n"); + if (c == 0) c = 2.09; mphf = czech_mph_create(mph, c); break; case MPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); + if (c == 0) c = 1.15; mphf = bmz_mph_create(mph, c); break; default: @@ -143,7 +151,7 @@ uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) assert(0); } assert(0); - return; + return 0; } uint32 mphf_size(mphf_t *mphf) diff --git a/src/cmph.h b/src/cmph.h index c8cdbf2..4d828bb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,8 +27,9 @@ typedef struct mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); void mph_set_verbosity(mph_t *mph, uint32 verbosity); +void mph_set_graphsize(mph_t *mph, float c); void mph_destroy(mph_t *mph); -mphf_t *mph_create(mph_t *mph, float c); +mphf_t *mph_create(mph_t *mph); /** Hash querying API **/ mphf_t *mphf_load(FILE *f); diff --git a/src/cmph_structs.c b/src/cmph_structs.c index dc38f89..9629815 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -13,6 +13,7 @@ mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) mph->algo = algo; mph->key_source = key_source; mph->verbosity = 0; + float c = 0; return mph; } @@ -24,7 +25,7 @@ void __mph_destroy(mph_t *mph) void __mphf_dump(mphf_t *mphf, FILE *fd) { uint32 nsize = htonl(mphf->size); - fwrite(mph_names[mphf->algo], strlen(mph_names[mphf->algo]) + 1, 1, fd); + fwrite(mph_names[mphf->algo], (uint32)(strlen(mph_names[mphf->algo]) + 1), 1, fd); fwrite(&nsize, sizeof(mphf->size), 1, fd); } mphf_t *__mphf_load(FILE *f) diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 9b1e634..4b9f879 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -10,6 +10,7 @@ struct __mph_t MPH_ALGO algo; key_source_t *key_source; uint32 verbosity; + float c; void *data; //algorithm dependent data }; diff --git a/src/czech.c b/src/czech.c index fb422c0..f526127 100644 --- a/src/czech.c +++ b/src/czech.c @@ -8,7 +8,6 @@ #include #include #include -#include //#define DEBUG #include "debug.h" @@ -68,7 +67,7 @@ mphf_t *czech_mph_create(mph_t *mph, float c) char *visited = NULL; czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; czech->m = mph->key_source->nkeys; - czech->n = ceil(c * mph->key_source->nkeys); + czech->n = (uint32)ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); czech->graph = graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); @@ -197,7 +196,7 @@ static int czech_gen_edges(mph_t *mph) if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -216,39 +215,29 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) { char *buf = NULL; uint32 buflen; - uint32 nbuflen; - uint32 i; - uint32 two = htonl(2); //number of hash functions + uint32 two = 2; //number of hash functions czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; - uint32 nn, nm; __mphf_dump(mphf, fd); fwrite(&two, sizeof(uint32), 1, fd); hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - nn = htonl(data->n); - fwrite(&nn, sizeof(uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(uint32), 1, fd); + fwrite(&(data->n), sizeof(uint32), 1, fd); + fwrite(&(data->m), sizeof(uint32), 1, fd); + + fwrite(data->g, sizeof(uint32)*data->n, 1, fd); - for (i = 0; i < data->n; ++i) - { - uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(uint32), 1, fd); - } #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -260,17 +249,14 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) void czech_mphf_load(FILE *f, mphf_t *mphf) { uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; uint32 buflen; uint32 i; - hash_state_t *state; czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; fread(&nhashes, sizeof(uint32), 1, f); - nhashes = ntohl(nhashes); czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -278,7 +264,6 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(uint32), 1, f); - buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -289,13 +274,10 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) DEBUGP("Reading m and n\n"); fread(&(czech->n), sizeof(uint32), 1, f); - czech->n = ntohl(czech->n); fread(&(czech->m), sizeof(uint32), 1, f); - czech->m = ntohl(czech->m); - + czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); fread(czech->g, czech->n*sizeof(uint32), 1, f); - for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); /* #ifdef DEBUG fprintf(stderr, "G: "); diff --git a/src/czech.h b/src/czech.h index 9bb758f..f83d224 100644 --- a/src/czech.h +++ b/src/czech.h @@ -14,5 +14,6 @@ mphf_t *czech_mph_create(mph_t *mph, float c); void czech_mphf_load(FILE *f, mphf_t *mphf); int czech_mphf_dump(mphf_t *mphf, FILE *f); +void czech_mphf_destroy(mphf_t *mphf); uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); #endif diff --git a/src/debug.h b/src/debug.h index 49b564e..daab6c7 100644 --- a/src/debug.h +++ b/src/debug.h @@ -1,15 +1,53 @@ -#ifndef __MY_DEBUGC__ -#define __MY_DEBUGC__ +#ifdef DEBUGP +#undef DEBUGP +#endif #ifdef __cplusplus #include +#ifdef WIN32 +#include +#endif #else #include +#ifdef WIN32 +#include #endif +#endif + +#ifdef WIN32 +#ifndef __DEBUG_H__ +#define __DEBUG_H__ +#include +static void debugprintf(const char *format, ...) +{ + va_list ap; + char *f = NULL; + const char *p="%s:%d "; + size_t plen = strlen(p); + va_start(ap, format); + f = (char *)malloc(plen + strlen(format) + 1); + if (!f) return; + memcpy(f, p, plen); + memcpy(f + plen, format, strlen(format) + 1); + vfprintf(stderr, f, ap); + va_end(ap); + free(f); +} +static void dummyprintf(const char *format, ...) +{} +#endif +#endif + #ifdef DEBUG +#ifdef WIN32 +#define DEBUGP debugprintf +#else #define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) +#endif +#else +#ifdef WIN32 +#define DEBUGP dummyprintf #else #define DEBUGP(args...) #endif - #endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 433452b..bb67e42 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -15,9 +15,9 @@ void djb2_state_destroy(djb2_state_t *state) uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) { - register unsigned int hash = 5381; + register uint32 hash = 5381; const unsigned char *ptr = k; - int i = 0; + uint32 i = 0; while (i < keylen) { hash = hash*33 ^ *ptr; diff --git a/src/graph.c b/src/graph.c index c41f2c9..cb75516 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -static uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +static const uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) @@ -52,7 +52,7 @@ graph_t *graph_new(uint32 nnodes, uint32 nedges) void graph_destroy(graph_t *graph) { - DEBUGP("Destroying graph\n"); + DEBUGP("Destroying graph\n"); free(graph->edges); free(graph->first); free(graph->next); @@ -103,7 +103,7 @@ void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) { - DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; return 0; @@ -207,7 +207,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) if (!degree1) return; while(1) { - DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); SETBIT(deleted, abs_edge(e, 0)); v2 = g->edges[abs_edge(e, 0)]; @@ -217,7 +217,7 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) degree1 = find_degree1_edge(g, v2, deleted, &e); if (degree1) { - DEBUGP("Inspecting vertex %u\n", v2); + DEBUGP("Inspecting vertex %u\n", v2); v1 = v2; } else break; @@ -240,7 +240,7 @@ int graph_is_cyclic(graph_t *g) { if (!(GETBIT(deleted, i))) { - DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); free(deleted); return 1; } @@ -261,7 +261,7 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); memset(deleted, 0, g->nedges/8 + 1); free(g->critical_nodes); - g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); + g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); g->ncritical_nodes = 0; memset(g->critical_nodes, 0, (g->nnodes*sizeof(uint8))/8 + 1); DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); diff --git a/src/graph.h b/src/graph.h index c512746..4856d1c 100644 --- a/src/graph.h +++ b/src/graph.h @@ -20,9 +20,10 @@ graph_t *graph_new(uint32 nnodes, uint32 nedges); void graph_destroy(graph_t *graph); void graph_add_edge(graph_t *g, uint32 v1, uint32 v2); -//void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); +void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); void graph_clear_edges(graph_t *g); uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2); +uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2); graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v); uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); diff --git a/src/hash.c b/src/hash.c index 896c9fb..2ab3619 100644 --- a/src/hash.c +++ b/src/hash.c @@ -81,7 +81,7 @@ void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen) memcpy(*buf, hash_names[state->hashfunc], strlen(hash_names[state->hashfunc]) + 1); DEBUGP("Algobuf is %u\n", *(uint32 *)algobuf); memcpy(*buf + strlen(hash_names[state->hashfunc]) + 1, algobuf, *buflen); - *buflen = strlen(hash_names[state->hashfunc]) + 1 + *buflen; + *buflen = (uint32)strlen(hash_names[state->hashfunc]) + 1 + *buflen; free(algobuf); return; } @@ -100,7 +100,7 @@ hash_state_t *hash_state_load(const char *buf, uint32 buflen) } } if (hashfunc == HASH_COUNT) return NULL; - offset = strlen(hash_names[hashfunc]) + 1; + offset = (uint32)strlen(hash_names[hashfunc]) + 1; switch (hashfunc) { case HASH_JENKINS: diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 65ab7f3..7b9f662 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -1,9 +1,11 @@ #include "jenkins_hash.h" #include +#ifdef WIN32 +#define _USE_MATH_DEFINES //For M_LOG2E +#endif #include #include #include -#include //#define DEBUG #include "debug.h" @@ -87,7 +89,7 @@ jenkins_state_t *jenkins_state_new(uint32 size) //size of hash table jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; - state->nbits = ceil(log(size)/M_LOG2E); + state->nbits = (uint32)ceil(log(size)/M_LOG2E); state->size = size; DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; @@ -162,9 +164,6 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) { - uint32 nseed = htonl(state->seed); - uint32 nnbits = htonl(state->nbits); - uint32 nsize = htonl(state->size); *buflen = sizeof(uint32)*3; *buf = malloc(*buflen); if (!*buf) @@ -172,9 +171,9 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) *buflen = UINT_MAX; return; } - memcpy(*buf, &nseed, sizeof(uint32)); - memcpy(*buf + sizeof(uint32), &nnbits, sizeof(uint32)); - memcpy(*buf + sizeof(uint32)*2, &nsize, sizeof(uint32)); + memcpy(*buf, &(state->seed), sizeof(uint32)); + memcpy(*buf + sizeof(uint32), &(state->nbits), sizeof(uint32)); + memcpy(*buf + sizeof(uint32)*2, &(state->size), sizeof(uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); return; @@ -182,9 +181,9 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); - state->seed = ntohl(*(uint32 *)buf); - state->nbits = ntohl(*(((uint32 *)buf) + 1)); - state->size = ntohl(*(((uint32 *)buf) + 2)); + state->seed = *(uint32 *)buf; + state->nbits = *(((uint32 *)buf) + 1); + state->size = *(((uint32 *)buf) + 2); state->hashfunc = HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; diff --git a/src/main.c b/src/main.c index d092473..a133de7 100644 --- a/src/main.c +++ b/src/main.c @@ -8,7 +8,14 @@ #include #include "cmph.h" #include "hash.h" -#include "../config.h" +#include "../wingetopt.h" + +#ifdef WIN32 +#define VERSION "0.2" +#else +#include "config.h" +#endif + void usage(const char *prg) { @@ -47,7 +54,7 @@ static int key_read(void *data, char **key, uint32 *keylen) if (feof(fd)) return -1; *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); memcpy(*key + *keylen, buf, strlen(buf)); - *keylen += strlen(buf); + *keylen += (uint32)strlen(buf); if (buf[strlen(buf) - 1] != '\n') continue; break; } @@ -76,7 +83,7 @@ static uint32 count_keys(FILE *fd) while(1) { char buf[BUFSIZ]; - char *c = fgets(buf, BUFSIZ, fd); + fgets(buf, BUFSIZ, fd); if (feof(fd)) break; if (buf[strlen(buf) - 1] != '\n') continue; ++count; @@ -209,7 +216,7 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; - if (seed == UINT_MAX) seed = time(NULL); + if (seed == UINT_MAX) seed = (uint32)time(NULL); srand(seed); if (mphf_file == NULL) @@ -219,7 +226,7 @@ int main(int argc, char **argv) memcpy(mphf_file + strlen(keys_file), ".mph\0", 5); } - keys_fd = fopen64(keys_file, "r"); + keys_fd = fopen(keys_file, "r"); if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -227,7 +234,7 @@ int main(int argc, char **argv) } source.data = (void *)keys_fd; - if (seed == UINT_MAX) seed = time(NULL); + if (seed == UINT_MAX) seed = (uint32)time(NULL); if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); else source.nkeys = nkeys; source.read = key_read; @@ -242,7 +249,8 @@ int main(int argc, char **argv) if (nhashes) mph_set_hashfuncs(mph, hashes); mph_set_verbosity(mph, verbosity); if(mph_algo == MPH_BMZ && c >= 2.0) c=1.15; - mphf = mph_create(mph, c); + if (c != 0) mph_set_graphsize(mph, c); + mphf = mph_create(mph); if (mphf == NULL) { @@ -265,7 +273,7 @@ int main(int argc, char **argv) } else { - uint8 * hashtable = NULL; + uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index 391d912..c9c6943 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -15,9 +15,9 @@ void sdbm_state_destroy(sdbm_state_t *state) uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) { - register unsigned int hash = 0; + register uint32 hash = 0; const unsigned char *ptr = k; - int i = 0; + uint32 i = 0; while(i < keylen) { hash = *ptr + (hash << 6) + (hash << 16) - hash; diff --git a/src/vqueue.c b/src/vqueue.c index af07e0a..4be3481 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -1,6 +1,7 @@ #include "vqueue.h" #include #include +#include struct __vqueue_t { uint32 * values; From 583b16d44b5a6682d833dca42a3c56f717961cc4 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 15:56:14 +0000 Subject: [PATCH 017/739] no message --- src/czech.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/czech.c b/src/czech.c index f526127..ac6bec0 100644 --- a/src/czech.c +++ b/src/czech.c @@ -1,3 +1,4 @@ + #include "czech.h" #include "cmph_structs.h" #include "czech_structs.h" From d2527ad507b2a7bce4caba076cd86b5bea7c2bd8 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 15:56:14 +0000 Subject: [PATCH 018/739] no message --- src/czech.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/czech.c b/src/czech.c index f526127..ac6bec0 100644 --- a/src/czech.c +++ b/src/czech.c @@ -1,3 +1,4 @@ + #include "czech.h" #include "cmph_structs.h" #include "czech_structs.h" From 7e254975230fadc3c0a13470eadc678770a4668b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 15:58:02 +0000 Subject: [PATCH 019/739] using bit mask to represent boolean values --- src/czech.c | 71 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/src/czech.c b/src/czech.c index ac6bec0..16efe3f 100644 --- a/src/czech.c +++ b/src/czech.c @@ -1,4 +1,3 @@ - #include "czech.h" #include "cmph_structs.h" #include "czech_structs.h" @@ -9,12 +8,18 @@ #include #include #include +#include //#define DEBUG #include "debug.h" +static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + static int czech_gen_edges(mph_t *mph); -static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v); +static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v); mph_t *czech_mph_new(key_source_t *key_source) { @@ -64,11 +69,11 @@ mphf_t *czech_mph_create(mph_t *mph, float c) czech_mphf_data_t *czechf = NULL; uint32 i; - uint32 iterations = 10; - char *visited = NULL; + uint32 iterations = 20; + uint8 *visited = NULL; czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; czech->m = mph->key_source->nkeys; - czech->n = (uint32)ceil(c * mph->key_source->nkeys); + czech->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); czech->graph = graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); @@ -114,21 +119,14 @@ mphf_t *czech_mph_create(mph_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(czech->n); - memset(visited, 0, czech->n); + visited = (char *)malloc(czech->n/8 + 1); + memset(visited, 0, czech->n/8 + 1); free(czech->g); czech->g = malloc(czech->n * sizeof(uint32)); assert(czech->g); - if (!czech->g) - { - fprintf(stderr, "out of memory"); - free(visited); - graph_destroy(czech->graph); - return NULL; - } for (i = 0; i < czech->n; ++i) { - if (!visited[i]) + if (!GETBIT(visited,i)) { czech->g[i] = 0; czech_traverse(czech, visited, i); @@ -157,18 +155,18 @@ mphf_t *czech_mph_create(mph_t *mph, float c) return mphf; } -static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v) +static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v) { graph_iterator_t it = graph_neighbors_it(czech->graph, v); uint32 neighbor = 0; - visited[v] = 1; + SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); - if(visited[neighbor]) continue; + if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; @@ -197,7 +195,7 @@ static int czech_gen_edges(mph_t *mph) if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -216,29 +214,39 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) { char *buf = NULL; uint32 buflen; - uint32 two = 2; //number of hash functions + uint32 nbuflen; + uint32 i; + uint32 two = htonl(2); //number of hash functions czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + uint32 nn, nm; __mphf_dump(mphf, fd); fwrite(&two, sizeof(uint32), 1, fd); hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - fwrite(&(data->n), sizeof(uint32), 1, fd); - fwrite(&(data->m), sizeof(uint32), 1, fd); - - fwrite(data->g, sizeof(uint32)*data->n, 1, fd); + nn = htonl(data->n); + fwrite(&nn, sizeof(uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(uint32), 1, fd); + for (i = 0; i < data->n; ++i) + { + uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(uint32), 1, fd); + } #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -250,14 +258,17 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) void czech_mphf_load(FILE *f, mphf_t *mphf) { uint32 nhashes; + char fbuf[BUFSIZ]; char *buf = NULL; uint32 buflen; uint32 i; + hash_state_t *state; czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; fread(&nhashes, sizeof(uint32), 1, f); + nhashes = ntohl(nhashes); czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -265,6 +276,7 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(uint32), 1, f); + buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -275,17 +287,18 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) DEBUGP("Reading m and n\n"); fread(&(czech->n), sizeof(uint32), 1, f); + czech->n = ntohl(czech->n); fread(&(czech->m), sizeof(uint32), 1, f); - + czech->m = ntohl(czech->m); + czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); fread(czech->g, czech->n*sizeof(uint32), 1, f); - /* + for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); fprintf(stderr, "\n"); #endif - */ return; } From 345e2a7bf084c26d915face521b1151c6b654a5e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 15:58:02 +0000 Subject: [PATCH 020/739] using bit mask to represent boolean values --- src/czech.c | 71 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/src/czech.c b/src/czech.c index ac6bec0..16efe3f 100644 --- a/src/czech.c +++ b/src/czech.c @@ -1,4 +1,3 @@ - #include "czech.h" #include "cmph_structs.h" #include "czech_structs.h" @@ -9,12 +8,18 @@ #include #include #include +#include //#define DEBUG #include "debug.h" +static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + static int czech_gen_edges(mph_t *mph); -static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v); +static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v); mph_t *czech_mph_new(key_source_t *key_source) { @@ -64,11 +69,11 @@ mphf_t *czech_mph_create(mph_t *mph, float c) czech_mphf_data_t *czechf = NULL; uint32 i; - uint32 iterations = 10; - char *visited = NULL; + uint32 iterations = 20; + uint8 *visited = NULL; czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; czech->m = mph->key_source->nkeys; - czech->n = (uint32)ceil(c * mph->key_source->nkeys); + czech->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); czech->graph = graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); @@ -114,21 +119,14 @@ mphf_t *czech_mph_create(mph_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(czech->n); - memset(visited, 0, czech->n); + visited = (char *)malloc(czech->n/8 + 1); + memset(visited, 0, czech->n/8 + 1); free(czech->g); czech->g = malloc(czech->n * sizeof(uint32)); assert(czech->g); - if (!czech->g) - { - fprintf(stderr, "out of memory"); - free(visited); - graph_destroy(czech->graph); - return NULL; - } for (i = 0; i < czech->n; ++i) { - if (!visited[i]) + if (!GETBIT(visited,i)) { czech->g[i] = 0; czech_traverse(czech, visited, i); @@ -157,18 +155,18 @@ mphf_t *czech_mph_create(mph_t *mph, float c) return mphf; } -static void czech_traverse(czech_mph_data_t *czech, char *visited, uint32 v) +static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v) { graph_iterator_t it = graph_neighbors_it(czech->graph, v); uint32 neighbor = 0; - visited[v] = 1; + SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); - if(visited[neighbor]) continue; + if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; @@ -197,7 +195,7 @@ static int czech_gen_edges(mph_t *mph) if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -216,29 +214,39 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) { char *buf = NULL; uint32 buflen; - uint32 two = 2; //number of hash functions + uint32 nbuflen; + uint32 i; + uint32 two = htonl(2); //number of hash functions czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + uint32 nn, nm; __mphf_dump(mphf, fd); fwrite(&two, sizeof(uint32), 1, fd); hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - fwrite(&(data->n), sizeof(uint32), 1, fd); - fwrite(&(data->m), sizeof(uint32), 1, fd); - - fwrite(data->g, sizeof(uint32)*data->n, 1, fd); + nn = htonl(data->n); + fwrite(&nn, sizeof(uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(uint32), 1, fd); + for (i = 0; i < data->n; ++i) + { + uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(uint32), 1, fd); + } #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -250,14 +258,17 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) void czech_mphf_load(FILE *f, mphf_t *mphf) { uint32 nhashes; + char fbuf[BUFSIZ]; char *buf = NULL; uint32 buflen; uint32 i; + hash_state_t *state; czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; fread(&nhashes, sizeof(uint32), 1, f); + nhashes = ntohl(nhashes); czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -265,6 +276,7 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(uint32), 1, f); + buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -275,17 +287,18 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) DEBUGP("Reading m and n\n"); fread(&(czech->n), sizeof(uint32), 1, f); + czech->n = ntohl(czech->n); fread(&(czech->m), sizeof(uint32), 1, f); - + czech->m = ntohl(czech->m); + czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); fread(czech->g, czech->n*sizeof(uint32), 1, f); - /* + for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); fprintf(stderr, "\n"); #endif - */ return; } From df3977eb033b2f1bbf5681836cca3975cdc90087 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 16:16:17 +0000 Subject: [PATCH 021/739] initial version From 9d691116b6f0f8185e195a6bcd08c165501b6e4c Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 16:16:17 +0000 Subject: [PATCH 022/739] initial version --- aclocal.m4 | 6960 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 6960 insertions(+) create mode 100644 aclocal.m4 diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..1d29c62 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,6960 @@ +# generated automatically by aclocal 1.9.3 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 47 AC_PROG_LIBTOOL +# Debian $Rev: 214 $ + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd* | netbsdelf*-gnu | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu | knetbsd*-gnu) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux*) + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED +]) +AC_MSG_RESULT([$SED]) +]) + +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.9.3])]) + +# AM_AUX_DIR_EXPAND + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 6 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# serial 7 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 7 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 11 + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# -*- Autoconf -*- + + +# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. + +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004 Free Software Foundation, Inc. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + From 1e238c4b038fe28e37a628b627fb9dccb4b2df6d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 16:25:02 +0000 Subject: [PATCH 023/739] initial version From c902bb96d07ba8796356c754387828acd3de6409 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 16:25:02 +0000 Subject: [PATCH 024/739] initial version --- aclocal.m4 | 6960 ---------------------------------------------------- 1 file changed, 6960 deletions(-) delete mode 100644 aclocal.m4 diff --git a/aclocal.m4 b/aclocal.m4 deleted file mode 100644 index 1d29c62..0000000 --- a/aclocal.m4 +++ /dev/null @@ -1,6960 +0,0 @@ -# generated automatically by aclocal 1.9.3 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 -# Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- - -# serial 47 AC_PROG_LIBTOOL -# Debian $Rev: 214 $ - - -# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) -# ----------------------------------------------------------- -# If this macro is not defined by Autoconf, define it here. -m4_ifdef([AC_PROVIDE_IFELSE], - [], - [m4_define([AC_PROVIDE_IFELSE], - [m4_ifdef([AC_PROVIDE_$1], - [$2], [$3])])]) - - -# AC_PROG_LIBTOOL -# --------------- -AC_DEFUN([AC_PROG_LIBTOOL], -[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl -dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX -dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. - AC_PROVIDE_IFELSE([AC_PROG_CXX], - [AC_LIBTOOL_CXX], - [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX - ])]) -dnl And a similar setup for Fortran 77 support - AC_PROVIDE_IFELSE([AC_PROG_F77], - [AC_LIBTOOL_F77], - [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -])]) - -dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. - AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [ifdef([AC_PROG_GCJ], - [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([A][M_PROG_GCJ], - [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([LT_AC_PROG_GCJ], - [define([LT_AC_PROG_GCJ], - defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -])])# AC_PROG_LIBTOOL - - -# _AC_PROG_LIBTOOL -# ---------------- -AC_DEFUN([_AC_PROG_LIBTOOL], -[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl -AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -# Prevent multiple expansion -define([AC_PROG_LIBTOOL], []) -])# _AC_PROG_LIBTOOL - - -# AC_LIBTOOL_SETUP -# ---------------- -AC_DEFUN([AC_LIBTOOL_SETUP], -[AC_PREREQ(2.50)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl -AC_REQUIRE([AC_PROG_NM])dnl - -AC_REQUIRE([AC_PROG_LN_S])dnl -AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl -# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! -AC_REQUIRE([AC_OBJEXT])dnl -AC_REQUIRE([AC_EXEEXT])dnl -dnl - -AC_LIBTOOL_SYS_MAX_CMD_LEN -AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -AC_LIBTOOL_OBJDIR - -AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -_LT_AC_PROG_ECHO_BACKSLASH - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] - -# Same as above, but do not quote variable references. -[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" - -AC_CHECK_TOOL(AR, ar, false) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(STRIP, strip, :) - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$MAGIC_CMD" && MAGIC_CMD=file -test -z "$NM" && NM=nm -test -z "$SED" && SED=sed -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$ac_objext" && ac_objext=o - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" - ;; - *) - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -# Only perform the check for file, if the check method requires it -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - AC_PATH_MAGIC - fi - ;; -esac - -AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -enable_win32_dll=yes, enable_win32_dll=no) - -AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -AC_ARG_WITH([pic], - [AC_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) -test -z "$pic_mode" && pic_mode=default - -# Use C for the default configuration in the libtool script -tagname= -AC_LIBTOOL_LANG_C_CONFIG -_LT_AC_TAGCONFIG -])# AC_LIBTOOL_SETUP - - -# _LT_AC_SYS_COMPILER -# ------------------- -AC_DEFUN([_LT_AC_SYS_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_AC_SYS_COMPILER - - -# _LT_AC_SYS_LIBPATH_AIX -# ---------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -])# _LT_AC_SYS_LIBPATH_AIX - - -# _LT_AC_SHELL_INIT(ARG) -# ---------------------- -AC_DEFUN([_LT_AC_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_AC_SHELL_INIT - - -# _LT_AC_PROG_ECHO_BACKSLASH -# -------------------------- -# Add some code to the start of the generated configure script which -# will find an echo command which doesn't interpret backslashes. -AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], -[_LT_AC_SHELL_INIT([ -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` - ;; -esac - -echo=${ECHO-echo} -if test "X[$]1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X[$]1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} -fi - -if test "X[$]1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null && - echo_test_string="`eval $cmd`" && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null - then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : -else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} - else - # Try using printf. - echo='printf %s\n' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL [$]0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$CONFIG_SHELL [$]0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "[$]0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -ECHO=$echo -if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then - ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -fi - -AC_SUBST(ECHO) -])])# _LT_AC_PROG_ECHO_BACKSLASH - - -# _LT_AC_LOCK -# ----------- -AC_DEFUN([_LT_AC_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw* | *-*-pw32*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; - ]) -esac - -need_locks="$enable_libtool_lock" - -])# _LT_AC_LOCK - - -# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], -[AC_REQUIRE([LT_AC_PROG_SED]) -AC_CACHE_CHECK([$1], [$2], - [$2=no - ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s conftest.err; then - $2=yes - fi - fi - $rm conftest* -]) - -if test x"[$]$2" = xyes; then - ifelse([$5], , :, [$5]) -else - ifelse([$6], , :, [$6]) -fi -])# AC_LIBTOOL_COMPILER_OPTION - - -# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ------------------------------------------------------------ -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -[AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - else - $2=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - ifelse([$4], , :, [$4]) -else - ifelse([$5], , :, [$5]) -fi -])# AC_LIBTOOL_LINKER_OPTION - - -# AC_LIBTOOL_SYS_MAX_CMD_LEN -# -------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], -[# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - *) - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ - = "XX$teststring") >/dev/null 2>&1 && - new_result=`expr "X$teststring" : ".*" 2>&1` && - lt_cv_sys_max_cmd_len=$new_result && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - teststring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -])# AC_LIBTOOL_SYS_MAX_CMD_LEN - - -# _LT_AC_CHECK_DLFCN -# -------------------- -AC_DEFUN([_LT_AC_CHECK_DLFCN], -[AC_CHECK_HEADERS(dlfcn.h)dnl -])# _LT_AC_CHECK_DLFCN - - -# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ------------------------------------------------------------------ -AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -}] -EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_unknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_AC_TRY_DLOPEN_SELF - - -# AC_LIBTOOL_DLOPEN_SELF -# ------------------- -AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_AC_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_AC_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -])# AC_LIBTOOL_DLOPEN_SELF - - -# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) -# --------------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler -AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test ! -s out/conftest.err; then - _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* -]) -])# AC_LIBTOOL_PROG_CC_C_O - - -# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) -# ----------------------------------------- -# Check to see if we can do hard links to lock some files if needed -AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], -[AC_REQUIRE([_LT_AC_LOCK])dnl - -hard_links="nottested" -if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS - - -# AC_LIBTOOL_OBJDIR -# ----------------- -AC_DEFUN([AC_LIBTOOL_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -])# AC_LIBTOOL_OBJDIR - - -# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) -# ---------------------------------------------- -# Check hardcoding attributes. -AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_AC_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ - test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ - test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then - - # We can hardcode non-existant directories. - if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_AC_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_AC_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_AC_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH - - -# AC_LIBTOOL_SYS_LIB_STRIP -# ------------------------ -AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], -[striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) -fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -])# AC_LIBTOOL_SYS_LIB_STRIP - - -# AC_LIBTOOL_SYS_DYNAMIC_LINKER -# ----------------------------- -# PORTME Fill in your ld.so characteristics -AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -[AC_MSG_CHECKING([dynamic linker characteristics]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case "$host_cpu" in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - need_version=yes - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no -])# AC_LIBTOOL_SYS_DYNAMIC_LINKER - - -# _LT_AC_TAGCONFIG -# ---------------- -AC_DEFUN([_LT_AC_TAGCONFIG], -[AC_ARG_WITH([tags], - [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], - [include additional configurations @<:@automatic@:>@])], - [tagnames="$withval"]) - -if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then - AC_MSG_WARN([output file `$ofile' does not exist]) - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then - AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) - else - AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) - fi - fi - - # Extract list of available tagged configurations in $ofile. - # Note that this assumes the entire list is on one line. - available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` - - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for tagname in $tagnames; do - IFS="$lt_save_ifs" - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in - "") ;; - *) AC_MSG_ERROR([invalid tag name: $tagname]) - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then - AC_MSG_ERROR([tag name \"$tagname\" already exists]) - fi - - # Update the list of available tags. - if test -n "$tagname"; then - echo appending configuration tag \"$tagname\" to $ofile - - case $tagname in - CXX) - if test -n "$CXX" && test "X$CXX" != "Xno"; then - AC_LIBTOOL_LANG_CXX_CONFIG - else - tagname="" - fi - ;; - - F77) - if test -n "$F77" && test "X$F77" != "Xno"; then - AC_LIBTOOL_LANG_F77_CONFIG - else - tagname="" - fi - ;; - - GCJ) - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - AC_LIBTOOL_LANG_GCJ_CONFIG - else - tagname="" - fi - ;; - - RC) - AC_LIBTOOL_LANG_RC_CONFIG - ;; - - *) - AC_MSG_ERROR([Unsupported tag name: $tagname]) - ;; - esac - - # Append the new tag name to the list of available tags. - if test -n "$tagname" ; then - available_tags="$available_tags $tagname" - fi - fi - done - IFS="$lt_save_ifs" - - # Now substitute the updated list of available tags. - if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then - mv "${ofile}T" "$ofile" - chmod +x "$ofile" - else - rm -f "${ofile}T" - AC_MSG_ERROR([unable to update list of available tagged configurations.]) - fi -fi -])# _LT_AC_TAGCONFIG - - -# AC_LIBTOOL_DLOPEN -# ----------------- -# enable checks for dlopen support -AC_DEFUN([AC_LIBTOOL_DLOPEN], - [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_DLOPEN - - -# AC_LIBTOOL_WIN32_DLL -# -------------------- -# declare package support for building win32 dll's -AC_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_WIN32_DLL - - -# AC_ENABLE_SHARED([DEFAULT]) -# --------------------------- -# implement the --enable-shared flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_SHARED], -[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([shared], - [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]AC_ENABLE_SHARED_DEFAULT) -])# AC_ENABLE_SHARED - - -# AC_DISABLE_SHARED -# ----------------- -#- set the default shared flag to --disable-shared -AC_DEFUN([AC_DISABLE_SHARED], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no) -])# AC_DISABLE_SHARED - - -# AC_ENABLE_STATIC([DEFAULT]) -# --------------------------- -# implement the --enable-static flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_STATIC], -[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([static], - [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]AC_ENABLE_STATIC_DEFAULT) -])# AC_ENABLE_STATIC - - -# AC_DISABLE_STATIC -# ----------------- -# set the default static flag to --disable-static -AC_DEFUN([AC_DISABLE_STATIC], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no) -])# AC_DISABLE_STATIC - - -# AC_ENABLE_FAST_INSTALL([DEFAULT]) -# --------------------------------- -# implement the --enable-fast-install flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_FAST_INSTALL], -[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([fast-install], - [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) -])# AC_ENABLE_FAST_INSTALL - - -# AC_DISABLE_FAST_INSTALL -# ----------------------- -# set the default to --disable-fast-install -AC_DEFUN([AC_DISABLE_FAST_INSTALL], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no) -])# AC_DISABLE_FAST_INSTALL - - -# AC_LIBTOOL_PICMODE([MODE]) -# -------------------------- -# implement the --with-pic flag -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -AC_DEFUN([AC_LIBTOOL_PICMODE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -pic_mode=ifelse($#,1,$1,default) -])# AC_LIBTOOL_PICMODE - - -# AC_PROG_EGREP -# ------------- -# This is predefined starting with Autoconf 2.54, so this conditional -# definition can be removed once we require Autoconf 2.54 or later. -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], -[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], - [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi]) - EGREP=$ac_cv_prog_egrep - AC_SUBST([EGREP]) -])]) - - -# AC_PATH_TOOL_PREFIX -# ------------------- -# find a file program which can recognise shared library -AC_DEFUN([AC_PATH_TOOL_PREFIX], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="ifelse([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -])# AC_PATH_TOOL_PREFIX - - -# AC_PATH_MAGIC -# ------------- -# find a file program which can recognise a shared library -AC_DEFUN([AC_PATH_MAGIC], -[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# AC_PATH_MAGIC - - -# AC_PROG_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([AC_PROG_LD], -[AC_ARG_WITH([gnu-ld], - [AC_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no]) -AC_REQUIRE([LT_AC_PROG_SED])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case "$host_cpu" in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu | knetbsd*-gnu) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -nto-qnx*) - lt_cv_deplibs_check_method=unknown - ;; - -openbsd*) - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' - else - lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -sco3.2v5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown -])# AC_DEPLIBS_CHECK_METHOD - - -# AC_PROG_NM -# ---------- -# find the pathname to a BSD-compatible name lister -AC_DEFUN([AC_PROG_NM], -[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/${ac_tool_prefix}nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - esac - fi - done - IFS="$lt_save_ifs" - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -fi]) -NM="$lt_cv_path_NM" -])# AC_PROG_NM - - -# AC_CHECK_LIBM -# ------------- -# check for math library -AC_DEFUN([AC_CHECK_LIBM], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -])# AC_CHECK_LIBM - - -# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl convenience library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will -# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and -# top_srcdir appropriately in the Makefiles. -AC_DEFUN([AC_LIBLTDL_CONVENIENCE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case $enable_ltdl_convenience in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_CONVENIENCE - - -# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl installable library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that LIBLTDL -# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If -# DIRECTORY is not provided and an installed libltdl is not found, it is -# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' -# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single -# quotes!). If your package is not flat and you're not using automake, -# define top_builddir and top_srcdir appropriately in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN([AC_LIBLTDL_INSTALLABLE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, lt_dlinit, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - LTDLINCL= - fi - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_INSTALLABLE - - -# AC_LIBTOOL_CXX -# -------------- -# enable support for C++ libraries -AC_DEFUN([AC_LIBTOOL_CXX], -[AC_REQUIRE([_LT_AC_LANG_CXX]) -])# AC_LIBTOOL_CXX - - -# _LT_AC_LANG_CXX -# --------------- -AC_DEFUN([_LT_AC_LANG_CXX], -[AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) -])# _LT_AC_LANG_CXX - - -# AC_LIBTOOL_F77 -# -------------- -# enable support for Fortran 77 libraries -AC_DEFUN([AC_LIBTOOL_F77], -[AC_REQUIRE([_LT_AC_LANG_F77]) -])# AC_LIBTOOL_F77 - - -# _LT_AC_LANG_F77 -# --------------- -AC_DEFUN([_LT_AC_LANG_F77], -[AC_REQUIRE([AC_PROG_F77]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) -])# _LT_AC_LANG_F77 - - -# AC_LIBTOOL_GCJ -# -------------- -# enable support for GCJ libraries -AC_DEFUN([AC_LIBTOOL_GCJ], -[AC_REQUIRE([_LT_AC_LANG_GCJ]) -])# AC_LIBTOOL_GCJ - - -# _LT_AC_LANG_GCJ -# --------------- -AC_DEFUN([_LT_AC_LANG_GCJ], -[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], - [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], - [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], - [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) -])# _LT_AC_LANG_GCJ - - -# AC_LIBTOOL_RC -# -------------- -# enable support for Windows resource files -AC_DEFUN([AC_LIBTOOL_RC], -[AC_REQUIRE([LT_AC_PROG_RC]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) -])# AC_LIBTOOL_RC - - -# AC_LIBTOOL_LANG_C_CONFIG -# ------------------------ -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) -AC_DEFUN([_LT_AC_LANG_C_CONFIG], -[lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' - -_LT_AC_SYS_COMPILER - -# -# Check for any special shared library compilation flags. -# -_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= -if test "$GCC" = no; then - case $host_os in - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' - ;; - esac -fi -if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then - AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) - if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : - else - AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) - _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no - fi -fi - - -# -# Check to make sure the static flag actually works. -# -AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), - $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), - [], - [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) - - -AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) - -# Report which librarie types wil actually be built -AC_MSG_CHECKING([if libtool supports shared libraries]) -AC_MSG_RESULT([$can_build_shared]) - -AC_MSG_CHECKING([whether to build shared libraries]) -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - darwin* | rhapsody*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' - ;; - esac - fi - ;; - esac - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; -esac -AC_MSG_RESULT([$enable_shared]) - -AC_MSG_CHECKING([whether to build static libraries]) -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -AC_MSG_RESULT([$enable_static]) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC="$lt_save_CC" -])# AC_LIBTOOL_LANG_C_CONFIG - - -# AC_LIBTOOL_LANG_CXX_CONFIG -# -------------------------- -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) -AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], -[AC_LANG_PUSH(C++) -AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([AC_PROG_CXXCPP]) - -_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_AC_TAGVAR(allow_undefined_flag, $1)= -_LT_AC_TAGVAR(always_export_symbols, $1)=no -_LT_AC_TAGVAR(archive_expsym_cmds, $1)= -_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_direct, $1)=no -_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= -_LT_AC_TAGVAR(hardcode_minus_L, $1)=no -_LT_AC_TAGVAR(hardcode_automatic, $1)=no -_LT_AC_TAGVAR(module_cmds, $1)= -_LT_AC_TAGVAR(module_expsym_cmds, $1)= -_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown -_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_AC_TAGVAR(no_undefined_flag, $1)= -_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Dependencies to place before and after the object being linked: -_LT_AC_TAGVAR(predep_objects, $1)= -_LT_AC_TAGVAR(postdep_objects, $1)= -_LT_AC_TAGVAR(predeps, $1)= -_LT_AC_TAGVAR(postdeps, $1)= -_LT_AC_TAGVAR(compiler_lib_search_path, $1)= - -# Source file extension for C++ test sources. -ac_ext=cc - -# Object file extension for compiled C++ test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_AC_SYS_COMPILER - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -_LT_AC_TAGVAR(compiler, $1)=$CC -cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' -else - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - AC_PROG_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -_LT_AC_TAGVAR(ld_shlibs, $1)=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - darwin* | rhapsody*) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' - ;; - esac - fi - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - dgux*) - case $cc_basename in - ec++) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - freebsd-elf*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - freebsd* | kfreebsd*-gnu) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - ;; - gnu*) - ;; - hpux9*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - ;; - *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - *) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC) - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case "$host_cpu" in - ia64*|hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - irix5* | irix6*) - case $cc_basename in - CC) - # SGI C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - linux*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc) - # Intel C++ - with_gnu_ld=yes - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - cxx) - # Compaq C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - m88k*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - mvs*) - case $cc_basename in - cxx) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - netbsd* | netbsdelf*-gnu | knetbsd*-gnu) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - osf3*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' - ;; - RCC) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ - $rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - sco*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case $cc_basename in - CC) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - lcc) - # Lucid - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; -esac -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_AC_TAGVAR(GCC, $1)="$GXX" -_LT_AC_TAGVAR(LD, $1)="$LD" - -AC_LIBTOOL_POSTDEP_PREDEP($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF($1) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -])# AC_LIBTOOL_LANG_CXX_CONFIG - -# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) -# ------------------------ -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" -ifelse([$1], [], -[#! $SHELL - -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: -# Originally by Gordon Matzigkeit , 1996 -# -# 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 2 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -# The names of the tagged configurations supported by this script. -available_tags= - -# ### BEGIN LIBTOOL CONFIG], -[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) - -# Is the compiler the GNU C compiler? -with_gcc=$_LT_AC_TAGVAR(GCC, $1) - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_[]_LT_AC_TAGVAR(LD, $1) - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) - -# Must we lock files when doing compilation ? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) - -# Commands used to build and install a shared archive. -archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) -archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) -module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" - -# Set to yes if exported symbols are required. -always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) - -# The commands to list exported symbols. -export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) - -# Symbols that must always be exported. -include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) - -ifelse([$1],[], -[# ### END LIBTOOL CONFIG], -[# ### END LIBTOOL TAG CONFIG: $tagname]) - -__EOF__ - -ifelse([$1],[], [ - case $host_os in - aix3*) - cat <<\EOF >> "$cfgfile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || \ - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -]) -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi -])# AC_LIBTOOL_CONFIG - - -# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl - -_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - - AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI - - -# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -# --------------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -[AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_NM]) -AC_REQUIRE([AC_OBJEXT]) -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) # Its linker distinguishes data from code symbols - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris* | sysv5*) - symcode='[[BDRT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if grep ' nm_test_var$' "$nlist" >/dev/null; then - if grep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' - - cat <> conftest.$ac_ext -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[[]] = -{ -EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext - cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -f conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi -]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE - - -# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) -# --------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], -[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= - -AC_MSG_CHECKING([for $compiler option to produce PIC]) - ifelse([$1],[CXX],[ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | kfreebsd*-gnu) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC) - # KAI C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - icpc) - # Intel C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - cxx) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu | knetbsd*-gnu) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC) - # Rational C++ 2.4.1 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx) - # Digital/Compaq C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - sco*) - case $cc_basename in - CC) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - *) - ;; - esac - ;; - solaris*) - case $cc_basename in - CC) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC) - # Sun C++ 4.x - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc) - # Lucid - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC) - # NonStop-UX NCC 3.20 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - unixware*) - ;; - vxworks*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case "$host_cpu" in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - newsos6) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - linux*) - case $CC in - icc* | ecc*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - ccc*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - sco3.2v5*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' - ;; - - solaris*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sunos4*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - uts4*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then - AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), - [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -case "$host_os" in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" - ;; -esac -]) - - -# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) -# ------------------------------------ -# See if the linker supports building shared libraries. -AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], -[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -ifelse([$1],[CXX],[ - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - linux*) - _LT_AC_TAGVAR(link_all_deplibs, $1)=no - ;; - *) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -],[ - runpath_var= - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)= - _LT_AC_TAGVAR(archive_expsym_cmds, $1)= - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= - _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown - _LT_AC_TAGVAR(hardcode_automatic, $1)=no - _LT_AC_TAGVAR(module_cmds, $1)= - _LT_AC_TAGVAR(module_expsym_cmds, $1)= - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_AC_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu | knetbsd*-gnu) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sunos4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" - fi - _LT_AC_TAGVAR(link_all_deplibs, $1)=no - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds it's shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - # see comment about different semantics on the GNU ld section - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - bsdi4*) - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - - darwin* | rhapsody*) - if test "$GXX" = yes ; then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - case "$host_os" in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' - ;; - esac - fi - ;; - esac - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - dgux*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case "$host_cpu" in - hppa*64*|ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - *) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd* | netbsdelf*-gnu | knetbsd*-gnu) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - sco3.2v5*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4.2uw2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv5*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_AC_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_MSG_CHECKING([whether -lc should be explicitly linked in]) - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) - then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) - ;; - esac - fi - ;; -esac -])# AC_LIBTOOL_PROG_LD_SHLIBS - - -# _LT_AC_FILE_LTDLL_C -# ------------------- -# Be careful that the start marker always follows a newline. -AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ -# /* ltdll.c starts here */ -# #define WIN32_LEAN_AND_MEAN -# #include -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ -])# _LT_AC_FILE_LTDLL_C - - -# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) -# --------------------------------- -AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) - - -# old names -AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) -AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) -AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) - -# This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL]) - -AC_DEFUN([LT_AC_PROG_GCJ], -[AC_CHECK_TOOL(GCJ, gcj, no) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS) -]) - -AC_DEFUN([LT_AC_PROG_RC], -[AC_CHECK_TOOL(RC, windres, no) -]) - -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -# LT_AC_PROG_SED -# -------------- -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -AC_DEFUN([LT_AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && break - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -SED=$lt_cv_path_SED -]) -AC_MSG_RESULT([$SED]) -]) - -# -*- Autoconf -*- -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. -# Generated from amversion.in; do not edit by hand. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.3])]) - -# AM_AUX_DIR_EXPAND - -# Copyright (C) 2001, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 6 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# serial 7 -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 -# Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 -# Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -#serial 2 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 7 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) - -# Do all the work for Automake. -*- Autoconf -*- - -# This macro actually does too much some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 -# Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 11 - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -]) -]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $1 | $1:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. - -# Copyright (C) 2001, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) - -# -*- Autoconf -*- -# Copyright (C) 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 1 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 2 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# -*- Autoconf -*- - - -# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 3 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# AM_PROG_MKDIR_P -# --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. - -# Copyright (C) 2003, 2004 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) -AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 2 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# -# Check to make sure that the build environment is sane. -# - -# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 3 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# AM_PROG_INSTALL_STRIP - -# Copyright (C) 2001, 2003 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004 Free Software Foundation, Inc. - -# 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 2, 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# serial 1 - - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - From 2c837e225e251e4a170ff83b36efe00dbb4204dc Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 18 Jan 2005 17:10:28 +0000 Subject: [PATCH 025/739] Added missing files. --- ChangeLog | 188 ++++++++++++------------------------------- cmph.vcproj | 210 +++++++++++++++++++++++++++++++++++++++++++++++++ cmphapp.vcproj | 141 +++++++++++++++++++++++++++++++++ wingetopt.c | 177 +++++++++++++++++++++++++++++++++++++++++ wingetopt.h | 25 ++++++ 5 files changed, 602 insertions(+), 139 deletions(-) create mode 100644 cmph.vcproj create mode 100644 cmphapp.vcproj create mode 100644 wingetopt.c create mode 100644 wingetopt.h diff --git a/ChangeLog b/ChangeLog index b7626b7..5534600 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,159 +1,69 @@ -2004-11-24 12:42 davi +2005-01-18 10:18 davi - * src/czech.c: Fixed some leaks. + * COPYING, INSTALL, src/Makefile.am, src/bmz.c, src/bmz.h, + src/cmph.c, src/cmph.h, src/cmph_structs.c, src/cmph_structs.h, + src/czech.c, src/czech.h, src/debug.h, src/djb2_hash.c, + src/graph.c, src/graph.h, src/hash.c, src/jenkins_hash.c, + src/main.c, src/sdbm_hash.c, src/vqueue.c: Fixed a lot of warnings. + Added visual studio project. Make needed changes to work with + windows. -2004-11-24 11:34 davi +2005-01-17 16:01 fc_botelho - * src/: Makefile.am, cmph.h, cmph_types.h, czech.h, graph.h, - hash.h, jenkins_hash.h, types.h, vstack.h: Better header layout. + * src/main.c: stable version -2004-11-23 15:15 davi +2005-01-17 15:58 fc_botelho - * src/jenkins_hash.c: Fixed trivial bug. + * src/: bmz.c, cmph.c, cmph.h, graph.c: stable version -2004-11-04 00:56 davi +2005-01-13 21:56 davi - * src/: czech.c, graph.c: Forgot. + * src/czech.c: Better error handling in czech.c. -2004-11-04 00:09 davi +2005-01-05 18:45 fc_botelho - * src/: cmph.c, cmph.h, czech.c, czech.h, graph.c, main.c: Fixed - small bug due to fgets trick. + * src/cmph_structs.c: included option -k to specify the number of + keys to use -2004-11-03 23:15 davi +2005-01-05 17:48 fc_botelho - * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, - main.c: Added verbosity option + * src/: cmph.c, main.c: included option -k to specify the number of + keys to use -2004-11-03 22:42 davi +2005-01-03 19:38 fc_botelho - * src/czech.c: [no log message] + * src/bmz.c: using less memory -2004-11-03 20:57 davi +2005-01-03 18:47 fc_botelho - * src/: Makefile.am, fnv_hash.c, fnv_hash.h, hash.c, hash_state.h: - Added fnv hash function. + * src/: bmz.c, graph.c: using less space to store the used_edges + and critical_nodes arrays -2004-11-03 18:10 davi +2004-12-23 11:16 davi - * src/: Makefile.am, cmph.c, cmph.h, czech.c, czech.h, djb2_hash.c, - hash.c, hash_state.h, jenkins_hash.c, main.c, sdbm_hash.c, - sdbm_hash.h: Added sdbm hash function. + * INSTALL, COPYING, AUTHORS, ChangeLog, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/graph.c, tests/Makefile.am, + tests/graph_tests.c, src/bmz.c, src/cmph_types.h, + src/czech_structs.h, src/hash_state.h, src/jenkins_hash.c, + src/bmz_structs.h, src/cmph.c, src/cmph.h, src/cmph_structs.h, + src/czech.c, src/debug.h, src/djb2_hash.c, src/djb2_hash.h, + src/fnv_hash.c, src/fnv_hash.h, src/graph.h, src/hash.c, + src/hash.h, src/jenkins_hash.h, src/sdbm_hash.c, src/vstack.h, + src/Makefile.am, src/bmz.h, src/cmph_structs.c, src/czech.h, + src/main.c, src/sdbm_hash.h, src/vqueue.c, src/vqueue.h, + src/vstack.c: Initial release. -2004-11-03 15:53 davi +2004-12-23 11:16 davi - * src/cmph.c, src/cmph.h, src/cmph_structs.c, src/cmph_structs.h, - src/czech.c, src/czech.h, src/czech_structs.h, src/main.c, - tests/Makefile.am, tests/czech_tests.c: Added callback structure to - retrieve keys in disk. - -2004-10-31 22:57 davi - - * src/: Makefile.am, djb2_hash.c, djb2_hash.h, hash.c, hash.h, - hash_funcs.h, jenkins_hash.h: Added new hash function. - -2004-10-31 20:53 davi - - * src/main.c: Added random seed. - -2004-10-31 20:48 davi - - * src/main.c, tests/czech_tests.c: Better getopt code. - -2004-10-31 19:27 davi - - * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, - czech.h, czech_structs.h, hash.c, hash.h, jenkins_hash.c, - jenkins_hash.h, main.c: Everything working flawlessly. - -2004-10-30 20:12 davi - - * src/cmph_structs.c: Added missing file. - -2004-10-30 20:09 davi - - * src/main.c: forgot. - -2004-10-29 19:02 davi - - * src/: Makefile.am, cmph.c, cmph.h, cmph_structs.h, czech.c, - czech.h, czech_structs.h, graph.c, hash.c, hash.h, jenkins_hash.c, - jenkins_hash.h, main.c: Cleaned some warnings. - -2004-10-29 16:14 davi - - * src/: hash.c, hash_state.h: Missing file. - -2004-10-29 14:18 davi - - * src/: Makefile.am, cmph.c, cmph.h, czech.c, graph.c, hash.h, - jenkins_hash.c, jenkins_hash.h, jenkinshash.c, jenkinshash.h: - Working nice. Serialization almost there. - -2004-10-28 11:21 davi - - * Makefile.am, src/cmph.c, src/cmph_structs.h, src/czech.c, - src/czech_structs.h, src/jenkinshash.c: Hash generation seems to be - working fine. - -2004-10-27 15:19 davi - - * src/hash.h: Added hash header. - -2004-10-27 15:06 davi - - * COPYING, INSTALL, Makefile.am, src/czech.c, src/czech_structs.h, - src/graph.c, src/graph.h, src/vstack.c, tests/Makefile.am, - tests/czech_tests.c, tests/graph_tests.c: Cool. Now it is - serialization time. - -2004-10-27 13:06 davi - - * tests/: czech_tests.c, keys: Added missing files. - -2004-10-26 21:23 davi - - * src/graph.c, tests/Makefile.am: Still working on f*cking graph - implementation. - -2004-10-25 20:05 davi - - * src/: cmph.c, cmph.h, cmph_structs.h, czech.c, czech.h, - czech_structs.h, graph.c, graph.h, jenkinshash.c, jenkinshash.h, - vstack.c: Added some new files. - -2004-10-25 00:27 davi - - * src/: czech.c, czech.h, graph.c, graph.h, jenkinshash.c: Some - random code. - -2004-10-24 23:07 davi - - * src/: Makefile.am, debug.h, graph.c, main.c, vstack.c, vstack.h: - Added stack implementation. - -2004-10-24 21:57 davi - - * src/list.h: Added missing file. - -2004-10-24 21:50 davi - - * src/types.h: Added missing file. - -2004-10-22 20:30 davi - - * src/: Makefile.am, cmph.h, czech.c, czech.h, graph.c, graph.h, - jenkinshash.c, jenkinshash.h: Added a lot of files. - -2004-10-19 17:08 davi - - * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, - cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, - src/main.c, tests/Makefile.am: Initial revision - -2004-10-19 17:08 davi - - * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, - cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, - src/main.c, tests/Makefile.am: Minimum perfect hashing library + * INSTALL, COPYING, AUTHORS, ChangeLog, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/graph.c, tests/Makefile.am, + tests/graph_tests.c, src/bmz.c, src/cmph_types.h, + src/czech_structs.h, src/hash_state.h, src/jenkins_hash.c, + src/bmz_structs.h, src/cmph.c, src/cmph.h, src/cmph_structs.h, + src/czech.c, src/debug.h, src/djb2_hash.c, src/djb2_hash.h, + src/fnv_hash.c, src/fnv_hash.h, src/graph.h, src/hash.c, + src/hash.h, src/jenkins_hash.h, src/sdbm_hash.c, src/vstack.h, + src/Makefile.am, src/bmz.h, src/cmph_structs.c, src/czech.h, + src/main.c, src/sdbm_hash.h, src/vqueue.c, src/vqueue.h, + src/vstack.c: Initial revision diff --git a/cmph.vcproj b/cmph.vcproj new file mode 100644 index 0000000..d7e925b --- /dev/null +++ b/cmph.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmphapp.vcproj b/cmphapp.vcproj new file mode 100644 index 0000000..bf92899 --- /dev/null +++ b/cmphapp.vcproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wingetopt.c b/wingetopt.c new file mode 100644 index 0000000..09fd6d9 --- /dev/null +++ b/wingetopt.c @@ -0,0 +1,177 @@ +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + diff --git a/wingetopt.h b/wingetopt.h new file mode 100644 index 0000000..4df5d78 --- /dev/null +++ b/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif +#endif + +#ifdef __cplusplus +} +#endif + From ac4a2f539f553e76030588f19d59f94b87eca7de Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 18 Jan 2005 17:10:28 +0000 Subject: [PATCH 026/739] Added missing files. --- ChangeLog | 188 ++++++++++++------------------------------- cmph.vcproj | 210 +++++++++++++++++++++++++++++++++++++++++++++++++ cmphapp.vcproj | 141 +++++++++++++++++++++++++++++++++ wingetopt.c | 177 +++++++++++++++++++++++++++++++++++++++++ wingetopt.h | 25 ++++++ 5 files changed, 602 insertions(+), 139 deletions(-) create mode 100644 cmph.vcproj create mode 100644 cmphapp.vcproj create mode 100644 wingetopt.c create mode 100644 wingetopt.h diff --git a/ChangeLog b/ChangeLog index b7626b7..5534600 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,159 +1,69 @@ -2004-11-24 12:42 davi +2005-01-18 10:18 davi - * src/czech.c: Fixed some leaks. + * COPYING, INSTALL, src/Makefile.am, src/bmz.c, src/bmz.h, + src/cmph.c, src/cmph.h, src/cmph_structs.c, src/cmph_structs.h, + src/czech.c, src/czech.h, src/debug.h, src/djb2_hash.c, + src/graph.c, src/graph.h, src/hash.c, src/jenkins_hash.c, + src/main.c, src/sdbm_hash.c, src/vqueue.c: Fixed a lot of warnings. + Added visual studio project. Make needed changes to work with + windows. -2004-11-24 11:34 davi +2005-01-17 16:01 fc_botelho - * src/: Makefile.am, cmph.h, cmph_types.h, czech.h, graph.h, - hash.h, jenkins_hash.h, types.h, vstack.h: Better header layout. + * src/main.c: stable version -2004-11-23 15:15 davi +2005-01-17 15:58 fc_botelho - * src/jenkins_hash.c: Fixed trivial bug. + * src/: bmz.c, cmph.c, cmph.h, graph.c: stable version -2004-11-04 00:56 davi +2005-01-13 21:56 davi - * src/: czech.c, graph.c: Forgot. + * src/czech.c: Better error handling in czech.c. -2004-11-04 00:09 davi +2005-01-05 18:45 fc_botelho - * src/: cmph.c, cmph.h, czech.c, czech.h, graph.c, main.c: Fixed - small bug due to fgets trick. + * src/cmph_structs.c: included option -k to specify the number of + keys to use -2004-11-03 23:15 davi +2005-01-05 17:48 fc_botelho - * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, - main.c: Added verbosity option + * src/: cmph.c, main.c: included option -k to specify the number of + keys to use -2004-11-03 22:42 davi +2005-01-03 19:38 fc_botelho - * src/czech.c: [no log message] + * src/bmz.c: using less memory -2004-11-03 20:57 davi +2005-01-03 18:47 fc_botelho - * src/: Makefile.am, fnv_hash.c, fnv_hash.h, hash.c, hash_state.h: - Added fnv hash function. + * src/: bmz.c, graph.c: using less space to store the used_edges + and critical_nodes arrays -2004-11-03 18:10 davi +2004-12-23 11:16 davi - * src/: Makefile.am, cmph.c, cmph.h, czech.c, czech.h, djb2_hash.c, - hash.c, hash_state.h, jenkins_hash.c, main.c, sdbm_hash.c, - sdbm_hash.h: Added sdbm hash function. + * INSTALL, COPYING, AUTHORS, ChangeLog, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/graph.c, tests/Makefile.am, + tests/graph_tests.c, src/bmz.c, src/cmph_types.h, + src/czech_structs.h, src/hash_state.h, src/jenkins_hash.c, + src/bmz_structs.h, src/cmph.c, src/cmph.h, src/cmph_structs.h, + src/czech.c, src/debug.h, src/djb2_hash.c, src/djb2_hash.h, + src/fnv_hash.c, src/fnv_hash.h, src/graph.h, src/hash.c, + src/hash.h, src/jenkins_hash.h, src/sdbm_hash.c, src/vstack.h, + src/Makefile.am, src/bmz.h, src/cmph_structs.c, src/czech.h, + src/main.c, src/sdbm_hash.h, src/vqueue.c, src/vqueue.h, + src/vstack.c: Initial release. -2004-11-03 15:53 davi +2004-12-23 11:16 davi - * src/cmph.c, src/cmph.h, src/cmph_structs.c, src/cmph_structs.h, - src/czech.c, src/czech.h, src/czech_structs.h, src/main.c, - tests/Makefile.am, tests/czech_tests.c: Added callback structure to - retrieve keys in disk. - -2004-10-31 22:57 davi - - * src/: Makefile.am, djb2_hash.c, djb2_hash.h, hash.c, hash.h, - hash_funcs.h, jenkins_hash.h: Added new hash function. - -2004-10-31 20:53 davi - - * src/main.c: Added random seed. - -2004-10-31 20:48 davi - - * src/main.c, tests/czech_tests.c: Better getopt code. - -2004-10-31 19:27 davi - - * src/: cmph.c, cmph.h, cmph_structs.c, cmph_structs.h, czech.c, - czech.h, czech_structs.h, hash.c, hash.h, jenkins_hash.c, - jenkins_hash.h, main.c: Everything working flawlessly. - -2004-10-30 20:12 davi - - * src/cmph_structs.c: Added missing file. - -2004-10-30 20:09 davi - - * src/main.c: forgot. - -2004-10-29 19:02 davi - - * src/: Makefile.am, cmph.c, cmph.h, cmph_structs.h, czech.c, - czech.h, czech_structs.h, graph.c, hash.c, hash.h, jenkins_hash.c, - jenkins_hash.h, main.c: Cleaned some warnings. - -2004-10-29 16:14 davi - - * src/: hash.c, hash_state.h: Missing file. - -2004-10-29 14:18 davi - - * src/: Makefile.am, cmph.c, cmph.h, czech.c, graph.c, hash.h, - jenkins_hash.c, jenkins_hash.h, jenkinshash.c, jenkinshash.h: - Working nice. Serialization almost there. - -2004-10-28 11:21 davi - - * Makefile.am, src/cmph.c, src/cmph_structs.h, src/czech.c, - src/czech_structs.h, src/jenkinshash.c: Hash generation seems to be - working fine. - -2004-10-27 15:19 davi - - * src/hash.h: Added hash header. - -2004-10-27 15:06 davi - - * COPYING, INSTALL, Makefile.am, src/czech.c, src/czech_structs.h, - src/graph.c, src/graph.h, src/vstack.c, tests/Makefile.am, - tests/czech_tests.c, tests/graph_tests.c: Cool. Now it is - serialization time. - -2004-10-27 13:06 davi - - * tests/: czech_tests.c, keys: Added missing files. - -2004-10-26 21:23 davi - - * src/graph.c, tests/Makefile.am: Still working on f*cking graph - implementation. - -2004-10-25 20:05 davi - - * src/: cmph.c, cmph.h, cmph_structs.h, czech.c, czech.h, - czech_structs.h, graph.c, graph.h, jenkinshash.c, jenkinshash.h, - vstack.c: Added some new files. - -2004-10-25 00:27 davi - - * src/: czech.c, czech.h, graph.c, graph.h, jenkinshash.c: Some - random code. - -2004-10-24 23:07 davi - - * src/: Makefile.am, debug.h, graph.c, main.c, vstack.c, vstack.h: - Added stack implementation. - -2004-10-24 21:57 davi - - * src/list.h: Added missing file. - -2004-10-24 21:50 davi - - * src/types.h: Added missing file. - -2004-10-22 20:30 davi - - * src/: Makefile.am, cmph.h, czech.c, czech.h, graph.c, graph.h, - jenkinshash.c, jenkinshash.h: Added a lot of files. - -2004-10-19 17:08 davi - - * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, - cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, - src/main.c, tests/Makefile.am: Initial revision - -2004-10-19 17:08 davi - - * AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, - cmph.spec, configure.ac, src/Makefile.am, src/cmph.c, src/cmph.h, - src/main.c, tests/Makefile.am: Minimum perfect hashing library + * INSTALL, COPYING, AUTHORS, ChangeLog, Makefile.am, NEWS, README, + cmph.spec, configure.ac, src/graph.c, tests/Makefile.am, + tests/graph_tests.c, src/bmz.c, src/cmph_types.h, + src/czech_structs.h, src/hash_state.h, src/jenkins_hash.c, + src/bmz_structs.h, src/cmph.c, src/cmph.h, src/cmph_structs.h, + src/czech.c, src/debug.h, src/djb2_hash.c, src/djb2_hash.h, + src/fnv_hash.c, src/fnv_hash.h, src/graph.h, src/hash.c, + src/hash.h, src/jenkins_hash.h, src/sdbm_hash.c, src/vstack.h, + src/Makefile.am, src/bmz.h, src/cmph_structs.c, src/czech.h, + src/main.c, src/sdbm_hash.h, src/vqueue.c, src/vqueue.h, + src/vstack.c: Initial revision diff --git a/cmph.vcproj b/cmph.vcproj new file mode 100644 index 0000000..d7e925b --- /dev/null +++ b/cmph.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmphapp.vcproj b/cmphapp.vcproj new file mode 100644 index 0000000..bf92899 --- /dev/null +++ b/cmphapp.vcproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wingetopt.c b/wingetopt.c new file mode 100644 index 0000000..09fd6d9 --- /dev/null +++ b/wingetopt.c @@ -0,0 +1,177 @@ +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + diff --git a/wingetopt.h b/wingetopt.h new file mode 100644 index 0000000..4df5d78 --- /dev/null +++ b/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif +#endif + +#ifdef __cplusplus +} +#endif + From ea71f288b38cebbdd1ce86d8e50c8829682ef8b1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 21:06:08 +0000 Subject: [PATCH 027/739] version with cmph prefix --- src/bmz.c | 314 ++++++++++++++++++++++---------------------- src/bmz.h | 20 +-- src/bmz_structs.h | 22 ++-- src/cmph.c | 100 +++++++------- src/cmph.h | 34 ++--- src/cmph_structs.c | 34 ++--- src/cmph_structs.h | 24 ++-- src/cmph_types.h | 15 ++- src/czech.c | 184 +++++++++++++------------- src/czech.h | 20 +-- src/czech_structs.h | 22 ++-- src/djb2_hash.c | 22 ++-- src/djb2_hash.h | 14 +- src/fnv_hash.c | 18 +-- src/fnv_hash.h | 14 +- src/graph.c | 108 +++++++-------- src/graph.h | 42 +++--- src/hash.c | 118 ++++++++--------- src/hash.h | 12 +- src/hash_state.h | 10 +- src/jenkins_hash.c | 64 ++++----- src/jenkins_hash.h | 20 +-- src/main.c | 78 +++++------ src/sdbm_hash.c | 22 ++-- src/sdbm_hash.h | 14 +- src/vqueue.c | 26 ++-- src/vqueue.h | 14 +- src/vstack.c | 32 ++--- src/vstack.h | 18 +-- 29 files changed, 718 insertions(+), 717 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 5c8aff3..b06e0c4 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -13,33 +13,33 @@ //#define DEBUG #include "debug.h" -//static uint32 UNDEFINED = UINT_MAX; +//static cmph_uint32 UNDEFINED = UINT_MAX; static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) -static int bmz_gen_edges(mph_t *mph); -static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); -static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited); +static int bmz_gen_edges(cmph_mph_t *mph); +static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); -mph_t *bmz_mph_new(key_source_t *key_source) +cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source) { - mph_t *mph = NULL; - bmz_mph_data_t *bmz = NULL; - mph = __mph_new(MPH_BMZ, key_source); + cmph_mph_t *mph = NULL; + cmph_bmz_mph_data_t *bmz = NULL; + mph = cmph__mph_new(CMPH_BMZ, key_source); if (mph == NULL) return NULL; - bmz = (bmz_mph_data_t *)malloc(sizeof(bmz_mph_data_t)); + bmz = (cmph_bmz_mph_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); if (bmz == NULL) { - __mph_destroy(mph); + cmph__mph_destroy(mph); return NULL; } - bmz->hashfuncs[0] = HASH_JENKINS; - bmz->hashfuncs[1] = HASH_JENKINS; + bmz->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; @@ -47,20 +47,20 @@ mph_t *bmz_mph_new(key_source_t *key_source) assert(mph->data); return mph; } -void bmz_mph_destroy(mph_t *mph) +void cmph_bmz_mph_destroy(cmph_mph_t *mph) { - bmz_mph_data_t *data = (bmz_mph_data_t *)mph->data; + cmph_bmz_mph_data_t *data = (cmph_bmz_mph_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); - __mph_destroy(mph); + cmph__mph_destroy(mph); } -void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) { - bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; - uint32 i = 0; - while(*hashptr != HASH_COUNT) + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) { if (i >= 2) break; //bmz only uses two hash functions bmz->hashfuncs[i] = *hashptr; @@ -68,33 +68,33 @@ void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) } } -mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) +cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) { - mphf_t *mphf = NULL; - bmz_mphf_data_t *bmzf = NULL; - uint32 i; - uint32 iterations; - uint32 iterations_map = 20; - uint8 *used_edges = NULL; - uint8 restart_mapping = 0; - uint8 * visited = NULL; + cmph_mphf_t *mphf = NULL; + cmph_bmz_mphf_data_t *bmzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations; + cmph_uint32 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; DEBUGP("bmz_c: %f\n", bmz_c); - bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; bmz->m = mph->key_source->nkeys; bmz->n = ceil(bmz_c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u bmz_c: %f\n", bmz->m, bmz->n, bmz_c); - bmz->graph = graph_new(bmz->n, bmz->m); + bmz->graph = cmph_graph_new(bmz->n, bmz->m); DEBUGP("Created graph\n"); - bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; do { // Mapping step - uint32 biggest_g_value = 0; - uint32 biggest_edge_value = 1; + cmph_uint32 biggest_g_value = 0; + cmph_uint32 biggest_edge_value = 1; iterations = 20; if (mph->verbosity) { @@ -104,17 +104,17 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) { int ok; DEBUGP("hash function 1\n"); - bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); + bmz->hashes[0] = cmph_hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); - bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); + bmz->hashes[1] = cmph_hash_state_new(bmz->hashfuncs[1], bmz->n); DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(bmz->hashes[0]); + cmph_hash_state_destroy(bmz->hashes[0]); bmz->hashes[0] = NULL; - hash_state_destroy(bmz->hashes[1]); + cmph_hash_state_destroy(bmz->hashes[1]); bmz->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -127,7 +127,7 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) } if (iterations == 0) { - graph_destroy(bmz->graph); + cmph_graph_destroy(bmz->graph); return NULL; } @@ -137,7 +137,7 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) fprintf(stderr, "Starting ordering step\n"); } - graph_obtain_critical_nodes(bmz->graph); + cmph_graph_obtain_critical_nodes(bmz->graph); // Searching step if (mph->verbosity) @@ -148,14 +148,14 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) DEBUGP("Searching step\n"); visited = (char *)malloc(bmz->n/8 + 1); memset(visited, 0, bmz->n/8 + 1); - used_edges = (uint8 *)malloc(bmz->m/8 + 1); + used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(uint32)); + bmz->g = malloc(bmz->n * sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { - if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) + if (cmph_graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) { if(bmz_c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); @@ -178,12 +178,12 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - graph_destroy(bmz->graph); + cmph_graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) return NULL; - mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); mphf->algo = mph->algo; - bmzf = (bmz_mphf_data_t *)malloc(sizeof(bmz_mph_data_t)); + bmzf = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; @@ -200,41 +200,41 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) return mphf; } -static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { - uint32 next_g; - uint32 u; /* Auxiliary vertex */ - uint32 lav; /* lookahead vertex */ - uint8 collision; - vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); - graph_iterator_t it, it1; + cmph_uint32 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph)) + 1); + cmph_graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); - bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - vqueue_insert(q, v); - while(!vqueue_is_empty(q)) + next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + cmph_vqueue_insert(q, v); + while(!cmph_vqueue_is_empty(q)) { - v = vqueue_remove(q); - it = graph_neighbors_it(bmz->graph, v); - while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + v = cmph_vqueue_remove(q); + it = cmph_graph_neighbors_it(bmz->graph, v); + while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { collision = 1; while(collision) // lookahead to resolve collisions { next_g = *biggest_g_value + 1; - it1 = graph_neighbors_it(bmz->graph, u); + it1 = cmph_graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - vqueue_destroy(q); + cmph_vqueue_destroy(q); return 1; // restart mapping step. } if (GETBIT(used_edges, next_g + bmz->g[lav])) @@ -247,10 +247,10 @@ static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * if (next_g > *biggest_g_value) *biggest_g_value = next_g; } // Marking used edges... - it1 = graph_neighbors_it(bmz->graph, u); - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + it1 = cmph_graph_neighbors_it(bmz->graph, u); + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -258,41 +258,41 @@ static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited,u); - vqueue_insert(q, u); + cmph_vqueue_insert(q, u); } } } - vqueue_destroy(q); + cmph_vqueue_destroy(q); return 0; } -static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { - uint32 next_g; - uint32 u; /* Auxiliary vertex */ - uint32 lav; /* lookahead vertex */ - uint8 collision; - uint32 * unused_g_values = NULL; - uint32 unused_g_values_capacity = 0; - uint32 nunused_g_values = 0; - vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); - graph_iterator_t it, it1; + cmph_uint32 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint32 * unused_g_values = NULL; + cmph_uint32 unused_g_values_capacity = 0; + cmph_uint32 nunused_g_values = 0; + cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph))+1); + cmph_graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); - bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - vqueue_insert(q, v); - while(!vqueue_is_empty(q)) + next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + cmph_vqueue_insert(q, v); + while(!cmph_vqueue_is_empty(q)) { - v = vqueue_remove(q); - it = graph_neighbors_it(bmz->graph, v); - while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + v = cmph_vqueue_remove(q); + it = cmph_graph_neighbors_it(bmz->graph, v); + while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { - uint32 next_g_index = 0; + cmph_uint32 next_g_index = 0; collision = 1; while(collision) // lookahead to resolve collisions { @@ -305,15 +305,15 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v next_g = *biggest_g_value + 1; next_g_index = UINT_MAX; } - it1 = graph_neighbors_it(bmz->graph, u); + it1 = cmph_graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - vqueue_destroy(q); + cmph_vqueue_destroy(q); free(unused_g_values); return 1; // restart mapping step. } @@ -328,7 +328,7 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(uint32)); + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; @@ -340,10 +340,10 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; // Marking used edges... - it1 = graph_neighbors_it(bmz->graph, u); - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + it1 = cmph_graph_neighbors_it(bmz->graph, u); + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -351,17 +351,17 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - vqueue_insert(q, u); + cmph_vqueue_insert(q, u); } } } - vqueue_destroy(q); + cmph_vqueue_destroy(q); free(unused_g_values); return 0; } -static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 unused_edge_index) +static cmph_uint32 next_unused_edge(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) { while(1) { @@ -372,11 +372,11 @@ static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 u return unused_edge_index; } -static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index, uint8 * visited) +static void bmz_traverse(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) { - graph_iterator_t it = graph_neighbors_it(bmz->graph, v); - uint32 neighbor = 0; - while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + cmph_graph_iterator_t it = cmph_graph_neighbors_it(bmz->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); @@ -389,15 +389,15 @@ static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint } } -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited) +static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) { - uint32 i, v1, v2, unused_edge_index = 0; + cmph_uint32 i, v1, v2, unused_edge_index = 0; DEBUGP("Labelling non critical vertices\n"); for(i = 0; i < bmz->m; i++) { - v1 = graph_vertex_id(bmz->graph, i, 0); - v2 = graph_vertex_id(bmz->graph, i, 1); + v1 = cmph_graph_vertex_id(bmz->graph, i, 0); + v2 = cmph_graph_vertex_id(bmz->graph, i, 1); if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); @@ -416,23 +416,23 @@ static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_ed } -static int bmz_gen_edges(mph_t *mph) +static int bmz_gen_edges(cmph_mph_t *mph) { - uint32 e; - bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; - uint8 multiple_edges = 0; + cmph_uint32 e; + cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; DEBUGP("Generating edges for %u vertices\n", bmz->n); - graph_clear_edges(bmz->graph); + cmph_graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { - uint32 h1, h2; - uint32 keylen; + cmph_uint32 h1, h2; + cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; - h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; if (h1 == h2) { @@ -442,43 +442,43 @@ static int bmz_gen_edges(mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - multiple_edges = graph_contains_edge(bmz->graph, h1, h2); + multiple_edges = cmph_graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. - graph_add_edge(bmz->graph, h1, h2); + cmph_graph_add_edge(bmz->graph, h1, h2); } return !multiple_edges; } -int bmz_mphf_dump(mphf_t *mphf, FILE *fd) +int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *fd) { char *buf = NULL; - uint32 buflen; - uint32 nbuflen; - uint32 i; - uint32 two = 2; //number of hash functions - bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; - uint32 nn, nm; - __mphf_dump(mphf, fd); + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = 2; //number of hash functions + cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; + cmph_uint32 nn, nm; + cmph__mphf_dump(mphf, fd); - fwrite(&two, sizeof(uint32), 1, fd); + fwrite(&two, sizeof(cmph_uint32), 1, fd); - hash_state_dump(data->hashes[0], &buf, &buflen); + cmph_hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - hash_state_dump(data->hashes[1], &buf, &buflen); + cmph_hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - fwrite(&(data->n), sizeof(uint32), 1, fd); - fwrite(&(data->m), sizeof(uint32), 1, fd); + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->g, sizeof(uint32)*(data->n), 1, fd); + fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -487,38 +487,38 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) return 1; } -void bmz_mphf_load(FILE *f, mphf_t *mphf) +void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf) { - uint32 nhashes; + cmph_uint32 nhashes; char *buf = NULL; - uint32 buflen; - uint32 i; - bmz_mphf_data_t *bmz = (bmz_mphf_data_t *)malloc(sizeof(bmz_mphf_data_t)); + cmph_uint32 buflen; + cmph_uint32 i; + cmph_bmz_mphf_data_t *bmz = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mphf_data_t)); DEBUGP("Loading bmz mphf\n"); mphf->data = bmz; - fread(&nhashes, sizeof(uint32), 1, f); - bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + fread(&nhashes, sizeof(cmph_uint32), 1, f); + bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); bmz->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - hash_state_t *state = NULL; - fread(&buflen, sizeof(uint32), 1, f); + cmph_hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); + state = cmph_hash_state_load(buf, buflen); bmz->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(bmz->n), sizeof(uint32), 1, f); - fread(&(bmz->m), sizeof(uint32), 1, f); + fread(&(bmz->n), sizeof(cmph_uint32), 1, f); + fread(&(bmz->m), sizeof(cmph_uint32), 1, f); - bmz->g = (uint32 *)malloc(sizeof(uint32)*bmz->n); - fread(bmz->g, bmz->n*sizeof(uint32), 1, f); + bmz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*bmz->n); + fread(bmz->g, bmz->n*sizeof(cmph_uint32), 1, f); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); @@ -528,22 +528,22 @@ void bmz_mphf_load(FILE *f, mphf_t *mphf) } -uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) { - bmz_mphf_data_t *bmz = mphf->data; - uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; - uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + cmph_bmz_mphf_data_t *bmz = mphf->data; + cmph_uint32 h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; + cmph_uint32 h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); return bmz->g[h1] + bmz->g[h2]; } -void bmz_mphf_destroy(mphf_t *mphf) +void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf) { - bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; + cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; free(data->g); - hash_state_destroy(data->hashes[0]); - hash_state_destroy(data->hashes[1]); + cmph_hash_state_destroy(data->hashes[0]); + cmph_hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/bmz.h b/src/bmz.h index f815029..6095b91 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -4,16 +4,16 @@ #include "graph.h" #include "cmph.h" -typedef struct __bmz_mphf_data_t bmz_mphf_data_t; -typedef struct __bmz_mph_data_t bmz_mph_data_t; +typedef struct cmph__bmz_mphf_data_t cmph_bmz_mphf_data_t; +typedef struct cmph__bmz_mph_data_t cmph_bmz_mph_data_t; -mph_t *bmz_mph_new(key_source_t *key_source); -void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); -void bmz_mph_destroy(mph_t *mph); -mphf_t *bmz_mph_create(mph_t *mph, float bmz_c); +cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source); +void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); +void cmph_bmz_mph_destroy(cmph_mph_t *mph); +cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c); -void bmz_mphf_load(FILE *f, mphf_t *mphf); -int bmz_mphf_dump(mphf_t *mphf, FILE *f); -void bmz_mphf_destroy(mphf_t *mphf); -uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf); +int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *f); +void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf); +cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/bmz_structs.h b/src/bmz_structs.h index 4f6d131..a906d6d 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -3,22 +3,22 @@ #include "hash_state.h" -struct __bmz_mphf_data_t +struct cmph__bmz_mphf_data_t { - uint32 m; //edges (words) count - uint32 n; //vertex count - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; -struct __bmz_mph_data_t +struct cmph__bmz_mph_data_t { CMPH_HASH hashfuncs[2]; - uint32 m; //edges (words) count - uint32 n; //vertex count - graph_t *graph; - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_graph_t *graph; + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; #endif diff --git a/src/cmph.c b/src/cmph.c index 7a67193..74e5bad 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -10,20 +10,20 @@ //#define DEBUG #include "debug.h" -const char *mph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ -mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source) +cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) { - mph_t *mph = NULL; - DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + cmph_mph_t *mph = NULL; + DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); switch (algo) { - case MPH_CZECH: - mph = czech_mph_new(key_source); + case CMPH_CZECH: + mph = cmph_czech_mph_new(key_source); break; - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("new bmz algorithm \n"); - mph = bmz_mph_new(key_source); + mph = cmph_bmz_mph_new(key_source); break; default: assert(0); @@ -32,63 +32,63 @@ mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source) return mph; } -void mph_destroy(mph_t *mph) +void cmph_mph_destroy(cmph_mph_t *mph) { - DEBUGP("Destroying mph with algo %s\n", mph_names[mph->algo]); + DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); switch (mph->algo) { - case MPH_CZECH: - czech_mph_destroy(mph); + case CMPH_CZECH: + cmph_czech_mph_destroy(mph); break; - case MPH_BMZ: /* included -- Fabiano */ - bmz_mph_destroy(mph); + case CMPH_BMZ: /* included -- Fabiano */ + cmph_bmz_mph_destroy(mph); break; default: assert(0); } } -void mph_set_verbosity(mph_t *mph, uint32 verbosity) +void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity) { mph->verbosity = verbosity; } -void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) { switch (mph->algo) { - case MPH_CZECH: - czech_mph_set_hashfuncs(mph, hashfuncs); + case CMPH_CZECH: + cmph_czech_mph_set_hashfuncs(mph, hashfuncs); break; - case MPH_BMZ: /* included -- Fabiano */ - bmz_mph_set_hashfuncs(mph, hashfuncs); + case CMPH_BMZ: /* included -- Fabiano */ + cmph_bmz_mph_set_hashfuncs(mph, hashfuncs); break; default: break; } return; } -void mph_set_graphsize(mph_t *mph, float c) +void cmph_mph_set_graphsize(cmph_mph_t *mph, float c) { mph->c = c; return; } -mphf_t *mph_create(mph_t *mph) +cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph) { - mphf_t *mphf = NULL; + cmph_mphf_t *mphf = NULL; float c = mph->c; switch (mph->algo) { - case MPH_CZECH: + case CMPH_CZECH: DEBUGP("Creating czech hash\n"); if (c == 0) c = 2.09; - mphf = czech_mph_create(mph, c); + mphf = cmph_czech_mph_create(mph, c); break; - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); if (c == 0) c = 1.15; - mphf = bmz_mph_create(mph, c); + mphf = cmph_bmz_mph_create(mph, c); break; default: assert(0); @@ -96,15 +96,15 @@ mphf_t *mph_create(mph_t *mph) return mphf; } -int mphf_dump(mphf_t *mphf, FILE *f) +int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f) { switch (mphf->algo) { - case MPH_CZECH: - return czech_mphf_dump(mphf, f); + case CMPH_CZECH: + return cmph_czech_mphf_dump(mphf, f); break; - case MPH_BMZ: /* included -- Fabiano */ - return bmz_mphf_dump(mphf, f); + case CMPH_BMZ: /* included -- Fabiano */ + return cmph_bmz_mphf_dump(mphf, f); break; default: assert(0); @@ -112,22 +112,22 @@ int mphf_dump(mphf_t *mphf, FILE *f) assert(0); return 0; } -mphf_t *mphf_load(FILE *f) +cmph_mphf_t *cmph_mphf_load(FILE *f) { - mphf_t *mphf = NULL; + cmph_mphf_t *mphf = NULL; DEBUGP("Loading mphf generic parts\n"); - mphf = __mphf_load(f); + mphf = cmph__mphf_load(f); if (mphf == NULL) return NULL; DEBUGP("Loading mphf algorithm dependent parts\n"); switch (mphf->algo) { - case MPH_CZECH: - czech_mphf_load(f, mphf); + case CMPH_CZECH: + cmph_czech_mphf_load(f, mphf); break; - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Loading bmz algorithm dependent parts\n"); - bmz_mphf_load(f, mphf); + cmph_bmz_mphf_load(f, mphf); break; default: assert(0); @@ -137,16 +137,16 @@ mphf_t *mphf_load(FILE *f) } -uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) { DEBUGP("mphf algorithm: %u \n", mphf->algo); switch(mphf->algo) { - case MPH_CZECH: - return czech_mphf_search(mphf, key, keylen); - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_CZECH: + return cmph_czech_mphf_search(mphf, key, keylen); + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); - return bmz_mphf_search(mphf, key, keylen); + return cmph_bmz_mphf_search(mphf, key, keylen); default: assert(0); } @@ -154,20 +154,20 @@ uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) return 0; } -uint32 mphf_size(mphf_t *mphf) +cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf) { return mphf->size; } -void mphf_destroy(mphf_t *mphf) +void cmph_mphf_destroy(cmph_mphf_t *mphf) { switch(mphf->algo) { - case MPH_CZECH: - czech_mphf_destroy(mphf); + case CMPH_CZECH: + cmph_czech_mphf_destroy(mphf); return; - case MPH_BMZ: /* included -- Fabiano */ - bmz_mphf_destroy(mphf); + case CMPH_BMZ: /* included -- Fabiano */ + cmph_bmz_mphf_destroy(mphf); return; default: assert(0); diff --git a/src/cmph.h b/src/cmph.h index 4d828bb..5ad98fb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -11,32 +11,32 @@ extern "C" #include "cmph_types.h" -typedef struct __mph_t mph_t; -typedef struct __mphf_t mphf_t; +typedef struct cmph__mph_t cmph_mph_t; +typedef struct cmph__mphf_t cmph_mphf_t; typedef struct { void *data; - uint32 nkeys; - int (*read)(void *, char **, uint32 *); - void (*dispose)(void *, char *, uint32); + cmph_uint32 nkeys; + int (*read)(void *, char **, cmph_uint32 *); + void (*dispose)(void *, char *, cmph_uint32); void (*rewind)(void *); -} key_source_t; +} cmph_key_source_t; /** Hash generation API **/ -mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); -void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); -void mph_set_verbosity(mph_t *mph, uint32 verbosity); -void mph_set_graphsize(mph_t *mph, float c); -void mph_destroy(mph_t *mph); -mphf_t *mph_create(mph_t *mph); +cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); +void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); +void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity); +void cmph_mph_set_graphsize(cmph_mph_t *mph, float c); +void cmph_mph_destroy(cmph_mph_t *mph); +cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph); /** Hash querying API **/ -mphf_t *mphf_load(FILE *f); -int mphf_dump(mphf_t *mphf, FILE *f); -uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen); -uint32 mphf_size(mphf_t *mphf); -void mphf_destroy(mphf_t *mphf); +cmph_mphf_t *cmph_mphf_load(FILE *f); +int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f); +cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); +cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf); +void cmph_mphf_destroy(cmph_mphf_t *mphf); #ifdef __cplusplus } diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 9629815..ee1e89f 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -5,10 +5,10 @@ //#define DEBUG #include "debug.h" -mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) +cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) { - mph_t *mph = (mph_t *)malloc(sizeof(mph_t)); - DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + cmph_mph_t *mph = (cmph_mph_t *)malloc(sizeof(cmph_mph_t)); + DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->algo = algo; mph->key_source = key_source; @@ -17,51 +17,51 @@ mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) return mph; } -void __mph_destroy(mph_t *mph) +void cmph__mph_destroy(cmph_mph_t *mph) { free(mph); } -void __mphf_dump(mphf_t *mphf, FILE *fd) +void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *fd) { - uint32 nsize = htonl(mphf->size); - fwrite(mph_names[mphf->algo], (uint32)(strlen(mph_names[mphf->algo]) + 1), 1, fd); + cmph_uint32 nsize = htonl(mphf->size); + fwrite(cmph_names[mphf->algo], (cmph_uint32)(strlen(cmph_names[mphf->algo]) + 1), 1, fd); fwrite(&nsize, sizeof(mphf->size), 1, fd); } -mphf_t *__mphf_load(FILE *f) +cmph_mphf_t *cmph__mphf_load(FILE *f) { - mphf_t *mphf = NULL; - uint32 i; + cmph_mphf_t *mphf = NULL; + cmph_uint32 i; char algo_name[BUFSIZ]; char *ptr = algo_name; - MPH_ALGO algo = MPH_COUNT; + CMPH_ALGO algo = CMPH_COUNT; DEBUGP("Loading mphf\n"); while(1) { - uint32 c = fread(ptr, 1, 1, f); + cmph_uint32 c = fread(ptr, 1, 1, f); if (c != 1) return NULL; if (*ptr == 0) break; ++ptr; } - for(i = 0; i < MPH_COUNT; ++i) + for(i = 0; i < CMPH_COUNT; ++i) { - if (strcmp(algo_name, mph_names[i]) == 0) + if (strcmp(algo_name, cmph_names[i]) == 0) { algo = i; } } - if (algo == MPH_COUNT) + if (algo == CMPH_COUNT) { DEBUGP("Algorithm %s not found\n", algo_name); return NULL; } - mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); mphf->algo = algo; fread(&(mphf->size), sizeof(mphf->size), 1, f); mphf->size = ntohl(mphf->size); mphf->data = NULL; - DEBUGP("Algorithm is %s and mphf is sized %u\n", mph_names[algo], mphf->size); + DEBUGP("Algorithm is %s and mphf is sized %u\n", cmph_names[algo], mphf->size); return mphf; } diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 4b9f879..65c8784 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -5,29 +5,29 @@ /** Hash generation algorithm data */ -struct __mph_t +struct cmph__mph_t { - MPH_ALGO algo; - key_source_t *key_source; - uint32 verbosity; + CMPH_ALGO algo; + cmph_key_source_t *key_source; + cmph_uint32 verbosity; float c; void *data; //algorithm dependent data }; /** Hash querying algorithm data */ -struct __mphf_t +struct cmph__mphf_t { - MPH_ALGO algo; - uint32 size; - key_source_t *key_source; + CMPH_ALGO algo; + cmph_uint32 size; + cmph_key_source_t *key_source; void *data; //algorithm dependent data }; -mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source); -void __mph_destroy(); -void __mphf_dump(mphf_t *mphf, FILE *); -mphf_t *__mphf_load(FILE *f); +cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); +void cmph__mph_destroy(); +void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *); +cmph_mphf_t *cmph__mphf_load(FILE *f); #endif diff --git a/src/cmph_types.h b/src/cmph_types.h index 84b6a22..6e07879 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -1,13 +1,14 @@ #ifndef __CMPH_TYPES_H__ #define __CMPH_TYPES_H__ -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; +typedef unsigned char cmph_uint8; +typedef unsigned short cmph_uint16; +typedef unsigned int cmph_uint32; -typedef enum { HASH_JENKINS, HASH_DJB2, HASH_SDBM, HASH_FNV, HASH_GLIB, HASH_PJW, HASH_COUNT } CMPH_HASH; -extern const char *hash_names[]; -typedef enum { MPH_CZECH, MPH_BMZ, MPH_COUNT } MPH_ALGO; /* included -- Fabiano */ -extern const char *mph_names[]; +typedef enum { CMPH_HASH_JENKINS, CMPH_HASH_DJB2, CMPH_HASH_SDBM, CMPH_HASH_FNV, + CMPH_HASH_GLIB, CMPH_HASH_PJW, CMPH_HASH_COUNT } CMPH_HASH; +extern const char *cmph_hash_names[]; +typedef enum { CMPH_CZECH, CMPH_BMZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +extern const char *cmph_names[]; #endif diff --git a/src/czech.c b/src/czech.c index 16efe3f..c4e1a96 100644 --- a/src/czech.c +++ b/src/czech.c @@ -18,23 +18,23 @@ static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) -static int czech_gen_edges(mph_t *mph); -static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v); +static int czech_gen_edges(cmph_mph_t *mph); +static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); -mph_t *czech_mph_new(key_source_t *key_source) +cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source) { - mph_t *mph = NULL; - czech_mph_data_t *czech = NULL; - mph = __mph_new(MPH_CZECH, key_source); + cmph_mph_t *mph = NULL; + cmph_czech_mph_data_t *czech = NULL; + mph = cmph__mph_new(CMPH_CZECH, key_source); if (mph == NULL) return NULL; - czech = (czech_mph_data_t *)malloc(sizeof(czech_mph_data_t)); + czech = (cmph_czech_mph_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); if (czech == NULL) { - __mph_destroy(mph); + cmph__mph_destroy(mph); return NULL; } - czech->hashfuncs[0] = HASH_JENKINS; - czech->hashfuncs[1] = HASH_JENKINS; + czech->hashfuncs[0] = CMPH_HASH_JENKINS; + czech->hashfuncs[1] = CMPH_HASH_JENKINS; czech->g = NULL; czech->graph = NULL; czech->hashes = NULL; @@ -42,20 +42,20 @@ mph_t *czech_mph_new(key_source_t *key_source) assert(mph->data); return mph; } -void czech_mph_destroy(mph_t *mph) +void cmph_czech_mph_destroy(cmph_mph_t *mph) { - czech_mph_data_t *data = (czech_mph_data_t *)mph->data; + cmph_czech_mph_data_t *data = (cmph_czech_mph_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); - __mph_destroy(mph); + cmph__mph_destroy(mph); } -void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) { - czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; - uint32 i = 0; - while(*hashptr != HASH_COUNT) + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) { if (i >= 2) break; //czech only uses two hash functions czech->hashfuncs[i] = *hashptr; @@ -63,22 +63,22 @@ void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) } } -mphf_t *czech_mph_create(mph_t *mph, float c) +cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) { - mphf_t *mphf = NULL; - czech_mphf_data_t *czechf = NULL; + cmph_mphf_t *mphf = NULL; + cmph_czech_mphf_data_t *czechf = NULL; - uint32 i; - uint32 iterations = 20; - uint8 *visited = NULL; - czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; czech->m = mph->key_source->nkeys; czech->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); - czech->graph = graph_new(czech->n, czech->m); + czech->graph = cmph_graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; //Mapping step if (mph->verbosity) @@ -88,15 +88,15 @@ mphf_t *czech_mph_create(mph_t *mph, float c) while(1) { int ok; - czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); - czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); + czech->hashes[0] = cmph_hash_state_new(czech->hashfuncs[0], czech->n); + czech->hashes[1] = cmph_hash_state_new(czech->hashfuncs[1], czech->n); ok = czech_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(czech->hashes[0]); + cmph_hash_state_destroy(czech->hashes[0]); czech->hashes[0] = NULL; - hash_state_destroy(czech->hashes[1]); + cmph_hash_state_destroy(czech->hashes[1]); czech->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -109,7 +109,7 @@ mphf_t *czech_mph_create(mph_t *mph, float c) } if (iterations == 0) { - graph_destroy(czech->graph); + cmph_graph_destroy(czech->graph); return NULL; } @@ -122,7 +122,7 @@ mphf_t *czech_mph_create(mph_t *mph, float c) visited = (char *)malloc(czech->n/8 + 1); memset(visited, 0, czech->n/8 + 1); free(czech->g); - czech->g = malloc(czech->n * sizeof(uint32)); + czech->g = malloc(czech->n * sizeof(cmph_uint32)); assert(czech->g); for (i = 0; i < czech->n; ++i) { @@ -132,13 +132,13 @@ mphf_t *czech_mph_create(mph_t *mph, float c) czech_traverse(czech, visited, i); } } - graph_destroy(czech->graph); + cmph_graph_destroy(czech->graph); free(visited); czech->graph = NULL; - mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); mphf->algo = mph->algo; - czechf = (czech_mphf_data_t *)malloc(sizeof(czech_mph_data_t)); + czechf = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); czechf->g = czech->g; czech->g = NULL; //transfer memory ownership czechf->hashes = czech->hashes; @@ -155,43 +155,43 @@ mphf_t *czech_mph_create(mph_t *mph, float c) return mphf; } -static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v) +static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) { - graph_iterator_t it = graph_neighbors_it(czech->graph, v); - uint32 neighbor = 0; + cmph_graph_iterator_t it = cmph_graph_neighbors_it(czech->graph, v); + cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) + while((neighbor = cmph_graph_next_neighbor(czech->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); - czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, cmph_graph_edge_id(czech->graph, v, neighbor)); + czech->g[neighbor] = cmph_graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], cmph_graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); czech_traverse(czech, visited, neighbor); } } -static int czech_gen_edges(mph_t *mph) +static int czech_gen_edges(cmph_mph_t *mph) { - uint32 e; - czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + cmph_uint32 e; + cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; int cycles = 0; DEBUGP("Generating edges for %u vertices\n", czech->n); - graph_clear_edges(czech->graph); + cmph_graph_clear_edges(czech->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { - uint32 h1, h2; - uint32 keylen; + cmph_uint32 h1, h2; + cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(czech->hashes[0], key, keylen) % czech->n; - h2 = hash(czech->hashes[1], key, keylen) % czech->n; + h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; + h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { @@ -201,51 +201,51 @@ static int czech_gen_edges(mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(czech->graph, h1, h2); + cmph_graph_add_edge(czech->graph, h1, h2); } - cycles = graph_is_cyclic(czech->graph); + cycles = cmph_graph_is_cyclic(czech->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int czech_mphf_dump(mphf_t *mphf, FILE *fd) +int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *fd) { char *buf = NULL; - uint32 buflen; - uint32 nbuflen; - uint32 i; - uint32 two = htonl(2); //number of hash functions - czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; - uint32 nn, nm; - __mphf_dump(mphf, fd); + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = htonl(2); //number of hash functions + cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; + cmph_uint32 nn, nm; + cmph__mphf_dump(mphf, fd); - fwrite(&two, sizeof(uint32), 1, fd); + fwrite(&two, sizeof(cmph_uint32), 1, fd); - hash_state_dump(data->hashes[0], &buf, &buflen); + cmph_hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - hash_state_dump(data->hashes[1], &buf, &buflen); + cmph_hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); nn = htonl(data->n); - fwrite(&nn, sizeof(uint32), 1, fd); + fwrite(&nn, sizeof(cmph_uint32), 1, fd); nm = htonl(data->m); - fwrite(&nm, sizeof(uint32), 1, fd); + fwrite(&nm, sizeof(cmph_uint32), 1, fd); for (i = 0; i < data->n; ++i) { - uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(uint32), 1, fd); + cmph_uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(cmph_uint32), 1, fd); } #ifdef DEBUG fprintf(stderr, "G: "); @@ -255,44 +255,44 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) return 1; } -void czech_mphf_load(FILE *f, mphf_t *mphf) +void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf) { - uint32 nhashes; + cmph_uint32 nhashes; char fbuf[BUFSIZ]; char *buf = NULL; - uint32 buflen; - uint32 i; - hash_state_t *state; - czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); + cmph_uint32 buflen; + cmph_uint32 i; + cmph_hash_state_t *state; + cmph_czech_mphf_data_t *czech = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mphf_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; - fread(&nhashes, sizeof(uint32), 1, f); + fread(&nhashes, sizeof(cmph_uint32), 1, f); nhashes = ntohl(nhashes); - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - hash_state_t *state = NULL; - fread(&buflen, sizeof(uint32), 1, f); + cmph_hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); + state = cmph_hash_state_load(buf, buflen); czech->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(czech->n), sizeof(uint32), 1, f); + fread(&(czech->n), sizeof(cmph_uint32), 1, f); czech->n = ntohl(czech->n); - fread(&(czech->m), sizeof(uint32), 1, f); + fread(&(czech->m), sizeof(cmph_uint32), 1, f); czech->m = ntohl(czech->m); - czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); - fread(czech->g, czech->n*sizeof(uint32), 1, f); + czech->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*czech->n); + fread(czech->g, czech->n*sizeof(cmph_uint32), 1, f); for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); @@ -303,22 +303,22 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) } -uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) { - czech_mphf_data_t *czech = mphf->data; - uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; - uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; + cmph_czech_mphf_data_t *czech = mphf->data; + cmph_uint32 h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; + cmph_uint32 h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > czech->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); return (czech->g[h1] + czech->g[h2]) % czech->m; } -void czech_mphf_destroy(mphf_t *mphf) +void cmph_czech_mphf_destroy(cmph_mphf_t *mphf) { - czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; free(data->g); - hash_state_destroy(data->hashes[0]); - hash_state_destroy(data->hashes[1]); + cmph_hash_state_destroy(data->hashes[0]); + cmph_hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/czech.h b/src/czech.h index f83d224..d167219 100644 --- a/src/czech.h +++ b/src/czech.h @@ -4,16 +4,16 @@ #include "graph.h" #include "cmph.h" -typedef struct __czech_mphf_data_t czech_mphf_data_t; -typedef struct __czech_mph_data_t czech_mph_data_t; +typedef struct cmph__czech_mphf_data_t cmph_czech_mphf_data_t; +typedef struct cmph__czech_mph_data_t cmph_czech_mph_data_t; -mph_t *czech_mph_new(key_source_t *key_source); -void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); -void czech_mph_destroy(mph_t *mph); -mphf_t *czech_mph_create(mph_t *mph, float c); +cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source); +void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); +void cmph_czech_mph_destroy(cmph_mph_t *mph); +cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c); -void czech_mphf_load(FILE *f, mphf_t *mphf); -int czech_mphf_dump(mphf_t *mphf, FILE *f); -void czech_mphf_destroy(mphf_t *mphf); -uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf); +int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *f); +void cmph_czech_mphf_destroy(cmph_mphf_t *mphf); +cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/czech_structs.h b/src/czech_structs.h index 3db81c8..1678433 100644 --- a/src/czech_structs.h +++ b/src/czech_structs.h @@ -3,22 +3,22 @@ #include "hash_state.h" -struct __czech_mphf_data_t +struct cmph__czech_mphf_data_t { - uint32 m; //edges (words) count - uint32 n; //vertex count - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; -struct __czech_mph_data_t +struct cmph__czech_mph_data_t { CMPH_HASH hashfuncs[2]; - uint32 m; //edges (words) count - uint32 n; //vertex count - graph_t *graph; - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_graph_t *graph; + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; #endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c index bb67e42..6e5b972 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -1,23 +1,23 @@ #include "djb2_hash.h" #include -djb2_state_t *djb2_state_new() +cmph_djb2_state_t *cmph_djb2_state_new() { - djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); - state->hashfunc = HASH_DJB2; + cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + state->hashfunc = CMPH_HASH_DJB2; return state; } -void djb2_state_destroy(djb2_state_t *state) +void cmph_djb2_state_destroy(cmph_djb2_state_t *state) { free(state); } -uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen) { - register uint32 hash = 5381; + register cmph_uint32 hash = 5381; const unsigned char *ptr = k; - uint32 i = 0; + cmph_uint32 i = 0; while (i < keylen) { hash = hash*33 ^ *ptr; @@ -27,16 +27,16 @@ uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) } -void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen) +void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -djb2_state_t *djb2_state_load(const char *buf, uint32 buflen) +cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen) { - djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); - state->hashfunc = HASH_DJB2; + cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + state->hashfunc = CMPH_HASH_DJB2; return state; } diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 0ea3998..549cc90 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct __djb2_state_t +typedef struct cmph__djb2_state_t { CMPH_HASH hashfunc; -} djb2_state_t; +} cmph_djb2_state_t; -djb2_state_t *djb2_state_new(); -uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen); -void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen); -djb2_state_t *djb2_state_load(const char *buf, uint32 buflen); -void djb2_state_destroy(djb2_state_t *state); +cmph_djb2_state_t *cmph_djb2_state_new(); +cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen); +void cmph_djb2_state_destroy(cmph_djb2_state_t *state); #endif diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 513fc56..9be1558 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -1,19 +1,19 @@ #include "fnv_hash.h" #include -fnv_state_t *fnv_state_new() +cmph_fnv_state_t *cmph_fnv_state_new() { - fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); - state->hashfunc = HASH_FNV; + cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + state->hashfunc = CMPH_HASH_FNV; return state; } -void fnv_state_destroy(fnv_state_t *state) +void cmph_fnv_state_destroy(cmph_fnv_state_t *state) { free(state); } -uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen) { const unsigned char *bp = (const unsigned char *)k; const unsigned char *be = bp + keylen; @@ -31,16 +31,16 @@ uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen) } -void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen) +void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -fnv_state_t *fnv_state_load(const char *buf, uint32 buflen) +cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen) { - fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); - state->hashfunc = HASH_FNV; + cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + state->hashfunc = CMPH_HASH_FNV; return state; } diff --git a/src/fnv_hash.h b/src/fnv_hash.h index a17717e..e9e54fa 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct __fnv_state_t +typedef struct cmph__fnv_state_t { CMPH_HASH hashfunc; -} fnv_state_t; +} cmph_fnv_state_t; -fnv_state_t *fnv_state_new(); -uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen); -void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen); -fnv_state_t *fnv_state_load(const char *buf, uint32 buflen); -void fnv_state_destroy(fnv_state_t *state); +cmph_fnv_state_t *cmph_fnv_state_new(); +cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen); +void cmph_fnv_state_destroy(cmph_fnv_state_t *state); #endif diff --git a/src/graph.c b/src/graph.c index cb75516..60e2d13 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,47 +10,47 @@ //#define DEBUG #include "debug.h" -static const uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) #define abs_edge(e, i) (e % g->nedges + i * g->nedges) -struct __graph_t +struct cmph__graph_t { - uint32 nnodes; - uint32 nedges; - uint32 *edges; - uint32 *first; - uint32 *next; - uint8 *critical_nodes; /* included -- Fabiano*/ - uint32 ncritical_nodes; /* included -- Fabiano*/ - uint32 cedges; + cmph_uint32 nnodes; + cmph_uint32 nedges; + cmph_uint32 *edges; + cmph_uint32 *first; + cmph_uint32 *next; + cmph_uint8 *critical_nodes; /* included -- Fabiano*/ + cmph_uint32 ncritical_nodes; /* included -- Fabiano*/ + cmph_uint32 cedges; int shrinking; }; -static uint32 EMPTY = UINT_MAX; +static cmph_uint32 EMPTY = UINT_MAX; -graph_t *graph_new(uint32 nnodes, uint32 nedges) +cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) { - graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); + cmph_graph_t *graph = (cmph_graph_t *)malloc(sizeof(cmph_graph_t)); if (!graph) return NULL; - graph->edges = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); - graph->next = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); - graph->first = (uint32 *)malloc(sizeof(uint32) * nnodes); + graph->edges = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); + graph->next = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); + graph->first = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * nnodes); graph->critical_nodes = NULL; /* included -- Fabiano*/ graph->ncritical_nodes = 0; /* included -- Fabiano*/ graph->nnodes = nnodes; graph->nedges = nedges; - graph_clear_edges(graph); + cmph_graph_clear_edges(graph); return graph; } -void graph_destroy(graph_t *graph) +void cmph_graph_destroy(cmph_graph_t *graph) { DEBUGP("Destroying graph\n"); free(graph->edges); @@ -61,9 +61,9 @@ void graph_destroy(graph_t *graph) return; } -void graph_print(graph_t *g) +void cmph_graph_print(cmph_graph_t *g) { - uint32 i, e; + cmph_uint32 i, e; for (i = 0; i < g->nnodes; ++i) { DEBUGP("Printing edges connected to %u\n", i); @@ -81,9 +81,9 @@ void graph_print(graph_t *g) return; } -void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) +void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { - uint32 e = g->cedges; + cmph_uint32 e = g->cedges; assert(v1 < g->nnodes); assert(v2 < g->nnodes); @@ -101,7 +101,7 @@ void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) ++(g->cedges); } -static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) +static int check_edge(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) { DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; @@ -109,9 +109,9 @@ static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) return 0; } -uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2) +cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { - uint32 e; + cmph_uint32 e; e = g->first[v1]; assert(e != EMPTY); if (check_edge(g, e, v1, v2)) return abs_edge(e, 0); @@ -123,9 +123,9 @@ uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2) while (!check_edge(g, e, v1, v2)); return abs_edge(e, 0); } -static void del_edge_point(graph_t *g, uint32 v1, uint32 v2) +static void del_edge_point(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { - uint32 e, prev; + cmph_uint32 e, prev; DEBUGP("Deleting edge point %u %u\n", v1, v2); e = g->first[v1]; @@ -151,16 +151,16 @@ static void del_edge_point(graph_t *g, uint32 v1, uint32 v2) } -void graph_del_edge(graph_t *g, uint32 v1, uint32 v2) +void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { g->shrinking = 1; del_edge_point(g, v1, v2); del_edge_point(g, v2, v1); } -void graph_clear_edges(graph_t *g) +void cmph_graph_clear_edges(cmph_graph_t *g) { - uint32 i; + cmph_uint32 i; for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; for (i = 0; i < g->nedges*2; ++i) { @@ -171,9 +171,9 @@ void graph_clear_edges(graph_t *g) g->shrinking = 0; } -static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) +static int find_degree1_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted, cmph_uint32 *e) { - uint32 edge = g->first[v]; + cmph_uint32 edge = g->first[v]; char found = 0; DEBUGP("Checking degree of vertex %u\n", v); if (edge == EMPTY) return 0; @@ -195,13 +195,13 @@ static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) return found; } -static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) +static void cyclic_del_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted) { - uint32 e; + cmph_uint32 e; char degree1; - uint32 v1 = v; - uint32 v2 = 0; + cmph_uint32 v1 = v; + cmph_uint32 v2 = 0; degree1 = find_degree1_edge(g, v1, deleted, &e); if (!degree1) return; @@ -224,10 +224,10 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) } } -int graph_is_cyclic(graph_t *g) +int cmph_graph_is_cyclic(cmph_graph_t *g) { - uint32 i; - uint32 v; + cmph_uint32 i; + cmph_uint32 v; char *deleted = (char *)malloc((g->nedges*sizeof(char))/8 + 1); memset(deleted, 0, g->nedges/8 + 1); @@ -249,21 +249,21 @@ int graph_is_cyclic(graph_t *g) return 0; } -uint8 graph_node_is_critical(graph_t * g, uint32 v) /* included -- Fabiano */ +cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v) /* included -- Fabiano */ { return GETBIT(g->critical_nodes,v); } -void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ +void cmph_graph_obtain_critical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ { - uint32 i; - uint32 v; + cmph_uint32 i; + cmph_uint32 v; char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); memset(deleted, 0, g->nedges/8 + 1); free(g->critical_nodes); - g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); + g->critical_nodes = (cmph_uint8 *)malloc((g->nnodes*sizeof(cmph_uint8))/8 + 1); g->ncritical_nodes = 0; - memset(g->critical_nodes, 0, (g->nnodes*sizeof(uint8))/8 + 1); + memset(g->critical_nodes, 0, (g->nnodes*sizeof(cmph_uint8))/8 + 1); DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) { @@ -290,9 +290,9 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ free(deleted); } -uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2) /* included -- Fabiano*/ +cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ { - uint32 e; + cmph_uint32 e; e = g->first[v1]; if(e == EMPTY) return 0; if (check_edge(g, e, v1, v2)) return 1; @@ -305,27 +305,27 @@ uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2) /* included -- Fabia return 1; } -uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id) /* included -- Fabiano*/ +cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ { return (g->edges[e + id*g->nedges]); } -uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ +cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ { return g->ncritical_nodes; } -graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v) +cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v) { - graph_iterator_t it; + cmph_graph_iterator_t it; it.vertex = v; it.edge = g->first[v]; return it; } -uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) +cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it) { - uint32 ret; - if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; + cmph_uint32 ret; + if(it->edge == EMPTY) return CMPH_GRAPH_NO_NEIGHBOR; if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; else ret = g->edges[it->edge]; it->edge = g->next[it->edge]; diff --git a/src/graph.h b/src/graph.h index 4856d1c..dc80b05 100644 --- a/src/graph.h +++ b/src/graph.h @@ -4,37 +4,37 @@ #include #include "cmph_types.h" -#define GRAPH_NO_NEIGHBOR UINT_MAX +#define CMPH_GRAPH_NO_NEIGHBOR UINT_MAX -typedef struct __graph_t graph_t; -typedef struct __graph_iterator_t graph_iterator_t; -struct __graph_iterator_t +typedef struct cmph__graph_t cmph_graph_t; +typedef struct cmph__graph_iterator_t cmph_graph_iterator_t; +struct cmph__graph_iterator_t { - uint32 vertex; - uint32 edge; + cmph_uint32 vertex; + cmph_uint32 edge; }; -graph_t *graph_new(uint32 nnodes, uint32 nedges); -void graph_destroy(graph_t *graph); +cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); +void cmph_graph_destroy(cmph_graph_t *graph); -void graph_add_edge(graph_t *g, uint32 v1, uint32 v2); -void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); -void graph_clear_edges(graph_t *g); -uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2); -uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2); +void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void cmph_graph_clear_edges(cmph_graph_t *g); +cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v); -uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); +cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v); +cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it); -void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ -uint8 graph_node_is_critical(graph_t * g, uint32 v); /* included -- Fabiano */ -uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ -uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id); /* included -- Fabiano*/ +void cmph_graph_obtain_critical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ +cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v); /* included -- Fabiano */ +cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ +cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ -int graph_is_cyclic(graph_t *g); +int cmph_graph_is_cyclic(cmph_graph_t *g); -void graph_print(graph_t *); +void cmph_graph_print(cmph_graph_t *); #endif diff --git a/src/hash.c b/src/hash.c index 2ab3619..639f799 100644 --- a/src/hash.c +++ b/src/hash.c @@ -7,26 +7,26 @@ //#define DEBUG #include "debug.h" -const char *hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; +const char *cmph_hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; -hash_state_t *hash_state_new(CMPH_HASH hashfunc, uint32 hashsize) +cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) { - hash_state_t *state = NULL; + cmph_hash_state_t *state = NULL; switch (hashfunc) { - case HASH_JENKINS: + case CMPH_HASH_JENKINS: DEBUGP("Jenkins function - %u\n", hashsize); - state = (hash_state_t *)jenkins_state_new(hashsize); + state = (cmph_hash_state_t *)cmph_jenkins_state_new(hashsize); DEBUGP("Jenkins function created\n"); break; - case HASH_DJB2: - state = (hash_state_t *)djb2_state_new(); + case CMPH_HASH_DJB2: + state = (cmph_hash_state_t *)cmph_djb2_state_new(); break; - case HASH_SDBM: - state = (hash_state_t *)sdbm_state_new(); + case CMPH_HASH_SDBM: + state = (cmph_hash_state_t *)cmph_sdbm_state_new(); break; - case HASH_FNV: - state = (hash_state_t *)fnv_state_new(); + case CMPH_HASH_FNV: + state = (cmph_hash_state_t *)cmph_fnv_state_new(); break; default: assert(0); @@ -34,18 +34,18 @@ hash_state_t *hash_state_new(CMPH_HASH hashfunc, uint32 hashsize) state->hashfunc = hashfunc; return state; } -uint32 hash(hash_state_t *state, const char *key, uint32 keylen) +cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen) { switch (state->hashfunc) { - case HASH_JENKINS: - return jenkins_hash((jenkins_state_t *)state, key, keylen); - case HASH_DJB2: - return djb2_hash((djb2_state_t *)state, key, keylen); - case HASH_SDBM: - return sdbm_hash((sdbm_state_t *)state, key, keylen); - case HASH_FNV: - return fnv_hash((fnv_state_t *)state, key, keylen); + case CMPH_HASH_JENKINS: + return cmph_jenkins_hash((cmph_jenkins_state_t *)state, key, keylen); + case CMPH_HASH_DJB2: + return cmph_djb2_hash((cmph_djb2_state_t *)state, key, keylen); + case CMPH_HASH_SDBM: + return cmph_sdbm_hash((cmph_sdbm_state_t *)state, key, keylen); + case CMPH_HASH_FNV: + return cmph_fnv_hash((cmph_fnv_state_t *)state, key, keylen); default: assert(0); } @@ -53,84 +53,84 @@ uint32 hash(hash_state_t *state, const char *key, uint32 keylen) return 0; } -void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen) +void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen) { char *algobuf; switch (state->hashfunc) { - case HASH_JENKINS: - jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); + case CMPH_HASH_JENKINS: + cmph_jenkins_state_dump((cmph_jenkins_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; - case HASH_DJB2: - djb2_state_dump((djb2_state_t *)state, &algobuf, buflen); + case CMPH_HASH_DJB2: + cmph_djb2_state_dump((cmph_djb2_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; - case HASH_SDBM: - sdbm_state_dump((sdbm_state_t *)state, &algobuf, buflen); + case CMPH_HASH_SDBM: + cmph_sdbm_state_dump((cmph_sdbm_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; - case HASH_FNV: - fnv_state_dump((fnv_state_t *)state, &algobuf, buflen); + case CMPH_HASH_FNV: + cmph_fnv_state_dump((cmph_fnv_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; default: assert(0); } - *buf = malloc(strlen(hash_names[state->hashfunc]) + 1 + *buflen); - memcpy(*buf, hash_names[state->hashfunc], strlen(hash_names[state->hashfunc]) + 1); - DEBUGP("Algobuf is %u\n", *(uint32 *)algobuf); - memcpy(*buf + strlen(hash_names[state->hashfunc]) + 1, algobuf, *buflen); - *buflen = (uint32)strlen(hash_names[state->hashfunc]) + 1 + *buflen; + *buf = malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); + DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); + memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, *buflen); + *buflen = (cmph_uint32)strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen; free(algobuf); return; } -hash_state_t *hash_state_load(const char *buf, uint32 buflen) +cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen) { - uint32 i; - uint32 offset; - CMPH_HASH hashfunc = HASH_COUNT; - for (i = 0; i < HASH_COUNT; ++i) + cmph_uint32 i; + cmph_uint32 offset; + CMPH_HASH hashfunc = CMPH_HASH_COUNT; + for (i = 0; i < CMPH_HASH_COUNT; ++i) { - if (strcmp(buf, hash_names[i]) == 0) + if (strcmp(buf, cmph_hash_names[i]) == 0) { hashfunc = i; break; } } - if (hashfunc == HASH_COUNT) return NULL; - offset = (uint32)strlen(hash_names[hashfunc]) + 1; + if (hashfunc == CMPH_HASH_COUNT) return NULL; + offset = (cmph_uint32)strlen(cmph_hash_names[hashfunc]) + 1; switch (hashfunc) { - case HASH_JENKINS: - return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); - case HASH_DJB2: - return (hash_state_t *)djb2_state_load(buf + offset, buflen - offset); - case HASH_SDBM: - return (hash_state_t *)sdbm_state_load(buf + offset, buflen - offset); - case HASH_FNV: - return (hash_state_t *)fnv_state_load(buf + offset, buflen - offset); + case CMPH_HASH_JENKINS: + return (cmph_hash_state_t *)cmph_jenkins_state_load(buf + offset, buflen - offset); + case CMPH_HASH_DJB2: + return (cmph_hash_state_t *)cmph_djb2_state_load(buf + offset, buflen - offset); + case CMPH_HASH_SDBM: + return (cmph_hash_state_t *)cmph_sdbm_state_load(buf + offset, buflen - offset); + case CMPH_HASH_FNV: + return (cmph_hash_state_t *)cmph_fnv_state_load(buf + offset, buflen - offset); default: return NULL; } return NULL; } -void hash_state_destroy(hash_state_t *state) +void cmph_hash_state_destroy(cmph_hash_state_t *state) { switch (state->hashfunc) { - case HASH_JENKINS: - jenkins_state_destroy((jenkins_state_t *)state); + case CMPH_HASH_JENKINS: + cmph_jenkins_state_destroy((cmph_jenkins_state_t *)state); break; - case HASH_DJB2: - djb2_state_destroy((djb2_state_t *)state); + case CMPH_HASH_DJB2: + cmph_djb2_state_destroy((cmph_djb2_state_t *)state); break; - case HASH_SDBM: - sdbm_state_destroy((sdbm_state_t *)state); + case CMPH_HASH_SDBM: + cmph_sdbm_state_destroy((cmph_sdbm_state_t *)state); break; - case HASH_FNV: - fnv_state_destroy((fnv_state_t *)state); + case CMPH_HASH_FNV: + cmph_fnv_state_destroy((cmph_fnv_state_t *)state); break; default: assert(0); diff --git a/src/hash.h b/src/hash.h index 90b8e37..371c1c9 100644 --- a/src/hash.h +++ b/src/hash.h @@ -3,12 +3,12 @@ #include "cmph_types.h" -typedef union __hash_state_t hash_state_t; +typedef union cmph__hash_state_t cmph_hash_state_t; -hash_state_t *hash_state_new(CMPH_HASH, uint32 hashsize); -uint32 hash(hash_state_t *state, const char *key, uint32 keylen); -void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen); -hash_state_t *hash_state_load(const char *buf, uint32 buflen); -void hash_state_destroy(hash_state_t *state); +cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH, cmph_uint32 hashsize); +cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen); +void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen); +void cmph_hash_state_destroy(cmph_hash_state_t *state); #endif diff --git a/src/hash_state.h b/src/hash_state.h index 67dcd77..39f0d68 100644 --- a/src/hash_state.h +++ b/src/hash_state.h @@ -6,13 +6,13 @@ #include "djb2_hash.h" #include "sdbm_hash.h" #include "fnv_hash.h" -union __hash_state_t +union cmph__hash_state_t { CMPH_HASH hashfunc; - jenkins_state_t jenkins; - djb2_state_t djb2; - sdbm_state_t sdbm; - fnv_state_t fnv; + cmph_jenkins_state_t jenkins; + cmph_djb2_state_t djb2; + cmph_sdbm_state_t sdbm; + cmph_fnv_state_t fnv; }; #endif diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 7b9f662..1971276 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -#define hashsize(n) ((uint32)1<<(n)) +#define hashsize(n) ((cmph_uint32)1<<(n)) #define hashmask(n) (hashsize(n)-1) @@ -73,7 +73,7 @@ use a bitmask. For example, if you need only 10 bits, do h = (h & hashmask(10)); In which case, the hash table should have hashsize(10) elements. -If you are hashing n strings (uint8 **)k, do it like this: +If you are hashing n strings (cmph_uint8 **)k, do it like this: for (i=0, h=0; iseed = rand() % size; - state->nbits = (uint32)ceil(log(size)/M_LOG2E); + state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); state->size = size; DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } -void jenkins_state_destroy(jenkins_state_t *state) +void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state) { free(state); } -uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen) { - uint32 a, b, c; - uint32 len, length; + cmph_uint32 a, b, c; + cmph_uint32 len, length; /* Set up the internal state */ length = keylen; @@ -113,9 +113,9 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) /*---------------------------------------- handle most of the key */ while (len >= 12) { - a += (k[0] +((uint32)k[1]<<8) +((uint32)k[2]<<16) +((uint32)k[3]<<24)); - b += (k[4] +((uint32)k[5]<<8) +((uint32)k[6]<<16) +((uint32)k[7]<<24)); - c += (k[8] +((uint32)k[9]<<8) +((uint32)k[10]<<16)+((uint32)k[11]<<24)); + a += (k[0] +((cmph_uint32)k[1]<<8) +((cmph_uint32)k[2]<<16) +((cmph_uint32)k[3]<<24)); + b += (k[4] +((cmph_uint32)k[5]<<8) +((cmph_uint32)k[6]<<16) +((cmph_uint32)k[7]<<24)); + c += (k[8] +((cmph_uint32)k[9]<<8) +((cmph_uint32)k[10]<<16)+((cmph_uint32)k[11]<<24)); mix(a,b,c); k += 12; len -= 12; } @@ -125,26 +125,26 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) switch(len) /* all the case statements fall through */ { case 11: - c +=((uint32)k[10]<<24); + c +=((cmph_uint32)k[10]<<24); case 10: - c +=((uint32)k[9]<<16); + c +=((cmph_uint32)k[9]<<16); case 9 : - c +=((uint32)k[8]<<8); + c +=((cmph_uint32)k[8]<<8); /* the first byte of c is reserved for the length */ case 8 : - b +=((uint32)k[7]<<24); + b +=((cmph_uint32)k[7]<<24); case 7 : - b +=((uint32)k[6]<<16); + b +=((cmph_uint32)k[6]<<16); case 6 : - b +=((uint32)k[5]<<8); + b +=((cmph_uint32)k[5]<<8); case 5 : b +=k[4]; case 4 : - a +=((uint32)k[3]<<24); + a +=((cmph_uint32)k[3]<<24); case 3 : - a +=((uint32)k[2]<<16); + a +=((cmph_uint32)k[2]<<16); case 2 : - a +=((uint32)k[1]<<8); + a +=((cmph_uint32)k[1]<<8); case 1 : a +=k[0]; /* case 0: nothing left to add */ @@ -162,29 +162,29 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) return c; } -void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) +void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { - *buflen = sizeof(uint32)*3; + *buflen = sizeof(cmph_uint32)*3; *buf = malloc(*buflen); if (!*buf) { *buflen = UINT_MAX; return; } - memcpy(*buf, &(state->seed), sizeof(uint32)); - memcpy(*buf + sizeof(uint32), &(state->nbits), sizeof(uint32)); - memcpy(*buf + sizeof(uint32)*2, &(state->size), sizeof(uint32)); + memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); + memcpy(*buf + sizeof(cmph_uint32), &(state->nbits), sizeof(cmph_uint32)); + memcpy(*buf + sizeof(cmph_uint32)*2, &(state->size), sizeof(cmph_uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); return; } -jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen) +cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen) { - jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); - state->seed = *(uint32 *)buf; - state->nbits = *(((uint32 *)buf) + 1); - state->size = *(((uint32 *)buf) + 2); - state->hashfunc = HASH_JENKINS; + cmph_jenkins_state_t *state = (cmph_jenkins_state_t *)malloc(sizeof(cmph_jenkins_state_t)); + state->seed = *(cmph_uint32 *)buf; + state->nbits = *(((cmph_uint32 *)buf) + 1); + state->size = *(((cmph_uint32 *)buf) + 2); + state->hashfunc = CMPH_HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; } diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index 1a84080..2086d7c 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -3,18 +3,18 @@ #include "hash.h" -typedef struct __jenkins_state_t +typedef struct cmph__jenkins_state_t { CMPH_HASH hashfunc; - uint32 seed; - uint32 nbits; - uint32 size; -} jenkins_state_t; + cmph_uint32 seed; + cmph_uint32 nbits; + cmph_uint32 size; +} cmph_jenkins_state_t; -jenkins_state_t *jenkins_state_new(uint32 size); //size of hash table -uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen); -void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen); -jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen); -void jenkins_state_destroy(jenkins_state_t *state); +cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size); //size of hash table +cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen); +void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state); #endif diff --git a/src/main.c b/src/main.c index a133de7..c556da1 100644 --- a/src/main.c +++ b/src/main.c @@ -23,15 +23,15 @@ void usage(const char *prg) } void usage_long(const char *prg) { - uint32 i; + cmph_uint32 i; fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); fprintf(stderr, " -a\t algorithm - valid values are\n"); - for (i = 0; i < MPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", mph_names[i]); + for (i = 0; i < CMPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", cmph_names[i]); fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); - for (i = 0; i < HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", hash_names[i]); + for (i = 0; i < CMPH_HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", cmph_hash_names[i]); fprintf(stderr, " -V\t print version number and exit\n"); fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); fprintf(stderr, " -k\t number of keys\n"); @@ -41,7 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " keysfile\t line separated file with keys\n"); } -static int key_read(void *data, char **key, uint32 *keylen) +static int key_read(void *data, char **key, cmph_uint32 *keylen) { FILE *fd = (FILE *)data; *key = NULL; @@ -54,7 +54,7 @@ static int key_read(void *data, char **key, uint32 *keylen) if (feof(fd)) return -1; *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); memcpy(*key + *keylen, buf, strlen(buf)); - *keylen += (uint32)strlen(buf); + *keylen += (cmph_uint32)strlen(buf); if (buf[strlen(buf) - 1] != '\n') continue; break; } @@ -66,7 +66,7 @@ static int key_read(void *data, char **key, uint32 *keylen) return *keylen; } -static void key_dispose(void *data, char *key, uint32 keylen) +static void key_dispose(void *data, char *key, cmph_uint32 keylen) { free(key); } @@ -76,9 +76,9 @@ static void key_rewind(void *data) rewind(fd); } -static uint32 count_keys(FILE *fd) +static cmph_uint32 count_keys(FILE *fd) { - uint32 count = 0; + cmph_uint32 count = 0; rewind(fd); while(1) { @@ -100,17 +100,17 @@ int main(int argc, char **argv) FILE *mphf_fd = stdout; const char *keys_file = NULL; FILE *keys_fd; - uint32 nkeys = UINT_MAX; - uint32 seed = UINT_MAX; + cmph_uint32 nkeys = UINT_MAX; + cmph_uint32 seed = UINT_MAX; CMPH_HASH *hashes = NULL; - uint32 nhashes = 0; - uint32 i; - MPH_ALGO mph_algo = MPH_CZECH; + cmph_uint32 nhashes = 0; + cmph_uint32 i; + CMPH_ALGO mph_algo = CMPH_CZECH; float c = 2.09; - mph_t *mph = NULL; - mphf_t *mphf = NULL; + cmph_mph_t *mph = NULL; + cmph_mphf_t *mphf = NULL; - key_source_t source; + cmph_key_source_t source; while (1) { @@ -166,9 +166,9 @@ int main(int argc, char **argv) case 'a': { char valid = 0; - for (i = 0; i < MPH_COUNT; ++i) + for (i = 0; i < CMPH_COUNT; ++i) { - if (strcmp(mph_names[i], optarg) == 0) + if (strcmp(cmph_names[i], optarg) == 0) { mph_algo = i; valid = 1; @@ -185,13 +185,13 @@ int main(int argc, char **argv) case 'f': { char valid = 0; - for (i = 0; i < HASH_COUNT; ++i) + for (i = 0; i < CMPH_HASH_COUNT; ++i) { - if (strcmp(hash_names[i], optarg) == 0) + if (strcmp(cmph_hash_names[i], optarg) == 0) { hashes = (CMPH_HASH *)realloc(hashes, sizeof(CMPH_HASH) * ( nhashes + 2 )); hashes[nhashes] = i; - hashes[nhashes + 1] = HASH_COUNT; + hashes[nhashes + 1] = CMPH_HASH_COUNT; ++nhashes; valid = 1; break; @@ -216,7 +216,7 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; - if (seed == UINT_MAX) seed = (uint32)time(NULL); + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); if (mphf_file == NULL) @@ -234,7 +234,7 @@ int main(int argc, char **argv) } source.data = (void *)keys_fd; - if (seed == UINT_MAX) seed = (uint32)time(NULL); + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); else source.nkeys = nkeys; source.read = key_read; @@ -245,17 +245,17 @@ int main(int argc, char **argv) { //Create mphf - mph = mph_new(mph_algo, &source); - if (nhashes) mph_set_hashfuncs(mph, hashes); - mph_set_verbosity(mph, verbosity); - if(mph_algo == MPH_BMZ && c >= 2.0) c=1.15; - if (c != 0) mph_set_graphsize(mph, c); - mphf = mph_create(mph); + mph = cmph_mph_new(mph_algo, &source); + if (nhashes) cmph_mph_set_hashfuncs(mph, hashes); + cmph_mph_set_verbosity(mph, verbosity); + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if (c != 0) cmph_mph_set_graphsize(mph, c); + mphf = cmph_mph_create(mph); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - mph_destroy(mph); + cmph_mph_destroy(mph); free(mphf_file); return -1; } @@ -267,13 +267,13 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - mphf_dump(mphf, mphf_fd); - mphf_destroy(mphf); + cmph_mphf_dump(mphf, mphf_fd); + cmph_mphf_destroy(mphf); fclose(mphf_fd); } else { - uint8 * hashtable = NULL; + cmph_uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { @@ -281,7 +281,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - mphf = mphf_load(mphf_fd); + mphf = cmph_mphf_load(mphf_fd); fclose(mphf_fd); if (!mphf) { @@ -289,16 +289,16 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - hashtable = (uint8*)malloc(source.nkeys*sizeof(uint8)); + hashtable = (cmph_uint8*)malloc(source.nkeys*sizeof(cmph_uint8)); memset(hashtable, 0, source.nkeys); //check all keys for (i = 0; i < source.nkeys; ++i) { - uint32 h; + cmph_uint32 h; char *buf; - uint32 buflen = 0; + cmph_uint32 buflen = 0; source.read(source.data, &buf, &buflen); - h = mphf_search(mphf, buf, buflen); + h = cmph_mphf_search(mphf, buf, buflen); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; @@ -308,7 +308,7 @@ int main(int argc, char **argv) } source.dispose(source.data, buf, buflen); } - mphf_destroy(mphf); + cmph_mphf_destroy(mphf); free(hashtable); } fclose(keys_fd); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index c9c6943..0a0b8fd 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -1,23 +1,23 @@ #include "sdbm_hash.h" #include -sdbm_state_t *sdbm_state_new() +cmph_sdbm_state_t *cmph_sdbm_state_new() { - sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); - state->hashfunc = HASH_SDBM; + cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + state->hashfunc = CMPH_HASH_SDBM; return state; } -void sdbm_state_destroy(sdbm_state_t *state) +void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state) { free(state); } -uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen) { - register uint32 hash = 0; + register cmph_uint32 hash = 0; const unsigned char *ptr = k; - uint32 i = 0; + cmph_uint32 i = 0; while(i < keylen) { hash = *ptr + (hash << 6) + (hash << 16) - hash; @@ -27,16 +27,16 @@ uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) } -void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen) +void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen) +cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen) { - sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); - state->hashfunc = HASH_SDBM; + cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + state->hashfunc = CMPH_HASH_SDBM; return state; } diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index 9e27f0f..39cd3bb 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct __sdbm_state_t +typedef struct cmph__sdbm_state_t { CMPH_HASH hashfunc; -} sdbm_state_t; +} cmph_sdbm_state_t; -sdbm_state_t *sdbm_state_new(); -uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen); -void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen); -sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen); -void sdbm_state_destroy(sdbm_state_t *state); +cmph_sdbm_state_t *cmph_sdbm_state_new(); +cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen); +void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state); #endif diff --git a/src/vqueue.c b/src/vqueue.c index 4be3481..e893b5b 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -2,49 +2,49 @@ #include #include #include -struct __vqueue_t +struct cmph__vqueue_t { - uint32 * values; - uint32 beg, end, capacity; + cmph_uint32 * values; + cmph_uint32 beg, end, capacity; }; -vqueue_t * vqueue_new(uint32 capacity) +cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity) { - vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); + cmph_vqueue_t *q = (cmph_vqueue_t *)malloc(sizeof(cmph_vqueue_t)); assert(q); - q->values = (uint32 *)calloc(capacity+1, sizeof(uint32)); + q->values = (cmph_uint32 *)calloc(capacity+1, sizeof(cmph_uint32)); q->beg = q->end = 0; q->capacity = capacity+1; return q; } -uint8 vqueue_is_empty(vqueue_t * q) +cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q) { return (q->beg == q->end); } -void vqueue_insert(vqueue_t * q, uint32 val) +void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val) { assert((q->end + 1)%q->capacity != q->beg); // Is queue full? q->end = (q->end + 1)%q->capacity; q->values[q->end] = val; } -uint32 vqueue_remove(vqueue_t * q) +cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q) { - assert(!vqueue_is_empty(q)); // Is queue empty? + assert(!cmph_vqueue_is_empty(q)); // Is queue empty? q->beg = (q->beg + 1)%q->capacity; return q->values[q->beg]; } -void vqueue_print(vqueue_t * q) +void cmph_vqueue_print(cmph_vqueue_t * q) { - uint32 i; + cmph_uint32 i; for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); } -void vqueue_destroy(vqueue_t *q) +void cmph_vqueue_destroy(cmph_vqueue_t *q) { free(q->values); q->values = NULL; } diff --git a/src/vqueue.h b/src/vqueue.h index cd870bb..d0853a9 100644 --- a/src/vqueue.h +++ b/src/vqueue.h @@ -2,17 +2,17 @@ #define __CMPH_VQUEUE_H__ #include "cmph_types.h" -typedef struct __vqueue_t vqueue_t; +typedef struct cmph__vqueue_t cmph_vqueue_t; -vqueue_t * vqueue_new(uint32 capacity); +cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity); -uint8 vqueue_is_empty(vqueue_t * q); +cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q); -void vqueue_insert(vqueue_t * q, uint32 val); +void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val); -uint32 vqueue_remove(vqueue_t * q); +cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q); -void vqueue_print(vqueue_t * q); +void cmph_vqueue_print(cmph_vqueue_t * q); -void vqueue_destroy(vqueue_t * q); +void cmph_vqueue_destroy(cmph_vqueue_t * q); #endif diff --git a/src/vstack.c b/src/vstack.c index 67b2945..a74f667 100644 --- a/src/vstack.c +++ b/src/vstack.c @@ -6,16 +6,16 @@ //#define DEBUG #include "debug.h" -struct __vstack_t +struct cmph__vstack_t { - uint32 pointer; - uint32 *values; - uint32 capacity; + cmph_uint32 pointer; + cmph_uint32 *values; + cmph_uint32 capacity; }; -vstack_t *vstack_new() +cmph_vstack_t *cmph_vstack_new() { - vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); + cmph_vstack_t *stack = (cmph_vstack_t *)malloc(sizeof(cmph_vstack_t)); assert(stack); stack->pointer = 0; stack->values = NULL; @@ -23,54 +23,54 @@ vstack_t *vstack_new() return stack; } -void vstack_destroy(vstack_t *stack) +void cmph_vstack_destroy(cmph_vstack_t *stack) { assert(stack); free(stack->values); free(stack); } -void vstack_push(vstack_t *stack, uint32 val) +void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val) { assert(stack); - vstack_reserve(stack, stack->pointer + 1); + cmph_vstack_reserve(stack, stack->pointer + 1); stack->values[stack->pointer] = val; ++(stack->pointer); } -void vstack_pop(vstack_t *stack) +void cmph_vstack_pop(cmph_vstack_t *stack) { assert(stack); assert(stack->pointer > 0); --(stack->pointer); } -uint32 vstack_top(vstack_t *stack) +cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack) { assert(stack); assert(stack->pointer > 0); return stack->values[(stack->pointer - 1)]; } -int vstack_empty(vstack_t *stack) +int cmph_vstack_empty(cmph_vstack_t *stack) { assert(stack); return stack->pointer == 0; } -uint32 vstack_size(vstack_t *stack) +cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack) { return stack->pointer; } -void vstack_reserve(vstack_t *stack, uint32 size) +void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size) { assert(stack); if (stack->capacity < size) { - uint32 new_capacity = stack->capacity + 1; + cmph_uint32 new_capacity = stack->capacity + 1; DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); while (new_capacity < size) { new_capacity *= 2; } - stack->values = (uint32 *)realloc(stack->values, sizeof(uint32)*new_capacity); + stack->values = (cmph_uint32 *)realloc(stack->values, sizeof(cmph_uint32)*new_capacity); assert(stack->values); stack->capacity = new_capacity; DEBUGP("Increased\n"); diff --git a/src/vstack.h b/src/vstack.h index 85893c4..8552a43 100644 --- a/src/vstack.h +++ b/src/vstack.h @@ -2,17 +2,17 @@ #define __CMPH_VSTACK_H__ #include "cmph_types.h" -typedef struct __vstack_t vstack_t; +typedef struct cmph__vstack_t cmph_vstack_t; -vstack_t *vstack_new(); -void vstack_destroy(vstack_t *stack); +cmph_vstack_t *cmph_vstack_new(); +void cmph_vstack_destroy(cmph_vstack_t *stack); -void vstack_push(vstack_t *stack, uint32 val); -uint32 vstack_top(vstack_t *stack); -void vstack_pop(vstack_t *stack); -int vstack_empty(vstack_t *stack); -uint32 vstack_size(vstack_t *stack); +void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val); +cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack); +void cmph_vstack_pop(cmph_vstack_t *stack); +int cmph_vstack_empty(cmph_vstack_t *stack); +cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack); -void vstack_reserve(vstack_t *stack, uint32 size); +void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size); #endif From 264a1996c8a2c1372f8c9ad73f326782d58c1de0 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 18 Jan 2005 21:06:08 +0000 Subject: [PATCH 028/739] version with cmph prefix --- src/bmz.c | 314 ++++++++++++++++++++++---------------------- src/bmz.h | 20 +-- src/bmz_structs.h | 22 ++-- src/cmph.c | 100 +++++++------- src/cmph.h | 34 ++--- src/cmph_structs.c | 34 ++--- src/cmph_structs.h | 24 ++-- src/cmph_types.h | 15 ++- src/czech.c | 184 +++++++++++++------------- src/czech.h | 20 +-- src/czech_structs.h | 22 ++-- src/djb2_hash.c | 22 ++-- src/djb2_hash.h | 14 +- src/fnv_hash.c | 18 +-- src/fnv_hash.h | 14 +- src/graph.c | 108 +++++++-------- src/graph.h | 42 +++--- src/hash.c | 118 ++++++++--------- src/hash.h | 12 +- src/hash_state.h | 10 +- src/jenkins_hash.c | 64 ++++----- src/jenkins_hash.h | 20 +-- src/main.c | 78 +++++------ src/sdbm_hash.c | 22 ++-- src/sdbm_hash.h | 14 +- src/vqueue.c | 26 ++-- src/vqueue.h | 14 +- src/vstack.c | 32 ++--- src/vstack.h | 18 +-- 29 files changed, 718 insertions(+), 717 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 5c8aff3..b06e0c4 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -13,33 +13,33 @@ //#define DEBUG #include "debug.h" -//static uint32 UNDEFINED = UINT_MAX; +//static cmph_uint32 UNDEFINED = UINT_MAX; static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) -static int bmz_gen_edges(mph_t *mph); -static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); -static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited); -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited); +static int bmz_gen_edges(cmph_mph_t *mph); +static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); -mph_t *bmz_mph_new(key_source_t *key_source) +cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source) { - mph_t *mph = NULL; - bmz_mph_data_t *bmz = NULL; - mph = __mph_new(MPH_BMZ, key_source); + cmph_mph_t *mph = NULL; + cmph_bmz_mph_data_t *bmz = NULL; + mph = cmph__mph_new(CMPH_BMZ, key_source); if (mph == NULL) return NULL; - bmz = (bmz_mph_data_t *)malloc(sizeof(bmz_mph_data_t)); + bmz = (cmph_bmz_mph_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); if (bmz == NULL) { - __mph_destroy(mph); + cmph__mph_destroy(mph); return NULL; } - bmz->hashfuncs[0] = HASH_JENKINS; - bmz->hashfuncs[1] = HASH_JENKINS; + bmz->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; @@ -47,20 +47,20 @@ mph_t *bmz_mph_new(key_source_t *key_source) assert(mph->data); return mph; } -void bmz_mph_destroy(mph_t *mph) +void cmph_bmz_mph_destroy(cmph_mph_t *mph) { - bmz_mph_data_t *data = (bmz_mph_data_t *)mph->data; + cmph_bmz_mph_data_t *data = (cmph_bmz_mph_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); - __mph_destroy(mph); + cmph__mph_destroy(mph); } -void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) { - bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; - uint32 i = 0; - while(*hashptr != HASH_COUNT) + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) { if (i >= 2) break; //bmz only uses two hash functions bmz->hashfuncs[i] = *hashptr; @@ -68,33 +68,33 @@ void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) } } -mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) +cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) { - mphf_t *mphf = NULL; - bmz_mphf_data_t *bmzf = NULL; - uint32 i; - uint32 iterations; - uint32 iterations_map = 20; - uint8 *used_edges = NULL; - uint8 restart_mapping = 0; - uint8 * visited = NULL; + cmph_mphf_t *mphf = NULL; + cmph_bmz_mphf_data_t *bmzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations; + cmph_uint32 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; DEBUGP("bmz_c: %f\n", bmz_c); - bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; + cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; bmz->m = mph->key_source->nkeys; bmz->n = ceil(bmz_c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u bmz_c: %f\n", bmz->m, bmz->n, bmz_c); - bmz->graph = graph_new(bmz->n, bmz->m); + bmz->graph = cmph_graph_new(bmz->n, bmz->m); DEBUGP("Created graph\n"); - bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; do { // Mapping step - uint32 biggest_g_value = 0; - uint32 biggest_edge_value = 1; + cmph_uint32 biggest_g_value = 0; + cmph_uint32 biggest_edge_value = 1; iterations = 20; if (mph->verbosity) { @@ -104,17 +104,17 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) { int ok; DEBUGP("hash function 1\n"); - bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); + bmz->hashes[0] = cmph_hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); - bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); + bmz->hashes[1] = cmph_hash_state_new(bmz->hashfuncs[1], bmz->n); DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(bmz->hashes[0]); + cmph_hash_state_destroy(bmz->hashes[0]); bmz->hashes[0] = NULL; - hash_state_destroy(bmz->hashes[1]); + cmph_hash_state_destroy(bmz->hashes[1]); bmz->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -127,7 +127,7 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) } if (iterations == 0) { - graph_destroy(bmz->graph); + cmph_graph_destroy(bmz->graph); return NULL; } @@ -137,7 +137,7 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) fprintf(stderr, "Starting ordering step\n"); } - graph_obtain_critical_nodes(bmz->graph); + cmph_graph_obtain_critical_nodes(bmz->graph); // Searching step if (mph->verbosity) @@ -148,14 +148,14 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) DEBUGP("Searching step\n"); visited = (char *)malloc(bmz->n/8 + 1); memset(visited, 0, bmz->n/8 + 1); - used_edges = (uint8 *)malloc(bmz->m/8 + 1); + used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(uint32)); + bmz->g = malloc(bmz->n * sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { - if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) + if (cmph_graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) { if(bmz_c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); @@ -178,12 +178,12 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - graph_destroy(bmz->graph); + cmph_graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) return NULL; - mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); mphf->algo = mph->algo; - bmzf = (bmz_mphf_data_t *)malloc(sizeof(bmz_mph_data_t)); + bmzf = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; @@ -200,41 +200,41 @@ mphf_t *bmz_mph_create(mph_t *mph, float bmz_c) return mphf; } -static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { - uint32 next_g; - uint32 u; /* Auxiliary vertex */ - uint32 lav; /* lookahead vertex */ - uint8 collision; - vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); - graph_iterator_t it, it1; + cmph_uint32 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph)) + 1); + cmph_graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); - bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - vqueue_insert(q, v); - while(!vqueue_is_empty(q)) + next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + cmph_vqueue_insert(q, v); + while(!cmph_vqueue_is_empty(q)) { - v = vqueue_remove(q); - it = graph_neighbors_it(bmz->graph, v); - while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + v = cmph_vqueue_remove(q); + it = cmph_graph_neighbors_it(bmz->graph, v); + while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { collision = 1; while(collision) // lookahead to resolve collisions { next_g = *biggest_g_value + 1; - it1 = graph_neighbors_it(bmz->graph, u); + it1 = cmph_graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - vqueue_destroy(q); + cmph_vqueue_destroy(q); return 1; // restart mapping step. } if (GETBIT(used_edges, next_g + bmz->g[lav])) @@ -247,10 +247,10 @@ static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * if (next_g > *biggest_g_value) *biggest_g_value = next_g; } // Marking used edges... - it1 = graph_neighbors_it(bmz->graph, u); - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + it1 = cmph_graph_neighbors_it(bmz->graph, u); + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -258,41 +258,41 @@ static uint8 bmz_traverse_critical_nodes(bmz_mph_data_t *bmz, uint32 v, uint32 * } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited,u); - vqueue_insert(q, u); + cmph_vqueue_insert(q, u); } } } - vqueue_destroy(q); + cmph_vqueue_destroy(q); return 0; } -static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v, uint32 * biggest_g_value, uint32 * biggest_edge_value, uint8 * used_edges, uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { - uint32 next_g; - uint32 u; /* Auxiliary vertex */ - uint32 lav; /* lookahead vertex */ - uint8 collision; - uint32 * unused_g_values = NULL; - uint32 unused_g_values_capacity = 0; - uint32 nunused_g_values = 0; - vqueue_t * q = vqueue_new((uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); - graph_iterator_t it, it1; + cmph_uint32 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint32 * unused_g_values = NULL; + cmph_uint32 unused_g_values_capacity = 0; + cmph_uint32 nunused_g_values = 0; + cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph))+1); + cmph_graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); - bmz->g[v] = (uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - vqueue_insert(q, v); - while(!vqueue_is_empty(q)) + next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + cmph_vqueue_insert(q, v); + while(!cmph_vqueue_is_empty(q)) { - v = vqueue_remove(q); - it = graph_neighbors_it(bmz->graph, v); - while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + v = cmph_vqueue_remove(q); + it = cmph_graph_neighbors_it(bmz->graph, v); + while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { - uint32 next_g_index = 0; + cmph_uint32 next_g_index = 0; collision = 1; while(collision) // lookahead to resolve collisions { @@ -305,15 +305,15 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v next_g = *biggest_g_value + 1; next_g_index = UINT_MAX; } - it1 = graph_neighbors_it(bmz->graph, u); + it1 = cmph_graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - vqueue_destroy(q); + cmph_vqueue_destroy(q); free(unused_g_values); return 1; // restart mapping step. } @@ -328,7 +328,7 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(uint32)); + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; @@ -340,10 +340,10 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; // Marking used edges... - it1 = graph_neighbors_it(bmz->graph, u); - while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + it1 = cmph_graph_neighbors_it(bmz->graph, u); + while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) { - if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -351,17 +351,17 @@ static uint8 bmz_traverse_critical_nodes_heuristic(bmz_mph_data_t *bmz, uint32 v } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - vqueue_insert(q, u); + cmph_vqueue_insert(q, u); } } } - vqueue_destroy(q); + cmph_vqueue_destroy(q); free(unused_g_values); return 0; } -static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 unused_edge_index) +static cmph_uint32 next_unused_edge(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) { while(1) { @@ -372,11 +372,11 @@ static uint32 next_unused_edge(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 u return unused_edge_index; } -static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint32 * unused_edge_index, uint8 * visited) +static void bmz_traverse(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) { - graph_iterator_t it = graph_neighbors_it(bmz->graph, v); - uint32 neighbor = 0; - while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + cmph_graph_iterator_t it = cmph_graph_neighbors_it(bmz->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); @@ -389,15 +389,15 @@ static void bmz_traverse(bmz_mph_data_t *bmz, uint8 * used_edges, uint32 v, uint } } -static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_edges, uint8 * visited) +static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) { - uint32 i, v1, v2, unused_edge_index = 0; + cmph_uint32 i, v1, v2, unused_edge_index = 0; DEBUGP("Labelling non critical vertices\n"); for(i = 0; i < bmz->m; i++) { - v1 = graph_vertex_id(bmz->graph, i, 0); - v2 = graph_vertex_id(bmz->graph, i, 1); + v1 = cmph_graph_vertex_id(bmz->graph, i, 0); + v2 = cmph_graph_vertex_id(bmz->graph, i, 1); if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); @@ -416,23 +416,23 @@ static void bmz_traverse_non_critical_nodes(bmz_mph_data_t *bmz, uint8 * used_ed } -static int bmz_gen_edges(mph_t *mph) +static int bmz_gen_edges(cmph_mph_t *mph) { - uint32 e; - bmz_mph_data_t *bmz = (bmz_mph_data_t *)mph->data; - uint8 multiple_edges = 0; + cmph_uint32 e; + cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; DEBUGP("Generating edges for %u vertices\n", bmz->n); - graph_clear_edges(bmz->graph); + cmph_graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { - uint32 h1, h2; - uint32 keylen; + cmph_uint32 h1, h2; + cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; - h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; if (h1 == h2) { @@ -442,43 +442,43 @@ static int bmz_gen_edges(mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - multiple_edges = graph_contains_edge(bmz->graph, h1, h2); + multiple_edges = cmph_graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. - graph_add_edge(bmz->graph, h1, h2); + cmph_graph_add_edge(bmz->graph, h1, h2); } return !multiple_edges; } -int bmz_mphf_dump(mphf_t *mphf, FILE *fd) +int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *fd) { char *buf = NULL; - uint32 buflen; - uint32 nbuflen; - uint32 i; - uint32 two = 2; //number of hash functions - bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; - uint32 nn, nm; - __mphf_dump(mphf, fd); + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = 2; //number of hash functions + cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; + cmph_uint32 nn, nm; + cmph__mphf_dump(mphf, fd); - fwrite(&two, sizeof(uint32), 1, fd); + fwrite(&two, sizeof(cmph_uint32), 1, fd); - hash_state_dump(data->hashes[0], &buf, &buflen); + cmph_hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - hash_state_dump(data->hashes[1], &buf, &buflen); + cmph_hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - fwrite(&(data->n), sizeof(uint32), 1, fd); - fwrite(&(data->m), sizeof(uint32), 1, fd); + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->g, sizeof(uint32)*(data->n), 1, fd); + fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -487,38 +487,38 @@ int bmz_mphf_dump(mphf_t *mphf, FILE *fd) return 1; } -void bmz_mphf_load(FILE *f, mphf_t *mphf) +void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf) { - uint32 nhashes; + cmph_uint32 nhashes; char *buf = NULL; - uint32 buflen; - uint32 i; - bmz_mphf_data_t *bmz = (bmz_mphf_data_t *)malloc(sizeof(bmz_mphf_data_t)); + cmph_uint32 buflen; + cmph_uint32 i; + cmph_bmz_mphf_data_t *bmz = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mphf_data_t)); DEBUGP("Loading bmz mphf\n"); mphf->data = bmz; - fread(&nhashes, sizeof(uint32), 1, f); - bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + fread(&nhashes, sizeof(cmph_uint32), 1, f); + bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); bmz->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - hash_state_t *state = NULL; - fread(&buflen, sizeof(uint32), 1, f); + cmph_hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); + state = cmph_hash_state_load(buf, buflen); bmz->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(bmz->n), sizeof(uint32), 1, f); - fread(&(bmz->m), sizeof(uint32), 1, f); + fread(&(bmz->n), sizeof(cmph_uint32), 1, f); + fread(&(bmz->m), sizeof(cmph_uint32), 1, f); - bmz->g = (uint32 *)malloc(sizeof(uint32)*bmz->n); - fread(bmz->g, bmz->n*sizeof(uint32), 1, f); + bmz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*bmz->n); + fread(bmz->g, bmz->n*sizeof(cmph_uint32), 1, f); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); @@ -528,22 +528,22 @@ void bmz_mphf_load(FILE *f, mphf_t *mphf) } -uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) { - bmz_mphf_data_t *bmz = mphf->data; - uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; - uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + cmph_bmz_mphf_data_t *bmz = mphf->data; + cmph_uint32 h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; + cmph_uint32 h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); return bmz->g[h1] + bmz->g[h2]; } -void bmz_mphf_destroy(mphf_t *mphf) +void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf) { - bmz_mphf_data_t *data = (bmz_mphf_data_t *)mphf->data; + cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; free(data->g); - hash_state_destroy(data->hashes[0]); - hash_state_destroy(data->hashes[1]); + cmph_hash_state_destroy(data->hashes[0]); + cmph_hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/bmz.h b/src/bmz.h index f815029..6095b91 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -4,16 +4,16 @@ #include "graph.h" #include "cmph.h" -typedef struct __bmz_mphf_data_t bmz_mphf_data_t; -typedef struct __bmz_mph_data_t bmz_mph_data_t; +typedef struct cmph__bmz_mphf_data_t cmph_bmz_mphf_data_t; +typedef struct cmph__bmz_mph_data_t cmph_bmz_mph_data_t; -mph_t *bmz_mph_new(key_source_t *key_source); -void bmz_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); -void bmz_mph_destroy(mph_t *mph); -mphf_t *bmz_mph_create(mph_t *mph, float bmz_c); +cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source); +void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); +void cmph_bmz_mph_destroy(cmph_mph_t *mph); +cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c); -void bmz_mphf_load(FILE *f, mphf_t *mphf); -int bmz_mphf_dump(mphf_t *mphf, FILE *f); -void bmz_mphf_destroy(mphf_t *mphf); -uint32 bmz_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf); +int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *f); +void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf); +cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/bmz_structs.h b/src/bmz_structs.h index 4f6d131..a906d6d 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -3,22 +3,22 @@ #include "hash_state.h" -struct __bmz_mphf_data_t +struct cmph__bmz_mphf_data_t { - uint32 m; //edges (words) count - uint32 n; //vertex count - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; -struct __bmz_mph_data_t +struct cmph__bmz_mph_data_t { CMPH_HASH hashfuncs[2]; - uint32 m; //edges (words) count - uint32 n; //vertex count - graph_t *graph; - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_graph_t *graph; + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; #endif diff --git a/src/cmph.c b/src/cmph.c index 7a67193..74e5bad 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -10,20 +10,20 @@ //#define DEBUG #include "debug.h" -const char *mph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ -mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source) +cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) { - mph_t *mph = NULL; - DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + cmph_mph_t *mph = NULL; + DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); switch (algo) { - case MPH_CZECH: - mph = czech_mph_new(key_source); + case CMPH_CZECH: + mph = cmph_czech_mph_new(key_source); break; - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("new bmz algorithm \n"); - mph = bmz_mph_new(key_source); + mph = cmph_bmz_mph_new(key_source); break; default: assert(0); @@ -32,63 +32,63 @@ mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source) return mph; } -void mph_destroy(mph_t *mph) +void cmph_mph_destroy(cmph_mph_t *mph) { - DEBUGP("Destroying mph with algo %s\n", mph_names[mph->algo]); + DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); switch (mph->algo) { - case MPH_CZECH: - czech_mph_destroy(mph); + case CMPH_CZECH: + cmph_czech_mph_destroy(mph); break; - case MPH_BMZ: /* included -- Fabiano */ - bmz_mph_destroy(mph); + case CMPH_BMZ: /* included -- Fabiano */ + cmph_bmz_mph_destroy(mph); break; default: assert(0); } } -void mph_set_verbosity(mph_t *mph, uint32 verbosity) +void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity) { mph->verbosity = verbosity; } -void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) { switch (mph->algo) { - case MPH_CZECH: - czech_mph_set_hashfuncs(mph, hashfuncs); + case CMPH_CZECH: + cmph_czech_mph_set_hashfuncs(mph, hashfuncs); break; - case MPH_BMZ: /* included -- Fabiano */ - bmz_mph_set_hashfuncs(mph, hashfuncs); + case CMPH_BMZ: /* included -- Fabiano */ + cmph_bmz_mph_set_hashfuncs(mph, hashfuncs); break; default: break; } return; } -void mph_set_graphsize(mph_t *mph, float c) +void cmph_mph_set_graphsize(cmph_mph_t *mph, float c) { mph->c = c; return; } -mphf_t *mph_create(mph_t *mph) +cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph) { - mphf_t *mphf = NULL; + cmph_mphf_t *mphf = NULL; float c = mph->c; switch (mph->algo) { - case MPH_CZECH: + case CMPH_CZECH: DEBUGP("Creating czech hash\n"); if (c == 0) c = 2.09; - mphf = czech_mph_create(mph, c); + mphf = cmph_czech_mph_create(mph, c); break; - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); if (c == 0) c = 1.15; - mphf = bmz_mph_create(mph, c); + mphf = cmph_bmz_mph_create(mph, c); break; default: assert(0); @@ -96,15 +96,15 @@ mphf_t *mph_create(mph_t *mph) return mphf; } -int mphf_dump(mphf_t *mphf, FILE *f) +int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f) { switch (mphf->algo) { - case MPH_CZECH: - return czech_mphf_dump(mphf, f); + case CMPH_CZECH: + return cmph_czech_mphf_dump(mphf, f); break; - case MPH_BMZ: /* included -- Fabiano */ - return bmz_mphf_dump(mphf, f); + case CMPH_BMZ: /* included -- Fabiano */ + return cmph_bmz_mphf_dump(mphf, f); break; default: assert(0); @@ -112,22 +112,22 @@ int mphf_dump(mphf_t *mphf, FILE *f) assert(0); return 0; } -mphf_t *mphf_load(FILE *f) +cmph_mphf_t *cmph_mphf_load(FILE *f) { - mphf_t *mphf = NULL; + cmph_mphf_t *mphf = NULL; DEBUGP("Loading mphf generic parts\n"); - mphf = __mphf_load(f); + mphf = cmph__mphf_load(f); if (mphf == NULL) return NULL; DEBUGP("Loading mphf algorithm dependent parts\n"); switch (mphf->algo) { - case MPH_CZECH: - czech_mphf_load(f, mphf); + case CMPH_CZECH: + cmph_czech_mphf_load(f, mphf); break; - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Loading bmz algorithm dependent parts\n"); - bmz_mphf_load(f, mphf); + cmph_bmz_mphf_load(f, mphf); break; default: assert(0); @@ -137,16 +137,16 @@ mphf_t *mphf_load(FILE *f) } -uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) { DEBUGP("mphf algorithm: %u \n", mphf->algo); switch(mphf->algo) { - case MPH_CZECH: - return czech_mphf_search(mphf, key, keylen); - case MPH_BMZ: /* included -- Fabiano */ + case CMPH_CZECH: + return cmph_czech_mphf_search(mphf, key, keylen); + case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); - return bmz_mphf_search(mphf, key, keylen); + return cmph_bmz_mphf_search(mphf, key, keylen); default: assert(0); } @@ -154,20 +154,20 @@ uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen) return 0; } -uint32 mphf_size(mphf_t *mphf) +cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf) { return mphf->size; } -void mphf_destroy(mphf_t *mphf) +void cmph_mphf_destroy(cmph_mphf_t *mphf) { switch(mphf->algo) { - case MPH_CZECH: - czech_mphf_destroy(mphf); + case CMPH_CZECH: + cmph_czech_mphf_destroy(mphf); return; - case MPH_BMZ: /* included -- Fabiano */ - bmz_mphf_destroy(mphf); + case CMPH_BMZ: /* included -- Fabiano */ + cmph_bmz_mphf_destroy(mphf); return; default: assert(0); diff --git a/src/cmph.h b/src/cmph.h index 4d828bb..5ad98fb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -11,32 +11,32 @@ extern "C" #include "cmph_types.h" -typedef struct __mph_t mph_t; -typedef struct __mphf_t mphf_t; +typedef struct cmph__mph_t cmph_mph_t; +typedef struct cmph__mphf_t cmph_mphf_t; typedef struct { void *data; - uint32 nkeys; - int (*read)(void *, char **, uint32 *); - void (*dispose)(void *, char *, uint32); + cmph_uint32 nkeys; + int (*read)(void *, char **, cmph_uint32 *); + void (*dispose)(void *, char *, cmph_uint32); void (*rewind)(void *); -} key_source_t; +} cmph_key_source_t; /** Hash generation API **/ -mph_t *mph_new(MPH_ALGO algo, key_source_t *key_source); -void mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); -void mph_set_verbosity(mph_t *mph, uint32 verbosity); -void mph_set_graphsize(mph_t *mph, float c); -void mph_destroy(mph_t *mph); -mphf_t *mph_create(mph_t *mph); +cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); +void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); +void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity); +void cmph_mph_set_graphsize(cmph_mph_t *mph, float c); +void cmph_mph_destroy(cmph_mph_t *mph); +cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph); /** Hash querying API **/ -mphf_t *mphf_load(FILE *f); -int mphf_dump(mphf_t *mphf, FILE *f); -uint32 mphf_search(mphf_t *mphf, const char *key, uint32 keylen); -uint32 mphf_size(mphf_t *mphf); -void mphf_destroy(mphf_t *mphf); +cmph_mphf_t *cmph_mphf_load(FILE *f); +int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f); +cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); +cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf); +void cmph_mphf_destroy(cmph_mphf_t *mphf); #ifdef __cplusplus } diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 9629815..ee1e89f 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -5,10 +5,10 @@ //#define DEBUG #include "debug.h" -mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) +cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) { - mph_t *mph = (mph_t *)malloc(sizeof(mph_t)); - DEBUGP("Creating mph with algorithm %s\n", mph_names[algo]); + cmph_mph_t *mph = (cmph_mph_t *)malloc(sizeof(cmph_mph_t)); + DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->algo = algo; mph->key_source = key_source; @@ -17,51 +17,51 @@ mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source) return mph; } -void __mph_destroy(mph_t *mph) +void cmph__mph_destroy(cmph_mph_t *mph) { free(mph); } -void __mphf_dump(mphf_t *mphf, FILE *fd) +void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *fd) { - uint32 nsize = htonl(mphf->size); - fwrite(mph_names[mphf->algo], (uint32)(strlen(mph_names[mphf->algo]) + 1), 1, fd); + cmph_uint32 nsize = htonl(mphf->size); + fwrite(cmph_names[mphf->algo], (cmph_uint32)(strlen(cmph_names[mphf->algo]) + 1), 1, fd); fwrite(&nsize, sizeof(mphf->size), 1, fd); } -mphf_t *__mphf_load(FILE *f) +cmph_mphf_t *cmph__mphf_load(FILE *f) { - mphf_t *mphf = NULL; - uint32 i; + cmph_mphf_t *mphf = NULL; + cmph_uint32 i; char algo_name[BUFSIZ]; char *ptr = algo_name; - MPH_ALGO algo = MPH_COUNT; + CMPH_ALGO algo = CMPH_COUNT; DEBUGP("Loading mphf\n"); while(1) { - uint32 c = fread(ptr, 1, 1, f); + cmph_uint32 c = fread(ptr, 1, 1, f); if (c != 1) return NULL; if (*ptr == 0) break; ++ptr; } - for(i = 0; i < MPH_COUNT; ++i) + for(i = 0; i < CMPH_COUNT; ++i) { - if (strcmp(algo_name, mph_names[i]) == 0) + if (strcmp(algo_name, cmph_names[i]) == 0) { algo = i; } } - if (algo == MPH_COUNT) + if (algo == CMPH_COUNT) { DEBUGP("Algorithm %s not found\n", algo_name); return NULL; } - mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); mphf->algo = algo; fread(&(mphf->size), sizeof(mphf->size), 1, f); mphf->size = ntohl(mphf->size); mphf->data = NULL; - DEBUGP("Algorithm is %s and mphf is sized %u\n", mph_names[algo], mphf->size); + DEBUGP("Algorithm is %s and mphf is sized %u\n", cmph_names[algo], mphf->size); return mphf; } diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 4b9f879..65c8784 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -5,29 +5,29 @@ /** Hash generation algorithm data */ -struct __mph_t +struct cmph__mph_t { - MPH_ALGO algo; - key_source_t *key_source; - uint32 verbosity; + CMPH_ALGO algo; + cmph_key_source_t *key_source; + cmph_uint32 verbosity; float c; void *data; //algorithm dependent data }; /** Hash querying algorithm data */ -struct __mphf_t +struct cmph__mphf_t { - MPH_ALGO algo; - uint32 size; - key_source_t *key_source; + CMPH_ALGO algo; + cmph_uint32 size; + cmph_key_source_t *key_source; void *data; //algorithm dependent data }; -mph_t *__mph_new(MPH_ALGO algo, key_source_t *key_source); -void __mph_destroy(); -void __mphf_dump(mphf_t *mphf, FILE *); -mphf_t *__mphf_load(FILE *f); +cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); +void cmph__mph_destroy(); +void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *); +cmph_mphf_t *cmph__mphf_load(FILE *f); #endif diff --git a/src/cmph_types.h b/src/cmph_types.h index 84b6a22..6e07879 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -1,13 +1,14 @@ #ifndef __CMPH_TYPES_H__ #define __CMPH_TYPES_H__ -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; +typedef unsigned char cmph_uint8; +typedef unsigned short cmph_uint16; +typedef unsigned int cmph_uint32; -typedef enum { HASH_JENKINS, HASH_DJB2, HASH_SDBM, HASH_FNV, HASH_GLIB, HASH_PJW, HASH_COUNT } CMPH_HASH; -extern const char *hash_names[]; -typedef enum { MPH_CZECH, MPH_BMZ, MPH_COUNT } MPH_ALGO; /* included -- Fabiano */ -extern const char *mph_names[]; +typedef enum { CMPH_HASH_JENKINS, CMPH_HASH_DJB2, CMPH_HASH_SDBM, CMPH_HASH_FNV, + CMPH_HASH_GLIB, CMPH_HASH_PJW, CMPH_HASH_COUNT } CMPH_HASH; +extern const char *cmph_hash_names[]; +typedef enum { CMPH_CZECH, CMPH_BMZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +extern const char *cmph_names[]; #endif diff --git a/src/czech.c b/src/czech.c index 16efe3f..c4e1a96 100644 --- a/src/czech.c +++ b/src/czech.c @@ -18,23 +18,23 @@ static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) -static int czech_gen_edges(mph_t *mph); -static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v); +static int czech_gen_edges(cmph_mph_t *mph); +static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); -mph_t *czech_mph_new(key_source_t *key_source) +cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source) { - mph_t *mph = NULL; - czech_mph_data_t *czech = NULL; - mph = __mph_new(MPH_CZECH, key_source); + cmph_mph_t *mph = NULL; + cmph_czech_mph_data_t *czech = NULL; + mph = cmph__mph_new(CMPH_CZECH, key_source); if (mph == NULL) return NULL; - czech = (czech_mph_data_t *)malloc(sizeof(czech_mph_data_t)); + czech = (cmph_czech_mph_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); if (czech == NULL) { - __mph_destroy(mph); + cmph__mph_destroy(mph); return NULL; } - czech->hashfuncs[0] = HASH_JENKINS; - czech->hashfuncs[1] = HASH_JENKINS; + czech->hashfuncs[0] = CMPH_HASH_JENKINS; + czech->hashfuncs[1] = CMPH_HASH_JENKINS; czech->g = NULL; czech->graph = NULL; czech->hashes = NULL; @@ -42,20 +42,20 @@ mph_t *czech_mph_new(key_source_t *key_source) assert(mph->data); return mph; } -void czech_mph_destroy(mph_t *mph) +void cmph_czech_mph_destroy(cmph_mph_t *mph) { - czech_mph_data_t *data = (czech_mph_data_t *)mph->data; + cmph_czech_mph_data_t *data = (cmph_czech_mph_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); - __mph_destroy(mph); + cmph__mph_destroy(mph); } -void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) { - czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; - uint32 i = 0; - while(*hashptr != HASH_COUNT) + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) { if (i >= 2) break; //czech only uses two hash functions czech->hashfuncs[i] = *hashptr; @@ -63,22 +63,22 @@ void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs) } } -mphf_t *czech_mph_create(mph_t *mph, float c) +cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) { - mphf_t *mphf = NULL; - czech_mphf_data_t *czechf = NULL; + cmph_mphf_t *mphf = NULL; + cmph_czech_mphf_data_t *czechf = NULL; - uint32 i; - uint32 iterations = 20; - uint8 *visited = NULL; - czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; czech->m = mph->key_source->nkeys; czech->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); - czech->graph = graph_new(czech->n, czech->m); + czech->graph = cmph_graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; //Mapping step if (mph->verbosity) @@ -88,15 +88,15 @@ mphf_t *czech_mph_create(mph_t *mph, float c) while(1) { int ok; - czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); - czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); + czech->hashes[0] = cmph_hash_state_new(czech->hashfuncs[0], czech->n); + czech->hashes[1] = cmph_hash_state_new(czech->hashfuncs[1], czech->n); ok = czech_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(czech->hashes[0]); + cmph_hash_state_destroy(czech->hashes[0]); czech->hashes[0] = NULL; - hash_state_destroy(czech->hashes[1]); + cmph_hash_state_destroy(czech->hashes[1]); czech->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -109,7 +109,7 @@ mphf_t *czech_mph_create(mph_t *mph, float c) } if (iterations == 0) { - graph_destroy(czech->graph); + cmph_graph_destroy(czech->graph); return NULL; } @@ -122,7 +122,7 @@ mphf_t *czech_mph_create(mph_t *mph, float c) visited = (char *)malloc(czech->n/8 + 1); memset(visited, 0, czech->n/8 + 1); free(czech->g); - czech->g = malloc(czech->n * sizeof(uint32)); + czech->g = malloc(czech->n * sizeof(cmph_uint32)); assert(czech->g); for (i = 0; i < czech->n; ++i) { @@ -132,13 +132,13 @@ mphf_t *czech_mph_create(mph_t *mph, float c) czech_traverse(czech, visited, i); } } - graph_destroy(czech->graph); + cmph_graph_destroy(czech->graph); free(visited); czech->graph = NULL; - mphf = (mphf_t *)malloc(sizeof(mphf_t)); + mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); mphf->algo = mph->algo; - czechf = (czech_mphf_data_t *)malloc(sizeof(czech_mph_data_t)); + czechf = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); czechf->g = czech->g; czech->g = NULL; //transfer memory ownership czechf->hashes = czech->hashes; @@ -155,43 +155,43 @@ mphf_t *czech_mph_create(mph_t *mph, float c) return mphf; } -static void czech_traverse(czech_mph_data_t *czech, uint8 *visited, uint32 v) +static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) { - graph_iterator_t it = graph_neighbors_it(czech->graph, v); - uint32 neighbor = 0; + cmph_graph_iterator_t it = cmph_graph_neighbors_it(czech->graph, v); + cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) + while((neighbor = cmph_graph_next_neighbor(czech->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); - czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, cmph_graph_edge_id(czech->graph, v, neighbor)); + czech->g[neighbor] = cmph_graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], cmph_graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); czech_traverse(czech, visited, neighbor); } } -static int czech_gen_edges(mph_t *mph) +static int czech_gen_edges(cmph_mph_t *mph) { - uint32 e; - czech_mph_data_t *czech = (czech_mph_data_t *)mph->data; + cmph_uint32 e; + cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; int cycles = 0; DEBUGP("Generating edges for %u vertices\n", czech->n); - graph_clear_edges(czech->graph); + cmph_graph_clear_edges(czech->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { - uint32 h1, h2; - uint32 keylen; + cmph_uint32 h1, h2; + cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(czech->hashes[0], key, keylen) % czech->n; - h2 = hash(czech->hashes[1], key, keylen) % czech->n; + h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; + h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { @@ -201,51 +201,51 @@ static int czech_gen_edges(mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(czech->graph, h1, h2); + cmph_graph_add_edge(czech->graph, h1, h2); } - cycles = graph_is_cyclic(czech->graph); + cycles = cmph_graph_is_cyclic(czech->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int czech_mphf_dump(mphf_t *mphf, FILE *fd) +int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *fd) { char *buf = NULL; - uint32 buflen; - uint32 nbuflen; - uint32 i; - uint32 two = htonl(2); //number of hash functions - czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; - uint32 nn, nm; - __mphf_dump(mphf, fd); + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = htonl(2); //number of hash functions + cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; + cmph_uint32 nn, nm; + cmph__mphf_dump(mphf, fd); - fwrite(&two, sizeof(uint32), 1, fd); + fwrite(&two, sizeof(cmph_uint32), 1, fd); - hash_state_dump(data->hashes[0], &buf, &buflen); + cmph_hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - hash_state_dump(data->hashes[1], &buf, &buflen); + cmph_hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(uint32), 1, fd); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); nn = htonl(data->n); - fwrite(&nn, sizeof(uint32), 1, fd); + fwrite(&nn, sizeof(cmph_uint32), 1, fd); nm = htonl(data->m); - fwrite(&nm, sizeof(uint32), 1, fd); + fwrite(&nm, sizeof(cmph_uint32), 1, fd); for (i = 0; i < data->n; ++i) { - uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(uint32), 1, fd); + cmph_uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(cmph_uint32), 1, fd); } #ifdef DEBUG fprintf(stderr, "G: "); @@ -255,44 +255,44 @@ int czech_mphf_dump(mphf_t *mphf, FILE *fd) return 1; } -void czech_mphf_load(FILE *f, mphf_t *mphf) +void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf) { - uint32 nhashes; + cmph_uint32 nhashes; char fbuf[BUFSIZ]; char *buf = NULL; - uint32 buflen; - uint32 i; - hash_state_t *state; - czech_mphf_data_t *czech = (czech_mphf_data_t *)malloc(sizeof(czech_mphf_data_t)); + cmph_uint32 buflen; + cmph_uint32 i; + cmph_hash_state_t *state; + cmph_czech_mphf_data_t *czech = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mphf_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; - fread(&nhashes, sizeof(uint32), 1, f); + fread(&nhashes, sizeof(cmph_uint32), 1, f); nhashes = ntohl(nhashes); - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - hash_state_t *state = NULL; - fread(&buflen, sizeof(uint32), 1, f); + cmph_hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); + state = cmph_hash_state_load(buf, buflen); czech->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(czech->n), sizeof(uint32), 1, f); + fread(&(czech->n), sizeof(cmph_uint32), 1, f); czech->n = ntohl(czech->n); - fread(&(czech->m), sizeof(uint32), 1, f); + fread(&(czech->m), sizeof(cmph_uint32), 1, f); czech->m = ntohl(czech->m); - czech->g = (uint32 *)malloc(sizeof(uint32)*czech->n); - fread(czech->g, czech->n*sizeof(uint32), 1, f); + czech->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*czech->n); + fread(czech->g, czech->n*sizeof(cmph_uint32), 1, f); for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); @@ -303,22 +303,22 @@ void czech_mphf_load(FILE *f, mphf_t *mphf) } -uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen) +cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) { - czech_mphf_data_t *czech = mphf->data; - uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; - uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; + cmph_czech_mphf_data_t *czech = mphf->data; + cmph_uint32 h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; + cmph_uint32 h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > czech->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); return (czech->g[h1] + czech->g[h2]) % czech->m; } -void czech_mphf_destroy(mphf_t *mphf) +void cmph_czech_mphf_destroy(cmph_mphf_t *mphf) { - czech_mphf_data_t *data = (czech_mphf_data_t *)mphf->data; + cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; free(data->g); - hash_state_destroy(data->hashes[0]); - hash_state_destroy(data->hashes[1]); + cmph_hash_state_destroy(data->hashes[0]); + cmph_hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/czech.h b/src/czech.h index f83d224..d167219 100644 --- a/src/czech.h +++ b/src/czech.h @@ -4,16 +4,16 @@ #include "graph.h" #include "cmph.h" -typedef struct __czech_mphf_data_t czech_mphf_data_t; -typedef struct __czech_mph_data_t czech_mph_data_t; +typedef struct cmph__czech_mphf_data_t cmph_czech_mphf_data_t; +typedef struct cmph__czech_mph_data_t cmph_czech_mph_data_t; -mph_t *czech_mph_new(key_source_t *key_source); -void czech_mph_set_hashfuncs(mph_t *mph, CMPH_HASH *hashfuncs); -void czech_mph_destroy(mph_t *mph); -mphf_t *czech_mph_create(mph_t *mph, float c); +cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source); +void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); +void cmph_czech_mph_destroy(cmph_mph_t *mph); +cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c); -void czech_mphf_load(FILE *f, mphf_t *mphf); -int czech_mphf_dump(mphf_t *mphf, FILE *f); -void czech_mphf_destroy(mphf_t *mphf); -uint32 czech_mphf_search(mphf_t *mphf, const char *key, uint32 keylen); +void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf); +int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *f); +void cmph_czech_mphf_destroy(cmph_mphf_t *mphf); +cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/czech_structs.h b/src/czech_structs.h index 3db81c8..1678433 100644 --- a/src/czech_structs.h +++ b/src/czech_structs.h @@ -3,22 +3,22 @@ #include "hash_state.h" -struct __czech_mphf_data_t +struct cmph__czech_mphf_data_t { - uint32 m; //edges (words) count - uint32 n; //vertex count - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; -struct __czech_mph_data_t +struct cmph__czech_mph_data_t { CMPH_HASH hashfuncs[2]; - uint32 m; //edges (words) count - uint32 n; //vertex count - graph_t *graph; - uint32 *g; - hash_state_t **hashes; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_graph_t *graph; + cmph_uint32 *g; + cmph_hash_state_t **hashes; }; #endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c index bb67e42..6e5b972 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -1,23 +1,23 @@ #include "djb2_hash.h" #include -djb2_state_t *djb2_state_new() +cmph_djb2_state_t *cmph_djb2_state_new() { - djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); - state->hashfunc = HASH_DJB2; + cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + state->hashfunc = CMPH_HASH_DJB2; return state; } -void djb2_state_destroy(djb2_state_t *state) +void cmph_djb2_state_destroy(cmph_djb2_state_t *state) { free(state); } -uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen) { - register uint32 hash = 5381; + register cmph_uint32 hash = 5381; const unsigned char *ptr = k; - uint32 i = 0; + cmph_uint32 i = 0; while (i < keylen) { hash = hash*33 ^ *ptr; @@ -27,16 +27,16 @@ uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen) } -void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen) +void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -djb2_state_t *djb2_state_load(const char *buf, uint32 buflen) +cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen) { - djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); - state->hashfunc = HASH_DJB2; + cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + state->hashfunc = CMPH_HASH_DJB2; return state; } diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 0ea3998..549cc90 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct __djb2_state_t +typedef struct cmph__djb2_state_t { CMPH_HASH hashfunc; -} djb2_state_t; +} cmph_djb2_state_t; -djb2_state_t *djb2_state_new(); -uint32 djb2_hash(djb2_state_t *state, const char *k, uint32 keylen); -void djb2_state_dump(djb2_state_t *state, char **buf, uint32 *buflen); -djb2_state_t *djb2_state_load(const char *buf, uint32 buflen); -void djb2_state_destroy(djb2_state_t *state); +cmph_djb2_state_t *cmph_djb2_state_new(); +cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen); +void cmph_djb2_state_destroy(cmph_djb2_state_t *state); #endif diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 513fc56..9be1558 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -1,19 +1,19 @@ #include "fnv_hash.h" #include -fnv_state_t *fnv_state_new() +cmph_fnv_state_t *cmph_fnv_state_new() { - fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); - state->hashfunc = HASH_FNV; + cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + state->hashfunc = CMPH_HASH_FNV; return state; } -void fnv_state_destroy(fnv_state_t *state) +void cmph_fnv_state_destroy(cmph_fnv_state_t *state) { free(state); } -uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen) { const unsigned char *bp = (const unsigned char *)k; const unsigned char *be = bp + keylen; @@ -31,16 +31,16 @@ uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen) } -void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen) +void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -fnv_state_t *fnv_state_load(const char *buf, uint32 buflen) +cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen) { - fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); - state->hashfunc = HASH_FNV; + cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + state->hashfunc = CMPH_HASH_FNV; return state; } diff --git a/src/fnv_hash.h b/src/fnv_hash.h index a17717e..e9e54fa 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct __fnv_state_t +typedef struct cmph__fnv_state_t { CMPH_HASH hashfunc; -} fnv_state_t; +} cmph_fnv_state_t; -fnv_state_t *fnv_state_new(); -uint32 fnv_hash(fnv_state_t *state, const char *k, uint32 keylen); -void fnv_state_dump(fnv_state_t *state, char **buf, uint32 *buflen); -fnv_state_t *fnv_state_load(const char *buf, uint32 buflen); -void fnv_state_destroy(fnv_state_t *state); +cmph_fnv_state_t *cmph_fnv_state_new(); +cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen); +void cmph_fnv_state_destroy(cmph_fnv_state_t *state); #endif diff --git a/src/graph.c b/src/graph.c index cb75516..60e2d13 100644 --- a/src/graph.c +++ b/src/graph.c @@ -10,47 +10,47 @@ //#define DEBUG #include "debug.h" -static const uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) #define abs_edge(e, i) (e % g->nedges + i * g->nedges) -struct __graph_t +struct cmph__graph_t { - uint32 nnodes; - uint32 nedges; - uint32 *edges; - uint32 *first; - uint32 *next; - uint8 *critical_nodes; /* included -- Fabiano*/ - uint32 ncritical_nodes; /* included -- Fabiano*/ - uint32 cedges; + cmph_uint32 nnodes; + cmph_uint32 nedges; + cmph_uint32 *edges; + cmph_uint32 *first; + cmph_uint32 *next; + cmph_uint8 *critical_nodes; /* included -- Fabiano*/ + cmph_uint32 ncritical_nodes; /* included -- Fabiano*/ + cmph_uint32 cedges; int shrinking; }; -static uint32 EMPTY = UINT_MAX; +static cmph_uint32 EMPTY = UINT_MAX; -graph_t *graph_new(uint32 nnodes, uint32 nedges) +cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) { - graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); + cmph_graph_t *graph = (cmph_graph_t *)malloc(sizeof(cmph_graph_t)); if (!graph) return NULL; - graph->edges = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); - graph->next = (uint32 *)malloc(sizeof(uint32) * 2 * nedges); - graph->first = (uint32 *)malloc(sizeof(uint32) * nnodes); + graph->edges = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); + graph->next = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); + graph->first = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * nnodes); graph->critical_nodes = NULL; /* included -- Fabiano*/ graph->ncritical_nodes = 0; /* included -- Fabiano*/ graph->nnodes = nnodes; graph->nedges = nedges; - graph_clear_edges(graph); + cmph_graph_clear_edges(graph); return graph; } -void graph_destroy(graph_t *graph) +void cmph_graph_destroy(cmph_graph_t *graph) { DEBUGP("Destroying graph\n"); free(graph->edges); @@ -61,9 +61,9 @@ void graph_destroy(graph_t *graph) return; } -void graph_print(graph_t *g) +void cmph_graph_print(cmph_graph_t *g) { - uint32 i, e; + cmph_uint32 i, e; for (i = 0; i < g->nnodes; ++i) { DEBUGP("Printing edges connected to %u\n", i); @@ -81,9 +81,9 @@ void graph_print(graph_t *g) return; } -void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) +void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { - uint32 e = g->cedges; + cmph_uint32 e = g->cedges; assert(v1 < g->nnodes); assert(v2 < g->nnodes); @@ -101,7 +101,7 @@ void graph_add_edge(graph_t *g, uint32 v1, uint32 v2) ++(g->cedges); } -static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) +static int check_edge(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) { DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; @@ -109,9 +109,9 @@ static int check_edge(graph_t *g, uint32 e, uint32 v1, uint32 v2) return 0; } -uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2) +cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { - uint32 e; + cmph_uint32 e; e = g->first[v1]; assert(e != EMPTY); if (check_edge(g, e, v1, v2)) return abs_edge(e, 0); @@ -123,9 +123,9 @@ uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2) while (!check_edge(g, e, v1, v2)); return abs_edge(e, 0); } -static void del_edge_point(graph_t *g, uint32 v1, uint32 v2) +static void del_edge_point(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { - uint32 e, prev; + cmph_uint32 e, prev; DEBUGP("Deleting edge point %u %u\n", v1, v2); e = g->first[v1]; @@ -151,16 +151,16 @@ static void del_edge_point(graph_t *g, uint32 v1, uint32 v2) } -void graph_del_edge(graph_t *g, uint32 v1, uint32 v2) +void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { g->shrinking = 1; del_edge_point(g, v1, v2); del_edge_point(g, v2, v1); } -void graph_clear_edges(graph_t *g) +void cmph_graph_clear_edges(cmph_graph_t *g) { - uint32 i; + cmph_uint32 i; for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; for (i = 0; i < g->nedges*2; ++i) { @@ -171,9 +171,9 @@ void graph_clear_edges(graph_t *g) g->shrinking = 0; } -static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) +static int find_degree1_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted, cmph_uint32 *e) { - uint32 edge = g->first[v]; + cmph_uint32 edge = g->first[v]; char found = 0; DEBUGP("Checking degree of vertex %u\n", v); if (edge == EMPTY) return 0; @@ -195,13 +195,13 @@ static int find_degree1_edge(graph_t *g, uint32 v, char *deleted, uint32 *e) return found; } -static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) +static void cyclic_del_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted) { - uint32 e; + cmph_uint32 e; char degree1; - uint32 v1 = v; - uint32 v2 = 0; + cmph_uint32 v1 = v; + cmph_uint32 v2 = 0; degree1 = find_degree1_edge(g, v1, deleted, &e); if (!degree1) return; @@ -224,10 +224,10 @@ static void cyclic_del_edge(graph_t *g, uint32 v, char *deleted) } } -int graph_is_cyclic(graph_t *g) +int cmph_graph_is_cyclic(cmph_graph_t *g) { - uint32 i; - uint32 v; + cmph_uint32 i; + cmph_uint32 v; char *deleted = (char *)malloc((g->nedges*sizeof(char))/8 + 1); memset(deleted, 0, g->nedges/8 + 1); @@ -249,21 +249,21 @@ int graph_is_cyclic(graph_t *g) return 0; } -uint8 graph_node_is_critical(graph_t * g, uint32 v) /* included -- Fabiano */ +cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v) /* included -- Fabiano */ { return GETBIT(g->critical_nodes,v); } -void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ +void cmph_graph_obtain_critical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ { - uint32 i; - uint32 v; + cmph_uint32 i; + cmph_uint32 v; char *deleted = (char *)malloc((g->nedges*sizeof(char))/8+1); memset(deleted, 0, g->nedges/8 + 1); free(g->critical_nodes); - g->critical_nodes = (uint8 *)malloc((g->nnodes*sizeof(uint8))/8 + 1); + g->critical_nodes = (cmph_uint8 *)malloc((g->nnodes*sizeof(cmph_uint8))/8 + 1); g->ncritical_nodes = 0; - memset(g->critical_nodes, 0, (g->nnodes*sizeof(uint8))/8 + 1); + memset(g->critical_nodes, 0, (g->nnodes*sizeof(cmph_uint8))/8 + 1); DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); for (v = 0; v < g->nnodes; ++v) { @@ -290,9 +290,9 @@ void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ free(deleted); } -uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2) /* included -- Fabiano*/ +cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ { - uint32 e; + cmph_uint32 e; e = g->first[v1]; if(e == EMPTY) return 0; if (check_edge(g, e, v1, v2)) return 1; @@ -305,27 +305,27 @@ uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2) /* included -- Fabia return 1; } -uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id) /* included -- Fabiano*/ +cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ { return (g->edges[e + id*g->nedges]); } -uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ +cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ { return g->ncritical_nodes; } -graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v) +cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v) { - graph_iterator_t it; + cmph_graph_iterator_t it; it.vertex = v; it.edge = g->first[v]; return it; } -uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) +cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it) { - uint32 ret; - if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; + cmph_uint32 ret; + if(it->edge == EMPTY) return CMPH_GRAPH_NO_NEIGHBOR; if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; else ret = g->edges[it->edge]; it->edge = g->next[it->edge]; diff --git a/src/graph.h b/src/graph.h index 4856d1c..dc80b05 100644 --- a/src/graph.h +++ b/src/graph.h @@ -4,37 +4,37 @@ #include #include "cmph_types.h" -#define GRAPH_NO_NEIGHBOR UINT_MAX +#define CMPH_GRAPH_NO_NEIGHBOR UINT_MAX -typedef struct __graph_t graph_t; -typedef struct __graph_iterator_t graph_iterator_t; -struct __graph_iterator_t +typedef struct cmph__graph_t cmph_graph_t; +typedef struct cmph__graph_iterator_t cmph_graph_iterator_t; +struct cmph__graph_iterator_t { - uint32 vertex; - uint32 edge; + cmph_uint32 vertex; + cmph_uint32 edge; }; -graph_t *graph_new(uint32 nnodes, uint32 nedges); -void graph_destroy(graph_t *graph); +cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); +void cmph_graph_destroy(cmph_graph_t *graph); -void graph_add_edge(graph_t *g, uint32 v1, uint32 v2); -void graph_del_edge(graph_t *g, uint32 v1, uint32 v2); -void graph_clear_edges(graph_t *g); -uint32 graph_edge_id(graph_t *g, uint32 v1, uint32 v2); -uint8 graph_contains_edge(graph_t *g, uint32 v1, uint32 v2); +void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void cmph_graph_clear_edges(cmph_graph_t *g); +cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -graph_iterator_t graph_neighbors_it(graph_t *g, uint32 v); -uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); +cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v); +cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it); -void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ -uint8 graph_node_is_critical(graph_t * g, uint32 v); /* included -- Fabiano */ -uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ -uint32 graph_vertex_id(graph_t *g, uint32 e, uint32 id); /* included -- Fabiano*/ +void cmph_graph_obtain_critical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ +cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v); /* included -- Fabiano */ +cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ +cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ -int graph_is_cyclic(graph_t *g); +int cmph_graph_is_cyclic(cmph_graph_t *g); -void graph_print(graph_t *); +void cmph_graph_print(cmph_graph_t *); #endif diff --git a/src/hash.c b/src/hash.c index 2ab3619..639f799 100644 --- a/src/hash.c +++ b/src/hash.c @@ -7,26 +7,26 @@ //#define DEBUG #include "debug.h" -const char *hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; +const char *cmph_hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; -hash_state_t *hash_state_new(CMPH_HASH hashfunc, uint32 hashsize) +cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) { - hash_state_t *state = NULL; + cmph_hash_state_t *state = NULL; switch (hashfunc) { - case HASH_JENKINS: + case CMPH_HASH_JENKINS: DEBUGP("Jenkins function - %u\n", hashsize); - state = (hash_state_t *)jenkins_state_new(hashsize); + state = (cmph_hash_state_t *)cmph_jenkins_state_new(hashsize); DEBUGP("Jenkins function created\n"); break; - case HASH_DJB2: - state = (hash_state_t *)djb2_state_new(); + case CMPH_HASH_DJB2: + state = (cmph_hash_state_t *)cmph_djb2_state_new(); break; - case HASH_SDBM: - state = (hash_state_t *)sdbm_state_new(); + case CMPH_HASH_SDBM: + state = (cmph_hash_state_t *)cmph_sdbm_state_new(); break; - case HASH_FNV: - state = (hash_state_t *)fnv_state_new(); + case CMPH_HASH_FNV: + state = (cmph_hash_state_t *)cmph_fnv_state_new(); break; default: assert(0); @@ -34,18 +34,18 @@ hash_state_t *hash_state_new(CMPH_HASH hashfunc, uint32 hashsize) state->hashfunc = hashfunc; return state; } -uint32 hash(hash_state_t *state, const char *key, uint32 keylen) +cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen) { switch (state->hashfunc) { - case HASH_JENKINS: - return jenkins_hash((jenkins_state_t *)state, key, keylen); - case HASH_DJB2: - return djb2_hash((djb2_state_t *)state, key, keylen); - case HASH_SDBM: - return sdbm_hash((sdbm_state_t *)state, key, keylen); - case HASH_FNV: - return fnv_hash((fnv_state_t *)state, key, keylen); + case CMPH_HASH_JENKINS: + return cmph_jenkins_hash((cmph_jenkins_state_t *)state, key, keylen); + case CMPH_HASH_DJB2: + return cmph_djb2_hash((cmph_djb2_state_t *)state, key, keylen); + case CMPH_HASH_SDBM: + return cmph_sdbm_hash((cmph_sdbm_state_t *)state, key, keylen); + case CMPH_HASH_FNV: + return cmph_fnv_hash((cmph_fnv_state_t *)state, key, keylen); default: assert(0); } @@ -53,84 +53,84 @@ uint32 hash(hash_state_t *state, const char *key, uint32 keylen) return 0; } -void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen) +void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen) { char *algobuf; switch (state->hashfunc) { - case HASH_JENKINS: - jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); + case CMPH_HASH_JENKINS: + cmph_jenkins_state_dump((cmph_jenkins_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; - case HASH_DJB2: - djb2_state_dump((djb2_state_t *)state, &algobuf, buflen); + case CMPH_HASH_DJB2: + cmph_djb2_state_dump((cmph_djb2_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; - case HASH_SDBM: - sdbm_state_dump((sdbm_state_t *)state, &algobuf, buflen); + case CMPH_HASH_SDBM: + cmph_sdbm_state_dump((cmph_sdbm_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; - case HASH_FNV: - fnv_state_dump((fnv_state_t *)state, &algobuf, buflen); + case CMPH_HASH_FNV: + cmph_fnv_state_dump((cmph_fnv_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; default: assert(0); } - *buf = malloc(strlen(hash_names[state->hashfunc]) + 1 + *buflen); - memcpy(*buf, hash_names[state->hashfunc], strlen(hash_names[state->hashfunc]) + 1); - DEBUGP("Algobuf is %u\n", *(uint32 *)algobuf); - memcpy(*buf + strlen(hash_names[state->hashfunc]) + 1, algobuf, *buflen); - *buflen = (uint32)strlen(hash_names[state->hashfunc]) + 1 + *buflen; + *buf = malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); + DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); + memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, *buflen); + *buflen = (cmph_uint32)strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen; free(algobuf); return; } -hash_state_t *hash_state_load(const char *buf, uint32 buflen) +cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen) { - uint32 i; - uint32 offset; - CMPH_HASH hashfunc = HASH_COUNT; - for (i = 0; i < HASH_COUNT; ++i) + cmph_uint32 i; + cmph_uint32 offset; + CMPH_HASH hashfunc = CMPH_HASH_COUNT; + for (i = 0; i < CMPH_HASH_COUNT; ++i) { - if (strcmp(buf, hash_names[i]) == 0) + if (strcmp(buf, cmph_hash_names[i]) == 0) { hashfunc = i; break; } } - if (hashfunc == HASH_COUNT) return NULL; - offset = (uint32)strlen(hash_names[hashfunc]) + 1; + if (hashfunc == CMPH_HASH_COUNT) return NULL; + offset = (cmph_uint32)strlen(cmph_hash_names[hashfunc]) + 1; switch (hashfunc) { - case HASH_JENKINS: - return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); - case HASH_DJB2: - return (hash_state_t *)djb2_state_load(buf + offset, buflen - offset); - case HASH_SDBM: - return (hash_state_t *)sdbm_state_load(buf + offset, buflen - offset); - case HASH_FNV: - return (hash_state_t *)fnv_state_load(buf + offset, buflen - offset); + case CMPH_HASH_JENKINS: + return (cmph_hash_state_t *)cmph_jenkins_state_load(buf + offset, buflen - offset); + case CMPH_HASH_DJB2: + return (cmph_hash_state_t *)cmph_djb2_state_load(buf + offset, buflen - offset); + case CMPH_HASH_SDBM: + return (cmph_hash_state_t *)cmph_sdbm_state_load(buf + offset, buflen - offset); + case CMPH_HASH_FNV: + return (cmph_hash_state_t *)cmph_fnv_state_load(buf + offset, buflen - offset); default: return NULL; } return NULL; } -void hash_state_destroy(hash_state_t *state) +void cmph_hash_state_destroy(cmph_hash_state_t *state) { switch (state->hashfunc) { - case HASH_JENKINS: - jenkins_state_destroy((jenkins_state_t *)state); + case CMPH_HASH_JENKINS: + cmph_jenkins_state_destroy((cmph_jenkins_state_t *)state); break; - case HASH_DJB2: - djb2_state_destroy((djb2_state_t *)state); + case CMPH_HASH_DJB2: + cmph_djb2_state_destroy((cmph_djb2_state_t *)state); break; - case HASH_SDBM: - sdbm_state_destroy((sdbm_state_t *)state); + case CMPH_HASH_SDBM: + cmph_sdbm_state_destroy((cmph_sdbm_state_t *)state); break; - case HASH_FNV: - fnv_state_destroy((fnv_state_t *)state); + case CMPH_HASH_FNV: + cmph_fnv_state_destroy((cmph_fnv_state_t *)state); break; default: assert(0); diff --git a/src/hash.h b/src/hash.h index 90b8e37..371c1c9 100644 --- a/src/hash.h +++ b/src/hash.h @@ -3,12 +3,12 @@ #include "cmph_types.h" -typedef union __hash_state_t hash_state_t; +typedef union cmph__hash_state_t cmph_hash_state_t; -hash_state_t *hash_state_new(CMPH_HASH, uint32 hashsize); -uint32 hash(hash_state_t *state, const char *key, uint32 keylen); -void hash_state_dump(hash_state_t *state, char **buf, uint32 *buflen); -hash_state_t *hash_state_load(const char *buf, uint32 buflen); -void hash_state_destroy(hash_state_t *state); +cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH, cmph_uint32 hashsize); +cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen); +void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen); +void cmph_hash_state_destroy(cmph_hash_state_t *state); #endif diff --git a/src/hash_state.h b/src/hash_state.h index 67dcd77..39f0d68 100644 --- a/src/hash_state.h +++ b/src/hash_state.h @@ -6,13 +6,13 @@ #include "djb2_hash.h" #include "sdbm_hash.h" #include "fnv_hash.h" -union __hash_state_t +union cmph__hash_state_t { CMPH_HASH hashfunc; - jenkins_state_t jenkins; - djb2_state_t djb2; - sdbm_state_t sdbm; - fnv_state_t fnv; + cmph_jenkins_state_t jenkins; + cmph_djb2_state_t djb2; + cmph_sdbm_state_t sdbm; + cmph_fnv_state_t fnv; }; #endif diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 7b9f662..1971276 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -#define hashsize(n) ((uint32)1<<(n)) +#define hashsize(n) ((cmph_uint32)1<<(n)) #define hashmask(n) (hashsize(n)-1) @@ -73,7 +73,7 @@ use a bitmask. For example, if you need only 10 bits, do h = (h & hashmask(10)); In which case, the hash table should have hashsize(10) elements. -If you are hashing n strings (uint8 **)k, do it like this: +If you are hashing n strings (cmph_uint8 **)k, do it like this: for (i=0, h=0; iseed = rand() % size; - state->nbits = (uint32)ceil(log(size)/M_LOG2E); + state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); state->size = size; DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } -void jenkins_state_destroy(jenkins_state_t *state) +void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state) { free(state); } -uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen) { - uint32 a, b, c; - uint32 len, length; + cmph_uint32 a, b, c; + cmph_uint32 len, length; /* Set up the internal state */ length = keylen; @@ -113,9 +113,9 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) /*---------------------------------------- handle most of the key */ while (len >= 12) { - a += (k[0] +((uint32)k[1]<<8) +((uint32)k[2]<<16) +((uint32)k[3]<<24)); - b += (k[4] +((uint32)k[5]<<8) +((uint32)k[6]<<16) +((uint32)k[7]<<24)); - c += (k[8] +((uint32)k[9]<<8) +((uint32)k[10]<<16)+((uint32)k[11]<<24)); + a += (k[0] +((cmph_uint32)k[1]<<8) +((cmph_uint32)k[2]<<16) +((cmph_uint32)k[3]<<24)); + b += (k[4] +((cmph_uint32)k[5]<<8) +((cmph_uint32)k[6]<<16) +((cmph_uint32)k[7]<<24)); + c += (k[8] +((cmph_uint32)k[9]<<8) +((cmph_uint32)k[10]<<16)+((cmph_uint32)k[11]<<24)); mix(a,b,c); k += 12; len -= 12; } @@ -125,26 +125,26 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) switch(len) /* all the case statements fall through */ { case 11: - c +=((uint32)k[10]<<24); + c +=((cmph_uint32)k[10]<<24); case 10: - c +=((uint32)k[9]<<16); + c +=((cmph_uint32)k[9]<<16); case 9 : - c +=((uint32)k[8]<<8); + c +=((cmph_uint32)k[8]<<8); /* the first byte of c is reserved for the length */ case 8 : - b +=((uint32)k[7]<<24); + b +=((cmph_uint32)k[7]<<24); case 7 : - b +=((uint32)k[6]<<16); + b +=((cmph_uint32)k[6]<<16); case 6 : - b +=((uint32)k[5]<<8); + b +=((cmph_uint32)k[5]<<8); case 5 : b +=k[4]; case 4 : - a +=((uint32)k[3]<<24); + a +=((cmph_uint32)k[3]<<24); case 3 : - a +=((uint32)k[2]<<16); + a +=((cmph_uint32)k[2]<<16); case 2 : - a +=((uint32)k[1]<<8); + a +=((cmph_uint32)k[1]<<8); case 1 : a +=k[0]; /* case 0: nothing left to add */ @@ -162,29 +162,29 @@ uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen) return c; } -void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen) +void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { - *buflen = sizeof(uint32)*3; + *buflen = sizeof(cmph_uint32)*3; *buf = malloc(*buflen); if (!*buf) { *buflen = UINT_MAX; return; } - memcpy(*buf, &(state->seed), sizeof(uint32)); - memcpy(*buf + sizeof(uint32), &(state->nbits), sizeof(uint32)); - memcpy(*buf + sizeof(uint32)*2, &(state->size), sizeof(uint32)); + memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); + memcpy(*buf + sizeof(cmph_uint32), &(state->nbits), sizeof(cmph_uint32)); + memcpy(*buf + sizeof(cmph_uint32)*2, &(state->size), sizeof(cmph_uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); return; } -jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen) +cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen) { - jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); - state->seed = *(uint32 *)buf; - state->nbits = *(((uint32 *)buf) + 1); - state->size = *(((uint32 *)buf) + 2); - state->hashfunc = HASH_JENKINS; + cmph_jenkins_state_t *state = (cmph_jenkins_state_t *)malloc(sizeof(cmph_jenkins_state_t)); + state->seed = *(cmph_uint32 *)buf; + state->nbits = *(((cmph_uint32 *)buf) + 1); + state->size = *(((cmph_uint32 *)buf) + 2); + state->hashfunc = CMPH_HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; } diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index 1a84080..2086d7c 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -3,18 +3,18 @@ #include "hash.h" -typedef struct __jenkins_state_t +typedef struct cmph__jenkins_state_t { CMPH_HASH hashfunc; - uint32 seed; - uint32 nbits; - uint32 size; -} jenkins_state_t; + cmph_uint32 seed; + cmph_uint32 nbits; + cmph_uint32 size; +} cmph_jenkins_state_t; -jenkins_state_t *jenkins_state_new(uint32 size); //size of hash table -uint32 jenkins_hash(jenkins_state_t *state, const char *k, uint32 keylen); -void jenkins_state_dump(jenkins_state_t *state, char **buf, uint32 *buflen); -jenkins_state_t *jenkins_state_load(const char *buf, uint32 buflen); -void jenkins_state_destroy(jenkins_state_t *state); +cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size); //size of hash table +cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen); +void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state); #endif diff --git a/src/main.c b/src/main.c index a133de7..c556da1 100644 --- a/src/main.c +++ b/src/main.c @@ -23,15 +23,15 @@ void usage(const char *prg) } void usage_long(const char *prg) { - uint32 i; + cmph_uint32 i; fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); fprintf(stderr, " -a\t algorithm - valid values are\n"); - for (i = 0; i < MPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", mph_names[i]); + for (i = 0; i < CMPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", cmph_names[i]); fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); - for (i = 0; i < HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", hash_names[i]); + for (i = 0; i < CMPH_HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", cmph_hash_names[i]); fprintf(stderr, " -V\t print version number and exit\n"); fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); fprintf(stderr, " -k\t number of keys\n"); @@ -41,7 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " keysfile\t line separated file with keys\n"); } -static int key_read(void *data, char **key, uint32 *keylen) +static int key_read(void *data, char **key, cmph_uint32 *keylen) { FILE *fd = (FILE *)data; *key = NULL; @@ -54,7 +54,7 @@ static int key_read(void *data, char **key, uint32 *keylen) if (feof(fd)) return -1; *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); memcpy(*key + *keylen, buf, strlen(buf)); - *keylen += (uint32)strlen(buf); + *keylen += (cmph_uint32)strlen(buf); if (buf[strlen(buf) - 1] != '\n') continue; break; } @@ -66,7 +66,7 @@ static int key_read(void *data, char **key, uint32 *keylen) return *keylen; } -static void key_dispose(void *data, char *key, uint32 keylen) +static void key_dispose(void *data, char *key, cmph_uint32 keylen) { free(key); } @@ -76,9 +76,9 @@ static void key_rewind(void *data) rewind(fd); } -static uint32 count_keys(FILE *fd) +static cmph_uint32 count_keys(FILE *fd) { - uint32 count = 0; + cmph_uint32 count = 0; rewind(fd); while(1) { @@ -100,17 +100,17 @@ int main(int argc, char **argv) FILE *mphf_fd = stdout; const char *keys_file = NULL; FILE *keys_fd; - uint32 nkeys = UINT_MAX; - uint32 seed = UINT_MAX; + cmph_uint32 nkeys = UINT_MAX; + cmph_uint32 seed = UINT_MAX; CMPH_HASH *hashes = NULL; - uint32 nhashes = 0; - uint32 i; - MPH_ALGO mph_algo = MPH_CZECH; + cmph_uint32 nhashes = 0; + cmph_uint32 i; + CMPH_ALGO mph_algo = CMPH_CZECH; float c = 2.09; - mph_t *mph = NULL; - mphf_t *mphf = NULL; + cmph_mph_t *mph = NULL; + cmph_mphf_t *mphf = NULL; - key_source_t source; + cmph_key_source_t source; while (1) { @@ -166,9 +166,9 @@ int main(int argc, char **argv) case 'a': { char valid = 0; - for (i = 0; i < MPH_COUNT; ++i) + for (i = 0; i < CMPH_COUNT; ++i) { - if (strcmp(mph_names[i], optarg) == 0) + if (strcmp(cmph_names[i], optarg) == 0) { mph_algo = i; valid = 1; @@ -185,13 +185,13 @@ int main(int argc, char **argv) case 'f': { char valid = 0; - for (i = 0; i < HASH_COUNT; ++i) + for (i = 0; i < CMPH_HASH_COUNT; ++i) { - if (strcmp(hash_names[i], optarg) == 0) + if (strcmp(cmph_hash_names[i], optarg) == 0) { hashes = (CMPH_HASH *)realloc(hashes, sizeof(CMPH_HASH) * ( nhashes + 2 )); hashes[nhashes] = i; - hashes[nhashes + 1] = HASH_COUNT; + hashes[nhashes + 1] = CMPH_HASH_COUNT; ++nhashes; valid = 1; break; @@ -216,7 +216,7 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; - if (seed == UINT_MAX) seed = (uint32)time(NULL); + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); if (mphf_file == NULL) @@ -234,7 +234,7 @@ int main(int argc, char **argv) } source.data = (void *)keys_fd; - if (seed == UINT_MAX) seed = (uint32)time(NULL); + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); else source.nkeys = nkeys; source.read = key_read; @@ -245,17 +245,17 @@ int main(int argc, char **argv) { //Create mphf - mph = mph_new(mph_algo, &source); - if (nhashes) mph_set_hashfuncs(mph, hashes); - mph_set_verbosity(mph, verbosity); - if(mph_algo == MPH_BMZ && c >= 2.0) c=1.15; - if (c != 0) mph_set_graphsize(mph, c); - mphf = mph_create(mph); + mph = cmph_mph_new(mph_algo, &source); + if (nhashes) cmph_mph_set_hashfuncs(mph, hashes); + cmph_mph_set_verbosity(mph, verbosity); + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if (c != 0) cmph_mph_set_graphsize(mph, c); + mphf = cmph_mph_create(mph); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - mph_destroy(mph); + cmph_mph_destroy(mph); free(mphf_file); return -1; } @@ -267,13 +267,13 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - mphf_dump(mphf, mphf_fd); - mphf_destroy(mphf); + cmph_mphf_dump(mphf, mphf_fd); + cmph_mphf_destroy(mphf); fclose(mphf_fd); } else { - uint8 * hashtable = NULL; + cmph_uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { @@ -281,7 +281,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - mphf = mphf_load(mphf_fd); + mphf = cmph_mphf_load(mphf_fd); fclose(mphf_fd); if (!mphf) { @@ -289,16 +289,16 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - hashtable = (uint8*)malloc(source.nkeys*sizeof(uint8)); + hashtable = (cmph_uint8*)malloc(source.nkeys*sizeof(cmph_uint8)); memset(hashtable, 0, source.nkeys); //check all keys for (i = 0; i < source.nkeys; ++i) { - uint32 h; + cmph_uint32 h; char *buf; - uint32 buflen = 0; + cmph_uint32 buflen = 0; source.read(source.data, &buf, &buflen); - h = mphf_search(mphf, buf, buflen); + h = cmph_mphf_search(mphf, buf, buflen); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; @@ -308,7 +308,7 @@ int main(int argc, char **argv) } source.dispose(source.data, buf, buflen); } - mphf_destroy(mphf); + cmph_mphf_destroy(mphf); free(hashtable); } fclose(keys_fd); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index c9c6943..0a0b8fd 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -1,23 +1,23 @@ #include "sdbm_hash.h" #include -sdbm_state_t *sdbm_state_new() +cmph_sdbm_state_t *cmph_sdbm_state_new() { - sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); - state->hashfunc = HASH_SDBM; + cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + state->hashfunc = CMPH_HASH_SDBM; return state; } -void sdbm_state_destroy(sdbm_state_t *state) +void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state) { free(state); } -uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) +cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen) { - register uint32 hash = 0; + register cmph_uint32 hash = 0; const unsigned char *ptr = k; - uint32 i = 0; + cmph_uint32 i = 0; while(i < keylen) { hash = *ptr + (hash << 6) + (hash << 16) - hash; @@ -27,16 +27,16 @@ uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen) } -void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen) +void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen) +cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen) { - sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); - state->hashfunc = HASH_SDBM; + cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + state->hashfunc = CMPH_HASH_SDBM; return state; } diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index 9e27f0f..39cd3bb 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct __sdbm_state_t +typedef struct cmph__sdbm_state_t { CMPH_HASH hashfunc; -} sdbm_state_t; +} cmph_sdbm_state_t; -sdbm_state_t *sdbm_state_new(); -uint32 sdbm_hash(sdbm_state_t *state, const char *k, uint32 keylen); -void sdbm_state_dump(sdbm_state_t *state, char **buf, uint32 *buflen); -sdbm_state_t *sdbm_state_load(const char *buf, uint32 buflen); -void sdbm_state_destroy(sdbm_state_t *state); +cmph_sdbm_state_t *cmph_sdbm_state_new(); +cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen); +void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen); +void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state); #endif diff --git a/src/vqueue.c b/src/vqueue.c index 4be3481..e893b5b 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -2,49 +2,49 @@ #include #include #include -struct __vqueue_t +struct cmph__vqueue_t { - uint32 * values; - uint32 beg, end, capacity; + cmph_uint32 * values; + cmph_uint32 beg, end, capacity; }; -vqueue_t * vqueue_new(uint32 capacity) +cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity) { - vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); + cmph_vqueue_t *q = (cmph_vqueue_t *)malloc(sizeof(cmph_vqueue_t)); assert(q); - q->values = (uint32 *)calloc(capacity+1, sizeof(uint32)); + q->values = (cmph_uint32 *)calloc(capacity+1, sizeof(cmph_uint32)); q->beg = q->end = 0; q->capacity = capacity+1; return q; } -uint8 vqueue_is_empty(vqueue_t * q) +cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q) { return (q->beg == q->end); } -void vqueue_insert(vqueue_t * q, uint32 val) +void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val) { assert((q->end + 1)%q->capacity != q->beg); // Is queue full? q->end = (q->end + 1)%q->capacity; q->values[q->end] = val; } -uint32 vqueue_remove(vqueue_t * q) +cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q) { - assert(!vqueue_is_empty(q)); // Is queue empty? + assert(!cmph_vqueue_is_empty(q)); // Is queue empty? q->beg = (q->beg + 1)%q->capacity; return q->values[q->beg]; } -void vqueue_print(vqueue_t * q) +void cmph_vqueue_print(cmph_vqueue_t * q) { - uint32 i; + cmph_uint32 i; for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); } -void vqueue_destroy(vqueue_t *q) +void cmph_vqueue_destroy(cmph_vqueue_t *q) { free(q->values); q->values = NULL; } diff --git a/src/vqueue.h b/src/vqueue.h index cd870bb..d0853a9 100644 --- a/src/vqueue.h +++ b/src/vqueue.h @@ -2,17 +2,17 @@ #define __CMPH_VQUEUE_H__ #include "cmph_types.h" -typedef struct __vqueue_t vqueue_t; +typedef struct cmph__vqueue_t cmph_vqueue_t; -vqueue_t * vqueue_new(uint32 capacity); +cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity); -uint8 vqueue_is_empty(vqueue_t * q); +cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q); -void vqueue_insert(vqueue_t * q, uint32 val); +void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val); -uint32 vqueue_remove(vqueue_t * q); +cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q); -void vqueue_print(vqueue_t * q); +void cmph_vqueue_print(cmph_vqueue_t * q); -void vqueue_destroy(vqueue_t * q); +void cmph_vqueue_destroy(cmph_vqueue_t * q); #endif diff --git a/src/vstack.c b/src/vstack.c index 67b2945..a74f667 100644 --- a/src/vstack.c +++ b/src/vstack.c @@ -6,16 +6,16 @@ //#define DEBUG #include "debug.h" -struct __vstack_t +struct cmph__vstack_t { - uint32 pointer; - uint32 *values; - uint32 capacity; + cmph_uint32 pointer; + cmph_uint32 *values; + cmph_uint32 capacity; }; -vstack_t *vstack_new() +cmph_vstack_t *cmph_vstack_new() { - vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); + cmph_vstack_t *stack = (cmph_vstack_t *)malloc(sizeof(cmph_vstack_t)); assert(stack); stack->pointer = 0; stack->values = NULL; @@ -23,54 +23,54 @@ vstack_t *vstack_new() return stack; } -void vstack_destroy(vstack_t *stack) +void cmph_vstack_destroy(cmph_vstack_t *stack) { assert(stack); free(stack->values); free(stack); } -void vstack_push(vstack_t *stack, uint32 val) +void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val) { assert(stack); - vstack_reserve(stack, stack->pointer + 1); + cmph_vstack_reserve(stack, stack->pointer + 1); stack->values[stack->pointer] = val; ++(stack->pointer); } -void vstack_pop(vstack_t *stack) +void cmph_vstack_pop(cmph_vstack_t *stack) { assert(stack); assert(stack->pointer > 0); --(stack->pointer); } -uint32 vstack_top(vstack_t *stack) +cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack) { assert(stack); assert(stack->pointer > 0); return stack->values[(stack->pointer - 1)]; } -int vstack_empty(vstack_t *stack) +int cmph_vstack_empty(cmph_vstack_t *stack) { assert(stack); return stack->pointer == 0; } -uint32 vstack_size(vstack_t *stack) +cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack) { return stack->pointer; } -void vstack_reserve(vstack_t *stack, uint32 size) +void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size) { assert(stack); if (stack->capacity < size) { - uint32 new_capacity = stack->capacity + 1; + cmph_uint32 new_capacity = stack->capacity + 1; DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); while (new_capacity < size) { new_capacity *= 2; } - stack->values = (uint32 *)realloc(stack->values, sizeof(uint32)*new_capacity); + stack->values = (cmph_uint32 *)realloc(stack->values, sizeof(cmph_uint32)*new_capacity); assert(stack->values); stack->capacity = new_capacity; DEBUGP("Increased\n"); diff --git a/src/vstack.h b/src/vstack.h index 85893c4..8552a43 100644 --- a/src/vstack.h +++ b/src/vstack.h @@ -2,17 +2,17 @@ #define __CMPH_VSTACK_H__ #include "cmph_types.h" -typedef struct __vstack_t vstack_t; +typedef struct cmph__vstack_t cmph_vstack_t; -vstack_t *vstack_new(); -void vstack_destroy(vstack_t *stack); +cmph_vstack_t *cmph_vstack_new(); +void cmph_vstack_destroy(cmph_vstack_t *stack); -void vstack_push(vstack_t *stack, uint32 val); -uint32 vstack_top(vstack_t *stack); -void vstack_pop(vstack_t *stack); -int vstack_empty(vstack_t *stack); -uint32 vstack_size(vstack_t *stack); +void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val); +cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack); +void cmph_vstack_pop(cmph_vstack_t *stack); +int cmph_vstack_empty(cmph_vstack_t *stack); +cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack); -void vstack_reserve(vstack_t *stack, uint32 size); +void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size); #endif From 81774a446472fed152ab9ce1a3c1bdfecfd59062 Mon Sep 17 00:00:00 2001 From: davi Date: Wed, 19 Jan 2005 12:40:22 +0000 Subject: [PATCH 029/739] Added macros for large file support. --- acinclude.m4 | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 15 +++++++ 2 files changed, 136 insertions(+) create mode 100644 acinclude.m4 diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..8a47cfa --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,121 @@ +dnl By default, many hosts won't let programs access large files; +dnl one must use special compiler options to get large-file access to work. +dnl For more details about this brain damage please see: +dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html + +dnl Written by Paul Eggert . + +dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. +dnl AC_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME) +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_FLAGS, + [AC_CACHE_CHECK([for $1 value to request large file support], + ac_cv_sys_largefile_$1, + [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || { + ac_cv_sys_largefile_$1=no + ifelse($1, CFLAGS, + [case "$host_os" in + # IRIX 6.2 and later require cc -n32. +changequote(, )dnl + irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*) +changequote([, ])dnl + if test "$GCC" != yes; then + ac_cv_sys_largefile_CFLAGS=-n32 + fi + ac_save_CC="$CC" + CC="$CC $ac_cv_sys_largefile_CFLAGS" + AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no) + CC="$ac_save_CC" + esac]) + }])]) + +dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. +dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL) +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND, + [case $2 in + no) ;; + ?*) + case "[$]$1" in + '') $1=$2 ;; + *) $1=[$]$1' '$2 ;; + esac ;; + esac]) + +dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. +dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT) +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE, + [AC_CACHE_CHECK([for $1], $2, + [$2=no +changequote(, )dnl + $4 + for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do + case "$ac_flag" in + -D$1) + $2=1 ;; + -D$1=*) + $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;; + esac + done +changequote([, ])dnl + ]) + if test "[$]$2" != no; then + AC_DEFINE_UNQUOTED([$1], [$]$2, [$3]) + fi]) + +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE, + [AC_REQUIRE([AC_CANONICAL_HOST]) + AC_ARG_ENABLE(largefile, + [ --disable-largefile omit support for large files]) + if test "$enable_largefile" != no; then + AC_CHECK_TOOL(GETCONF, getconf) + AC_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS) + AC_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS) + AC_SYS_EXTRA_LARGEFILE_FLAGS(LIBS) + + for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do + case "$ac_flag" in + no) ;; + -D_FILE_OFFSET_BITS=*) ;; + -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;; + -D_LARGE_FILES | -D_LARGE_FILES=*) ;; + -D?* | -I?*) + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;; + *) + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;; + esac + done + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS") + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS") + AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, + ac_cv_sys_file_offset_bits, + [[Number of bits in a file offset, on hosts where this is settable.]]) + [case "$host_os" in + # HP-UX 10.20 and later + hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) + ac_cv_sys_file_offset_bits=64 ;; + esac] + AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, + ac_cv_sys_largefile_source, + [Define to make fseeko etc. visible, on some hosts.], + [case "$host_os" in + # HP-UX 10.20 and later + hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) + ac_cv_sys_largefile_source=1 ;; + esac]) + AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES, + ac_cv_sys_large_files, + [Define for large files, on AIX-style hosts.], + [case "$host_os" in + # AIX 4.2 and later + aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*) + ac_cv_sys_large_files=1 ;; + esac]) + fi + ]) + +AC_DEFUN([AC_CHECK_SPOON], [ + AC_ARG_WITH(spoon, [ --with-spoon=SPOON this is inocuous, since the truth is that there is no spoon ]) + AC_MSG_CHECKING(if there is spoon) + AC_MSG_RESULT(no) +]) + + diff --git a/configure.ac b/configure.ac index dcea170..53ec71a 100644 --- a/configure.ac +++ b/configure.ac @@ -9,6 +9,20 @@ AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_LIBTOOL +AC_SYS_EXTRA_LARGEFILE +if test "x$ac_cv_sys_largefile_CFLAGS" = "xno" ; then + ac_cv_sys_largefile_CFLAGS="" +fi +if test "x$ac_cv_sys_largefile_LDFLAGS" = "xno" ; then + ac_cv_sys_largefile_LDFLAGS="" +fi +if test "x$ac_cv_sys_largefile_LIBS" = "xno" ; then + ac_cv_sys_largefile_LIBS="" +fi +CFLAGS="$CFLAGS $ac_cv_sys_largefile_CFLAGS" +LDFLAGS="$LDFLAGS $ac_cv_sys_largefile_LDFLAGS" +LIBS="$LIBS $ac_cv_sys_largefile_LIBS" + dnl Checks for headers AC_CHECK_HEADERS([getopt.h math.h]) @@ -19,5 +33,6 @@ LDFLAGS="$LIBM $LDFLAGS" dnl Checks for library functions. +AC_CHECK_SPOON dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) AC_OUTPUT(Makefile src/Makefile tests/Makefile) From 31e9d838e8b265da2695190c5a2ca823fec51d40 Mon Sep 17 00:00:00 2001 From: davi Date: Wed, 19 Jan 2005 12:40:22 +0000 Subject: [PATCH 030/739] Added macros for large file support. --- acinclude.m4 | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 15 +++++++ 2 files changed, 136 insertions(+) create mode 100644 acinclude.m4 diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..8a47cfa --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,121 @@ +dnl By default, many hosts won't let programs access large files; +dnl one must use special compiler options to get large-file access to work. +dnl For more details about this brain damage please see: +dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html + +dnl Written by Paul Eggert . + +dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. +dnl AC_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME) +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_FLAGS, + [AC_CACHE_CHECK([for $1 value to request large file support], + ac_cv_sys_largefile_$1, + [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || { + ac_cv_sys_largefile_$1=no + ifelse($1, CFLAGS, + [case "$host_os" in + # IRIX 6.2 and later require cc -n32. +changequote(, )dnl + irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*) +changequote([, ])dnl + if test "$GCC" != yes; then + ac_cv_sys_largefile_CFLAGS=-n32 + fi + ac_save_CC="$CC" + CC="$CC $ac_cv_sys_largefile_CFLAGS" + AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no) + CC="$ac_save_CC" + esac]) + }])]) + +dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. +dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL) +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND, + [case $2 in + no) ;; + ?*) + case "[$]$1" in + '') $1=$2 ;; + *) $1=[$]$1' '$2 ;; + esac ;; + esac]) + +dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE. +dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT) +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE, + [AC_CACHE_CHECK([for $1], $2, + [$2=no +changequote(, )dnl + $4 + for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do + case "$ac_flag" in + -D$1) + $2=1 ;; + -D$1=*) + $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;; + esac + done +changequote([, ])dnl + ]) + if test "[$]$2" != no; then + AC_DEFINE_UNQUOTED([$1], [$]$2, [$3]) + fi]) + +AC_DEFUN(AC_SYS_EXTRA_LARGEFILE, + [AC_REQUIRE([AC_CANONICAL_HOST]) + AC_ARG_ENABLE(largefile, + [ --disable-largefile omit support for large files]) + if test "$enable_largefile" != no; then + AC_CHECK_TOOL(GETCONF, getconf) + AC_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS) + AC_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS) + AC_SYS_EXTRA_LARGEFILE_FLAGS(LIBS) + + for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do + case "$ac_flag" in + no) ;; + -D_FILE_OFFSET_BITS=*) ;; + -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;; + -D_LARGE_FILES | -D_LARGE_FILES=*) ;; + -D?* | -I?*) + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;; + *) + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;; + esac + done + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS") + AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS") + AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, + ac_cv_sys_file_offset_bits, + [[Number of bits in a file offset, on hosts where this is settable.]]) + [case "$host_os" in + # HP-UX 10.20 and later + hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) + ac_cv_sys_file_offset_bits=64 ;; + esac] + AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, + ac_cv_sys_largefile_source, + [Define to make fseeko etc. visible, on some hosts.], + [case "$host_os" in + # HP-UX 10.20 and later + hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*) + ac_cv_sys_largefile_source=1 ;; + esac]) + AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES, + ac_cv_sys_large_files, + [Define for large files, on AIX-style hosts.], + [case "$host_os" in + # AIX 4.2 and later + aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*) + ac_cv_sys_large_files=1 ;; + esac]) + fi + ]) + +AC_DEFUN([AC_CHECK_SPOON], [ + AC_ARG_WITH(spoon, [ --with-spoon=SPOON this is inocuous, since the truth is that there is no spoon ]) + AC_MSG_CHECKING(if there is spoon) + AC_MSG_RESULT(no) +]) + + diff --git a/configure.ac b/configure.ac index dcea170..53ec71a 100644 --- a/configure.ac +++ b/configure.ac @@ -9,6 +9,20 @@ AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_LIBTOOL +AC_SYS_EXTRA_LARGEFILE +if test "x$ac_cv_sys_largefile_CFLAGS" = "xno" ; then + ac_cv_sys_largefile_CFLAGS="" +fi +if test "x$ac_cv_sys_largefile_LDFLAGS" = "xno" ; then + ac_cv_sys_largefile_LDFLAGS="" +fi +if test "x$ac_cv_sys_largefile_LIBS" = "xno" ; then + ac_cv_sys_largefile_LIBS="" +fi +CFLAGS="$CFLAGS $ac_cv_sys_largefile_CFLAGS" +LDFLAGS="$LDFLAGS $ac_cv_sys_largefile_LDFLAGS" +LIBS="$LIBS $ac_cv_sys_largefile_LIBS" + dnl Checks for headers AC_CHECK_HEADERS([getopt.h math.h]) @@ -19,5 +33,6 @@ LDFLAGS="$LIBM $LDFLAGS" dnl Checks for library functions. +AC_CHECK_SPOON dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) AC_OUTPUT(Makefile src/Makefile tests/Makefile) From 955d4ad8fd9d0bfddf13903c8ab185f79959a00d Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 20 Jan 2005 12:28:42 +0000 Subject: [PATCH 031/739] Added initial txt2tags documentation. --- ChangeLog | 34 ++++++++++++ README.t2t | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 3 +- wingetopt.h | 4 +- 4 files changed, 186 insertions(+), 4 deletions(-) create mode 100644 README.t2t diff --git a/ChangeLog b/ChangeLog index 5534600..79d6b1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,37 @@ +2005-01-19 10:40 davi + + * acinclude.m4, configure.ac: Added macros for large file support. + +2005-01-18 19:06 fc_botelho + + * src/: bmz.c, bmz.h, bmz_structs.h, cmph.c, cmph.h, + cmph_structs.c, cmph_structs.h, cmph_types.h, czech.c, czech.h, + czech_structs.h, djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, + graph.c, graph.h, hash.c, hash.h, hash_state.h, jenkins_hash.c, + jenkins_hash.h, main.c, sdbm_hash.c, sdbm_hash.h, vqueue.c, + vqueue.h, vstack.c, vstack.h: version with cmph prefix + +2005-01-18 15:10 davi + + * ChangeLog, cmph.vcproj, cmphapp.vcproj, wingetopt.c, wingetopt.h: + Added missing files. + +2005-01-18 14:25 fc_botelho + + * aclocal.m4: initial version + +2005-01-18 14:16 fc_botelho + + * aclocal.m4: initial version + +2005-01-18 13:58 fc_botelho + + * src/czech.c: using bit mask to represent boolean values + +2005-01-18 13:56 fc_botelho + + * src/czech.c: no message + 2005-01-18 10:18 davi * COPYING, INSTALL, src/Makefile.am, src/bmz.c, src/bmz.h, diff --git a/README.t2t b/README.t2t new file mode 100644 index 0000000..a40b32d --- /dev/null +++ b/README.t2t @@ -0,0 +1,149 @@ +== cmph - C Minimal Perfect Hashing Library == + + +**Description** + +C Minimal Perfect Hashing Library is a portable LGPLed library to create and +work with minimal perfect hashes. The cmph library encapsulates the newest +and more efficient algorithms in the literature in a ease-to-use, +production-quality, fast API. The library is designed to work big entries that +won't fit in the main memory. It has been used successfully to create hashes +bigger than 100 million entries. Although there is a lack of similar libraries +in the free software world, we can point out some of the "distinguishing" +features of cmph: + +- Fast +- Space-efficient with main memory usage carefully documented +- The best modern algorithms are available (or at least scheduled for implementation :-)) +- Object oriented implementation +- Works with in-disk key sets through use of adapter pattern +- Serialization of hash functions +- Easily extensible +- Well encapsulated API aiming binary compatibility through releases +- Free Software + + +**News for version 0.3** + +- New heuristics in bmz algorithm, providing hash creation with only + (0.93 * 16 + 4)*n bytes and hash query with (0.93*4)n bytes + +**Examples** + +Using cmph is quite ease. Take a look. + + +``` + // Create minimal perfect hash from in-memory vector + #include + ... + + const char **vector; + unsigned int nkeys; + //Fill vector + //... + + //Create minimal perfect hash + cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "sample key"; + unsigned int id = cmph_search(hash, key); + + //Destroy hash + cmph_destroy(hash); +``` +------------------------------- + +``` + // Create minimal perfect hash from in-disk keys using BMZ algorithm + #include + ... + + //Open file with newline separated list of keys + FILE *fd = fopen("keysfile_newline_separated", "r"); + //check for errors + //... + + cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + fclose(fd); + + //Find key + const char *key = "sample key"; + unsigned int id = cmph_search(hash, key); + + //Destroy hash + cmph_destroy(hash); +``` +-------------------------------------- + + +**The cmph application** + +cmph is the name of both the library and the utility +application that comes with this package. You can use the cmph +application to create minimal perfect hashes from command line. The cmph utility +comes with a number of flags, but it is very simple to create and query +minimal perfect hashes: + +``` + $ # Create mph for keys in file keys_file + $ ./cmph keys_file + $ # Query id of keys in the file keys_query + $ ./cmph -m keys_file.mph keys_query +``` + +The additional options let you set most of the parameters you have +available through the C API. Below you can see the full help message for the +utility. + + +``` + usage: cmph [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile + Minimum perfect hashing tool + + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * czech + * bmz + -f hash function (may be used multiple times) - valid values are + * jenkins + * djb2 + * sdbm + * fnv + * glib + * pjw + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + keysfile line separated file with keys +``` + +**Downloads** + +Use the project page at sourceforge: http://sf.net/projects/cmph + +**License Stuff** + +Code is under the LGPL. +---------------------------------------- + +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/src/main.c b/src/main.c index c556da1..fcc9d01 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,4 @@ -#include +#include "../wingetopt.h" #include #include #include @@ -8,7 +8,6 @@ #include #include "cmph.h" #include "hash.h" -#include "../wingetopt.h" #ifdef WIN32 #define VERSION "0.2" diff --git a/wingetopt.h b/wingetopt.h index 4df5d78..9596853 100644 --- a/wingetopt.h +++ b/wingetopt.h @@ -16,8 +16,8 @@ extern "C" { int opterr = 1; /* non-zero if a question mark should be returned */ int getopt(int argc, char *argv[], char *opstring); - #endif -#endif + #endif //_GETOPT_ +#endif //WIN32 #ifdef __cplusplus } From 76f7be31e441ab9ccc80e4bd39d21d4e2fae0ce2 Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 20 Jan 2005 12:28:42 +0000 Subject: [PATCH 032/739] Added initial txt2tags documentation. --- ChangeLog | 34 ++++++++++++ README | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.t2t | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 3 +- wingetopt.h | 4 +- 5 files changed, 333 insertions(+), 4 deletions(-) create mode 100644 README.t2t diff --git a/ChangeLog b/ChangeLog index 5534600..79d6b1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,37 @@ +2005-01-19 10:40 davi + + * acinclude.m4, configure.ac: Added macros for large file support. + +2005-01-18 19:06 fc_botelho + + * src/: bmz.c, bmz.h, bmz_structs.h, cmph.c, cmph.h, + cmph_structs.c, cmph_structs.h, cmph_types.h, czech.c, czech.h, + czech_structs.h, djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, + graph.c, graph.h, hash.c, hash.h, hash_state.h, jenkins_hash.c, + jenkins_hash.h, main.c, sdbm_hash.c, sdbm_hash.h, vqueue.c, + vqueue.h, vstack.c, vstack.h: version with cmph prefix + +2005-01-18 15:10 davi + + * ChangeLog, cmph.vcproj, cmphapp.vcproj, wingetopt.c, wingetopt.h: + Added missing files. + +2005-01-18 14:25 fc_botelho + + * aclocal.m4: initial version + +2005-01-18 14:16 fc_botelho + + * aclocal.m4: initial version + +2005-01-18 13:58 fc_botelho + + * src/czech.c: using bit mask to represent boolean values + +2005-01-18 13:56 fc_botelho + + * src/czech.c: no message + 2005-01-18 10:18 davi * COPYING, INSTALL, src/Makefile.am, src/bmz.c, src/bmz.h, diff --git a/README b/README index e69de29..6a1cdd0 100644 --- a/README +++ b/README @@ -0,0 +1,147 @@ +== cmph - C Minimal Perfect Hashing Library == + +Description + +C Minimal Perfect Hashing Library is a portable LGPLed library to create and +work with minimal perfect hashes. The cmph library encapsulates the newest +and more efficient algorithms in the literature in a ease-to-use, +production-quality, fast API. The library is designed to work big entries that +won't fit in the main memory. It has been used successfully to create hashes +bigger than 100 million entries. Although there is a lack of similar libraries +in the free software world, we can point out some of the "distinguishing" +features of cmph: + +- Fast +- Space-efficient with main memory usage carefully documented +- The best modern algorithms are available (or at least scheduled for implementation :-)) +- Object oriented implementation +- Works with in-disk key sets through use of adapter pattern +- Serialization of hash functions +- Easily extensible +- Well encapsulated API aiming binary compatibility through releases +- Free Software + +News for version 0.3 + +- New heuristics in bmz algorithm, providing hash creation with only + (0.93 * 16 + 4)*n bytes and hash query with (0.93*4)n bytes + +Examples + +Using cmph is quite ease. Take a look. + + + // Create minimal perfect hash from in-memory vector + #include + ... + + const char **vector; + unsigned int nkeys; + //Fill vector + //... + + //Create minimal perfect hash + cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "sample key"; + unsigned int id = cmph_search(hash, key); + + //Destroy hash + cmph_destroy(hash); + +------------------------------- + + + // Create minimal perfect hash from in-disk keys using BMZ algorithm + #include + ... + + //Open file with newline separated list of keys + FILE *fd = fopen("keysfile_newline_separated", "r"); + //check for errors + //... + + cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + fclose(fd); + + //Find key + const char *key = "sample key"; + unsigned int id = cmph_search(hash, key); + + //Destroy hash + cmph_destroy(hash); + +-------------------------------------- + +The cmph application + +cmph is the name of both the library and the utility +application that comes with this package. You can use the cmph +application to create minimal perfect hashes from command line. The cmph utility +comes with a number of flags, but it is very simple to create and query +minimal perfect hashes: + + + $ # Create mph for keys in file keys_file + $ ./cmph keys_file + $ # Query id of keys in the file keys_query + $ ./cmph -m keys_file.mph keys_query + + +The additional options let you set most of the parameters you have +available through the C API. Below you can see the full help message for the +utility. + + + usage: cmph [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile + Minimum perfect hashing tool + + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * czech + * bmz + -f hash function (may be used multiple times) - valid values are + * jenkins + * djb2 + * sdbm + * fnv + * glib + * pjw + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + keysfile line separated file with keys + + +Downloads + +Use the project page at sourceforge: http://sf.net/projects/cmph + +License Stuff + +Code is under the LGPL. + +---------------------------------------- + +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + +Last Updated: Thu Jan 20 11:01:01 2005 + + + + + diff --git a/README.t2t b/README.t2t new file mode 100644 index 0000000..a40b32d --- /dev/null +++ b/README.t2t @@ -0,0 +1,149 @@ +== cmph - C Minimal Perfect Hashing Library == + + +**Description** + +C Minimal Perfect Hashing Library is a portable LGPLed library to create and +work with minimal perfect hashes. The cmph library encapsulates the newest +and more efficient algorithms in the literature in a ease-to-use, +production-quality, fast API. The library is designed to work big entries that +won't fit in the main memory. It has been used successfully to create hashes +bigger than 100 million entries. Although there is a lack of similar libraries +in the free software world, we can point out some of the "distinguishing" +features of cmph: + +- Fast +- Space-efficient with main memory usage carefully documented +- The best modern algorithms are available (or at least scheduled for implementation :-)) +- Object oriented implementation +- Works with in-disk key sets through use of adapter pattern +- Serialization of hash functions +- Easily extensible +- Well encapsulated API aiming binary compatibility through releases +- Free Software + + +**News for version 0.3** + +- New heuristics in bmz algorithm, providing hash creation with only + (0.93 * 16 + 4)*n bytes and hash query with (0.93*4)n bytes + +**Examples** + +Using cmph is quite ease. Take a look. + + +``` + // Create minimal perfect hash from in-memory vector + #include + ... + + const char **vector; + unsigned int nkeys; + //Fill vector + //... + + //Create minimal perfect hash + cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "sample key"; + unsigned int id = cmph_search(hash, key); + + //Destroy hash + cmph_destroy(hash); +``` +------------------------------- + +``` + // Create minimal perfect hash from in-disk keys using BMZ algorithm + #include + ... + + //Open file with newline separated list of keys + FILE *fd = fopen("keysfile_newline_separated", "r"); + //check for errors + //... + + cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + fclose(fd); + + //Find key + const char *key = "sample key"; + unsigned int id = cmph_search(hash, key); + + //Destroy hash + cmph_destroy(hash); +``` +-------------------------------------- + + +**The cmph application** + +cmph is the name of both the library and the utility +application that comes with this package. You can use the cmph +application to create minimal perfect hashes from command line. The cmph utility +comes with a number of flags, but it is very simple to create and query +minimal perfect hashes: + +``` + $ # Create mph for keys in file keys_file + $ ./cmph keys_file + $ # Query id of keys in the file keys_query + $ ./cmph -m keys_file.mph keys_query +``` + +The additional options let you set most of the parameters you have +available through the C API. Below you can see the full help message for the +utility. + + +``` + usage: cmph [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile + Minimum perfect hashing tool + + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * czech + * bmz + -f hash function (may be used multiple times) - valid values are + * jenkins + * djb2 + * sdbm + * fnv + * glib + * pjw + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + keysfile line separated file with keys +``` + +**Downloads** + +Use the project page at sourceforge: http://sf.net/projects/cmph + +**License Stuff** + +Code is under the LGPL. +---------------------------------------- + +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/src/main.c b/src/main.c index c556da1..fcc9d01 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,4 @@ -#include +#include "../wingetopt.h" #include #include #include @@ -8,7 +8,6 @@ #include #include "cmph.h" #include "hash.h" -#include "../wingetopt.h" #ifdef WIN32 #define VERSION "0.2" diff --git a/wingetopt.h b/wingetopt.h index 4df5d78..9596853 100644 --- a/wingetopt.h +++ b/wingetopt.h @@ -16,8 +16,8 @@ extern "C" { int opterr = 1; /* non-zero if a question mark should be returned */ int getopt(int argc, char *argv[], char *opstring); - #endif -#endif + #endif //_GETOPT_ +#endif //WIN32 #ifdef __cplusplus } From 4dda0a3b62eb1cbece670c3eee8ffb71c82be0d5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 21 Jan 2005 20:30:23 +0000 Subject: [PATCH 033/739] mask to represent a boolean value using only 1 bit --- src/bitbool.c | 2 ++ src/bitbool.h | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 src/bitbool.c create mode 100644 src/bitbool.h diff --git a/src/bitbool.c b/src/bitbool.c new file mode 100644 index 0000000..07279e4 --- /dev/null +++ b/src/bitbool.c @@ -0,0 +1,2 @@ +#include "bitbool.h" +const cmph_uint8 bitmask[] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; diff --git a/src/bitbool.h b/src/bitbool.h new file mode 100644 index 0000000..5428919 --- /dev/null +++ b/src/bitbool.h @@ -0,0 +1,9 @@ +#ifndef _CMPH_BITBOOL_H__ +#define _CMPH_BITBOOL_H__ +#include "cmph_types.h" +extern const cmph_uint8 bitmask[]; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + +#endif From a050a62857e73092f2f6bcdca767a50d8880371e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 21 Jan 2005 20:30:23 +0000 Subject: [PATCH 034/739] mask to represent a boolean value using only 1 bit --- src/bitbool.c | 2 ++ src/bitbool.h | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 src/bitbool.c create mode 100644 src/bitbool.h diff --git a/src/bitbool.c b/src/bitbool.c new file mode 100644 index 0000000..07279e4 --- /dev/null +++ b/src/bitbool.c @@ -0,0 +1,2 @@ +#include "bitbool.h" +const cmph_uint8 bitmask[] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; diff --git a/src/bitbool.h b/src/bitbool.h new file mode 100644 index 0000000..5428919 --- /dev/null +++ b/src/bitbool.h @@ -0,0 +1,9 @@ +#ifndef _CMPH_BITBOOL_H__ +#define _CMPH_BITBOOL_H__ +#include "cmph_types.h" +extern const cmph_uint8 bitmask[]; +#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) + +#endif From 3ed086d14a9ebf101a656b4eff4f7115cc5fc309 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 21 Jan 2005 20:42:33 +0000 Subject: [PATCH 035/739] Only public symbols were prefixed with cmph, and the API was changed to agree with the initial txt2html documentation --- src/bmz.c | 232 +++++++++++++++++++++----------------------- src/bmz.h | 25 +++-- src/bmz_structs.h | 14 +-- src/cmph.c | 85 ++++++++-------- src/cmph.h | 27 +++--- src/cmph_structs.c | 15 ++- src/cmph_structs.h | 12 +-- src/czech.c | 134 ++++++++++++------------- src/czech.h | 25 +++-- src/czech_structs.h | 14 +-- src/djb2_hash.c | 14 +-- src/djb2_hash.h | 14 +-- src/fnv_hash.c | 14 +-- src/fnv_hash.h | 14 +-- src/graph.c | 57 +++++------ src/graph.h | 38 ++++---- src/hash.c | 54 +++++------ src/hash.h | 12 +-- src/hash_state.h | 10 +- src/jenkins_hash.c | 14 +-- src/jenkins_hash.h | 14 +-- src/main.c | 30 +++--- src/sdbm_hash.c | 14 +-- src/sdbm_hash.h | 14 +-- src/vqueue.c | 18 ++-- src/vqueue.h | 14 +-- src/vstack.c | 22 ++--- src/vstack.h | 18 ++-- 28 files changed, 475 insertions(+), 493 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index b06e0c4..7b29a86 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -1,8 +1,10 @@ +#include "graph.h" #include "bmz.h" #include "cmph_structs.h" #include "bmz_structs.h" #include "hash.h" #include "vqueue.h" +#include "bitbool.h" #include #include @@ -15,49 +17,39 @@ //static cmph_uint32 UNDEFINED = UINT_MAX; -static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; -#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) -#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) -#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) +/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ -static int bmz_gen_edges(cmph_mph_t *mph); -static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); -static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); -static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); +static int bmz_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); - -cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source) +bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = NULL; - cmph_bmz_mph_data_t *bmz = NULL; - mph = cmph__mph_new(CMPH_BMZ, key_source); - if (mph == NULL) return NULL; - bmz = (cmph_bmz_mph_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); - if (bmz == NULL) - { - cmph__mph_destroy(mph); - return NULL; - } + bmz_config_data_t *bmz = NULL; + bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; - mph->data = bmz; - assert(mph->data); - return mph; -} -void cmph_bmz_mph_destroy(cmph_mph_t *mph) -{ - cmph_bmz_mph_data_t *data = (cmph_bmz_mph_data_t *)mph->data; - DEBUGP("Destroying algorithm dependent data\n"); - free(data); - cmph__mph_destroy(mph); + assert(bmz); + return bmz; } -void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) +void bmz_config_destroy(cmph_config_t *mph) { - cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + bmz_config_data_t *data = (bmz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) @@ -68,10 +60,10 @@ void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) } } -cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) +cmph_t *bmz_new(cmph_config_t *mph, float c) { - cmph_mphf_t *mphf = NULL; - cmph_bmz_mphf_data_t *bmzf = NULL; + cmph_t *mphf = NULL; + bmz_data_t *bmzf = NULL; cmph_uint32 i; cmph_uint32 iterations; cmph_uint32 iterations_map = 20; @@ -79,15 +71,15 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - DEBUGP("bmz_c: %f\n", bmz_c); - cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + DEBUGP("c: %f\n", c); + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; bmz->m = mph->key_source->nkeys; - bmz->n = ceil(bmz_c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u bmz_c: %f\n", bmz->m, bmz->n, bmz_c); - bmz->graph = cmph_graph_new(bmz->n, bmz->m); + bmz->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); + bmz->graph = graph_new(bmz->n, bmz->m); DEBUGP("Created graph\n"); - bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; do @@ -104,17 +96,17 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) { int ok; DEBUGP("hash function 1\n"); - bmz->hashes[0] = cmph_hash_state_new(bmz->hashfuncs[0], bmz->n); + bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); - bmz->hashes[1] = cmph_hash_state_new(bmz->hashfuncs[1], bmz->n); + bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { --iterations; - cmph_hash_state_destroy(bmz->hashes[0]); + hash_state_destroy(bmz->hashes[0]); bmz->hashes[0] = NULL; - cmph_hash_state_destroy(bmz->hashes[1]); + hash_state_destroy(bmz->hashes[1]); bmz->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -127,7 +119,7 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) } if (iterations == 0) { - cmph_graph_destroy(bmz->graph); + graph_destroy(bmz->graph); return NULL; } @@ -137,7 +129,7 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) fprintf(stderr, "Starting ordering step\n"); } - cmph_graph_obtain_critical_nodes(bmz->graph); + graph_obtain_critical_nodes(bmz->graph); // Searching step if (mph->verbosity) @@ -155,9 +147,9 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { - if (cmph_graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) + if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) { - if(bmz_c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); if(restart_mapping) break; } @@ -178,12 +170,12 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - cmph_graph_destroy(bmz->graph); + graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) return NULL; - mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); + mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - bmzf = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); + bmzf = (bmz_data_t *)malloc(sizeof(bmz_config_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; @@ -200,41 +192,41 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) return mphf; } -static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint32 next_g; cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph)) + 1); - cmph_graph_iterator_t it, it1; + vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); + graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - cmph_vqueue_insert(q, v); - while(!cmph_vqueue_is_empty(q)) + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) { - v = cmph_vqueue_remove(q); - it = cmph_graph_neighbors_it(bmz->graph, v); - while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { collision = 1; while(collision) // lookahead to resolve collisions { next_g = *biggest_g_value + 1; - it1 = cmph_graph_neighbors_it(bmz->graph, u); + it1 = graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - cmph_vqueue_destroy(q); + vqueue_destroy(q); return 1; // restart mapping step. } if (GETBIT(used_edges, next_g + bmz->g[lav])) @@ -247,10 +239,10 @@ static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uin if (next_g > *biggest_g_value) *biggest_g_value = next_g; } // Marking used edges... - it1 = cmph_graph_neighbors_it(bmz->graph, u); - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -258,16 +250,16 @@ static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uin } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited,u); - cmph_vqueue_insert(q, u); + vqueue_insert(q, u); } } } - cmph_vqueue_destroy(q); + vqueue_destroy(q); return 0; } -static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint32 next_g; cmph_uint32 u; /* Auxiliary vertex */ @@ -276,21 +268,21 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz cmph_uint32 * unused_g_values = NULL; cmph_uint32 unused_g_values_capacity = 0; cmph_uint32 nunused_g_values = 0; - cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph))+1); - cmph_graph_iterator_t it, it1; + vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); + graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - cmph_vqueue_insert(q, v); - while(!cmph_vqueue_is_empty(q)) + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) { - v = cmph_vqueue_remove(q); - it = cmph_graph_neighbors_it(bmz->graph, v); - while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { cmph_uint32 next_g_index = 0; collision = 1; @@ -305,15 +297,15 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz next_g = *biggest_g_value + 1; next_g_index = UINT_MAX; } - it1 = cmph_graph_neighbors_it(bmz->graph, u); + it1 = graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - cmph_vqueue_destroy(q); + vqueue_destroy(q); free(unused_g_values); return 1; // restart mapping step. } @@ -340,10 +332,10 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; // Marking used edges... - it1 = cmph_graph_neighbors_it(bmz->graph, u); - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -351,17 +343,17 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - cmph_vqueue_insert(q, u); + vqueue_insert(q, u); } } } - cmph_vqueue_destroy(q); + vqueue_destroy(q); free(unused_g_values); return 0; } -static cmph_uint32 next_unused_edge(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) +static cmph_uint32 next_unused_edge(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) { while(1) { @@ -372,11 +364,11 @@ static cmph_uint32 next_unused_edge(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_ return unused_edge_index; } -static void bmz_traverse(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) +static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) { - cmph_graph_iterator_t it = cmph_graph_neighbors_it(bmz->graph, v); + graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; - while((neighbor = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); @@ -389,15 +381,15 @@ static void bmz_traverse(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph } } -static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) +static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint32 i, v1, v2, unused_edge_index = 0; DEBUGP("Labelling non critical vertices\n"); for(i = 0; i < bmz->m; i++) { - v1 = cmph_graph_vertex_id(bmz->graph, i, 0); - v2 = cmph_graph_vertex_id(bmz->graph, i, 1); + v1 = graph_vertex_id(bmz->graph, i, 0); + v2 = graph_vertex_id(bmz->graph, i, 1); if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); @@ -416,14 +408,14 @@ static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 } -static int bmz_gen_edges(cmph_mph_t *mph) +static int bmz_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; cmph_uint8 multiple_edges = 0; DEBUGP("Generating edges for %u vertices\n", bmz->n); - cmph_graph_clear_edges(bmz->graph); + graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -431,8 +423,8 @@ static int bmz_gen_edges(cmph_mph_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; - h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; + h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; if (h1 == h2) { @@ -442,34 +434,34 @@ static int bmz_gen_edges(cmph_mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - multiple_edges = cmph_graph_contains_edge(bmz->graph, h1, h2); + multiple_edges = graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. - cmph_graph_add_edge(bmz->graph, h1, h2); + graph_add_edge(bmz->graph, h1, h2); } return !multiple_edges; } -int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *fd) +int bmz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions - cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; + bmz_data_t *data = (bmz_data_t *)mphf->data; cmph_uint32 nn, nm; - cmph__mphf_dump(mphf, fd); + __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); - cmph_hash_state_dump(data->hashes[0], &buf, &buflen); + hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - cmph_hash_state_dump(data->hashes[1], &buf, &buflen); + hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); @@ -487,28 +479,28 @@ int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *fd) return 1; } -void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf) +void bmz_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - cmph_bmz_mphf_data_t *bmz = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mphf_data_t)); + bmz_data_t *bmz = (bmz_data_t *)malloc(sizeof(bmz_data_t)); DEBUGP("Loading bmz mphf\n"); mphf->data = bmz; fread(&nhashes, sizeof(cmph_uint32), 1, f); - bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); bmz->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - cmph_hash_state_t *state = NULL; + hash_state_t *state = NULL; fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = cmph_hash_state_load(buf, buflen); + state = hash_state_load(buf, buflen); bmz->hashes[i] = state; free(buf); } @@ -528,22 +520,22 @@ void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf) } -cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - cmph_bmz_mphf_data_t *bmz = mphf->data; - cmph_uint32 h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; - cmph_uint32 h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; + bmz_data_t *bmz = mphf->data; + cmph_uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + cmph_uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); return bmz->g[h1] + bmz->g[h2]; } -void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf) +void bmz_destroy(cmph_t *mphf) { - cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; + bmz_data_t *data = (bmz_data_t *)mphf->data; free(data->g); - cmph_hash_state_destroy(data->hashes[0]); - cmph_hash_state_destroy(data->hashes[1]); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/bmz.h b/src/bmz.h index 6095b91..7a81a02 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -1,19 +1,18 @@ -#ifndef __BMZ_H__ -#define __BMZ_H__ +#ifndef __CMPH_BMZ_H__ +#define __CMPH_BMZ_H__ -#include "graph.h" #include "cmph.h" -typedef struct cmph__bmz_mphf_data_t cmph_bmz_mphf_data_t; -typedef struct cmph__bmz_mph_data_t cmph_bmz_mph_data_t; +typedef struct __bmz_data_t bmz_data_t; +typedef struct __bmz_config_data_t bmz_config_data_t; -cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source); -void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); -void cmph_bmz_mph_destroy(cmph_mph_t *mph); -cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c); +bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source); +void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz_config_destroy(cmph_config_t *mph); +cmph_t *bmz_new(cmph_config_t *mph, float c); -void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf); -int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *f); -void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf); -cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); +void bmz_load(FILE *f, cmph_t *mphf); +int bmz_dump(cmph_t *mphf, FILE *f); +void bmz_destroy(cmph_t *mphf); +cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/bmz_structs.h b/src/bmz_structs.h index a906d6d..63378e5 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -1,24 +1,24 @@ -#ifndef __BMZ_STRUCTS_H__ -#define __BMZ_STRUCTS_H__ +#ifndef __CMPH_BMZ_STRUCTS_H__ +#define __CMPH_BMZ_STRUCTS_H__ #include "hash_state.h" -struct cmph__bmz_mphf_data_t +struct __bmz_data_t { cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; -struct cmph__bmz_mph_data_t +struct __bmz_config_data_t { CMPH_HASH hashfuncs[2]; cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count - cmph_graph_t *graph; + graph_t *graph; cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; #endif diff --git a/src/cmph.c b/src/cmph.c index 74e5bad..bb52106 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -10,85 +10,84 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "czech", NULL }; /* included -- Fabiano */ -cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) +cmph_config_t *cmph_config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = NULL; - DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); - switch (algo) - { - case CMPH_CZECH: - mph = cmph_czech_mph_new(key_source); - break; - case CMPH_BMZ: /* included -- Fabiano */ - DEBUGP("new bmz algorithm \n"); - mph = cmph_bmz_mph_new(key_source); - break; - default: - assert(0); - } + cmph_config_t *mph = NULL; + mph = __config_new(key_source); assert(mph); + mph->algo = CMPH_CZECH; // default value return mph; } -void cmph_mph_destroy(cmph_mph_t *mph) +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + mph->algo = algo; +} + +void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); switch (mph->algo) { case CMPH_CZECH: - cmph_czech_mph_destroy(mph); + czech_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - cmph_bmz_mph_destroy(mph); + bmz_config_destroy(mph); break; default: assert(0); } + __config_destroy(mph); } -void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity) +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity) { mph->verbosity = verbosity; } -void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { switch (mph->algo) { case CMPH_CZECH: - cmph_czech_mph_set_hashfuncs(mph, hashfuncs); + czech_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BMZ: /* included -- Fabiano */ - cmph_bmz_mph_set_hashfuncs(mph, hashfuncs); + bmz_config_set_hashfuncs(mph, hashfuncs); break; default: break; } return; } -void cmph_mph_set_graphsize(cmph_mph_t *mph, float c) +void cmph_config_set_graphsize(cmph_config_t *mph, float c) { mph->c = c; return; } -cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph) +cmph_t *cmph_new(cmph_config_t *mph) { - cmph_mphf_t *mphf = NULL; + cmph_t *mphf = NULL; float c = mph->c; + + DEBUGP("Creating mph with algorithm %s\n", cmph_names[mph->algo]); switch (mph->algo) { case CMPH_CZECH: DEBUGP("Creating czech hash\n"); + mph->data = czech_config_new(mph->key_source); if (c == 0) c = 2.09; - mphf = cmph_czech_mph_create(mph, c); + mphf = czech_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); + mph->data = bmz_config_new(mph->key_source); if (c == 0) c = 1.15; - mphf = cmph_bmz_mph_create(mph, c); + mphf = bmz_new(mph, c); break; default: assert(0); @@ -96,15 +95,15 @@ cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph) return mphf; } -int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f) +int cmph_dump(cmph_t *mphf, FILE *f) { switch (mphf->algo) { case CMPH_CZECH: - return cmph_czech_mphf_dump(mphf, f); + return czech_dump(mphf, f); break; case CMPH_BMZ: /* included -- Fabiano */ - return cmph_bmz_mphf_dump(mphf, f); + return bmz_dump(mphf, f); break; default: assert(0); @@ -112,22 +111,22 @@ int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f) assert(0); return 0; } -cmph_mphf_t *cmph_mphf_load(FILE *f) +cmph_t *cmph_load(FILE *f) { - cmph_mphf_t *mphf = NULL; + cmph_t *mphf = NULL; DEBUGP("Loading mphf generic parts\n"); - mphf = cmph__mphf_load(f); + mphf = __cmph_load(f); if (mphf == NULL) return NULL; DEBUGP("Loading mphf algorithm dependent parts\n"); switch (mphf->algo) { case CMPH_CZECH: - cmph_czech_mphf_load(f, mphf); + czech_load(f, mphf); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Loading bmz algorithm dependent parts\n"); - cmph_bmz_mphf_load(f, mphf); + bmz_load(f, mphf); break; default: assert(0); @@ -137,16 +136,16 @@ cmph_mphf_t *cmph_mphf_load(FILE *f) } -cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { DEBUGP("mphf algorithm: %u \n", mphf->algo); switch(mphf->algo) { case CMPH_CZECH: - return cmph_czech_mphf_search(mphf, key, keylen); + return czech_search(mphf, key, keylen); case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); - return cmph_bmz_mphf_search(mphf, key, keylen); + return bmz_search(mphf, key, keylen); default: assert(0); } @@ -154,20 +153,20 @@ cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 key return 0; } -cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf) +cmph_uint32 cmph_size(cmph_t *mphf) { return mphf->size; } -void cmph_mphf_destroy(cmph_mphf_t *mphf) +void cmph_destroy(cmph_t *mphf) { switch(mphf->algo) { case CMPH_CZECH: - cmph_czech_mphf_destroy(mphf); + czech_destroy(mphf); return; case CMPH_BMZ: /* included -- Fabiano */ - cmph_bmz_mphf_destroy(mphf); + bmz_destroy(mphf); return; default: assert(0); diff --git a/src/cmph.h b/src/cmph.h index 5ad98fb..f74de32 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -11,8 +11,8 @@ extern "C" #include "cmph_types.h" -typedef struct cmph__mph_t cmph_mph_t; -typedef struct cmph__mphf_t cmph_mphf_t; +typedef struct __config_t cmph_config_t; +typedef struct __cmph_t cmph_t; typedef struct { @@ -24,19 +24,20 @@ typedef struct } cmph_key_source_t; /** Hash generation API **/ -cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); -void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); -void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity); -void cmph_mph_set_graphsize(cmph_mph_t *mph, float c); -void cmph_mph_destroy(cmph_mph_t *mph); -cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph); +cmph_config_t *cmph_config_new(cmph_key_source_t *key_source); +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); +void cmph_config_set_graphsize(cmph_config_t *mph, float c); +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_destroy(cmph_config_t *mph); +cmph_t *cmph_new(cmph_config_t *mph); /** Hash querying API **/ -cmph_mphf_t *cmph_mphf_load(FILE *f); -int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f); -cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); -cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf); -void cmph_mphf_destroy(cmph_mphf_t *mphf); +cmph_t *cmph_load(FILE *f); +int cmph_dump(cmph_t *mphf, FILE *f); +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +cmph_uint32 cmph_size(cmph_t *mphf); +void cmph_destroy(cmph_t *mphf); #ifdef __cplusplus } diff --git a/src/cmph_structs.c b/src/cmph_structs.c index ee1e89f..060fbd8 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -5,32 +5,31 @@ //#define DEBUG #include "debug.h" -cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) +cmph_config_t *__config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = (cmph_mph_t *)malloc(sizeof(cmph_mph_t)); + cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; - mph->algo = algo; mph->key_source = key_source; mph->verbosity = 0; float c = 0; return mph; } -void cmph__mph_destroy(cmph_mph_t *mph) +void __config_destroy(cmph_config_t *mph) { free(mph); } -void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *fd) +void __cmph_dump(cmph_t *mphf, FILE *fd) { cmph_uint32 nsize = htonl(mphf->size); fwrite(cmph_names[mphf->algo], (cmph_uint32)(strlen(cmph_names[mphf->algo]) + 1), 1, fd); fwrite(&nsize, sizeof(mphf->size), 1, fd); } -cmph_mphf_t *cmph__mphf_load(FILE *f) +cmph_t *__cmph_load(FILE *f) { - cmph_mphf_t *mphf = NULL; + cmph_t *mphf = NULL; cmph_uint32 i; char algo_name[BUFSIZ]; char *ptr = algo_name; @@ -56,7 +55,7 @@ cmph_mphf_t *cmph__mphf_load(FILE *f) DEBUGP("Algorithm %s not found\n", algo_name); return NULL; } - mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); + mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = algo; fread(&(mphf->size), sizeof(mphf->size), 1, f); mphf->size = ntohl(mphf->size); diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 65c8784..436e363 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -5,7 +5,7 @@ /** Hash generation algorithm data */ -struct cmph__mph_t +struct __config_t { CMPH_ALGO algo; cmph_key_source_t *key_source; @@ -16,7 +16,7 @@ struct cmph__mph_t /** Hash querying algorithm data */ -struct cmph__mphf_t +struct __cmph_t { CMPH_ALGO algo; cmph_uint32 size; @@ -24,10 +24,10 @@ struct cmph__mphf_t void *data; //algorithm dependent data }; -cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); -void cmph__mph_destroy(); -void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *); -cmph_mphf_t *cmph__mphf_load(FILE *f); +cmph_config_t *__config_new(cmph_key_source_t *key_source); +void __config_destroy(); +void __cmph_dump(cmph_t *mphf, FILE *); +cmph_t *__cmph_load(FILE *f); #endif diff --git a/src/czech.c b/src/czech.c index c4e1a96..e7498e0 100644 --- a/src/czech.c +++ b/src/czech.c @@ -1,7 +1,9 @@ +#include "graph.h" #include "czech.h" #include "cmph_structs.h" #include "czech_structs.h" #include "hash.h" +#include "bitbool.h" #include #include @@ -13,46 +15,36 @@ //#define DEBUG #include "debug.h" -static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; -#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) -#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) -#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) +/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ -static int czech_gen_edges(cmph_mph_t *mph); -static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); +static int czech_gen_edges(cmph_config_t *mph); +static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); -cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source) +czech_config_data_t *czech_config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = NULL; - cmph_czech_mph_data_t *czech = NULL; - mph = cmph__mph_new(CMPH_CZECH, key_source); - if (mph == NULL) return NULL; - czech = (cmph_czech_mph_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); - if (czech == NULL) - { - cmph__mph_destroy(mph); - return NULL; - } + czech_config_data_t *czech = NULL; + czech = (czech_config_data_t *)malloc(sizeof(czech_config_data_t)); czech->hashfuncs[0] = CMPH_HASH_JENKINS; czech->hashfuncs[1] = CMPH_HASH_JENKINS; czech->g = NULL; czech->graph = NULL; czech->hashes = NULL; - mph->data = czech; - assert(mph->data); - return mph; + assert(czech); + return czech; } -void cmph_czech_mph_destroy(cmph_mph_t *mph) +void czech_config_destroy(cmph_config_t *mph) { - cmph_czech_mph_data_t *data = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *data = (czech_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); - cmph__mph_destroy(mph); } -void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) +void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { - cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *czech = (czech_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) @@ -63,22 +55,22 @@ void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) } } -cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) +cmph_t *czech_new(cmph_config_t *mph, float c) { - cmph_mphf_t *mphf = NULL; - cmph_czech_mphf_data_t *czechf = NULL; + cmph_t *mphf = NULL; + czech_data_t *czechf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; - cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *czech = (czech_config_data_t *)mph->data; czech->m = mph->key_source->nkeys; czech->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); - czech->graph = cmph_graph_new(czech->n, czech->m); + czech->graph = graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); - czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; //Mapping step if (mph->verbosity) @@ -88,15 +80,15 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) while(1) { int ok; - czech->hashes[0] = cmph_hash_state_new(czech->hashfuncs[0], czech->n); - czech->hashes[1] = cmph_hash_state_new(czech->hashfuncs[1], czech->n); + czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); + czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); ok = czech_gen_edges(mph); if (!ok) { --iterations; - cmph_hash_state_destroy(czech->hashes[0]); + hash_state_destroy(czech->hashes[0]); czech->hashes[0] = NULL; - cmph_hash_state_destroy(czech->hashes[1]); + hash_state_destroy(czech->hashes[1]); czech->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -109,7 +101,7 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) } if (iterations == 0) { - cmph_graph_destroy(czech->graph); + graph_destroy(czech->graph); return NULL; } @@ -132,13 +124,13 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) czech_traverse(czech, visited, i); } } - cmph_graph_destroy(czech->graph); + graph_destroy(czech->graph); free(visited); czech->graph = NULL; - mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); + mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - czechf = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); + czechf = (czech_data_t *)malloc(sizeof(czech_config_data_t)); czechf->g = czech->g; czech->g = NULL; //transfer memory ownership czechf->hashes = czech->hashes; @@ -155,34 +147,34 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) return mphf; } -static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) +static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) { - cmph_graph_iterator_t it = cmph_graph_neighbors_it(czech->graph, v); + graph_iterator_t it = graph_neighbors_it(czech->graph, v); cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = cmph_graph_next_neighbor(czech->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, cmph_graph_edge_id(czech->graph, v, neighbor)); - czech->g[neighbor] = cmph_graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], cmph_graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); + czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); czech_traverse(czech, visited, neighbor); } } -static int czech_gen_edges(cmph_mph_t *mph) +static int czech_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *czech = (czech_config_data_t *)mph->data; int cycles = 0; DEBUGP("Generating edges for %u vertices\n", czech->n); - cmph_graph_clear_edges(czech->graph); + graph_clear_edges(czech->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -190,8 +182,8 @@ static int czech_gen_edges(cmph_mph_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; - h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; + h1 = hash(czech->hashes[0], key, keylen) % czech->n; + h2 = hash(czech->hashes[1], key, keylen) % czech->n; if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { @@ -201,36 +193,36 @@ static int czech_gen_edges(cmph_mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - cmph_graph_add_edge(czech->graph, h1, h2); + graph_add_edge(czech->graph, h1, h2); } - cycles = cmph_graph_is_cyclic(czech->graph); + cycles = graph_is_cyclic(czech->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *fd) +int czech_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; cmph_uint32 two = htonl(2); //number of hash functions - cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; + czech_data_t *data = (czech_data_t *)mphf->data; cmph_uint32 nn, nm; - cmph__mphf_dump(mphf, fd); + __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); - cmph_hash_state_dump(data->hashes[0], &buf, &buflen); + hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - cmph_hash_state_dump(data->hashes[1], &buf, &buflen); + hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); @@ -255,32 +247,32 @@ int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *fd) return 1; } -void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf) +void czech_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char fbuf[BUFSIZ]; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - cmph_hash_state_t *state; - cmph_czech_mphf_data_t *czech = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mphf_data_t)); + hash_state_t *state; + czech_data_t *czech = (czech_data_t *)malloc(sizeof(czech_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; fread(&nhashes, sizeof(cmph_uint32), 1, f); nhashes = ntohl(nhashes); - czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - cmph_hash_state_t *state = NULL; + hash_state_t *state = NULL; fread(&buflen, sizeof(cmph_uint32), 1, f); buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = cmph_hash_state_load(buf, buflen); + state = hash_state_load(buf, buflen); czech->hashes[i] = state; free(buf); } @@ -303,22 +295,22 @@ void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf) } -cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - cmph_czech_mphf_data_t *czech = mphf->data; - cmph_uint32 h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; - cmph_uint32 h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; + czech_data_t *czech = mphf->data; + cmph_uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; + cmph_uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > czech->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); return (czech->g[h1] + czech->g[h2]) % czech->m; } -void cmph_czech_mphf_destroy(cmph_mphf_t *mphf) +void czech_destroy(cmph_t *mphf) { - cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; + czech_data_t *data = (czech_data_t *)mphf->data; free(data->g); - cmph_hash_state_destroy(data->hashes[0]); - cmph_hash_state_destroy(data->hashes[1]); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/czech.h b/src/czech.h index d167219..9070e89 100644 --- a/src/czech.h +++ b/src/czech.h @@ -1,19 +1,18 @@ -#ifndef __CZECH_H__ -#define __CZECH_H__ +#ifndef __CMPH_CZECH_H__ +#define __CMPH_CZECH_H__ -#include "graph.h" #include "cmph.h" -typedef struct cmph__czech_mphf_data_t cmph_czech_mphf_data_t; -typedef struct cmph__czech_mph_data_t cmph_czech_mph_data_t; +typedef struct __czech_data_t czech_data_t; +typedef struct __czech_config_data_t czech_config_data_t; -cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source); -void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); -void cmph_czech_mph_destroy(cmph_mph_t *mph); -cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c); +czech_config_data_t *czech_config_new(cmph_key_source_t *key_source); +void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void czech_config_destroy(cmph_config_t *mph); +cmph_t *czech_new(cmph_config_t *mph, float c); -void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf); -int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *f); -void cmph_czech_mphf_destroy(cmph_mphf_t *mphf); -cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); +void czech_load(FILE *f, cmph_t *mphf); +int czech_dump(cmph_t *mphf, FILE *f); +void czech_destroy(cmph_t *mphf); +cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/czech_structs.h b/src/czech_structs.h index 1678433..a03bc6e 100644 --- a/src/czech_structs.h +++ b/src/czech_structs.h @@ -1,24 +1,24 @@ -#ifndef __CZECH_STRUCTS_H__ -#define __CZECH_STRUCTS_H__ +#ifndef __CMPH_CZECH_STRUCTS_H__ +#define __CMPH_CZECH_STRUCTS_H__ #include "hash_state.h" -struct cmph__czech_mphf_data_t +struct __czech_data_t { cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; -struct cmph__czech_mph_data_t +struct __czech_config_data_t { CMPH_HASH hashfuncs[2]; cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count - cmph_graph_t *graph; + graph_t *graph; cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; #endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 6e5b972..5bbd9bd 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -1,19 +1,19 @@ #include "djb2_hash.h" #include -cmph_djb2_state_t *cmph_djb2_state_new() +djb2_state_t *djb2_state_new() { - cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); state->hashfunc = CMPH_HASH_DJB2; return state; } -void cmph_djb2_state_destroy(cmph_djb2_state_t *state) +void djb2_state_destroy(djb2_state_t *state) { free(state); } -cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 5381; const unsigned char *ptr = k; @@ -27,16 +27,16 @@ cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 } -void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen) +void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen) +djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) { - cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); state->hashfunc = CMPH_HASH_DJB2; return state; } diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 549cc90..3fef71d 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct cmph__djb2_state_t +typedef struct __djb2_state_t { CMPH_HASH hashfunc; -} cmph_djb2_state_t; +} djb2_state_t; -cmph_djb2_state_t *cmph_djb2_state_new(); -cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen); -void cmph_djb2_state_destroy(cmph_djb2_state_t *state); +djb2_state_t *djb2_state_new(); +cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); +void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); +void djb2_state_destroy(djb2_state_t *state); #endif diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 9be1558..5bf8db2 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -1,19 +1,19 @@ #include "fnv_hash.h" #include -cmph_fnv_state_t *cmph_fnv_state_new() +fnv_state_t *fnv_state_new() { - cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); state->hashfunc = CMPH_HASH_FNV; return state; } -void cmph_fnv_state_destroy(cmph_fnv_state_t *state) +void fnv_state_destroy(fnv_state_t *state) { free(state); } -cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen) { const unsigned char *bp = (const unsigned char *)k; const unsigned char *be = bp + keylen; @@ -31,16 +31,16 @@ cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 ke } -void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen) +void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen) +fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) { - cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); state->hashfunc = CMPH_HASH_FNV; return state; } diff --git a/src/fnv_hash.h b/src/fnv_hash.h index e9e54fa..e73e0f6 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct cmph__fnv_state_t +typedef struct __fnv_state_t { CMPH_HASH hashfunc; -} cmph_fnv_state_t; +} fnv_state_t; -cmph_fnv_state_t *cmph_fnv_state_new(); -cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen); -void cmph_fnv_state_destroy(cmph_fnv_state_t *state); +fnv_state_t *fnv_state_new(); +cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); +void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); +void fnv_state_destroy(fnv_state_t *state); #endif diff --git a/src/graph.c b/src/graph.c index 60e2d13..5f1346e 100644 --- a/src/graph.c +++ b/src/graph.c @@ -6,18 +6,19 @@ #include #include #include "vstack.h" +#include "bitbool.h" //#define DEBUG #include "debug.h" -static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; -#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) -#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) -#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) +/* static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ #define abs_edge(e, i) (e % g->nedges + i * g->nedges) -struct cmph__graph_t +struct __graph_t { cmph_uint32 nnodes; cmph_uint32 nedges; @@ -32,9 +33,9 @@ struct cmph__graph_t static cmph_uint32 EMPTY = UINT_MAX; -cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) +graph_t *graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) { - cmph_graph_t *graph = (cmph_graph_t *)malloc(sizeof(cmph_graph_t)); + graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); if (!graph) return NULL; graph->edges = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); @@ -45,12 +46,12 @@ cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) graph->nnodes = nnodes; graph->nedges = nedges; - cmph_graph_clear_edges(graph); + graph_clear_edges(graph); return graph; } -void cmph_graph_destroy(cmph_graph_t *graph) +void graph_destroy(graph_t *graph) { DEBUGP("Destroying graph\n"); free(graph->edges); @@ -61,7 +62,7 @@ void cmph_graph_destroy(cmph_graph_t *graph) return; } -void cmph_graph_print(cmph_graph_t *g) +void graph_print(graph_t *g) { cmph_uint32 i, e; for (i = 0; i < g->nnodes; ++i) @@ -81,7 +82,7 @@ void cmph_graph_print(cmph_graph_t *g) return; } -void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +void graph_add_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { cmph_uint32 e = g->cedges; @@ -101,7 +102,7 @@ void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) ++(g->cedges); } -static int check_edge(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) +static int check_edge(graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) { DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; @@ -109,7 +110,7 @@ static int check_edge(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint3 return 0; } -cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +cmph_uint32 graph_edge_id(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { cmph_uint32 e; e = g->first[v1]; @@ -123,7 +124,7 @@ cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) while (!check_edge(g, e, v1, v2)); return abs_edge(e, 0); } -static void del_edge_point(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +static void del_edge_point(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { cmph_uint32 e, prev; @@ -151,14 +152,14 @@ static void del_edge_point(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) } -void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +void graph_del_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { g->shrinking = 1; del_edge_point(g, v1, v2); del_edge_point(g, v2, v1); } -void cmph_graph_clear_edges(cmph_graph_t *g) +void graph_clear_edges(graph_t *g) { cmph_uint32 i; for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; @@ -171,7 +172,7 @@ void cmph_graph_clear_edges(cmph_graph_t *g) g->shrinking = 0; } -static int find_degree1_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted, cmph_uint32 *e) +static int find_degree1_edge(graph_t *g, cmph_uint32 v, char *deleted, cmph_uint32 *e) { cmph_uint32 edge = g->first[v]; char found = 0; @@ -195,7 +196,7 @@ static int find_degree1_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted, cmph return found; } -static void cyclic_del_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted) +static void cyclic_del_edge(graph_t *g, cmph_uint32 v, char *deleted) { cmph_uint32 e; @@ -224,7 +225,7 @@ static void cyclic_del_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted) } } -int cmph_graph_is_cyclic(cmph_graph_t *g) +int graph_is_cyclic(graph_t *g) { cmph_uint32 i; cmph_uint32 v; @@ -249,12 +250,12 @@ int cmph_graph_is_cyclic(cmph_graph_t *g) return 0; } -cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v) /* included -- Fabiano */ +cmph_uint8 graph_node_is_critical(graph_t * g, cmph_uint32 v) /* included -- Fabiano */ { return GETBIT(g->critical_nodes,v); } -void cmph_graph_obtain_critical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ +void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ { cmph_uint32 i; cmph_uint32 v; @@ -290,7 +291,7 @@ void cmph_graph_obtain_critical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ free(deleted); } -cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ +cmph_uint8 graph_contains_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ { cmph_uint32 e; e = g->first[v1]; @@ -305,27 +306,27 @@ cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 return 1; } -cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ +cmph_uint32 graph_vertex_id(graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ { return (g->edges[e + id*g->nedges]); } -cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ +cmph_uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ { return g->ncritical_nodes; } -cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v) +graph_iterator_t graph_neighbors_it(graph_t *g, cmph_uint32 v) { - cmph_graph_iterator_t it; + graph_iterator_t it; it.vertex = v; it.edge = g->first[v]; return it; } -cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it) +cmph_uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) { cmph_uint32 ret; - if(it->edge == EMPTY) return CMPH_GRAPH_NO_NEIGHBOR; + if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; else ret = g->edges[it->edge]; it->edge = g->next[it->edge]; diff --git a/src/graph.h b/src/graph.h index dc80b05..e1b5de6 100644 --- a/src/graph.h +++ b/src/graph.h @@ -4,11 +4,11 @@ #include #include "cmph_types.h" -#define CMPH_GRAPH_NO_NEIGHBOR UINT_MAX +#define GRAPH_NO_NEIGHBOR UINT_MAX -typedef struct cmph__graph_t cmph_graph_t; -typedef struct cmph__graph_iterator_t cmph_graph_iterator_t; -struct cmph__graph_iterator_t +typedef struct __graph_t graph_t; +typedef struct __graph_iterator_t graph_iterator_t; +struct __graph_iterator_t { cmph_uint32 vertex; cmph_uint32 edge; @@ -16,25 +16,25 @@ struct cmph__graph_iterator_t -cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); -void cmph_graph_destroy(cmph_graph_t *graph); +graph_t *graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); +void graph_destroy(graph_t *graph); -void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -void cmph_graph_clear_edges(cmph_graph_t *g); -cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_add_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_del_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_clear_edges(graph_t *g); +cmph_uint32 graph_edge_id(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +cmph_uint8 graph_contains_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v); -cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it); +graph_iterator_t graph_neighbors_it(graph_t *g, cmph_uint32 v); +cmph_uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); -void cmph_graph_obtain_critical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ -cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v); /* included -- Fabiano */ -cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ -cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ +void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ +cmph_uint8 graph_node_is_critical(graph_t * g, cmph_uint32 v); /* included -- Fabiano */ +cmph_uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ +cmph_uint32 graph_vertex_id(graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ -int cmph_graph_is_cyclic(cmph_graph_t *g); +int graph_is_cyclic(graph_t *g); -void cmph_graph_print(cmph_graph_t *); +void graph_print(graph_t *); #endif diff --git a/src/hash.c b/src/hash.c index 639f799..369ea3b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -7,26 +7,26 @@ //#define DEBUG #include "debug.h" -const char *cmph_hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; +const char *cmph_hash_names[] = { "djb2", "fnv", "glib", "jenkins", "pjw", "sdbm", NULL }; -cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) +hash_state_t *hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) { - cmph_hash_state_t *state = NULL; + hash_state_t *state = NULL; switch (hashfunc) { case CMPH_HASH_JENKINS: DEBUGP("Jenkins function - %u\n", hashsize); - state = (cmph_hash_state_t *)cmph_jenkins_state_new(hashsize); + state = (hash_state_t *)jenkins_state_new(hashsize); DEBUGP("Jenkins function created\n"); break; case CMPH_HASH_DJB2: - state = (cmph_hash_state_t *)cmph_djb2_state_new(); + state = (hash_state_t *)djb2_state_new(); break; case CMPH_HASH_SDBM: - state = (cmph_hash_state_t *)cmph_sdbm_state_new(); + state = (hash_state_t *)sdbm_state_new(); break; case CMPH_HASH_FNV: - state = (cmph_hash_state_t *)cmph_fnv_state_new(); + state = (hash_state_t *)fnv_state_new(); break; default: assert(0); @@ -34,18 +34,18 @@ cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) state->hashfunc = hashfunc; return state; } -cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen) +cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen) { switch (state->hashfunc) { case CMPH_HASH_JENKINS: - return cmph_jenkins_hash((cmph_jenkins_state_t *)state, key, keylen); + return jenkins_hash((jenkins_state_t *)state, key, keylen); case CMPH_HASH_DJB2: - return cmph_djb2_hash((cmph_djb2_state_t *)state, key, keylen); + return djb2_hash((djb2_state_t *)state, key, keylen); case CMPH_HASH_SDBM: - return cmph_sdbm_hash((cmph_sdbm_state_t *)state, key, keylen); + return sdbm_hash((sdbm_state_t *)state, key, keylen); case CMPH_HASH_FNV: - return cmph_fnv_hash((cmph_fnv_state_t *)state, key, keylen); + return fnv_hash((fnv_state_t *)state, key, keylen); default: assert(0); } @@ -53,25 +53,25 @@ cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 key return 0; } -void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen) +void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) { char *algobuf; switch (state->hashfunc) { case CMPH_HASH_JENKINS: - cmph_jenkins_state_dump((cmph_jenkins_state_t *)state, &algobuf, buflen); + jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; case CMPH_HASH_DJB2: - cmph_djb2_state_dump((cmph_djb2_state_t *)state, &algobuf, buflen); + djb2_state_dump((djb2_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; case CMPH_HASH_SDBM: - cmph_sdbm_state_dump((cmph_sdbm_state_t *)state, &algobuf, buflen); + sdbm_state_dump((sdbm_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; case CMPH_HASH_FNV: - cmph_fnv_state_dump((cmph_fnv_state_t *)state, &algobuf, buflen); + fnv_state_dump((fnv_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; default: @@ -86,7 +86,7 @@ void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buf return; } -cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen) +hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) { cmph_uint32 i; cmph_uint32 offset; @@ -104,33 +104,33 @@ cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen) switch (hashfunc) { case CMPH_HASH_JENKINS: - return (cmph_hash_state_t *)cmph_jenkins_state_load(buf + offset, buflen - offset); + return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); case CMPH_HASH_DJB2: - return (cmph_hash_state_t *)cmph_djb2_state_load(buf + offset, buflen - offset); + return (hash_state_t *)djb2_state_load(buf + offset, buflen - offset); case CMPH_HASH_SDBM: - return (cmph_hash_state_t *)cmph_sdbm_state_load(buf + offset, buflen - offset); + return (hash_state_t *)sdbm_state_load(buf + offset, buflen - offset); case CMPH_HASH_FNV: - return (cmph_hash_state_t *)cmph_fnv_state_load(buf + offset, buflen - offset); + return (hash_state_t *)fnv_state_load(buf + offset, buflen - offset); default: return NULL; } return NULL; } -void cmph_hash_state_destroy(cmph_hash_state_t *state) +void hash_state_destroy(hash_state_t *state) { switch (state->hashfunc) { case CMPH_HASH_JENKINS: - cmph_jenkins_state_destroy((cmph_jenkins_state_t *)state); + jenkins_state_destroy((jenkins_state_t *)state); break; case CMPH_HASH_DJB2: - cmph_djb2_state_destroy((cmph_djb2_state_t *)state); + djb2_state_destroy((djb2_state_t *)state); break; case CMPH_HASH_SDBM: - cmph_sdbm_state_destroy((cmph_sdbm_state_t *)state); + sdbm_state_destroy((sdbm_state_t *)state); break; case CMPH_HASH_FNV: - cmph_fnv_state_destroy((cmph_fnv_state_t *)state); + fnv_state_destroy((fnv_state_t *)state); break; default: assert(0); diff --git a/src/hash.h b/src/hash.h index 371c1c9..2397c33 100644 --- a/src/hash.h +++ b/src/hash.h @@ -3,12 +3,12 @@ #include "cmph_types.h" -typedef union cmph__hash_state_t cmph_hash_state_t; +typedef union __hash_state_t hash_state_t; -cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH, cmph_uint32 hashsize); -cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen); -void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen); -void cmph_hash_state_destroy(cmph_hash_state_t *state); +hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); +cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); +void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); +hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); +void hash_state_destroy(hash_state_t *state); #endif diff --git a/src/hash_state.h b/src/hash_state.h index 39f0d68..67dcd77 100644 --- a/src/hash_state.h +++ b/src/hash_state.h @@ -6,13 +6,13 @@ #include "djb2_hash.h" #include "sdbm_hash.h" #include "fnv_hash.h" -union cmph__hash_state_t +union __hash_state_t { CMPH_HASH hashfunc; - cmph_jenkins_state_t jenkins; - cmph_djb2_state_t djb2; - cmph_sdbm_state_t sdbm; - cmph_fnv_state_t fnv; + jenkins_state_t jenkins; + djb2_state_t djb2; + sdbm_state_t sdbm; + fnv_state_t fnv; }; #endif diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 1971276..c849ec8 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -84,9 +84,9 @@ Use for hash table lookup, or anything where one collision in 2^^32 is acceptable. Do NOT use for cryptographic purposes. -------------------------------------------------------------------- */ -cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size) //size of hash table +jenkins_state_t *jenkins_state_new(cmph_uint32 size) //size of hash table { - cmph_jenkins_state_t *state = (cmph_jenkins_state_t *)malloc(sizeof(cmph_jenkins_state_t)); + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); @@ -94,12 +94,12 @@ cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size) //size of hash ta DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } -void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state) +void jenkins_state_destroy(jenkins_state_t *state) { free(state); } -cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen) { cmph_uint32 a, b, c; cmph_uint32 len, length; @@ -162,7 +162,7 @@ cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_u return c; } -void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen) +void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { *buflen = sizeof(cmph_uint32)*3; *buf = malloc(*buflen); @@ -178,9 +178,9 @@ void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint3 return; } -cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen) +jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { - cmph_jenkins_state_t *state = (cmph_jenkins_state_t *)malloc(sizeof(cmph_jenkins_state_t)); + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); state->seed = *(cmph_uint32 *)buf; state->nbits = *(((cmph_uint32 *)buf) + 1); state->size = *(((cmph_uint32 *)buf) + 2); diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index 2086d7c..baa6209 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -3,18 +3,18 @@ #include "hash.h" -typedef struct cmph__jenkins_state_t +typedef struct __jenkins_state_t { CMPH_HASH hashfunc; cmph_uint32 seed; cmph_uint32 nbits; cmph_uint32 size; -} cmph_jenkins_state_t; +} jenkins_state_t; -cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size); //size of hash table -cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen); -void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state); +jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table +cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); +void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); +void jenkins_state_destroy(jenkins_state_t *state); #endif diff --git a/src/main.c b/src/main.c index fcc9d01..21ab419 100644 --- a/src/main.c +++ b/src/main.c @@ -106,8 +106,8 @@ int main(int argc, char **argv) cmph_uint32 i; CMPH_ALGO mph_algo = CMPH_CZECH; float c = 2.09; - cmph_mph_t *mph = NULL; - cmph_mphf_t *mphf = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf = NULL; cmph_key_source_t source; @@ -243,18 +243,18 @@ int main(int argc, char **argv) if (generate) { //Create mphf - - mph = cmph_mph_new(mph_algo, &source); - if (nhashes) cmph_mph_set_hashfuncs(mph, hashes); - cmph_mph_set_verbosity(mph, verbosity); + config = cmph_config_new(&source); + cmph_config_set_algo(config, mph_algo); + if (nhashes) cmph_config_set_hashfuncs(config, hashes); + cmph_config_set_verbosity(config, verbosity); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; - if (c != 0) cmph_mph_set_graphsize(mph, c); - mphf = cmph_mph_create(mph); + if (c != 0) cmph_config_set_graphsize(config, c); + mphf = cmph_new(config); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - cmph_mph_destroy(mph); + cmph_config_destroy(config); free(mphf_file); return -1; } @@ -266,13 +266,13 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - cmph_mphf_dump(mphf, mphf_fd); - cmph_mphf_destroy(mphf); + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); fclose(mphf_fd); } else { - cmph_uint8 * hashtable = NULL; + cmph_uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { @@ -280,7 +280,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - mphf = cmph_mphf_load(mphf_fd); + mphf = cmph_load(mphf_fd); fclose(mphf_fd); if (!mphf) { @@ -297,7 +297,7 @@ int main(int argc, char **argv) char *buf; cmph_uint32 buflen = 0; source.read(source.data, &buf, &buflen); - h = cmph_mphf_search(mphf, buf, buflen); + h = cmph_search(mphf, buf, buflen); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; @@ -307,7 +307,7 @@ int main(int argc, char **argv) } source.dispose(source.data, buf, buflen); } - cmph_mphf_destroy(mphf); + cmph_destroy(mphf); free(hashtable); } fclose(keys_fd); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index 0a0b8fd..bddcce6 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -1,19 +1,19 @@ #include "sdbm_hash.h" #include -cmph_sdbm_state_t *cmph_sdbm_state_new() +sdbm_state_t *sdbm_state_new() { - cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); state->hashfunc = CMPH_HASH_SDBM; return state; } -void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state) +void sdbm_state_destroy(sdbm_state_t *state) { free(state); } -cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 0; const unsigned char *ptr = k; @@ -27,16 +27,16 @@ cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 } -void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen) +void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen) +sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) { - cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); state->hashfunc = CMPH_HASH_SDBM; return state; } diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index 39cd3bb..a05daae 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct cmph__sdbm_state_t +typedef struct __sdbm_state_t { CMPH_HASH hashfunc; -} cmph_sdbm_state_t; +} sdbm_state_t; -cmph_sdbm_state_t *cmph_sdbm_state_new(); -cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen); -void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state); +sdbm_state_t *sdbm_state_new(); +cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); +void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); +void sdbm_state_destroy(sdbm_state_t *state); #endif diff --git a/src/vqueue.c b/src/vqueue.c index e893b5b..0e55095 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -2,15 +2,15 @@ #include #include #include -struct cmph__vqueue_t +struct __vqueue_t { cmph_uint32 * values; cmph_uint32 beg, end, capacity; }; -cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity) +vqueue_t * vqueue_new(cmph_uint32 capacity) { - cmph_vqueue_t *q = (cmph_vqueue_t *)malloc(sizeof(cmph_vqueue_t)); + vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); assert(q); q->values = (cmph_uint32 *)calloc(capacity+1, sizeof(cmph_uint32)); q->beg = q->end = 0; @@ -18,33 +18,33 @@ cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity) return q; } -cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q) +cmph_uint8 vqueue_is_empty(vqueue_t * q) { return (q->beg == q->end); } -void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val) +void vqueue_insert(vqueue_t * q, cmph_uint32 val) { assert((q->end + 1)%q->capacity != q->beg); // Is queue full? q->end = (q->end + 1)%q->capacity; q->values[q->end] = val; } -cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q) +cmph_uint32 vqueue_remove(vqueue_t * q) { - assert(!cmph_vqueue_is_empty(q)); // Is queue empty? + assert(!vqueue_is_empty(q)); // Is queue empty? q->beg = (q->beg + 1)%q->capacity; return q->values[q->beg]; } -void cmph_vqueue_print(cmph_vqueue_t * q) +void vqueue_print(vqueue_t * q) { cmph_uint32 i; for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); } -void cmph_vqueue_destroy(cmph_vqueue_t *q) +void vqueue_destroy(vqueue_t *q) { free(q->values); q->values = NULL; } diff --git a/src/vqueue.h b/src/vqueue.h index d0853a9..86fccab 100644 --- a/src/vqueue.h +++ b/src/vqueue.h @@ -2,17 +2,17 @@ #define __CMPH_VQUEUE_H__ #include "cmph_types.h" -typedef struct cmph__vqueue_t cmph_vqueue_t; +typedef struct __vqueue_t vqueue_t; -cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity); +vqueue_t * vqueue_new(cmph_uint32 capacity); -cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q); +cmph_uint8 vqueue_is_empty(vqueue_t * q); -void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val); +void vqueue_insert(vqueue_t * q, cmph_uint32 val); -cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q); +cmph_uint32 vqueue_remove(vqueue_t * q); -void cmph_vqueue_print(cmph_vqueue_t * q); +void vqueue_print(vqueue_t * q); -void cmph_vqueue_destroy(cmph_vqueue_t * q); +void vqueue_destroy(vqueue_t * q); #endif diff --git a/src/vstack.c b/src/vstack.c index a74f667..24555cd 100644 --- a/src/vstack.c +++ b/src/vstack.c @@ -6,16 +6,16 @@ //#define DEBUG #include "debug.h" -struct cmph__vstack_t +struct __vstack_t { cmph_uint32 pointer; cmph_uint32 *values; cmph_uint32 capacity; }; -cmph_vstack_t *cmph_vstack_new() +vstack_t *vstack_new() { - cmph_vstack_t *stack = (cmph_vstack_t *)malloc(sizeof(cmph_vstack_t)); + vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); assert(stack); stack->pointer = 0; stack->values = NULL; @@ -23,43 +23,43 @@ cmph_vstack_t *cmph_vstack_new() return stack; } -void cmph_vstack_destroy(cmph_vstack_t *stack) +void vstack_destroy(vstack_t *stack) { assert(stack); free(stack->values); free(stack); } -void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val) +void vstack_push(vstack_t *stack, cmph_uint32 val) { assert(stack); - cmph_vstack_reserve(stack, stack->pointer + 1); + vstack_reserve(stack, stack->pointer + 1); stack->values[stack->pointer] = val; ++(stack->pointer); } -void cmph_vstack_pop(cmph_vstack_t *stack) +void vstack_pop(vstack_t *stack) { assert(stack); assert(stack->pointer > 0); --(stack->pointer); } -cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack) +cmph_uint32 vstack_top(vstack_t *stack) { assert(stack); assert(stack->pointer > 0); return stack->values[(stack->pointer - 1)]; } -int cmph_vstack_empty(cmph_vstack_t *stack) +int vstack_empty(vstack_t *stack) { assert(stack); return stack->pointer == 0; } -cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack) +cmph_uint32 vstack_size(vstack_t *stack) { return stack->pointer; } -void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size) +void vstack_reserve(vstack_t *stack, cmph_uint32 size) { assert(stack); if (stack->capacity < size) diff --git a/src/vstack.h b/src/vstack.h index 8552a43..1cefaaf 100644 --- a/src/vstack.h +++ b/src/vstack.h @@ -2,17 +2,17 @@ #define __CMPH_VSTACK_H__ #include "cmph_types.h" -typedef struct cmph__vstack_t cmph_vstack_t; +typedef struct __vstack_t vstack_t; -cmph_vstack_t *cmph_vstack_new(); -void cmph_vstack_destroy(cmph_vstack_t *stack); +vstack_t *vstack_new(); +void vstack_destroy(vstack_t *stack); -void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val); -cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack); -void cmph_vstack_pop(cmph_vstack_t *stack); -int cmph_vstack_empty(cmph_vstack_t *stack); -cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack); +void vstack_push(vstack_t *stack, cmph_uint32 val); +cmph_uint32 vstack_top(vstack_t *stack); +void vstack_pop(vstack_t *stack); +int vstack_empty(vstack_t *stack); +cmph_uint32 vstack_size(vstack_t *stack); -void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size); +void vstack_reserve(vstack_t *stack, cmph_uint32 size); #endif From d3788d43a84620be55412eea301e631cdc5631f1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 21 Jan 2005 20:42:33 +0000 Subject: [PATCH 036/739] Only public symbols were prefixed with cmph, and the API was changed to agree with the initial txt2html documentation --- src/bmz.c | 232 +++++++++++++++++++++----------------------- src/bmz.h | 25 +++-- src/bmz_structs.h | 14 +-- src/cmph.c | 85 ++++++++-------- src/cmph.h | 27 +++--- src/cmph_structs.c | 15 ++- src/cmph_structs.h | 12 +-- src/czech.c | 134 ++++++++++++------------- src/czech.h | 25 +++-- src/czech_structs.h | 14 +-- src/djb2_hash.c | 14 +-- src/djb2_hash.h | 14 +-- src/fnv_hash.c | 14 +-- src/fnv_hash.h | 14 +-- src/graph.c | 57 +++++------ src/graph.h | 38 ++++---- src/hash.c | 54 +++++------ src/hash.h | 12 +-- src/hash_state.h | 10 +- src/jenkins_hash.c | 14 +-- src/jenkins_hash.h | 14 +-- src/main.c | 30 +++--- src/sdbm_hash.c | 14 +-- src/sdbm_hash.h | 14 +-- src/vqueue.c | 18 ++-- src/vqueue.h | 14 +-- src/vstack.c | 22 ++--- src/vstack.h | 18 ++-- 28 files changed, 475 insertions(+), 493 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index b06e0c4..7b29a86 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -1,8 +1,10 @@ +#include "graph.h" #include "bmz.h" #include "cmph_structs.h" #include "bmz_structs.h" #include "hash.h" #include "vqueue.h" +#include "bitbool.h" #include #include @@ -15,49 +17,39 @@ //static cmph_uint32 UNDEFINED = UINT_MAX; -static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; -#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) -#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) -#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) +/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ -static int bmz_gen_edges(cmph_mph_t *mph); -static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); -static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); -static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); +static int bmz_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); - -cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source) +bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = NULL; - cmph_bmz_mph_data_t *bmz = NULL; - mph = cmph__mph_new(CMPH_BMZ, key_source); - if (mph == NULL) return NULL; - bmz = (cmph_bmz_mph_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); - if (bmz == NULL) - { - cmph__mph_destroy(mph); - return NULL; - } + bmz_config_data_t *bmz = NULL; + bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; - mph->data = bmz; - assert(mph->data); - return mph; -} -void cmph_bmz_mph_destroy(cmph_mph_t *mph) -{ - cmph_bmz_mph_data_t *data = (cmph_bmz_mph_data_t *)mph->data; - DEBUGP("Destroying algorithm dependent data\n"); - free(data); - cmph__mph_destroy(mph); + assert(bmz); + return bmz; } -void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) +void bmz_config_destroy(cmph_config_t *mph) { - cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + bmz_config_data_t *data = (bmz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) @@ -68,10 +60,10 @@ void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) } } -cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) +cmph_t *bmz_new(cmph_config_t *mph, float c) { - cmph_mphf_t *mphf = NULL; - cmph_bmz_mphf_data_t *bmzf = NULL; + cmph_t *mphf = NULL; + bmz_data_t *bmzf = NULL; cmph_uint32 i; cmph_uint32 iterations; cmph_uint32 iterations_map = 20; @@ -79,15 +71,15 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - DEBUGP("bmz_c: %f\n", bmz_c); - cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + DEBUGP("c: %f\n", c); + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; bmz->m = mph->key_source->nkeys; - bmz->n = ceil(bmz_c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u bmz_c: %f\n", bmz->m, bmz->n, bmz_c); - bmz->graph = cmph_graph_new(bmz->n, bmz->m); + bmz->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); + bmz->graph = graph_new(bmz->n, bmz->m); DEBUGP("Created graph\n"); - bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; do @@ -104,17 +96,17 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) { int ok; DEBUGP("hash function 1\n"); - bmz->hashes[0] = cmph_hash_state_new(bmz->hashfuncs[0], bmz->n); + bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); - bmz->hashes[1] = cmph_hash_state_new(bmz->hashfuncs[1], bmz->n); + bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { --iterations; - cmph_hash_state_destroy(bmz->hashes[0]); + hash_state_destroy(bmz->hashes[0]); bmz->hashes[0] = NULL; - cmph_hash_state_destroy(bmz->hashes[1]); + hash_state_destroy(bmz->hashes[1]); bmz->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -127,7 +119,7 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) } if (iterations == 0) { - cmph_graph_destroy(bmz->graph); + graph_destroy(bmz->graph); return NULL; } @@ -137,7 +129,7 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) fprintf(stderr, "Starting ordering step\n"); } - cmph_graph_obtain_critical_nodes(bmz->graph); + graph_obtain_critical_nodes(bmz->graph); // Searching step if (mph->verbosity) @@ -155,9 +147,9 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { - if (cmph_graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) + if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) { - if(bmz_c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); if(restart_mapping) break; } @@ -178,12 +170,12 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - cmph_graph_destroy(bmz->graph); + graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) return NULL; - mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); + mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - bmzf = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mph_data_t)); + bmzf = (bmz_data_t *)malloc(sizeof(bmz_config_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; @@ -200,41 +192,41 @@ cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c) return mphf; } -static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint32 next_g; cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph)) + 1); - cmph_graph_iterator_t it, it1; + vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); + graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - cmph_vqueue_insert(q, v); - while(!cmph_vqueue_is_empty(q)) + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) { - v = cmph_vqueue_remove(q); - it = cmph_graph_neighbors_it(bmz->graph, v); - while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { collision = 1; while(collision) // lookahead to resolve collisions { next_g = *biggest_g_value + 1; - it1 = cmph_graph_neighbors_it(bmz->graph, u); + it1 = graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - cmph_vqueue_destroy(q); + vqueue_destroy(q); return 1; // restart mapping step. } if (GETBIT(used_edges, next_g + bmz->g[lav])) @@ -247,10 +239,10 @@ static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uin if (next_g > *biggest_g_value) *biggest_g_value = next_g; } // Marking used edges... - it1 = cmph_graph_neighbors_it(bmz->graph, u); - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -258,16 +250,16 @@ static cmph_uint8 bmz_traverse_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uin } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited,u); - cmph_vqueue_insert(q, u); + vqueue_insert(q, u); } } } - cmph_vqueue_destroy(q); + vqueue_destroy(q); return 0; } -static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint32 next_g; cmph_uint32 u; /* Auxiliary vertex */ @@ -276,21 +268,21 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz cmph_uint32 * unused_g_values = NULL; cmph_uint32 unused_g_values_capacity = 0; cmph_uint32 nunused_g_values = 0; - cmph_vqueue_t * q = cmph_vqueue_new((cmph_uint32)(0.5*cmph_graph_ncritical_nodes(bmz->graph))+1); - cmph_graph_iterator_t it, it1; + vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); + graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ - cmph_vqueue_insert(q, v); - while(!cmph_vqueue_is_empty(q)) + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) { - v = cmph_vqueue_remove(q); - it = cmph_graph_neighbors_it(bmz->graph, v); - while ((u = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) { cmph_uint32 next_g_index = 0; collision = 1; @@ -305,15 +297,15 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz next_g = *biggest_g_value + 1; next_g_index = UINT_MAX; } - it1 = cmph_graph_neighbors_it(bmz->graph, u); + it1 = graph_neighbors_it(bmz->graph, u); collision = 0; - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) { if(next_g + bmz->g[lav] >= bmz->m) { - cmph_vqueue_destroy(q); + vqueue_destroy(q); free(unused_g_values); return 1; // restart mapping step. } @@ -340,10 +332,10 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; // Marking used edges... - it1 = cmph_graph_neighbors_it(bmz->graph, u); - while((lav = cmph_graph_next_neighbor(bmz->graph, &it1)) != CMPH_GRAPH_NO_NEIGHBOR) + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) { - if (cmph_graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) { SETBIT(used_edges,next_g + bmz->g[lav]); if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; @@ -351,17 +343,17 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(cmph_bmz_mph_data_t *bmz } bmz->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - cmph_vqueue_insert(q, u); + vqueue_insert(q, u); } } } - cmph_vqueue_destroy(q); + vqueue_destroy(q); free(unused_g_values); return 0; } -static cmph_uint32 next_unused_edge(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) +static cmph_uint32 next_unused_edge(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) { while(1) { @@ -372,11 +364,11 @@ static cmph_uint32 next_unused_edge(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_ return unused_edge_index; } -static void bmz_traverse(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) +static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) { - cmph_graph_iterator_t it = cmph_graph_neighbors_it(bmz->graph, v); + graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; - while((neighbor = cmph_graph_next_neighbor(bmz->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); @@ -389,15 +381,15 @@ static void bmz_traverse(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph } } -static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) +static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint32 i, v1, v2, unused_edge_index = 0; DEBUGP("Labelling non critical vertices\n"); for(i = 0; i < bmz->m; i++) { - v1 = cmph_graph_vertex_id(bmz->graph, i, 0); - v2 = cmph_graph_vertex_id(bmz->graph, i, 1); + v1 = graph_vertex_id(bmz->graph, i, 0); + v2 = graph_vertex_id(bmz->graph, i, 1); if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); @@ -416,14 +408,14 @@ static void bmz_traverse_non_critical_nodes(cmph_bmz_mph_data_t *bmz, cmph_uint8 } -static int bmz_gen_edges(cmph_mph_t *mph) +static int bmz_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - cmph_bmz_mph_data_t *bmz = (cmph_bmz_mph_data_t *)mph->data; + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; cmph_uint8 multiple_edges = 0; DEBUGP("Generating edges for %u vertices\n", bmz->n); - cmph_graph_clear_edges(bmz->graph); + graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -431,8 +423,8 @@ static int bmz_gen_edges(cmph_mph_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; - h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; + h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; if (h1 == h2) { @@ -442,34 +434,34 @@ static int bmz_gen_edges(cmph_mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - multiple_edges = cmph_graph_contains_edge(bmz->graph, h1, h2); + multiple_edges = graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. - cmph_graph_add_edge(bmz->graph, h1, h2); + graph_add_edge(bmz->graph, h1, h2); } return !multiple_edges; } -int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *fd) +int bmz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions - cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; + bmz_data_t *data = (bmz_data_t *)mphf->data; cmph_uint32 nn, nm; - cmph__mphf_dump(mphf, fd); + __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); - cmph_hash_state_dump(data->hashes[0], &buf, &buflen); + hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - cmph_hash_state_dump(data->hashes[1], &buf, &buflen); + hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); @@ -487,28 +479,28 @@ int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *fd) return 1; } -void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf) +void bmz_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - cmph_bmz_mphf_data_t *bmz = (cmph_bmz_mphf_data_t *)malloc(sizeof(cmph_bmz_mphf_data_t)); + bmz_data_t *bmz = (bmz_data_t *)malloc(sizeof(bmz_data_t)); DEBUGP("Loading bmz mphf\n"); mphf->data = bmz; fread(&nhashes, sizeof(cmph_uint32), 1, f); - bmz->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); bmz->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - cmph_hash_state_t *state = NULL; + hash_state_t *state = NULL; fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = cmph_hash_state_load(buf, buflen); + state = hash_state_load(buf, buflen); bmz->hashes[i] = state; free(buf); } @@ -528,22 +520,22 @@ void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf) } -cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - cmph_bmz_mphf_data_t *bmz = mphf->data; - cmph_uint32 h1 = cmph_hash(bmz->hashes[0], key, keylen) % bmz->n; - cmph_uint32 h2 = cmph_hash(bmz->hashes[1], key, keylen) % bmz->n; + bmz_data_t *bmz = mphf->data; + cmph_uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + cmph_uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); return bmz->g[h1] + bmz->g[h2]; } -void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf) +void bmz_destroy(cmph_t *mphf) { - cmph_bmz_mphf_data_t *data = (cmph_bmz_mphf_data_t *)mphf->data; + bmz_data_t *data = (bmz_data_t *)mphf->data; free(data->g); - cmph_hash_state_destroy(data->hashes[0]); - cmph_hash_state_destroy(data->hashes[1]); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/bmz.h b/src/bmz.h index 6095b91..7a81a02 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -1,19 +1,18 @@ -#ifndef __BMZ_H__ -#define __BMZ_H__ +#ifndef __CMPH_BMZ_H__ +#define __CMPH_BMZ_H__ -#include "graph.h" #include "cmph.h" -typedef struct cmph__bmz_mphf_data_t cmph_bmz_mphf_data_t; -typedef struct cmph__bmz_mph_data_t cmph_bmz_mph_data_t; +typedef struct __bmz_data_t bmz_data_t; +typedef struct __bmz_config_data_t bmz_config_data_t; -cmph_mph_t *cmph_bmz_mph_new(cmph_key_source_t *key_source); -void cmph_bmz_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); -void cmph_bmz_mph_destroy(cmph_mph_t *mph); -cmph_mphf_t *cmph_bmz_mph_create(cmph_mph_t *mph, float bmz_c); +bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source); +void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz_config_destroy(cmph_config_t *mph); +cmph_t *bmz_new(cmph_config_t *mph, float c); -void cmph_bmz_mphf_load(FILE *f, cmph_mphf_t *mphf); -int cmph_bmz_mphf_dump(cmph_mphf_t *mphf, FILE *f); -void cmph_bmz_mphf_destroy(cmph_mphf_t *mphf); -cmph_uint32 cmph_bmz_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); +void bmz_load(FILE *f, cmph_t *mphf); +int bmz_dump(cmph_t *mphf, FILE *f); +void bmz_destroy(cmph_t *mphf); +cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/bmz_structs.h b/src/bmz_structs.h index a906d6d..63378e5 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -1,24 +1,24 @@ -#ifndef __BMZ_STRUCTS_H__ -#define __BMZ_STRUCTS_H__ +#ifndef __CMPH_BMZ_STRUCTS_H__ +#define __CMPH_BMZ_STRUCTS_H__ #include "hash_state.h" -struct cmph__bmz_mphf_data_t +struct __bmz_data_t { cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; -struct cmph__bmz_mph_data_t +struct __bmz_config_data_t { CMPH_HASH hashfuncs[2]; cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count - cmph_graph_t *graph; + graph_t *graph; cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; #endif diff --git a/src/cmph.c b/src/cmph.c index 74e5bad..bb52106 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -10,85 +10,84 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "czech", "bmz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "czech", NULL }; /* included -- Fabiano */ -cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) +cmph_config_t *cmph_config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = NULL; - DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); - switch (algo) - { - case CMPH_CZECH: - mph = cmph_czech_mph_new(key_source); - break; - case CMPH_BMZ: /* included -- Fabiano */ - DEBUGP("new bmz algorithm \n"); - mph = cmph_bmz_mph_new(key_source); - break; - default: - assert(0); - } + cmph_config_t *mph = NULL; + mph = __config_new(key_source); assert(mph); + mph->algo = CMPH_CZECH; // default value return mph; } -void cmph_mph_destroy(cmph_mph_t *mph) +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + mph->algo = algo; +} + +void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); switch (mph->algo) { case CMPH_CZECH: - cmph_czech_mph_destroy(mph); + czech_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - cmph_bmz_mph_destroy(mph); + bmz_config_destroy(mph); break; default: assert(0); } + __config_destroy(mph); } -void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity) +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity) { mph->verbosity = verbosity; } -void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { switch (mph->algo) { case CMPH_CZECH: - cmph_czech_mph_set_hashfuncs(mph, hashfuncs); + czech_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BMZ: /* included -- Fabiano */ - cmph_bmz_mph_set_hashfuncs(mph, hashfuncs); + bmz_config_set_hashfuncs(mph, hashfuncs); break; default: break; } return; } -void cmph_mph_set_graphsize(cmph_mph_t *mph, float c) +void cmph_config_set_graphsize(cmph_config_t *mph, float c) { mph->c = c; return; } -cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph) +cmph_t *cmph_new(cmph_config_t *mph) { - cmph_mphf_t *mphf = NULL; + cmph_t *mphf = NULL; float c = mph->c; + + DEBUGP("Creating mph with algorithm %s\n", cmph_names[mph->algo]); switch (mph->algo) { case CMPH_CZECH: DEBUGP("Creating czech hash\n"); + mph->data = czech_config_new(mph->key_source); if (c == 0) c = 2.09; - mphf = cmph_czech_mph_create(mph, c); + mphf = czech_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); + mph->data = bmz_config_new(mph->key_source); if (c == 0) c = 1.15; - mphf = cmph_bmz_mph_create(mph, c); + mphf = bmz_new(mph, c); break; default: assert(0); @@ -96,15 +95,15 @@ cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph) return mphf; } -int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f) +int cmph_dump(cmph_t *mphf, FILE *f) { switch (mphf->algo) { case CMPH_CZECH: - return cmph_czech_mphf_dump(mphf, f); + return czech_dump(mphf, f); break; case CMPH_BMZ: /* included -- Fabiano */ - return cmph_bmz_mphf_dump(mphf, f); + return bmz_dump(mphf, f); break; default: assert(0); @@ -112,22 +111,22 @@ int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f) assert(0); return 0; } -cmph_mphf_t *cmph_mphf_load(FILE *f) +cmph_t *cmph_load(FILE *f) { - cmph_mphf_t *mphf = NULL; + cmph_t *mphf = NULL; DEBUGP("Loading mphf generic parts\n"); - mphf = cmph__mphf_load(f); + mphf = __cmph_load(f); if (mphf == NULL) return NULL; DEBUGP("Loading mphf algorithm dependent parts\n"); switch (mphf->algo) { case CMPH_CZECH: - cmph_czech_mphf_load(f, mphf); + czech_load(f, mphf); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Loading bmz algorithm dependent parts\n"); - cmph_bmz_mphf_load(f, mphf); + bmz_load(f, mphf); break; default: assert(0); @@ -137,16 +136,16 @@ cmph_mphf_t *cmph_mphf_load(FILE *f) } -cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { DEBUGP("mphf algorithm: %u \n", mphf->algo); switch(mphf->algo) { case CMPH_CZECH: - return cmph_czech_mphf_search(mphf, key, keylen); + return czech_search(mphf, key, keylen); case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); - return cmph_bmz_mphf_search(mphf, key, keylen); + return bmz_search(mphf, key, keylen); default: assert(0); } @@ -154,20 +153,20 @@ cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 key return 0; } -cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf) +cmph_uint32 cmph_size(cmph_t *mphf) { return mphf->size; } -void cmph_mphf_destroy(cmph_mphf_t *mphf) +void cmph_destroy(cmph_t *mphf) { switch(mphf->algo) { case CMPH_CZECH: - cmph_czech_mphf_destroy(mphf); + czech_destroy(mphf); return; case CMPH_BMZ: /* included -- Fabiano */ - cmph_bmz_mphf_destroy(mphf); + bmz_destroy(mphf); return; default: assert(0); diff --git a/src/cmph.h b/src/cmph.h index 5ad98fb..f74de32 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -11,8 +11,8 @@ extern "C" #include "cmph_types.h" -typedef struct cmph__mph_t cmph_mph_t; -typedef struct cmph__mphf_t cmph_mphf_t; +typedef struct __config_t cmph_config_t; +typedef struct __cmph_t cmph_t; typedef struct { @@ -24,19 +24,20 @@ typedef struct } cmph_key_source_t; /** Hash generation API **/ -cmph_mph_t *cmph_mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); -void cmph_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); -void cmph_mph_set_verbosity(cmph_mph_t *mph, cmph_uint32 verbosity); -void cmph_mph_set_graphsize(cmph_mph_t *mph, float c); -void cmph_mph_destroy(cmph_mph_t *mph); -cmph_mphf_t *cmph_mph_create(cmph_mph_t *mph); +cmph_config_t *cmph_config_new(cmph_key_source_t *key_source); +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); +void cmph_config_set_graphsize(cmph_config_t *mph, float c); +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_destroy(cmph_config_t *mph); +cmph_t *cmph_new(cmph_config_t *mph); /** Hash querying API **/ -cmph_mphf_t *cmph_mphf_load(FILE *f); -int cmph_mphf_dump(cmph_mphf_t *mphf, FILE *f); -cmph_uint32 cmph_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); -cmph_uint32 cmph_mphf_size(cmph_mphf_t *mphf); -void cmph_mphf_destroy(cmph_mphf_t *mphf); +cmph_t *cmph_load(FILE *f); +int cmph_dump(cmph_t *mphf, FILE *f); +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +cmph_uint32 cmph_size(cmph_t *mphf); +void cmph_destroy(cmph_t *mphf); #ifdef __cplusplus } diff --git a/src/cmph_structs.c b/src/cmph_structs.c index ee1e89f..060fbd8 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -5,32 +5,31 @@ //#define DEBUG #include "debug.h" -cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source) +cmph_config_t *__config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = (cmph_mph_t *)malloc(sizeof(cmph_mph_t)); + cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; - mph->algo = algo; mph->key_source = key_source; mph->verbosity = 0; float c = 0; return mph; } -void cmph__mph_destroy(cmph_mph_t *mph) +void __config_destroy(cmph_config_t *mph) { free(mph); } -void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *fd) +void __cmph_dump(cmph_t *mphf, FILE *fd) { cmph_uint32 nsize = htonl(mphf->size); fwrite(cmph_names[mphf->algo], (cmph_uint32)(strlen(cmph_names[mphf->algo]) + 1), 1, fd); fwrite(&nsize, sizeof(mphf->size), 1, fd); } -cmph_mphf_t *cmph__mphf_load(FILE *f) +cmph_t *__cmph_load(FILE *f) { - cmph_mphf_t *mphf = NULL; + cmph_t *mphf = NULL; cmph_uint32 i; char algo_name[BUFSIZ]; char *ptr = algo_name; @@ -56,7 +55,7 @@ cmph_mphf_t *cmph__mphf_load(FILE *f) DEBUGP("Algorithm %s not found\n", algo_name); return NULL; } - mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); + mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = algo; fread(&(mphf->size), sizeof(mphf->size), 1, f); mphf->size = ntohl(mphf->size); diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 65c8784..436e363 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -5,7 +5,7 @@ /** Hash generation algorithm data */ -struct cmph__mph_t +struct __config_t { CMPH_ALGO algo; cmph_key_source_t *key_source; @@ -16,7 +16,7 @@ struct cmph__mph_t /** Hash querying algorithm data */ -struct cmph__mphf_t +struct __cmph_t { CMPH_ALGO algo; cmph_uint32 size; @@ -24,10 +24,10 @@ struct cmph__mphf_t void *data; //algorithm dependent data }; -cmph_mph_t *cmph__mph_new(CMPH_ALGO algo, cmph_key_source_t *key_source); -void cmph__mph_destroy(); -void cmph__mphf_dump(cmph_mphf_t *mphf, FILE *); -cmph_mphf_t *cmph__mphf_load(FILE *f); +cmph_config_t *__config_new(cmph_key_source_t *key_source); +void __config_destroy(); +void __cmph_dump(cmph_t *mphf, FILE *); +cmph_t *__cmph_load(FILE *f); #endif diff --git a/src/czech.c b/src/czech.c index c4e1a96..e7498e0 100644 --- a/src/czech.c +++ b/src/czech.c @@ -1,7 +1,9 @@ +#include "graph.h" #include "czech.h" #include "cmph_structs.h" #include "czech_structs.h" #include "hash.h" +#include "bitbool.h" #include #include @@ -13,46 +15,36 @@ //#define DEBUG #include "debug.h" -static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; -#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) -#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) -#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) +/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ -static int czech_gen_edges(cmph_mph_t *mph); -static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); +static int czech_gen_edges(cmph_config_t *mph); +static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); -cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source) +czech_config_data_t *czech_config_new(cmph_key_source_t *key_source) { - cmph_mph_t *mph = NULL; - cmph_czech_mph_data_t *czech = NULL; - mph = cmph__mph_new(CMPH_CZECH, key_source); - if (mph == NULL) return NULL; - czech = (cmph_czech_mph_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); - if (czech == NULL) - { - cmph__mph_destroy(mph); - return NULL; - } + czech_config_data_t *czech = NULL; + czech = (czech_config_data_t *)malloc(sizeof(czech_config_data_t)); czech->hashfuncs[0] = CMPH_HASH_JENKINS; czech->hashfuncs[1] = CMPH_HASH_JENKINS; czech->g = NULL; czech->graph = NULL; czech->hashes = NULL; - mph->data = czech; - assert(mph->data); - return mph; + assert(czech); + return czech; } -void cmph_czech_mph_destroy(cmph_mph_t *mph) +void czech_config_destroy(cmph_config_t *mph) { - cmph_czech_mph_data_t *data = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *data = (czech_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); - cmph__mph_destroy(mph); } -void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) +void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { - cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *czech = (czech_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) @@ -63,22 +55,22 @@ void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs) } } -cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) +cmph_t *czech_new(cmph_config_t *mph, float c) { - cmph_mphf_t *mphf = NULL; - cmph_czech_mphf_data_t *czechf = NULL; + cmph_t *mphf = NULL; + czech_data_t *czechf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; - cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *czech = (czech_config_data_t *)mph->data; czech->m = mph->key_source->nkeys; czech->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); - czech->graph = cmph_graph_new(czech->n, czech->m); + czech->graph = graph_new(czech->n, czech->m); DEBUGP("Created graph\n"); - czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*3); + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; //Mapping step if (mph->verbosity) @@ -88,15 +80,15 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) while(1) { int ok; - czech->hashes[0] = cmph_hash_state_new(czech->hashfuncs[0], czech->n); - czech->hashes[1] = cmph_hash_state_new(czech->hashfuncs[1], czech->n); + czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); + czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); ok = czech_gen_edges(mph); if (!ok) { --iterations; - cmph_hash_state_destroy(czech->hashes[0]); + hash_state_destroy(czech->hashes[0]); czech->hashes[0] = NULL; - cmph_hash_state_destroy(czech->hashes[1]); + hash_state_destroy(czech->hashes[1]); czech->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) @@ -109,7 +101,7 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) } if (iterations == 0) { - cmph_graph_destroy(czech->graph); + graph_destroy(czech->graph); return NULL; } @@ -132,13 +124,13 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) czech_traverse(czech, visited, i); } } - cmph_graph_destroy(czech->graph); + graph_destroy(czech->graph); free(visited); czech->graph = NULL; - mphf = (cmph_mphf_t *)malloc(sizeof(cmph_mphf_t)); + mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - czechf = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mph_data_t)); + czechf = (czech_data_t *)malloc(sizeof(czech_config_data_t)); czechf->g = czech->g; czech->g = NULL; //transfer memory ownership czechf->hashes = czech->hashes; @@ -155,34 +147,34 @@ cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c) return mphf; } -static void czech_traverse(cmph_czech_mph_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) +static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) { - cmph_graph_iterator_t it = cmph_graph_neighbors_it(czech->graph, v); + graph_iterator_t it = graph_neighbors_it(czech->graph, v); cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = cmph_graph_next_neighbor(czech->graph, &it)) != CMPH_GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, cmph_graph_edge_id(czech->graph, v, neighbor)); - czech->g[neighbor] = cmph_graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], cmph_graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); + czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); czech_traverse(czech, visited, neighbor); } } -static int czech_gen_edges(cmph_mph_t *mph) +static int czech_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - cmph_czech_mph_data_t *czech = (cmph_czech_mph_data_t *)mph->data; + czech_config_data_t *czech = (czech_config_data_t *)mph->data; int cycles = 0; DEBUGP("Generating edges for %u vertices\n", czech->n); - cmph_graph_clear_edges(czech->graph); + graph_clear_edges(czech->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -190,8 +182,8 @@ static int czech_gen_edges(cmph_mph_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; - h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; + h1 = hash(czech->hashes[0], key, keylen) % czech->n; + h2 = hash(czech->hashes[1], key, keylen) % czech->n; if (h1 == h2) if (++h2 >= czech->n) h2 = 0; if (h1 == h2) { @@ -201,36 +193,36 @@ static int czech_gen_edges(cmph_mph_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - cmph_graph_add_edge(czech->graph, h1, h2); + graph_add_edge(czech->graph, h1, h2); } - cycles = cmph_graph_is_cyclic(czech->graph); + cycles = graph_is_cyclic(czech->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *fd) +int czech_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; cmph_uint32 two = htonl(2); //number of hash functions - cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; + czech_data_t *data = (czech_data_t *)mphf->data; cmph_uint32 nn, nm; - cmph__mphf_dump(mphf, fd); + __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); - cmph_hash_state_dump(data->hashes[0], &buf, &buflen); + hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - cmph_hash_state_dump(data->hashes[1], &buf, &buflen); + hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); nbuflen = htonl(buflen); fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); @@ -255,32 +247,32 @@ int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *fd) return 1; } -void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf) +void czech_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char fbuf[BUFSIZ]; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - cmph_hash_state_t *state; - cmph_czech_mphf_data_t *czech = (cmph_czech_mphf_data_t *)malloc(sizeof(cmph_czech_mphf_data_t)); + hash_state_t *state; + czech_data_t *czech = (czech_data_t *)malloc(sizeof(czech_data_t)); DEBUGP("Loading czech mphf\n"); mphf->data = czech; fread(&nhashes, sizeof(cmph_uint32), 1, f); nhashes = ntohl(nhashes); - czech->hashes = (cmph_hash_state_t **)malloc(sizeof(cmph_hash_state_t *)*(nhashes + 1)); + czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); czech->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { - cmph_hash_state_t *state = NULL; + hash_state_t *state = NULL; fread(&buflen, sizeof(cmph_uint32), 1, f); buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = cmph_hash_state_load(buf, buflen); + state = hash_state_load(buf, buflen); czech->hashes[i] = state; free(buf); } @@ -303,22 +295,22 @@ void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf) } -cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - cmph_czech_mphf_data_t *czech = mphf->data; - cmph_uint32 h1 = cmph_hash(czech->hashes[0], key, keylen) % czech->n; - cmph_uint32 h2 = cmph_hash(czech->hashes[1], key, keylen) % czech->n; + czech_data_t *czech = mphf->data; + cmph_uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; + cmph_uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > czech->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); return (czech->g[h1] + czech->g[h2]) % czech->m; } -void cmph_czech_mphf_destroy(cmph_mphf_t *mphf) +void czech_destroy(cmph_t *mphf) { - cmph_czech_mphf_data_t *data = (cmph_czech_mphf_data_t *)mphf->data; + czech_data_t *data = (czech_data_t *)mphf->data; free(data->g); - cmph_hash_state_destroy(data->hashes[0]); - cmph_hash_state_destroy(data->hashes[1]); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); free(data->hashes); free(data); free(mphf); diff --git a/src/czech.h b/src/czech.h index d167219..9070e89 100644 --- a/src/czech.h +++ b/src/czech.h @@ -1,19 +1,18 @@ -#ifndef __CZECH_H__ -#define __CZECH_H__ +#ifndef __CMPH_CZECH_H__ +#define __CMPH_CZECH_H__ -#include "graph.h" #include "cmph.h" -typedef struct cmph__czech_mphf_data_t cmph_czech_mphf_data_t; -typedef struct cmph__czech_mph_data_t cmph_czech_mph_data_t; +typedef struct __czech_data_t czech_data_t; +typedef struct __czech_config_data_t czech_config_data_t; -cmph_mph_t *cmph_czech_mph_new(cmph_key_source_t *key_source); -void cmph_czech_mph_set_hashfuncs(cmph_mph_t *mph, CMPH_HASH *hashfuncs); -void cmph_czech_mph_destroy(cmph_mph_t *mph); -cmph_mphf_t *cmph_czech_mph_create(cmph_mph_t *mph, float c); +czech_config_data_t *czech_config_new(cmph_key_source_t *key_source); +void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void czech_config_destroy(cmph_config_t *mph); +cmph_t *czech_new(cmph_config_t *mph, float c); -void cmph_czech_mphf_load(FILE *f, cmph_mphf_t *mphf); -int cmph_czech_mphf_dump(cmph_mphf_t *mphf, FILE *f); -void cmph_czech_mphf_destroy(cmph_mphf_t *mphf); -cmph_uint32 cmph_czech_mphf_search(cmph_mphf_t *mphf, const char *key, cmph_uint32 keylen); +void czech_load(FILE *f, cmph_t *mphf); +int czech_dump(cmph_t *mphf, FILE *f); +void czech_destroy(cmph_t *mphf); +cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); #endif diff --git a/src/czech_structs.h b/src/czech_structs.h index 1678433..a03bc6e 100644 --- a/src/czech_structs.h +++ b/src/czech_structs.h @@ -1,24 +1,24 @@ -#ifndef __CZECH_STRUCTS_H__ -#define __CZECH_STRUCTS_H__ +#ifndef __CMPH_CZECH_STRUCTS_H__ +#define __CMPH_CZECH_STRUCTS_H__ #include "hash_state.h" -struct cmph__czech_mphf_data_t +struct __czech_data_t { cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; -struct cmph__czech_mph_data_t +struct __czech_config_data_t { CMPH_HASH hashfuncs[2]; cmph_uint32 m; //edges (words) count cmph_uint32 n; //vertex count - cmph_graph_t *graph; + graph_t *graph; cmph_uint32 *g; - cmph_hash_state_t **hashes; + hash_state_t **hashes; }; #endif diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 6e5b972..5bbd9bd 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -1,19 +1,19 @@ #include "djb2_hash.h" #include -cmph_djb2_state_t *cmph_djb2_state_new() +djb2_state_t *djb2_state_new() { - cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); state->hashfunc = CMPH_HASH_DJB2; return state; } -void cmph_djb2_state_destroy(cmph_djb2_state_t *state) +void djb2_state_destroy(djb2_state_t *state) { free(state); } -cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 5381; const unsigned char *ptr = k; @@ -27,16 +27,16 @@ cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 } -void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen) +void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen) +djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) { - cmph_djb2_state_t *state = (cmph_djb2_state_t *)malloc(sizeof(cmph_djb2_state_t)); + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); state->hashfunc = CMPH_HASH_DJB2; return state; } diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 549cc90..3fef71d 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct cmph__djb2_state_t +typedef struct __djb2_state_t { CMPH_HASH hashfunc; -} cmph_djb2_state_t; +} djb2_state_t; -cmph_djb2_state_t *cmph_djb2_state_new(); -cmph_uint32 cmph_djb2_hash(cmph_djb2_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_djb2_state_dump(cmph_djb2_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_djb2_state_t *cmph_djb2_state_load(const char *buf, cmph_uint32 buflen); -void cmph_djb2_state_destroy(cmph_djb2_state_t *state); +djb2_state_t *djb2_state_new(); +cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); +void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); +void djb2_state_destroy(djb2_state_t *state); #endif diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 9be1558..5bf8db2 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -1,19 +1,19 @@ #include "fnv_hash.h" #include -cmph_fnv_state_t *cmph_fnv_state_new() +fnv_state_t *fnv_state_new() { - cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); state->hashfunc = CMPH_HASH_FNV; return state; } -void cmph_fnv_state_destroy(cmph_fnv_state_t *state) +void fnv_state_destroy(fnv_state_t *state) { free(state); } -cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen) { const unsigned char *bp = (const unsigned char *)k; const unsigned char *be = bp + keylen; @@ -31,16 +31,16 @@ cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 ke } -void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen) +void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen) +fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) { - cmph_fnv_state_t *state = (cmph_fnv_state_t *)malloc(sizeof(cmph_fnv_state_t)); + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); state->hashfunc = CMPH_HASH_FNV; return state; } diff --git a/src/fnv_hash.h b/src/fnv_hash.h index e9e54fa..e73e0f6 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct cmph__fnv_state_t +typedef struct __fnv_state_t { CMPH_HASH hashfunc; -} cmph_fnv_state_t; +} fnv_state_t; -cmph_fnv_state_t *cmph_fnv_state_new(); -cmph_uint32 cmph_fnv_hash(cmph_fnv_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_fnv_state_dump(cmph_fnv_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_fnv_state_t *cmph_fnv_state_load(const char *buf, cmph_uint32 buflen); -void cmph_fnv_state_destroy(cmph_fnv_state_t *state); +fnv_state_t *fnv_state_new(); +cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); +void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); +void fnv_state_destroy(fnv_state_t *state); #endif diff --git a/src/graph.c b/src/graph.c index 60e2d13..5f1346e 100644 --- a/src/graph.c +++ b/src/graph.c @@ -6,18 +6,19 @@ #include #include #include "vstack.h" +#include "bitbool.h" //#define DEBUG #include "debug.h" -static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; -#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) -#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) -#define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) +/* static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ #define abs_edge(e, i) (e % g->nedges + i * g->nedges) -struct cmph__graph_t +struct __graph_t { cmph_uint32 nnodes; cmph_uint32 nedges; @@ -32,9 +33,9 @@ struct cmph__graph_t static cmph_uint32 EMPTY = UINT_MAX; -cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) +graph_t *graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) { - cmph_graph_t *graph = (cmph_graph_t *)malloc(sizeof(cmph_graph_t)); + graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); if (!graph) return NULL; graph->edges = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); @@ -45,12 +46,12 @@ cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) graph->nnodes = nnodes; graph->nedges = nedges; - cmph_graph_clear_edges(graph); + graph_clear_edges(graph); return graph; } -void cmph_graph_destroy(cmph_graph_t *graph) +void graph_destroy(graph_t *graph) { DEBUGP("Destroying graph\n"); free(graph->edges); @@ -61,7 +62,7 @@ void cmph_graph_destroy(cmph_graph_t *graph) return; } -void cmph_graph_print(cmph_graph_t *g) +void graph_print(graph_t *g) { cmph_uint32 i, e; for (i = 0; i < g->nnodes; ++i) @@ -81,7 +82,7 @@ void cmph_graph_print(cmph_graph_t *g) return; } -void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +void graph_add_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { cmph_uint32 e = g->cedges; @@ -101,7 +102,7 @@ void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) ++(g->cedges); } -static int check_edge(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) +static int check_edge(graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) { DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; @@ -109,7 +110,7 @@ static int check_edge(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint3 return 0; } -cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +cmph_uint32 graph_edge_id(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { cmph_uint32 e; e = g->first[v1]; @@ -123,7 +124,7 @@ cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) while (!check_edge(g, e, v1, v2)); return abs_edge(e, 0); } -static void del_edge_point(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +static void del_edge_point(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { cmph_uint32 e, prev; @@ -151,14 +152,14 @@ static void del_edge_point(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) } -void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +void graph_del_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) { g->shrinking = 1; del_edge_point(g, v1, v2); del_edge_point(g, v2, v1); } -void cmph_graph_clear_edges(cmph_graph_t *g) +void graph_clear_edges(graph_t *g) { cmph_uint32 i; for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; @@ -171,7 +172,7 @@ void cmph_graph_clear_edges(cmph_graph_t *g) g->shrinking = 0; } -static int find_degree1_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted, cmph_uint32 *e) +static int find_degree1_edge(graph_t *g, cmph_uint32 v, char *deleted, cmph_uint32 *e) { cmph_uint32 edge = g->first[v]; char found = 0; @@ -195,7 +196,7 @@ static int find_degree1_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted, cmph return found; } -static void cyclic_del_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted) +static void cyclic_del_edge(graph_t *g, cmph_uint32 v, char *deleted) { cmph_uint32 e; @@ -224,7 +225,7 @@ static void cyclic_del_edge(cmph_graph_t *g, cmph_uint32 v, char *deleted) } } -int cmph_graph_is_cyclic(cmph_graph_t *g) +int graph_is_cyclic(graph_t *g) { cmph_uint32 i; cmph_uint32 v; @@ -249,12 +250,12 @@ int cmph_graph_is_cyclic(cmph_graph_t *g) return 0; } -cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v) /* included -- Fabiano */ +cmph_uint8 graph_node_is_critical(graph_t * g, cmph_uint32 v) /* included -- Fabiano */ { return GETBIT(g->critical_nodes,v); } -void cmph_graph_obtain_critical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ +void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ { cmph_uint32 i; cmph_uint32 v; @@ -290,7 +291,7 @@ void cmph_graph_obtain_critical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ free(deleted); } -cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ +cmph_uint8 graph_contains_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ { cmph_uint32 e; e = g->first[v1]; @@ -305,27 +306,27 @@ cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 return 1; } -cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ +cmph_uint32 graph_vertex_id(graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ { return (g->edges[e + id*g->nedges]); } -cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g) /* included -- Fabiano*/ +cmph_uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ { return g->ncritical_nodes; } -cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v) +graph_iterator_t graph_neighbors_it(graph_t *g, cmph_uint32 v) { - cmph_graph_iterator_t it; + graph_iterator_t it; it.vertex = v; it.edge = g->first[v]; return it; } -cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it) +cmph_uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) { cmph_uint32 ret; - if(it->edge == EMPTY) return CMPH_GRAPH_NO_NEIGHBOR; + if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; else ret = g->edges[it->edge]; it->edge = g->next[it->edge]; diff --git a/src/graph.h b/src/graph.h index dc80b05..e1b5de6 100644 --- a/src/graph.h +++ b/src/graph.h @@ -4,11 +4,11 @@ #include #include "cmph_types.h" -#define CMPH_GRAPH_NO_NEIGHBOR UINT_MAX +#define GRAPH_NO_NEIGHBOR UINT_MAX -typedef struct cmph__graph_t cmph_graph_t; -typedef struct cmph__graph_iterator_t cmph_graph_iterator_t; -struct cmph__graph_iterator_t +typedef struct __graph_t graph_t; +typedef struct __graph_iterator_t graph_iterator_t; +struct __graph_iterator_t { cmph_uint32 vertex; cmph_uint32 edge; @@ -16,25 +16,25 @@ struct cmph__graph_iterator_t -cmph_graph_t *cmph_graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); -void cmph_graph_destroy(cmph_graph_t *graph); +graph_t *graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); +void graph_destroy(graph_t *graph); -void cmph_graph_add_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -void cmph_graph_del_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -void cmph_graph_clear_edges(cmph_graph_t *g); -cmph_uint32 cmph_graph_edge_id(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -cmph_uint8 cmph_graph_contains_edge(cmph_graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_add_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_del_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_clear_edges(graph_t *g); +cmph_uint32 graph_edge_id(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +cmph_uint8 graph_contains_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); -cmph_graph_iterator_t cmph_graph_neighbors_it(cmph_graph_t *g, cmph_uint32 v); -cmph_uint32 cmph_graph_next_neighbor(cmph_graph_t *g, cmph_graph_iterator_t* it); +graph_iterator_t graph_neighbors_it(graph_t *g, cmph_uint32 v); +cmph_uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); -void cmph_graph_obtain_critical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ -cmph_uint8 cmph_graph_node_is_critical(cmph_graph_t * g, cmph_uint32 v); /* included -- Fabiano */ -cmph_uint32 cmph_graph_ncritical_nodes(cmph_graph_t *g); /* included -- Fabiano*/ -cmph_uint32 cmph_graph_vertex_id(cmph_graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ +void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ +cmph_uint8 graph_node_is_critical(graph_t * g, cmph_uint32 v); /* included -- Fabiano */ +cmph_uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ +cmph_uint32 graph_vertex_id(graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ -int cmph_graph_is_cyclic(cmph_graph_t *g); +int graph_is_cyclic(graph_t *g); -void cmph_graph_print(cmph_graph_t *); +void graph_print(graph_t *); #endif diff --git a/src/hash.c b/src/hash.c index 639f799..369ea3b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -7,26 +7,26 @@ //#define DEBUG #include "debug.h" -const char *cmph_hash_names[] = { "jenkins", "djb2", "sdbm", "fnv", "glib", "pjw", NULL }; +const char *cmph_hash_names[] = { "djb2", "fnv", "glib", "jenkins", "pjw", "sdbm", NULL }; -cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) +hash_state_t *hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) { - cmph_hash_state_t *state = NULL; + hash_state_t *state = NULL; switch (hashfunc) { case CMPH_HASH_JENKINS: DEBUGP("Jenkins function - %u\n", hashsize); - state = (cmph_hash_state_t *)cmph_jenkins_state_new(hashsize); + state = (hash_state_t *)jenkins_state_new(hashsize); DEBUGP("Jenkins function created\n"); break; case CMPH_HASH_DJB2: - state = (cmph_hash_state_t *)cmph_djb2_state_new(); + state = (hash_state_t *)djb2_state_new(); break; case CMPH_HASH_SDBM: - state = (cmph_hash_state_t *)cmph_sdbm_state_new(); + state = (hash_state_t *)sdbm_state_new(); break; case CMPH_HASH_FNV: - state = (cmph_hash_state_t *)cmph_fnv_state_new(); + state = (hash_state_t *)fnv_state_new(); break; default: assert(0); @@ -34,18 +34,18 @@ cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) state->hashfunc = hashfunc; return state; } -cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen) +cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen) { switch (state->hashfunc) { case CMPH_HASH_JENKINS: - return cmph_jenkins_hash((cmph_jenkins_state_t *)state, key, keylen); + return jenkins_hash((jenkins_state_t *)state, key, keylen); case CMPH_HASH_DJB2: - return cmph_djb2_hash((cmph_djb2_state_t *)state, key, keylen); + return djb2_hash((djb2_state_t *)state, key, keylen); case CMPH_HASH_SDBM: - return cmph_sdbm_hash((cmph_sdbm_state_t *)state, key, keylen); + return sdbm_hash((sdbm_state_t *)state, key, keylen); case CMPH_HASH_FNV: - return cmph_fnv_hash((cmph_fnv_state_t *)state, key, keylen); + return fnv_hash((fnv_state_t *)state, key, keylen); default: assert(0); } @@ -53,25 +53,25 @@ cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 key return 0; } -void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen) +void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) { char *algobuf; switch (state->hashfunc) { case CMPH_HASH_JENKINS: - cmph_jenkins_state_dump((cmph_jenkins_state_t *)state, &algobuf, buflen); + jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; case CMPH_HASH_DJB2: - cmph_djb2_state_dump((cmph_djb2_state_t *)state, &algobuf, buflen); + djb2_state_dump((djb2_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; case CMPH_HASH_SDBM: - cmph_sdbm_state_dump((cmph_sdbm_state_t *)state, &algobuf, buflen); + sdbm_state_dump((sdbm_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; case CMPH_HASH_FNV: - cmph_fnv_state_dump((cmph_fnv_state_t *)state, &algobuf, buflen); + fnv_state_dump((fnv_state_t *)state, &algobuf, buflen); if (*buflen == UINT_MAX) return; break; default: @@ -86,7 +86,7 @@ void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buf return; } -cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen) +hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) { cmph_uint32 i; cmph_uint32 offset; @@ -104,33 +104,33 @@ cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen) switch (hashfunc) { case CMPH_HASH_JENKINS: - return (cmph_hash_state_t *)cmph_jenkins_state_load(buf + offset, buflen - offset); + return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); case CMPH_HASH_DJB2: - return (cmph_hash_state_t *)cmph_djb2_state_load(buf + offset, buflen - offset); + return (hash_state_t *)djb2_state_load(buf + offset, buflen - offset); case CMPH_HASH_SDBM: - return (cmph_hash_state_t *)cmph_sdbm_state_load(buf + offset, buflen - offset); + return (hash_state_t *)sdbm_state_load(buf + offset, buflen - offset); case CMPH_HASH_FNV: - return (cmph_hash_state_t *)cmph_fnv_state_load(buf + offset, buflen - offset); + return (hash_state_t *)fnv_state_load(buf + offset, buflen - offset); default: return NULL; } return NULL; } -void cmph_hash_state_destroy(cmph_hash_state_t *state) +void hash_state_destroy(hash_state_t *state) { switch (state->hashfunc) { case CMPH_HASH_JENKINS: - cmph_jenkins_state_destroy((cmph_jenkins_state_t *)state); + jenkins_state_destroy((jenkins_state_t *)state); break; case CMPH_HASH_DJB2: - cmph_djb2_state_destroy((cmph_djb2_state_t *)state); + djb2_state_destroy((djb2_state_t *)state); break; case CMPH_HASH_SDBM: - cmph_sdbm_state_destroy((cmph_sdbm_state_t *)state); + sdbm_state_destroy((sdbm_state_t *)state); break; case CMPH_HASH_FNV: - cmph_fnv_state_destroy((cmph_fnv_state_t *)state); + fnv_state_destroy((fnv_state_t *)state); break; default: assert(0); diff --git a/src/hash.h b/src/hash.h index 371c1c9..2397c33 100644 --- a/src/hash.h +++ b/src/hash.h @@ -3,12 +3,12 @@ #include "cmph_types.h" -typedef union cmph__hash_state_t cmph_hash_state_t; +typedef union __hash_state_t hash_state_t; -cmph_hash_state_t *cmph_hash_state_new(CMPH_HASH, cmph_uint32 hashsize); -cmph_uint32 cmph_hash(cmph_hash_state_t *state, const char *key, cmph_uint32 keylen); -void cmph_hash_state_dump(cmph_hash_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_hash_state_t *cmph_hash_state_load(const char *buf, cmph_uint32 buflen); -void cmph_hash_state_destroy(cmph_hash_state_t *state); +hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); +cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); +void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); +hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); +void hash_state_destroy(hash_state_t *state); #endif diff --git a/src/hash_state.h b/src/hash_state.h index 39f0d68..67dcd77 100644 --- a/src/hash_state.h +++ b/src/hash_state.h @@ -6,13 +6,13 @@ #include "djb2_hash.h" #include "sdbm_hash.h" #include "fnv_hash.h" -union cmph__hash_state_t +union __hash_state_t { CMPH_HASH hashfunc; - cmph_jenkins_state_t jenkins; - cmph_djb2_state_t djb2; - cmph_sdbm_state_t sdbm; - cmph_fnv_state_t fnv; + jenkins_state_t jenkins; + djb2_state_t djb2; + sdbm_state_t sdbm; + fnv_state_t fnv; }; #endif diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 1971276..c849ec8 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -84,9 +84,9 @@ Use for hash table lookup, or anything where one collision in 2^^32 is acceptable. Do NOT use for cryptographic purposes. -------------------------------------------------------------------- */ -cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size) //size of hash table +jenkins_state_t *jenkins_state_new(cmph_uint32 size) //size of hash table { - cmph_jenkins_state_t *state = (cmph_jenkins_state_t *)malloc(sizeof(cmph_jenkins_state_t)); + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); @@ -94,12 +94,12 @@ cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size) //size of hash ta DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } -void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state) +void jenkins_state_destroy(jenkins_state_t *state) { free(state); } -cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen) { cmph_uint32 a, b, c; cmph_uint32 len, length; @@ -162,7 +162,7 @@ cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_u return c; } -void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen) +void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { *buflen = sizeof(cmph_uint32)*3; *buf = malloc(*buflen); @@ -178,9 +178,9 @@ void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint3 return; } -cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen) +jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { - cmph_jenkins_state_t *state = (cmph_jenkins_state_t *)malloc(sizeof(cmph_jenkins_state_t)); + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); state->seed = *(cmph_uint32 *)buf; state->nbits = *(((cmph_uint32 *)buf) + 1); state->size = *(((cmph_uint32 *)buf) + 2); diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index 2086d7c..baa6209 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -3,18 +3,18 @@ #include "hash.h" -typedef struct cmph__jenkins_state_t +typedef struct __jenkins_state_t { CMPH_HASH hashfunc; cmph_uint32 seed; cmph_uint32 nbits; cmph_uint32 size; -} cmph_jenkins_state_t; +} jenkins_state_t; -cmph_jenkins_state_t *cmph_jenkins_state_new(cmph_uint32 size); //size of hash table -cmph_uint32 cmph_jenkins_hash(cmph_jenkins_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_jenkins_state_dump(cmph_jenkins_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_jenkins_state_t *cmph_jenkins_state_load(const char *buf, cmph_uint32 buflen); -void cmph_jenkins_state_destroy(cmph_jenkins_state_t *state); +jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table +cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); +void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); +void jenkins_state_destroy(jenkins_state_t *state); #endif diff --git a/src/main.c b/src/main.c index fcc9d01..21ab419 100644 --- a/src/main.c +++ b/src/main.c @@ -106,8 +106,8 @@ int main(int argc, char **argv) cmph_uint32 i; CMPH_ALGO mph_algo = CMPH_CZECH; float c = 2.09; - cmph_mph_t *mph = NULL; - cmph_mphf_t *mphf = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf = NULL; cmph_key_source_t source; @@ -243,18 +243,18 @@ int main(int argc, char **argv) if (generate) { //Create mphf - - mph = cmph_mph_new(mph_algo, &source); - if (nhashes) cmph_mph_set_hashfuncs(mph, hashes); - cmph_mph_set_verbosity(mph, verbosity); + config = cmph_config_new(&source); + cmph_config_set_algo(config, mph_algo); + if (nhashes) cmph_config_set_hashfuncs(config, hashes); + cmph_config_set_verbosity(config, verbosity); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; - if (c != 0) cmph_mph_set_graphsize(mph, c); - mphf = cmph_mph_create(mph); + if (c != 0) cmph_config_set_graphsize(config, c); + mphf = cmph_new(config); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - cmph_mph_destroy(mph); + cmph_config_destroy(config); free(mphf_file); return -1; } @@ -266,13 +266,13 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - cmph_mphf_dump(mphf, mphf_fd); - cmph_mphf_destroy(mphf); + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); fclose(mphf_fd); } else { - cmph_uint8 * hashtable = NULL; + cmph_uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { @@ -280,7 +280,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - mphf = cmph_mphf_load(mphf_fd); + mphf = cmph_load(mphf_fd); fclose(mphf_fd); if (!mphf) { @@ -297,7 +297,7 @@ int main(int argc, char **argv) char *buf; cmph_uint32 buflen = 0; source.read(source.data, &buf, &buflen); - h = cmph_mphf_search(mphf, buf, buflen); + h = cmph_search(mphf, buf, buflen); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; @@ -307,7 +307,7 @@ int main(int argc, char **argv) } source.dispose(source.data, buf, buflen); } - cmph_mphf_destroy(mphf); + cmph_destroy(mphf); free(hashtable); } fclose(keys_fd); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index 0a0b8fd..bddcce6 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -1,19 +1,19 @@ #include "sdbm_hash.h" #include -cmph_sdbm_state_t *cmph_sdbm_state_new() +sdbm_state_t *sdbm_state_new() { - cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); state->hashfunc = CMPH_HASH_SDBM; return state; } -void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state) +void sdbm_state_destroy(sdbm_state_t *state) { free(state); } -cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen) +cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 0; const unsigned char *ptr = k; @@ -27,16 +27,16 @@ cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 } -void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen) +void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) { *buf = NULL; *buflen = 0; return; } -cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen) +sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) { - cmph_sdbm_state_t *state = (cmph_sdbm_state_t *)malloc(sizeof(cmph_sdbm_state_t)); + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); state->hashfunc = CMPH_HASH_SDBM; return state; } diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index 39cd3bb..a05daae 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -3,15 +3,15 @@ #include "hash.h" -typedef struct cmph__sdbm_state_t +typedef struct __sdbm_state_t { CMPH_HASH hashfunc; -} cmph_sdbm_state_t; +} sdbm_state_t; -cmph_sdbm_state_t *cmph_sdbm_state_new(); -cmph_uint32 cmph_sdbm_hash(cmph_sdbm_state_t *state, const char *k, cmph_uint32 keylen); -void cmph_sdbm_state_dump(cmph_sdbm_state_t *state, char **buf, cmph_uint32 *buflen); -cmph_sdbm_state_t *cmph_sdbm_state_load(const char *buf, cmph_uint32 buflen); -void cmph_sdbm_state_destroy(cmph_sdbm_state_t *state); +sdbm_state_t *sdbm_state_new(); +cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); +void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); +void sdbm_state_destroy(sdbm_state_t *state); #endif diff --git a/src/vqueue.c b/src/vqueue.c index e893b5b..0e55095 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -2,15 +2,15 @@ #include #include #include -struct cmph__vqueue_t +struct __vqueue_t { cmph_uint32 * values; cmph_uint32 beg, end, capacity; }; -cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity) +vqueue_t * vqueue_new(cmph_uint32 capacity) { - cmph_vqueue_t *q = (cmph_vqueue_t *)malloc(sizeof(cmph_vqueue_t)); + vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); assert(q); q->values = (cmph_uint32 *)calloc(capacity+1, sizeof(cmph_uint32)); q->beg = q->end = 0; @@ -18,33 +18,33 @@ cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity) return q; } -cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q) +cmph_uint8 vqueue_is_empty(vqueue_t * q) { return (q->beg == q->end); } -void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val) +void vqueue_insert(vqueue_t * q, cmph_uint32 val) { assert((q->end + 1)%q->capacity != q->beg); // Is queue full? q->end = (q->end + 1)%q->capacity; q->values[q->end] = val; } -cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q) +cmph_uint32 vqueue_remove(vqueue_t * q) { - assert(!cmph_vqueue_is_empty(q)); // Is queue empty? + assert(!vqueue_is_empty(q)); // Is queue empty? q->beg = (q->beg + 1)%q->capacity; return q->values[q->beg]; } -void cmph_vqueue_print(cmph_vqueue_t * q) +void vqueue_print(vqueue_t * q) { cmph_uint32 i; for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); } -void cmph_vqueue_destroy(cmph_vqueue_t *q) +void vqueue_destroy(vqueue_t *q) { free(q->values); q->values = NULL; } diff --git a/src/vqueue.h b/src/vqueue.h index d0853a9..86fccab 100644 --- a/src/vqueue.h +++ b/src/vqueue.h @@ -2,17 +2,17 @@ #define __CMPH_VQUEUE_H__ #include "cmph_types.h" -typedef struct cmph__vqueue_t cmph_vqueue_t; +typedef struct __vqueue_t vqueue_t; -cmph_vqueue_t * cmph_vqueue_new(cmph_uint32 capacity); +vqueue_t * vqueue_new(cmph_uint32 capacity); -cmph_uint8 cmph_vqueue_is_empty(cmph_vqueue_t * q); +cmph_uint8 vqueue_is_empty(vqueue_t * q); -void cmph_vqueue_insert(cmph_vqueue_t * q, cmph_uint32 val); +void vqueue_insert(vqueue_t * q, cmph_uint32 val); -cmph_uint32 cmph_vqueue_remove(cmph_vqueue_t * q); +cmph_uint32 vqueue_remove(vqueue_t * q); -void cmph_vqueue_print(cmph_vqueue_t * q); +void vqueue_print(vqueue_t * q); -void cmph_vqueue_destroy(cmph_vqueue_t * q); +void vqueue_destroy(vqueue_t * q); #endif diff --git a/src/vstack.c b/src/vstack.c index a74f667..24555cd 100644 --- a/src/vstack.c +++ b/src/vstack.c @@ -6,16 +6,16 @@ //#define DEBUG #include "debug.h" -struct cmph__vstack_t +struct __vstack_t { cmph_uint32 pointer; cmph_uint32 *values; cmph_uint32 capacity; }; -cmph_vstack_t *cmph_vstack_new() +vstack_t *vstack_new() { - cmph_vstack_t *stack = (cmph_vstack_t *)malloc(sizeof(cmph_vstack_t)); + vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); assert(stack); stack->pointer = 0; stack->values = NULL; @@ -23,43 +23,43 @@ cmph_vstack_t *cmph_vstack_new() return stack; } -void cmph_vstack_destroy(cmph_vstack_t *stack) +void vstack_destroy(vstack_t *stack) { assert(stack); free(stack->values); free(stack); } -void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val) +void vstack_push(vstack_t *stack, cmph_uint32 val) { assert(stack); - cmph_vstack_reserve(stack, stack->pointer + 1); + vstack_reserve(stack, stack->pointer + 1); stack->values[stack->pointer] = val; ++(stack->pointer); } -void cmph_vstack_pop(cmph_vstack_t *stack) +void vstack_pop(vstack_t *stack) { assert(stack); assert(stack->pointer > 0); --(stack->pointer); } -cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack) +cmph_uint32 vstack_top(vstack_t *stack) { assert(stack); assert(stack->pointer > 0); return stack->values[(stack->pointer - 1)]; } -int cmph_vstack_empty(cmph_vstack_t *stack) +int vstack_empty(vstack_t *stack) { assert(stack); return stack->pointer == 0; } -cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack) +cmph_uint32 vstack_size(vstack_t *stack) { return stack->pointer; } -void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size) +void vstack_reserve(vstack_t *stack, cmph_uint32 size) { assert(stack); if (stack->capacity < size) diff --git a/src/vstack.h b/src/vstack.h index 8552a43..1cefaaf 100644 --- a/src/vstack.h +++ b/src/vstack.h @@ -2,17 +2,17 @@ #define __CMPH_VSTACK_H__ #include "cmph_types.h" -typedef struct cmph__vstack_t cmph_vstack_t; +typedef struct __vstack_t vstack_t; -cmph_vstack_t *cmph_vstack_new(); -void cmph_vstack_destroy(cmph_vstack_t *stack); +vstack_t *vstack_new(); +void vstack_destroy(vstack_t *stack); -void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val); -cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack); -void cmph_vstack_pop(cmph_vstack_t *stack); -int cmph_vstack_empty(cmph_vstack_t *stack); -cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack); +void vstack_push(vstack_t *stack, cmph_uint32 val); +cmph_uint32 vstack_top(vstack_t *stack); +void vstack_pop(vstack_t *stack); +int vstack_empty(vstack_t *stack); +cmph_uint32 vstack_size(vstack_t *stack); -void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size); +void vstack_reserve(vstack_t *stack, cmph_uint32 size); #endif From 70ad75cf97528d1f519e5af4f7b3073080393742 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 21 Jan 2005 20:44:11 +0000 Subject: [PATCH 037/739] included files bitbool.h and bitbool.c --- src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.am b/src/Makefile.am index 98aef25..5eb55e7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h libcmph_la_SOURCES = debug.h\ + bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ jenkins_hash.h jenkins_hash.c\ From 8305f399aae2c232dac04953f0829fcfc5172b70 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 21 Jan 2005 20:44:11 +0000 Subject: [PATCH 038/739] included files bitbool.h and bitbool.c --- src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.am b/src/Makefile.am index 98aef25..5eb55e7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h libcmph_la_SOURCES = debug.h\ + bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ jenkins_hash.h jenkins_hash.c\ From c8b19092f160a1ed6bc8a8f79e2bfd9645c44c84 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 21 Jan 2005 21:14:55 +0000 Subject: [PATCH 039/739] Fixed wingetopt.c --- README.t2t | 3 ++- src/cmph.h | 12 +++++++----- tests/graph_tests.c | 6 +++--- wingetopt.c | 2 ++ 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/README.t2t b/README.t2t index a40b32d..d0c1946 100644 --- a/README.t2t +++ b/README.t2t @@ -15,9 +15,10 @@ features of cmph: - Fast - Space-efficient with main memory usage carefully documented - The best modern algorithms are available (or at least scheduled for implementation :-)) -- Object oriented implementation - Works with in-disk key sets through use of adapter pattern - Serialization of hash functions +- Portable C code (currently works on GNU/Linux and WIN32) +- Object oriented implementation - Easily extensible - Well encapsulated API aiming binary compatibility through releases - Free Software diff --git a/src/cmph.h b/src/cmph.h index f74de32..2d8d087 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -23,22 +23,24 @@ typedef struct void (*rewind)(void *); } cmph_key_source_t; -/** Hash generation API **/ +/** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_key_source_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_destroy(cmph_config_t *mph); -cmph_t *cmph_new(cmph_config_t *mph); -/** Hash querying API **/ -cmph_t *cmph_load(FILE *f); -int cmph_dump(cmph_t *mphf, FILE *f); +/** Hash API **/ +cmph_t *cmph_new(cmph_config_t *mph); cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); cmph_uint32 cmph_size(cmph_t *mphf); void cmph_destroy(cmph_t *mphf); +/** Hash serialization/deserialization */ +int cmph_dump(cmph_t *mphf, FILE *f); +cmph_t *cmph_load(FILE *f); + #ifdef __cplusplus } #endif diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 35476aa..74dd32e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -6,14 +6,14 @@ int main(int argc, char **argv) { graph_iterator_t it; - uint32 i, neighbor; + cmph_uint32 i, neighbor; graph_t *g = graph_new(5, 10); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) { - uint32 v1 = i % 5; - uint32 v2 = (i*2) % 5; + cmph_uint32 v1 = i % 5; + cmph_uint32 v2 = (i*2) % 5; if (v1 == v2) continue; graph_add_edge(g, v1, v2); DEBUGP("Added edge %u %u\n", v1, v2); diff --git a/wingetopt.c b/wingetopt.c index 09fd6d9..c981d0f 100644 --- a/wingetopt.c +++ b/wingetopt.c @@ -1,3 +1,4 @@ +#ifdef WIN32 /***************************************************************************** * * MODULE NAME : GETOPT.C @@ -175,3 +176,4 @@ int getopt(int argc, char *argv[], char *opstring) } } +#endif //WIN32 From ae434fdc8d6804273ee29999a41c034c7441a7d4 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 21 Jan 2005 21:14:55 +0000 Subject: [PATCH 040/739] Fixed wingetopt.c --- README.t2t | 3 ++- src/cmph.h | 12 +++++++----- tests/graph_tests.c | 6 +++--- wingetopt.c | 2 ++ 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/README.t2t b/README.t2t index a40b32d..d0c1946 100644 --- a/README.t2t +++ b/README.t2t @@ -15,9 +15,10 @@ features of cmph: - Fast - Space-efficient with main memory usage carefully documented - The best modern algorithms are available (or at least scheduled for implementation :-)) -- Object oriented implementation - Works with in-disk key sets through use of adapter pattern - Serialization of hash functions +- Portable C code (currently works on GNU/Linux and WIN32) +- Object oriented implementation - Easily extensible - Well encapsulated API aiming binary compatibility through releases - Free Software diff --git a/src/cmph.h b/src/cmph.h index f74de32..2d8d087 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -23,22 +23,24 @@ typedef struct void (*rewind)(void *); } cmph_key_source_t; -/** Hash generation API **/ +/** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_key_source_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_destroy(cmph_config_t *mph); -cmph_t *cmph_new(cmph_config_t *mph); -/** Hash querying API **/ -cmph_t *cmph_load(FILE *f); -int cmph_dump(cmph_t *mphf, FILE *f); +/** Hash API **/ +cmph_t *cmph_new(cmph_config_t *mph); cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); cmph_uint32 cmph_size(cmph_t *mphf); void cmph_destroy(cmph_t *mphf); +/** Hash serialization/deserialization */ +int cmph_dump(cmph_t *mphf, FILE *f); +cmph_t *cmph_load(FILE *f); + #ifdef __cplusplus } #endif diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 35476aa..74dd32e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -6,14 +6,14 @@ int main(int argc, char **argv) { graph_iterator_t it; - uint32 i, neighbor; + cmph_uint32 i, neighbor; graph_t *g = graph_new(5, 10); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) { - uint32 v1 = i % 5; - uint32 v2 = (i*2) % 5; + cmph_uint32 v1 = i % 5; + cmph_uint32 v2 = (i*2) % 5; if (v1 == v2) continue; graph_add_edge(g, v1, v2); DEBUGP("Added edge %u %u\n", v1, v2); diff --git a/wingetopt.c b/wingetopt.c index 09fd6d9..c981d0f 100644 --- a/wingetopt.c +++ b/wingetopt.c @@ -1,3 +1,4 @@ +#ifdef WIN32 /***************************************************************************** * * MODULE NAME : GETOPT.C @@ -175,3 +176,4 @@ int getopt(int argc, char *argv[], char *opstring) } } +#endif //WIN32 From 783e633b6ce66652572bbb04623bfa214a1c0575 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 21 Jan 2005 21:19:18 +0000 Subject: [PATCH 041/739] Added Doxyfile. --- ChangeLog | 29 ++ Doxyfile | 1153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1182 insertions(+) create mode 100644 Doxyfile diff --git a/ChangeLog b/ChangeLog index 79d6b1d..65fe7fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2005-01-21 19:14 davi + + * README.t2t, wingetopt.c, src/cmph.h, tests/graph_tests.c: Fixed + wingetopt.c + +2005-01-21 18:44 fc_botelho + + * src/Makefile.am: included files bitbool.h and bitbool.c + +2005-01-21 18:42 fc_botelho + + * src/: bmz.c, bmz.h, bmz_structs.h, cmph.c, cmph.h, + cmph_structs.c, cmph_structs.h, czech.c, czech.h, czech_structs.h, + djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, graph.c, graph.h, + hash.c, hash.h, hash_state.h, jenkins_hash.c, jenkins_hash.h, + main.c, sdbm_hash.c, sdbm_hash.h, vqueue.c, vqueue.h, vstack.c, + vstack.h: Only public symbols were prefixed with cmph, and the API + was changed to agree with the initial txt2html documentation + +2005-01-21 18:30 fc_botelho + + * src/: bitbool.c, bitbool.h: mask to represent a boolean value + using only 1 bit + +2005-01-20 10:28 davi + + * ChangeLog, README, README.t2t, wingetopt.h, src/main.c: Added + initial txt2tags documentation. + 2005-01-19 10:40 davi * acinclude.m4, configure.ac: Added macros for large file support. diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..aa0402f --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1153 @@ +# Doxyfile 1.3.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = cmph + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = YES + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO From 60cba13617faa8c410b5cdbce0f55575236680a0 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 21 Jan 2005 21:19:18 +0000 Subject: [PATCH 042/739] Added Doxyfile. --- ChangeLog | 29 ++ Doxyfile | 1153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1182 insertions(+) create mode 100644 Doxyfile diff --git a/ChangeLog b/ChangeLog index 79d6b1d..65fe7fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2005-01-21 19:14 davi + + * README.t2t, wingetopt.c, src/cmph.h, tests/graph_tests.c: Fixed + wingetopt.c + +2005-01-21 18:44 fc_botelho + + * src/Makefile.am: included files bitbool.h and bitbool.c + +2005-01-21 18:42 fc_botelho + + * src/: bmz.c, bmz.h, bmz_structs.h, cmph.c, cmph.h, + cmph_structs.c, cmph_structs.h, czech.c, czech.h, czech_structs.h, + djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, graph.c, graph.h, + hash.c, hash.h, hash_state.h, jenkins_hash.c, jenkins_hash.h, + main.c, sdbm_hash.c, sdbm_hash.h, vqueue.c, vqueue.h, vstack.c, + vstack.h: Only public symbols were prefixed with cmph, and the API + was changed to agree with the initial txt2html documentation + +2005-01-21 18:30 fc_botelho + + * src/: bitbool.c, bitbool.h: mask to represent a boolean value + using only 1 bit + +2005-01-20 10:28 davi + + * ChangeLog, README, README.t2t, wingetopt.h, src/main.c: Added + initial txt2tags documentation. + 2005-01-19 10:40 davi * acinclude.m4, configure.ac: Added macros for large file support. diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..aa0402f --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1153 @@ +# Doxyfile 1.3.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = cmph + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = YES + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO From e5f0aef11c19c2dcd17d0574a26d2eed626d1cbd Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 18:15:50 +0000 Subject: [PATCH 043/739] It was fixed some English mistakes and It was included the files BMZ.t2t, CZECH.t2t and COMPARISON.t2t --- BMZ.t2t | 26 ++++++++++ COMPARISON.t2t | 27 +++++++++++ CZECH.t2t | 24 ++++++++++ README.t2t | 125 +++++++++++++++++++++++++++++-------------------- 4 files changed, 152 insertions(+), 50 deletions(-) create mode 100644 BMZ.t2t create mode 100644 COMPARISON.t2t create mode 100644 CZECH.t2t diff --git a/BMZ.t2t b/BMZ.t2t new file mode 100644 index 0000000..ca4bb87 --- /dev/null +++ b/BMZ.t2t @@ -0,0 +1,26 @@ +BMZ Algorithm + + +---------------------------------------- + +**History** + +**The Algorithm** + +**The Heuristic** + +**Papers** + +---------------------------------------- +[Home README.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/COMPARISON.t2t b/COMPARISON.t2t new file mode 100644 index 0000000..ee4774e --- /dev/null +++ b/COMPARISON.t2t @@ -0,0 +1,27 @@ +Comparison Between BMZ And CZECH Algorithms + + +---------------------------------------- + +**Features** + +**Constructing Minimal Perfect Hash Functions** + +**Memory Consumption** + + +**Run times** + +---------------------------------------- +[Home README.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/CZECH.t2t b/CZECH.t2t new file mode 100644 index 0000000..d7dc701 --- /dev/null +++ b/CZECH.t2t @@ -0,0 +1,24 @@ +CZECH Algorithm + + +---------------------------------------- + +**History** + +**The Algorithm** + +**Papers** + +---------------------------------------- +[Home README.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/README.t2t b/README.t2t index d0c1946..36f7bf2 100644 --- a/README.t2t +++ b/README.t2t @@ -1,41 +1,65 @@ -== cmph - C Minimal Perfect Hashing Library == +CMPH - C Minimal Perfect Hashing Library +---------------------------------------- + **Description** C Minimal Perfect Hashing Library is a portable LGPLed library to create and -work with minimal perfect hashes. The cmph library encapsulates the newest -and more efficient algorithms in the literature in a ease-to-use, -production-quality, fast API. The library is designed to work big entries that -won't fit in the main memory. It has been used successfully to create hashes -bigger than 100 million entries. Although there is a lack of similar libraries -in the free software world, we can point out some of the "distinguishing" +to work with minimal perfect hashing functions. The cmph library encapsulates the newest +and more efficient algorithms (available in the literature) in an easy-to-use, +production-quality and fast API. The library is designed to work with big entries that +can not be fit in the main memory. It has been used successfully for constructing minimal perfect +hashing functions for sets with more than 100 million of keys. +Although there is a lack of similar libraries +in the free software world, we can point out some of the distinguishable features of cmph: -- Fast -- Space-efficient with main memory usage carefully documented -- The best modern algorithms are available (or at least scheduled for implementation :-)) -- Works with in-disk key sets through use of adapter pattern -- Serialization of hash functions -- Portable C code (currently works on GNU/Linux and WIN32) -- Object oriented implementation -- Easily extensible -- Well encapsulated API aiming binary compatibility through releases -- Free Software +- Fast. +- Space-efficient with main memory usage carefully documented. +- The best modern algorithms are available (or at least scheduled for implementation :-)). +- Works with in-disk key sets through of using the adapter pattern. +- Serialization of hash functions. +- Portable C code (currently works on GNU/Linux and WIN32). +- Object oriented implementation. +- Easily extensible. +- Well encapsulated API aiming binary compatibility through releases. +- Free Software. +---------------------------------------- + +**Supported Algorithms** + +- [BMZ Algorithm BMZ.html]. A very fast algorithm based on cyclic random graphs to construct minimal + perfect hash functions in linear time. The resulting functions are not order preserving and + can be stored in only 4cn bytes, where c is between 0.93 and 1.15. + +- [CZECH Algorithm CZECH.html]. An algorithm based on acyclic random graphs to construct minimal + perfect hash functions in linear time. The resulting functions are order preserving and + are stored in 4cn bytes, where c is greater than 2. + +[Click Here COMPARISON.html] to see a comparison of the supported algorithms. + + +---------------------------------------- + **News for version 0.3** -- New heuristics in bmz algorithm, providing hash creation with only - (0.93 * 16 + 4)*n bytes and hash query with (0.93*4)n bytes +- New heuristic added to the bmz algorithm permits to generate a mphf with only + (xxx)*n bytes. The resulting function can be stored in (0.93*4)n bytes. + [click here BMZ.html] for details. + + +---------------------------------------- **Examples** -Using cmph is quite ease. Take a look. +Using cmph is quite simple. Take a look. ``` - // Create minimal perfect hash from in-memory vector + // Create minimal perfect hash function from in-memory vector #include ... @@ -44,7 +68,7 @@ Using cmph is quite ease. Take a look. //Fill vector //... - //Create minimal perfect hash + //Create minimal perfect hashing function using the default(czech) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -59,7 +83,7 @@ Using cmph is quite ease. Take a look. ------------------------------- ``` - // Create minimal perfect hash from in-disk keys using BMZ algorithm + // Create minimal perfect hash function from in-disk keys using BMZ algorithm #include ... @@ -83,18 +107,18 @@ Using cmph is quite ease. Take a look. ``` -------------------------------------- - **The cmph application** cmph is the name of both the library and the utility application that comes with this package. You can use the cmph -application to create minimal perfect hashes from command line. The cmph utility -comes with a number of flags, but it is very simple to create and query -minimal perfect hashes: +application for constructing minimal perfect hashing functions from the command line. +The cmph utility +comes with a number of flags, but it is very simple to create and to query +minimal perfect hashing functions: ``` - $ # Create mph for keys in file keys_file - $ ./cmph keys_file + $ # Using the czech algorithm (default one) for constructing a mphf for keys in file keys_file + $ ./cmph -g keys_file $ # Query id of keys in the file keys_query $ ./cmph -m keys_file.mph keys_query ``` @@ -105,34 +129,35 @@ utility. ``` - usage: cmph [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile Minimum perfect hashing tool - - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * czech - * bmz - -f hash function (may be used multiple times) - valid values are - * jenkins - * djb2 - * sdbm - * fnv - * glib - * pjw - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * czech + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * glib + * jenkins + * pjw + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + keysfile line separated file with keys ``` **Downloads** Use the project page at sourceforge: http://sf.net/projects/cmph + **License Stuff** Code is under the LGPL. From 061a3c3a8c11e410aa790ea18da2397a4fffd4b9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 18:15:50 +0000 Subject: [PATCH 044/739] It was fixed some English mistakes and It was included the files BMZ.t2t, CZECH.t2t and COMPARISON.t2t --- BMZ.t2t | 26 ++++++++++ COMPARISON.t2t | 27 +++++++++++ CZECH.t2t | 24 ++++++++++ README.t2t | 125 +++++++++++++++++++++++++++++-------------------- 4 files changed, 152 insertions(+), 50 deletions(-) create mode 100644 BMZ.t2t create mode 100644 COMPARISON.t2t create mode 100644 CZECH.t2t diff --git a/BMZ.t2t b/BMZ.t2t new file mode 100644 index 0000000..ca4bb87 --- /dev/null +++ b/BMZ.t2t @@ -0,0 +1,26 @@ +BMZ Algorithm + + +---------------------------------------- + +**History** + +**The Algorithm** + +**The Heuristic** + +**Papers** + +---------------------------------------- +[Home README.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/COMPARISON.t2t b/COMPARISON.t2t new file mode 100644 index 0000000..ee4774e --- /dev/null +++ b/COMPARISON.t2t @@ -0,0 +1,27 @@ +Comparison Between BMZ And CZECH Algorithms + + +---------------------------------------- + +**Features** + +**Constructing Minimal Perfect Hash Functions** + +**Memory Consumption** + + +**Run times** + +---------------------------------------- +[Home README.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/CZECH.t2t b/CZECH.t2t new file mode 100644 index 0000000..d7dc701 --- /dev/null +++ b/CZECH.t2t @@ -0,0 +1,24 @@ +CZECH Algorithm + + +---------------------------------------- + +**History** + +**The Algorithm** + +**Papers** + +---------------------------------------- +[Home README.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + + +%preproc(html): '^%html% ' '' +%html% SourceForge.net Logo +Last Updated: %%date(%c) diff --git a/README.t2t b/README.t2t index d0c1946..36f7bf2 100644 --- a/README.t2t +++ b/README.t2t @@ -1,41 +1,65 @@ -== cmph - C Minimal Perfect Hashing Library == +CMPH - C Minimal Perfect Hashing Library +---------------------------------------- + **Description** C Minimal Perfect Hashing Library is a portable LGPLed library to create and -work with minimal perfect hashes. The cmph library encapsulates the newest -and more efficient algorithms in the literature in a ease-to-use, -production-quality, fast API. The library is designed to work big entries that -won't fit in the main memory. It has been used successfully to create hashes -bigger than 100 million entries. Although there is a lack of similar libraries -in the free software world, we can point out some of the "distinguishing" +to work with minimal perfect hashing functions. The cmph library encapsulates the newest +and more efficient algorithms (available in the literature) in an easy-to-use, +production-quality and fast API. The library is designed to work with big entries that +can not be fit in the main memory. It has been used successfully for constructing minimal perfect +hashing functions for sets with more than 100 million of keys. +Although there is a lack of similar libraries +in the free software world, we can point out some of the distinguishable features of cmph: -- Fast -- Space-efficient with main memory usage carefully documented -- The best modern algorithms are available (or at least scheduled for implementation :-)) -- Works with in-disk key sets through use of adapter pattern -- Serialization of hash functions -- Portable C code (currently works on GNU/Linux and WIN32) -- Object oriented implementation -- Easily extensible -- Well encapsulated API aiming binary compatibility through releases -- Free Software +- Fast. +- Space-efficient with main memory usage carefully documented. +- The best modern algorithms are available (or at least scheduled for implementation :-)). +- Works with in-disk key sets through of using the adapter pattern. +- Serialization of hash functions. +- Portable C code (currently works on GNU/Linux and WIN32). +- Object oriented implementation. +- Easily extensible. +- Well encapsulated API aiming binary compatibility through releases. +- Free Software. +---------------------------------------- + +**Supported Algorithms** + +- [BMZ Algorithm BMZ.html]. A very fast algorithm based on cyclic random graphs to construct minimal + perfect hash functions in linear time. The resulting functions are not order preserving and + can be stored in only 4cn bytes, where c is between 0.93 and 1.15. + +- [CZECH Algorithm CZECH.html]. An algorithm based on acyclic random graphs to construct minimal + perfect hash functions in linear time. The resulting functions are order preserving and + are stored in 4cn bytes, where c is greater than 2. + +[Click Here COMPARISON.html] to see a comparison of the supported algorithms. + + +---------------------------------------- + **News for version 0.3** -- New heuristics in bmz algorithm, providing hash creation with only - (0.93 * 16 + 4)*n bytes and hash query with (0.93*4)n bytes +- New heuristic added to the bmz algorithm permits to generate a mphf with only + (xxx)*n bytes. The resulting function can be stored in (0.93*4)n bytes. + [click here BMZ.html] for details. + + +---------------------------------------- **Examples** -Using cmph is quite ease. Take a look. +Using cmph is quite simple. Take a look. ``` - // Create minimal perfect hash from in-memory vector + // Create minimal perfect hash function from in-memory vector #include ... @@ -44,7 +68,7 @@ Using cmph is quite ease. Take a look. //Fill vector //... - //Create minimal perfect hash + //Create minimal perfect hashing function using the default(czech) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -59,7 +83,7 @@ Using cmph is quite ease. Take a look. ------------------------------- ``` - // Create minimal perfect hash from in-disk keys using BMZ algorithm + // Create minimal perfect hash function from in-disk keys using BMZ algorithm #include ... @@ -83,18 +107,18 @@ Using cmph is quite ease. Take a look. ``` -------------------------------------- - **The cmph application** cmph is the name of both the library and the utility application that comes with this package. You can use the cmph -application to create minimal perfect hashes from command line. The cmph utility -comes with a number of flags, but it is very simple to create and query -minimal perfect hashes: +application for constructing minimal perfect hashing functions from the command line. +The cmph utility +comes with a number of flags, but it is very simple to create and to query +minimal perfect hashing functions: ``` - $ # Create mph for keys in file keys_file - $ ./cmph keys_file + $ # Using the czech algorithm (default one) for constructing a mphf for keys in file keys_file + $ ./cmph -g keys_file $ # Query id of keys in the file keys_query $ ./cmph -m keys_file.mph keys_query ``` @@ -105,34 +129,35 @@ utility. ``` - usage: cmph [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile Minimum perfect hashing tool - - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * czech - * bmz - -f hash function (may be used multiple times) - valid values are - * jenkins - * djb2 - * sdbm - * fnv - * glib - * pjw - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * czech + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * glib + * jenkins + * pjw + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + keysfile line separated file with keys ``` **Downloads** Use the project page at sourceforge: http://sf.net/projects/cmph + **License Stuff** Code is under the LGPL. From be80deedb662c10ce386b29cd5a684e44a805f00 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 19:11:08 +0000 Subject: [PATCH 045/739] The algorithms and hash functions were put in alphabetical order --- src/cmph_types.h | 6 +++--- src/main.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cmph_types.h b/src/cmph_types.h index 6e07879..077fb60 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -5,10 +5,10 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; -typedef enum { CMPH_HASH_JENKINS, CMPH_HASH_DJB2, CMPH_HASH_SDBM, CMPH_HASH_FNV, - CMPH_HASH_GLIB, CMPH_HASH_PJW, CMPH_HASH_COUNT } CMPH_HASH; +typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_GLIB, CMPH_HASH_JENKINS, + CMPH_HASH_PJW, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_CZECH, CMPH_BMZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CZECH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/main.c b/src/main.c index 21ab419..97e73a6 100644 --- a/src/main.c +++ b/src/main.c @@ -18,12 +18,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); From 439b3ecbcf8af074624ebe9f81f6db0ef1654f31 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 19:11:08 +0000 Subject: [PATCH 046/739] The algorithms and hash functions were put in alphabetical order --- src/cmph_types.h | 6 +++--- src/main.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cmph_types.h b/src/cmph_types.h index 6e07879..077fb60 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -5,10 +5,10 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; -typedef enum { CMPH_HASH_JENKINS, CMPH_HASH_DJB2, CMPH_HASH_SDBM, CMPH_HASH_FNV, - CMPH_HASH_GLIB, CMPH_HASH_PJW, CMPH_HASH_COUNT } CMPH_HASH; +typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_GLIB, CMPH_HASH_JENKINS, + CMPH_HASH_PJW, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_CZECH, CMPH_BMZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CZECH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/main.c b/src/main.c index 21ab419..97e73a6 100644 --- a/src/main.c +++ b/src/main.c @@ -18,12 +18,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); From 8ea43ca39ffb20ba44e5b5fa02852be7e268f3ea Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 19:20:26 +0000 Subject: [PATCH 047/739] the memory consumption to create a mphf using bmz with a heuristic was fixed. --- README.t2t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.t2t b/README.t2t index 36f7bf2..52b01c4 100644 --- a/README.t2t +++ b/README.t2t @@ -47,7 +47,7 @@ features of cmph: **News for version 0.3** - New heuristic added to the bmz algorithm permits to generate a mphf with only - (xxx)*n bytes. The resulting function can be stored in (0.93*4)n bytes. + 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. [click here BMZ.html] for details. From 8efdd6af872722625b95b6be852f98f6b28472fa Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 19:20:26 +0000 Subject: [PATCH 048/739] the memory consumption to create a mphf using bmz with a heuristic was fixed. --- README.t2t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.t2t b/README.t2t index 36f7bf2..52b01c4 100644 --- a/README.t2t +++ b/README.t2t @@ -47,7 +47,7 @@ features of cmph: **News for version 0.3** - New heuristic added to the bmz algorithm permits to generate a mphf with only - (xxx)*n bytes. The resulting function can be stored in (0.93*4)n bytes. + 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. [click here BMZ.html] for details. From cf5ff6f1405f8f079643d764530dbde4a51fb7eb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 20:25:58 +0000 Subject: [PATCH 049/739] The file adpater was implemented. --- src/bmz.c | 2 +- src/bmz.h | 2 +- src/cmph.c | 82 +++++++++++++++++++++++++++++++++++++++++++++- src/cmph.h | 9 +++-- src/cmph_structs.c | 2 +- src/cmph_structs.h | 6 ++-- src/czech.c | 2 +- src/czech.h | 2 +- src/main.c | 75 +++++++----------------------------------- 9 files changed, 107 insertions(+), 75 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 7b29a86..bc75015 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -27,7 +27,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); -bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source) +bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source) { bmz_config_data_t *bmz = NULL; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); diff --git a/src/bmz.h b/src/bmz.h index 7a81a02..13c0f87 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -6,7 +6,7 @@ typedef struct __bmz_data_t bmz_data_t; typedef struct __bmz_config_data_t bmz_config_data_t; -bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source); +bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source); void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void bmz_config_destroy(cmph_config_t *mph); cmph_t *bmz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index bb52106..979b85f 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -12,7 +12,87 @@ const char *cmph_names[] = { "bmz", "czech", NULL }; /* included -- Fabiano */ -cmph_config_t *cmph_config_new(cmph_key_source_t *key_source) +static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) +{ + FILE *fd = (FILE *)data; + *key = NULL; + *keylen = 0; + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (c == NULL) return -1; + if (feof(fd)) return -1; + *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); + memcpy(*key + *keylen, buf, strlen(buf)); + *keylen += (cmph_uint32)strlen(buf); + if (buf[strlen(buf) - 1] != '\n') continue; + break; + } + if ((*keylen) && (*key)[*keylen - 1] == '\n') + { + (*key)[(*keylen) - 1] = 0; + --(*keylen); + } + return *keylen; +} + +static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} +static void key_nlfile_rewind(void *data) +{ + FILE *fd = (FILE *)data; + rewind(fd); +} + +static cmph_uint32 count_nlfile_keys(FILE *fd) +{ + cmph_uint32 count = 0; + rewind(fd); + while(1) + { + char buf[BUFSIZ]; + fgets(buf, BUFSIZ, fd); + if (feof(fd)) break; + if (buf[strlen(buf) - 1] != '\n') continue; + ++count; + } + rewind(fd); + return count; +} + +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)keys_fd; + key_source->nkeys = count_nlfile_keys(keys_fd); + key_source->read = key_nlfile_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_nlfile_rewind; + return key_source; +} + +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)keys_fd; + key_source->nkeys = nkeys; + key_source->read = key_nlfile_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_nlfile_rewind; + return key_source; +} + +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) +{ + return NULL; +} + +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = NULL; mph = __config_new(key_source); diff --git a/src/cmph.h b/src/cmph.h index 2d8d087..1e7da9f 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -21,10 +21,15 @@ typedef struct int (*read)(void *, char **, cmph_uint32 *); void (*dispose)(void *, char *, cmph_uint32); void (*rewind)(void *); -} cmph_key_source_t; +} cmph_io_adapter_t; + +/** Adapter pattern API **/ +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ -cmph_config_t *cmph_config_new(cmph_key_source_t *key_source); +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 060fbd8..d6c4306 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -5,7 +5,7 @@ //#define DEBUG #include "debug.h" -cmph_config_t *__config_new(cmph_key_source_t *key_source) +cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 436e363..d150a60 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -8,7 +8,7 @@ struct __config_t { CMPH_ALGO algo; - cmph_key_source_t *key_source; + cmph_io_adapter_t *key_source; cmph_uint32 verbosity; float c; void *data; //algorithm dependent data @@ -20,11 +20,11 @@ struct __cmph_t { CMPH_ALGO algo; cmph_uint32 size; - cmph_key_source_t *key_source; + cmph_io_adapter_t *key_source; void *data; //algorithm dependent data }; -cmph_config_t *__config_new(cmph_key_source_t *key_source); +cmph_config_t *__config_new(cmph_io_adapter_t *key_source); void __config_destroy(); void __cmph_dump(cmph_t *mphf, FILE *); cmph_t *__cmph_load(FILE *f); diff --git a/src/czech.c b/src/czech.c index e7498e0..fe8c3bc 100644 --- a/src/czech.c +++ b/src/czech.c @@ -23,7 +23,7 @@ static int czech_gen_edges(cmph_config_t *mph); static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); -czech_config_data_t *czech_config_new(cmph_key_source_t *key_source) +czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source) { czech_config_data_t *czech = NULL; czech = (czech_config_data_t *)malloc(sizeof(czech_config_data_t)); diff --git a/src/czech.h b/src/czech.h index 9070e89..64af13c 100644 --- a/src/czech.h +++ b/src/czech.h @@ -6,7 +6,7 @@ typedef struct __czech_data_t czech_data_t; typedef struct __czech_config_data_t czech_config_data_t; -czech_config_data_t *czech_config_new(cmph_key_source_t *key_source); +czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source); void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void czech_config_destroy(cmph_config_t *mph); cmph_t *czech_new(cmph_config_t *mph, float c); diff --git a/src/main.c b/src/main.c index 97e73a6..4b9d0e5 100644 --- a/src/main.c +++ b/src/main.c @@ -40,56 +40,6 @@ void usage_long(const char *prg) fprintf(stderr, " keysfile\t line separated file with keys\n"); } -static int key_read(void *data, char **key, cmph_uint32 *keylen) -{ - FILE *fd = (FILE *)data; - *key = NULL; - *keylen = 0; - while(1) - { - char buf[BUFSIZ]; - char *c = fgets(buf, BUFSIZ, fd); - if (c == NULL) return -1; - if (feof(fd)) return -1; - *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); - memcpy(*key + *keylen, buf, strlen(buf)); - *keylen += (cmph_uint32)strlen(buf); - if (buf[strlen(buf) - 1] != '\n') continue; - break; - } - if ((*keylen) && (*key)[*keylen - 1] == '\n') - { - (*key)[(*keylen) - 1] = 0; - --(*keylen); - } - return *keylen; -} - -static void key_dispose(void *data, char *key, cmph_uint32 keylen) -{ - free(key); -} -static void key_rewind(void *data) -{ - FILE *fd = (FILE *)data; - rewind(fd); -} - -static cmph_uint32 count_keys(FILE *fd) -{ - cmph_uint32 count = 0; - rewind(fd); - while(1) - { - char buf[BUFSIZ]; - fgets(buf, BUFSIZ, fd); - if (feof(fd)) break; - if (buf[strlen(buf) - 1] != '\n') continue; - ++count; - } - rewind(fd); - return count; -} int main(int argc, char **argv) { @@ -109,7 +59,7 @@ int main(int argc, char **argv) cmph_config_t *config = NULL; cmph_t *mphf = NULL; - cmph_key_source_t source; + cmph_io_adapter_t *source; while (1) { @@ -232,18 +182,14 @@ int main(int argc, char **argv) return -1; } - source.data = (void *)keys_fd; if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); - if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); - else source.nkeys = nkeys; - source.read = key_read; - source.dispose = key_dispose; - source.rewind = key_rewind; - + if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); + else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); + if (generate) { //Create mphf - config = cmph_config_new(&source); + config = cmph_config_new(source); cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); @@ -288,15 +234,15 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - hashtable = (cmph_uint8*)malloc(source.nkeys*sizeof(cmph_uint8)); - memset(hashtable, 0, source.nkeys); + hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); + memset(hashtable, 0, source->nkeys); //check all keys - for (i = 0; i < source.nkeys; ++i) + for (i = 0; i < source->nkeys; ++i) { cmph_uint32 h; char *buf; cmph_uint32 buflen = 0; - source.read(source.data, &buf, &buflen); + source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); @@ -305,12 +251,13 @@ int main(int argc, char **argv) { printf("%s -> %u\n", buf, h); } - source.dispose(source.data, buf, buflen); + source->dispose(source->data, buf, buflen); } cmph_destroy(mphf); free(hashtable); } fclose(keys_fd); free(mphf_file); + free(source); return 0; } From 8221293106a05e4129b00c7bb666f8e21b8d8154 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 24 Jan 2005 20:25:58 +0000 Subject: [PATCH 050/739] The file adpater was implemented. --- src/bmz.c | 2 +- src/bmz.h | 2 +- src/cmph.c | 82 +++++++++++++++++++++++++++++++++++++++++++++- src/cmph.h | 9 +++-- src/cmph_structs.c | 2 +- src/cmph_structs.h | 6 ++-- src/czech.c | 2 +- src/czech.h | 2 +- src/main.c | 75 +++++++----------------------------------- 9 files changed, 107 insertions(+), 75 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 7b29a86..bc75015 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -27,7 +27,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); -bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source) +bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source) { bmz_config_data_t *bmz = NULL; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); diff --git a/src/bmz.h b/src/bmz.h index 7a81a02..13c0f87 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -6,7 +6,7 @@ typedef struct __bmz_data_t bmz_data_t; typedef struct __bmz_config_data_t bmz_config_data_t; -bmz_config_data_t *bmz_config_new(cmph_key_source_t *key_source); +bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source); void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void bmz_config_destroy(cmph_config_t *mph); cmph_t *bmz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index bb52106..979b85f 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -12,7 +12,87 @@ const char *cmph_names[] = { "bmz", "czech", NULL }; /* included -- Fabiano */ -cmph_config_t *cmph_config_new(cmph_key_source_t *key_source) +static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) +{ + FILE *fd = (FILE *)data; + *key = NULL; + *keylen = 0; + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (c == NULL) return -1; + if (feof(fd)) return -1; + *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); + memcpy(*key + *keylen, buf, strlen(buf)); + *keylen += (cmph_uint32)strlen(buf); + if (buf[strlen(buf) - 1] != '\n') continue; + break; + } + if ((*keylen) && (*key)[*keylen - 1] == '\n') + { + (*key)[(*keylen) - 1] = 0; + --(*keylen); + } + return *keylen; +} + +static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} +static void key_nlfile_rewind(void *data) +{ + FILE *fd = (FILE *)data; + rewind(fd); +} + +static cmph_uint32 count_nlfile_keys(FILE *fd) +{ + cmph_uint32 count = 0; + rewind(fd); + while(1) + { + char buf[BUFSIZ]; + fgets(buf, BUFSIZ, fd); + if (feof(fd)) break; + if (buf[strlen(buf) - 1] != '\n') continue; + ++count; + } + rewind(fd); + return count; +} + +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)keys_fd; + key_source->nkeys = count_nlfile_keys(keys_fd); + key_source->read = key_nlfile_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_nlfile_rewind; + return key_source; +} + +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)keys_fd; + key_source->nkeys = nkeys; + key_source->read = key_nlfile_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_nlfile_rewind; + return key_source; +} + +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) +{ + return NULL; +} + +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = NULL; mph = __config_new(key_source); diff --git a/src/cmph.h b/src/cmph.h index 2d8d087..1e7da9f 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -21,10 +21,15 @@ typedef struct int (*read)(void *, char **, cmph_uint32 *); void (*dispose)(void *, char *, cmph_uint32); void (*rewind)(void *); -} cmph_key_source_t; +} cmph_io_adapter_t; + +/** Adapter pattern API **/ +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ -cmph_config_t *cmph_config_new(cmph_key_source_t *key_source); +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 060fbd8..d6c4306 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -5,7 +5,7 @@ //#define DEBUG #include "debug.h" -cmph_config_t *__config_new(cmph_key_source_t *key_source) +cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); diff --git a/src/cmph_structs.h b/src/cmph_structs.h index 436e363..d150a60 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -8,7 +8,7 @@ struct __config_t { CMPH_ALGO algo; - cmph_key_source_t *key_source; + cmph_io_adapter_t *key_source; cmph_uint32 verbosity; float c; void *data; //algorithm dependent data @@ -20,11 +20,11 @@ struct __cmph_t { CMPH_ALGO algo; cmph_uint32 size; - cmph_key_source_t *key_source; + cmph_io_adapter_t *key_source; void *data; //algorithm dependent data }; -cmph_config_t *__config_new(cmph_key_source_t *key_source); +cmph_config_t *__config_new(cmph_io_adapter_t *key_source); void __config_destroy(); void __cmph_dump(cmph_t *mphf, FILE *); cmph_t *__cmph_load(FILE *f); diff --git a/src/czech.c b/src/czech.c index e7498e0..fe8c3bc 100644 --- a/src/czech.c +++ b/src/czech.c @@ -23,7 +23,7 @@ static int czech_gen_edges(cmph_config_t *mph); static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); -czech_config_data_t *czech_config_new(cmph_key_source_t *key_source) +czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source) { czech_config_data_t *czech = NULL; czech = (czech_config_data_t *)malloc(sizeof(czech_config_data_t)); diff --git a/src/czech.h b/src/czech.h index 9070e89..64af13c 100644 --- a/src/czech.h +++ b/src/czech.h @@ -6,7 +6,7 @@ typedef struct __czech_data_t czech_data_t; typedef struct __czech_config_data_t czech_config_data_t; -czech_config_data_t *czech_config_new(cmph_key_source_t *key_source); +czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source); void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void czech_config_destroy(cmph_config_t *mph); cmph_t *czech_new(cmph_config_t *mph, float c); diff --git a/src/main.c b/src/main.c index 97e73a6..4b9d0e5 100644 --- a/src/main.c +++ b/src/main.c @@ -40,56 +40,6 @@ void usage_long(const char *prg) fprintf(stderr, " keysfile\t line separated file with keys\n"); } -static int key_read(void *data, char **key, cmph_uint32 *keylen) -{ - FILE *fd = (FILE *)data; - *key = NULL; - *keylen = 0; - while(1) - { - char buf[BUFSIZ]; - char *c = fgets(buf, BUFSIZ, fd); - if (c == NULL) return -1; - if (feof(fd)) return -1; - *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); - memcpy(*key + *keylen, buf, strlen(buf)); - *keylen += (cmph_uint32)strlen(buf); - if (buf[strlen(buf) - 1] != '\n') continue; - break; - } - if ((*keylen) && (*key)[*keylen - 1] == '\n') - { - (*key)[(*keylen) - 1] = 0; - --(*keylen); - } - return *keylen; -} - -static void key_dispose(void *data, char *key, cmph_uint32 keylen) -{ - free(key); -} -static void key_rewind(void *data) -{ - FILE *fd = (FILE *)data; - rewind(fd); -} - -static cmph_uint32 count_keys(FILE *fd) -{ - cmph_uint32 count = 0; - rewind(fd); - while(1) - { - char buf[BUFSIZ]; - fgets(buf, BUFSIZ, fd); - if (feof(fd)) break; - if (buf[strlen(buf) - 1] != '\n') continue; - ++count; - } - rewind(fd); - return count; -} int main(int argc, char **argv) { @@ -109,7 +59,7 @@ int main(int argc, char **argv) cmph_config_t *config = NULL; cmph_t *mphf = NULL; - cmph_key_source_t source; + cmph_io_adapter_t *source; while (1) { @@ -232,18 +182,14 @@ int main(int argc, char **argv) return -1; } - source.data = (void *)keys_fd; if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); - if(nkeys == UINT_MAX) source.nkeys = count_keys(keys_fd); - else source.nkeys = nkeys; - source.read = key_read; - source.dispose = key_dispose; - source.rewind = key_rewind; - + if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); + else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); + if (generate) { //Create mphf - config = cmph_config_new(&source); + config = cmph_config_new(source); cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); @@ -288,15 +234,15 @@ int main(int argc, char **argv) free(mphf_file); return -1; } - hashtable = (cmph_uint8*)malloc(source.nkeys*sizeof(cmph_uint8)); - memset(hashtable, 0, source.nkeys); + hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); + memset(hashtable, 0, source->nkeys); //check all keys - for (i = 0; i < source.nkeys; ++i) + for (i = 0; i < source->nkeys; ++i) { cmph_uint32 h; char *buf; cmph_uint32 buflen = 0; - source.read(source.data, &buf, &buflen); + source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); @@ -305,12 +251,13 @@ int main(int argc, char **argv) { printf("%s -> %u\n", buf, h); } - source.dispose(source.data, buf, buflen); + source->dispose(source->data, buf, buflen); } cmph_destroy(mphf); free(hashtable); } fclose(keys_fd); free(mphf_file); + free(source); return 0; } From c684ca967b46db80cc0038ac29d0bfd24dbe574a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:33:08 +0000 Subject: [PATCH 051/739] It was included the PreProc macro through the CONFIG.t2t file and the LOGO through the LOGO.html file --- BMZ.t2t | 8 ++++---- COMPARISON.t2t | 10 +++++----- CZECH.t2t | 24 ------------------------ README.t2t | 28 ++++++++++++++++------------ 4 files changed, 25 insertions(+), 45 deletions(-) delete mode 100644 CZECH.t2t diff --git a/BMZ.t2t b/BMZ.t2t index ca4bb87..eea2831 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -1,6 +1,8 @@ BMZ Algorithm +%!includeconf: CONFIG.t2t + ---------------------------------------- **History** @@ -12,7 +14,7 @@ BMZ Algorithm **Papers** ---------------------------------------- -[Home README.html] +[Home index.html] ---------------------------------------- Enjoy! @@ -20,7 +22,5 @@ Davi de Castro Reis Fabiano Cupertino Botelho - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo +%!include(html): ''LOGO.html'' Last Updated: %%date(%c) diff --git a/COMPARISON.t2t b/COMPARISON.t2t index ee4774e..bc0fbb2 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -1,6 +1,8 @@ -Comparison Between BMZ And CZECH Algorithms +Comparison Between BMZ And CHM Algorithms +%!includeconf: CONFIG.t2t + ---------------------------------------- **Features** @@ -13,7 +15,7 @@ Comparison Between BMZ And CZECH Algorithms **Run times** ---------------------------------------- -[Home README.html] +[Home index.html] ---------------------------------------- Enjoy! @@ -21,7 +23,5 @@ Davi de Castro Reis Fabiano Cupertino Botelho - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo +%!include(html): ''LOGO.html'' Last Updated: %%date(%c) diff --git a/CZECH.t2t b/CZECH.t2t deleted file mode 100644 index d7dc701..0000000 --- a/CZECH.t2t +++ /dev/null @@ -1,24 +0,0 @@ -CZECH Algorithm - - ----------------------------------------- - -**History** - -**The Algorithm** - -**Papers** - ----------------------------------------- -[Home README.html] ----------------------------------------- -Enjoy! - -Davi de Castro Reis - -Fabiano Cupertino Botelho - - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo -Last Updated: %%date(%c) diff --git a/README.t2t b/README.t2t index 52b01c4..d03151f 100644 --- a/README.t2t +++ b/README.t2t @@ -1,6 +1,8 @@ CMPH - C Minimal Perfect Hashing Library +%!includeconf: CONFIG.t2t + ---------------------------------------- **Description** @@ -9,7 +11,7 @@ C Minimal Perfect Hashing Library is a portable LGPLed library to create and to work with minimal perfect hashing functions. The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that -can not be fit in the main memory. It has been used successfully for constructing minimal perfect +can not fit in the main memory. It has been used successfully for constructing minimal perfect hashing functions for sets with more than 100 million of keys. Although there is a lack of similar libraries in the free software world, we can point out some of the distinguishable @@ -31,15 +33,19 @@ features of cmph: **Supported Algorithms** -- [BMZ Algorithm BMZ.html]. A very fast algorithm based on cyclic random graphs to construct minimal + +%html% - [BMZ Algorithm bmz.html]. +%txt% - BMZ Algorithm. + A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and can be stored in only 4cn bytes, where c is between 0.93 and 1.15. - -- [CZECH Algorithm CZECH.html]. An algorithm based on acyclic random graphs to construct minimal +%html% - [CHM Algorithm chm.html]. +%txt% - CHM Algorithm. + An algorithm based on acyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are order preserving and are stored in 4cn bytes, where c is greater than 2. -[Click Here COMPARISON.html] to see a comparison of the supported algorithms. +%html% [Click Here comparison.html] to see a comparison of the supported algorithms. ---------------------------------------- @@ -48,7 +54,7 @@ features of cmph: - New heuristic added to the bmz algorithm permits to generate a mphf with only 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. - [click here BMZ.html] for details. + [click here bmz.html] for details. ---------------------------------------- @@ -68,7 +74,7 @@ Using cmph is quite simple. Take a look. //Fill vector //... - //Create minimal perfect hashing function using the default(czech) algorithm. + //Create minimal perfect hashing function using the default(chm) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -117,7 +123,7 @@ comes with a number of flags, but it is very simple to create and to query minimal perfect hashing functions: ``` - $ # Using the czech algorithm (default one) for constructing a mphf for keys in file keys_file + $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file $ ./cmph -g keys_file $ # Query id of keys in the file keys_query $ ./cmph -m keys_file.mph keys_query @@ -136,7 +142,7 @@ utility. -c c value that determines the number of vertices in the graph -a algorithm - valid values are * bmz - * czech + * chm -f hash function (may be used multiple times) - valid values are * djb2 * fnv @@ -169,7 +175,5 @@ Davi de Castro Reis Fabiano Cupertino Botelho - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo +%!include(html): ''LOGO.html'' Last Updated: %%date(%c) From b6124cfb22f608fe3c15e77df14ec37add1b8d48 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:33:08 +0000 Subject: [PATCH 052/739] It was included the PreProc macro through the CONFIG.t2t file and the LOGO through the LOGO.html file --- BMZ.t2t | 8 ++++---- COMPARISON.t2t | 10 +++++----- CZECH.t2t | 24 ------------------------ README.t2t | 28 ++++++++++++++++------------ 4 files changed, 25 insertions(+), 45 deletions(-) delete mode 100644 CZECH.t2t diff --git a/BMZ.t2t b/BMZ.t2t index ca4bb87..eea2831 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -1,6 +1,8 @@ BMZ Algorithm +%!includeconf: CONFIG.t2t + ---------------------------------------- **History** @@ -12,7 +14,7 @@ BMZ Algorithm **Papers** ---------------------------------------- -[Home README.html] +[Home index.html] ---------------------------------------- Enjoy! @@ -20,7 +22,5 @@ Davi de Castro Reis Fabiano Cupertino Botelho - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo +%!include(html): ''LOGO.html'' Last Updated: %%date(%c) diff --git a/COMPARISON.t2t b/COMPARISON.t2t index ee4774e..bc0fbb2 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -1,6 +1,8 @@ -Comparison Between BMZ And CZECH Algorithms +Comparison Between BMZ And CHM Algorithms +%!includeconf: CONFIG.t2t + ---------------------------------------- **Features** @@ -13,7 +15,7 @@ Comparison Between BMZ And CZECH Algorithms **Run times** ---------------------------------------- -[Home README.html] +[Home index.html] ---------------------------------------- Enjoy! @@ -21,7 +23,5 @@ Davi de Castro Reis Fabiano Cupertino Botelho - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo +%!include(html): ''LOGO.html'' Last Updated: %%date(%c) diff --git a/CZECH.t2t b/CZECH.t2t deleted file mode 100644 index d7dc701..0000000 --- a/CZECH.t2t +++ /dev/null @@ -1,24 +0,0 @@ -CZECH Algorithm - - ----------------------------------------- - -**History** - -**The Algorithm** - -**Papers** - ----------------------------------------- -[Home README.html] ----------------------------------------- -Enjoy! - -Davi de Castro Reis - -Fabiano Cupertino Botelho - - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo -Last Updated: %%date(%c) diff --git a/README.t2t b/README.t2t index 52b01c4..d03151f 100644 --- a/README.t2t +++ b/README.t2t @@ -1,6 +1,8 @@ CMPH - C Minimal Perfect Hashing Library +%!includeconf: CONFIG.t2t + ---------------------------------------- **Description** @@ -9,7 +11,7 @@ C Minimal Perfect Hashing Library is a portable LGPLed library to create and to work with minimal perfect hashing functions. The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that -can not be fit in the main memory. It has been used successfully for constructing minimal perfect +can not fit in the main memory. It has been used successfully for constructing minimal perfect hashing functions for sets with more than 100 million of keys. Although there is a lack of similar libraries in the free software world, we can point out some of the distinguishable @@ -31,15 +33,19 @@ features of cmph: **Supported Algorithms** -- [BMZ Algorithm BMZ.html]. A very fast algorithm based on cyclic random graphs to construct minimal + +%html% - [BMZ Algorithm bmz.html]. +%txt% - BMZ Algorithm. + A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and can be stored in only 4cn bytes, where c is between 0.93 and 1.15. - -- [CZECH Algorithm CZECH.html]. An algorithm based on acyclic random graphs to construct minimal +%html% - [CHM Algorithm chm.html]. +%txt% - CHM Algorithm. + An algorithm based on acyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are order preserving and are stored in 4cn bytes, where c is greater than 2. -[Click Here COMPARISON.html] to see a comparison of the supported algorithms. +%html% [Click Here comparison.html] to see a comparison of the supported algorithms. ---------------------------------------- @@ -48,7 +54,7 @@ features of cmph: - New heuristic added to the bmz algorithm permits to generate a mphf with only 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. - [click here BMZ.html] for details. + [click here bmz.html] for details. ---------------------------------------- @@ -68,7 +74,7 @@ Using cmph is quite simple. Take a look. //Fill vector //... - //Create minimal perfect hashing function using the default(czech) algorithm. + //Create minimal perfect hashing function using the default(chm) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -117,7 +123,7 @@ comes with a number of flags, but it is very simple to create and to query minimal perfect hashing functions: ``` - $ # Using the czech algorithm (default one) for constructing a mphf for keys in file keys_file + $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file $ ./cmph -g keys_file $ # Query id of keys in the file keys_query $ ./cmph -m keys_file.mph keys_query @@ -136,7 +142,7 @@ utility. -c c value that determines the number of vertices in the graph -a algorithm - valid values are * bmz - * czech + * chm -f hash function (may be used multiple times) - valid values are * djb2 * fnv @@ -169,7 +175,5 @@ Davi de Castro Reis Fabiano Cupertino Botelho - -%preproc(html): '^%html% ' '' -%html% SourceForge.net Logo +%!include(html): ''LOGO.html'' Last Updated: %%date(%c) From a29ea2dbd11aad66553da695c6c7f8beb091c287 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:40:08 +0000 Subject: [PATCH 053/739] It was included the PreProc macro through the CONFIG.t2t file and the LOGO through the LOGO.html file --- CHM.t2t | 24 ++++++++++++++++++++++++ CONFIG.t2t | 2 ++ LOGO.html | 1 + 3 files changed, 27 insertions(+) create mode 100644 CHM.t2t create mode 100644 CONFIG.t2t create mode 100644 LOGO.html diff --git a/CHM.t2t b/CHM.t2t new file mode 100644 index 0000000..ae1fef5 --- /dev/null +++ b/CHM.t2t @@ -0,0 +1,24 @@ +CHM Algorithm + + +%!includeconf: CONFIG.t2t + +---------------------------------------- + +**History** + +**The Algorithm** + +**Papers** + +---------------------------------------- +[Home index.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + +%!include(html): ''LOGO.html'' +Last Updated: %%date(%c) diff --git a/CONFIG.t2t b/CONFIG.t2t new file mode 100644 index 0000000..807454c --- /dev/null +++ b/CONFIG.t2t @@ -0,0 +1,2 @@ +%! PreProc(html): '^%html% ' '' +%! PreProc(txt): '^%txt% ' '' diff --git a/LOGO.html b/LOGO.html new file mode 100644 index 0000000..dc245a8 --- /dev/null +++ b/LOGO.html @@ -0,0 +1 @@ +SourceForge.net Logo From c8f5d2dc9db0880c5ad4fa8bc06b18b26966a581 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:40:08 +0000 Subject: [PATCH 054/739] It was included the PreProc macro through the CONFIG.t2t file and the LOGO through the LOGO.html file --- CHM.t2t | 24 ++++++++++++++++++++++++ CONFIG.t2t | 2 ++ LOGO.html | 1 + 3 files changed, 27 insertions(+) create mode 100644 CHM.t2t create mode 100644 CONFIG.t2t create mode 100644 LOGO.html diff --git a/CHM.t2t b/CHM.t2t new file mode 100644 index 0000000..ae1fef5 --- /dev/null +++ b/CHM.t2t @@ -0,0 +1,24 @@ +CHM Algorithm + + +%!includeconf: CONFIG.t2t + +---------------------------------------- + +**History** + +**The Algorithm** + +**Papers** + +---------------------------------------- +[Home index.html] +---------------------------------------- +Enjoy! + +Davi de Castro Reis + +Fabiano Cupertino Botelho + +%!include(html): ''LOGO.html'' +Last Updated: %%date(%c) diff --git a/CONFIG.t2t b/CONFIG.t2t new file mode 100644 index 0000000..807454c --- /dev/null +++ b/CONFIG.t2t @@ -0,0 +1,2 @@ +%! PreProc(html): '^%html% ' '' +%! PreProc(txt): '^%txt% ' '' diff --git a/LOGO.html b/LOGO.html new file mode 100644 index 0000000..dc245a8 --- /dev/null +++ b/LOGO.html @@ -0,0 +1 @@ +SourceForge.net Logo From 7c7324a44f748a38559616aa007f4476ca9933b3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:42:03 +0000 Subject: [PATCH 055/739] Vector adapter commented --- src/cmph.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmph.h b/src/cmph.h index 1e7da9f..f457736 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -24,9 +24,10 @@ typedef struct } cmph_io_adapter_t; /** Adapter pattern API **/ +/* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); +/*cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys);*/ /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); From 9e724e5d80212311b8074447e140ee21d4d5c3c2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:42:03 +0000 Subject: [PATCH 056/739] Vector adapter commented --- src/cmph.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmph.h b/src/cmph.h index 1e7da9f..f457736 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -24,9 +24,10 @@ typedef struct } cmph_io_adapter_t; /** Adapter pattern API **/ +/* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); +/*cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys);*/ /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); From a5153049d6cbe70ba37028b1c99bdab856f34eb7 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:44:50 +0000 Subject: [PATCH 057/739] Version was updated --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 53ec71a..9986da0 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.2) +AM_INIT_AUTOMAKE(cmph, 0.3) AM_CONFIG_HEADER(config.h) dnl Checks for programs. From 56a9e19d841c25dec9c04fb1ec85ad20920511da Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:44:50 +0000 Subject: [PATCH 058/739] Version was updated --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 53ec71a..9986da0 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.2) +AM_INIT_AUTOMAKE(cmph, 0.3) AM_CONFIG_HEADER(config.h) dnl Checks for programs. From 92db0cf7504d5580130bcfdc0a05cb14accc4c7b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:47:23 +0000 Subject: [PATCH 059/739] README was updated From ed091d5dee5bc64be1089a12277237d7ba80c9f1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:47:23 +0000 Subject: [PATCH 060/739] README was updated --- README | 121 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 49 deletions(-) diff --git a/README b/README index 6a1cdd0..8fc9cd9 100644 --- a/README +++ b/README @@ -1,37 +1,59 @@ -== cmph - C Minimal Perfect Hashing Library == +CMPH - C Minimal Perfect Hashing Library + +---------------------------------------- Description C Minimal Perfect Hashing Library is a portable LGPLed library to create and -work with minimal perfect hashes. The cmph library encapsulates the newest -and more efficient algorithms in the literature in a ease-to-use, -production-quality, fast API. The library is designed to work big entries that -won't fit in the main memory. It has been used successfully to create hashes -bigger than 100 million entries. Although there is a lack of similar libraries -in the free software world, we can point out some of the "distinguishing" +to work with minimal perfect hashing functions. The cmph library encapsulates the newest +and more efficient algorithms (available in the literature) in an easy-to-use, +production-quality and fast API. The library is designed to work with big entries that +can not fit in the main memory. It has been used successfully for constructing minimal perfect +hashing functions for sets with more than 100 million of keys. +Although there is a lack of similar libraries +in the free software world, we can point out some of the distinguishable features of cmph: -- Fast -- Space-efficient with main memory usage carefully documented -- The best modern algorithms are available (or at least scheduled for implementation :-)) -- Object oriented implementation -- Works with in-disk key sets through use of adapter pattern -- Serialization of hash functions -- Easily extensible -- Well encapsulated API aiming binary compatibility through releases -- Free Software +- Fast. +- Space-efficient with main memory usage carefully documented. +- The best modern algorithms are available (or at least scheduled for implementation :-)). +- Works with in-disk key sets through of using the adapter pattern. +- Serialization of hash functions. +- Portable C code (currently works on GNU/Linux and WIN32). +- Object oriented implementation. +- Easily extensible. +- Well encapsulated API aiming binary compatibility through releases. +- Free Software. + +---------------------------------------- + +Supported Algorithms + +- BMZ Algorithm. + A very fast algorithm based on cyclic random graphs to construct minimal + perfect hash functions in linear time. The resulting functions are not order preserving and + can be stored in only 4cn bytes, where c is between 0.93 and 1.15. +- CHM Algorithm. + An algorithm based on acyclic random graphs to construct minimal + perfect hash functions in linear time. The resulting functions are order preserving and + are stored in 4cn bytes, where c is greater than 2. + +---------------------------------------- News for version 0.3 -- New heuristics in bmz algorithm, providing hash creation with only - (0.93 * 16 + 4)*n bytes and hash query with (0.93*4)n bytes +- New heuristic added to the bmz algorithm permits to generate a mphf with only + 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. + click here (bmz.html) for details. + +---------------------------------------- Examples -Using cmph is quite ease. Take a look. +Using cmph is quite simple. Take a look. - // Create minimal perfect hash from in-memory vector + // Create minimal perfect hash function from in-memory vector #include ... @@ -40,7 +62,7 @@ Using cmph is quite ease. Take a look. //Fill vector //... - //Create minimal perfect hash + //Create minimal perfect hashing function using the default(chm) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -55,7 +77,7 @@ Using cmph is quite ease. Take a look. ------------------------------- - // Create minimal perfect hash from in-disk keys using BMZ algorithm + // Create minimal perfect hash function from in-disk keys using BMZ algorithm #include ... @@ -83,13 +105,14 @@ The cmph application cmph is the name of both the library and the utility application that comes with this package. You can use the cmph -application to create minimal perfect hashes from command line. The cmph utility -comes with a number of flags, but it is very simple to create and query -minimal perfect hashes: +application for constructing minimal perfect hashing functions from the command line. +The cmph utility +comes with a number of flags, but it is very simple to create and to query +minimal perfect hashing functions: - $ # Create mph for keys in file keys_file - $ ./cmph keys_file + $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file + $ ./cmph -g keys_file $ # Query id of keys in the file keys_query $ ./cmph -m keys_file.mph keys_query @@ -99,28 +122,28 @@ available through the C API. Below you can see the full help message for the utility. - usage: cmph [-v] [-h] [-V] [-k] [-g [-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile Minimum perfect hashing tool - - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * czech - * bmz - -f hash function (may be used multiple times) - valid values are - * jenkins - * djb2 - * sdbm - * fnv - * glib - * pjw - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * chm + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * glib + * jenkins + * pjw + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + keysfile line separated file with keys Downloads @@ -139,7 +162,7 @@ Davi de Castro Reis Fabiano Cupertino Botelho -Last Updated: Thu Jan 20 11:01:01 2005 +Last Updated: Tue Jan 25 18:43:38 2005 From 18516c9a1169ea2f26c9a46274a5d87d74fcc342 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:50:41 +0000 Subject: [PATCH 061/739] script to generate the documentation and the README file --- gendocs | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 gendocs diff --git a/gendocs b/gendocs new file mode 100755 index 0000000..85ead77 --- /dev/null +++ b/gendocs @@ -0,0 +1,5 @@ +txt2tags -t html -i README.t2t -o index.html +txt2tags -t html -i BMZ.t2t -o bmz.html +txt2tags -t html -i CHM.t2t -o chm.html +txt2tags -t html -i COMPARISON.t2t -o comparison.html +txt2tags -t txt -i README.t2t -o README From e984385fa4c2e7dd94b660ea0ede568f043e668d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 20:50:41 +0000 Subject: [PATCH 062/739] script to generate the documentation and the README file --- gendocs | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 gendocs diff --git a/gendocs b/gendocs new file mode 100755 index 0000000..85ead77 --- /dev/null +++ b/gendocs @@ -0,0 +1,5 @@ +txt2tags -t html -i README.t2t -o index.html +txt2tags -t html -i BMZ.t2t -o bmz.html +txt2tags -t html -i CHM.t2t -o chm.html +txt2tags -t html -i COMPARISON.t2t -o comparison.html +txt2tags -t txt -i README.t2t -o README From d7ea6d6a3e71d8ace88a9ddb7420f2a00b72a4d9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 21:06:58 +0000 Subject: [PATCH 063/739] It was changed the prefix czech by chm --- src/Makefile.am | 2 +- src/chm.c | 317 ++++++++++++++++++++++++++++++++++++++++++++++ src/chm.h | 18 +++ src/chm_structs.h | 24 ++++ src/cmph.c | 38 +++--- src/cmph_types.h | 2 +- src/main.c | 2 +- 7 files changed, 381 insertions(+), 22 deletions(-) create mode 100644 src/chm.c create mode 100644 src/chm.h create mode 100644 src/chm_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 5eb55e7..3b01af4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,7 +14,7 @@ libcmph_la_SOURCES = debug.h\ graph.h graph.c\ cmph.h cmph.c\ cmph_structs.h cmph_structs.c\ - czech.h czech_structs.h czech.c\ + chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/chm.c b/src/chm.c new file mode 100644 index 0000000..5739c3b --- /dev/null +++ b/src/chm.c @@ -0,0 +1,317 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source) +{ + chm_config_data_t *chm = NULL; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + assert(chm); + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + chm->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(chm->n/8 + 1); + memset(visited, 0, chm->n/8 + 1); + free(chm->g); + chm->g = malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_config_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices\n", chm->n); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = htonl(2); //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + cmph_uint32 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + nn = htonl(data->n); + fwrite(&nn, sizeof(cmph_uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(cmph_uint32), 1, fd); + + for (i = 0; i < data->n; ++i) + { + cmph_uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(cmph_uint32), 1, fd); + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char fbuf[BUFSIZ]; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + hash_state_t *state; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + nhashes = ntohl(nhashes); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + buflen = ntohl(buflen); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(chm->n), sizeof(cmph_uint32), 1, f); + chm->n = ntohl(chm->n); + fread(&(chm->m), sizeof(cmph_uint32), 1, f); + chm->m = ntohl(chm->m); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + for (i = 0; i < chm->n; ++i) chm->g[i] = ntohl(chm->g[i]); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/chm.h b/src/chm.h new file mode 100644 index 0000000..f98d83d --- /dev/null +++ b/src/chm.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_CHM_H__ +#define __CMPH_CHM_H__ + +#include "cmph.h" + +typedef struct __chm_data_t chm_data_t; +typedef struct __chm_config_data_t chm_config_data_t; + +chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source); +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void chm_config_destroy(cmph_config_t *mph); +cmph_t *chm_new(cmph_config_t *mph, float c); + +void chm_load(FILE *f, cmph_t *mphf); +int chm_dump(cmph_t *mphf, FILE *f); +void chm_destroy(cmph_t *mphf); +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/chm_structs.h b/src/chm_structs.h new file mode 100644 index 0000000..fcad1bc --- /dev/null +++ b/src/chm_structs.h @@ -0,0 +1,24 @@ +#ifndef __CMPH_CHM_STRUCTS_H__ +#define __CMPH_CHM_STRUCTS_H__ + +#include "hash_state.h" + +struct __chm_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + hash_state_t **hashes; +}; + +struct __chm_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + graph_t *graph; + cmph_uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c index 979b85f..6aed7ee 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -1,6 +1,6 @@ #include "cmph.h" #include "cmph_structs.h" -#include "czech.h" +#include "chm.h" #include "bmz.h" //#include "bmz.h" /* included -- Fabiano */ @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "czech", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { @@ -97,7 +97,7 @@ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) cmph_config_t *mph = NULL; mph = __config_new(key_source); assert(mph); - mph->algo = CMPH_CZECH; // default value + mph->algo = CMPH_CHM; // default value return mph; } @@ -111,8 +111,8 @@ void cmph_config_destroy(cmph_config_t *mph) DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); switch (mph->algo) { - case CMPH_CZECH: - czech_config_destroy(mph); + case CMPH_CHM: + chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ bmz_config_destroy(mph); @@ -132,8 +132,8 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { switch (mph->algo) { - case CMPH_CZECH: - czech_config_set_hashfuncs(mph, hashfuncs); + case CMPH_CHM: + chm_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); @@ -157,11 +157,11 @@ cmph_t *cmph_new(cmph_config_t *mph) DEBUGP("Creating mph with algorithm %s\n", cmph_names[mph->algo]); switch (mph->algo) { - case CMPH_CZECH: - DEBUGP("Creating czech hash\n"); - mph->data = czech_config_new(mph->key_source); + case CMPH_CHM: + DEBUGP("Creating chm hash\n"); + mph->data = chm_config_new(mph->key_source); if (c == 0) c = 2.09; - mphf = czech_new(mph, c); + mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); @@ -179,8 +179,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) { switch (mphf->algo) { - case CMPH_CZECH: - return czech_dump(mphf, f); + case CMPH_CHM: + return chm_dump(mphf, f); break; case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); @@ -201,8 +201,8 @@ cmph_t *cmph_load(FILE *f) switch (mphf->algo) { - case CMPH_CZECH: - czech_load(f, mphf); + case CMPH_CHM: + chm_load(f, mphf); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Loading bmz algorithm dependent parts\n"); @@ -221,8 +221,8 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("mphf algorithm: %u \n", mphf->algo); switch(mphf->algo) { - case CMPH_CZECH: - return czech_search(mphf, key, keylen); + case CMPH_CHM: + return chm_search(mphf, key, keylen); case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); @@ -242,8 +242,8 @@ void cmph_destroy(cmph_t *mphf) { switch(mphf->algo) { - case CMPH_CZECH: - czech_destroy(mphf); + case CMPH_CHM: + chm_destroy(mphf); return; case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); diff --git a/src/cmph_types.h b/src/cmph_types.h index 077fb60..8b65795 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -8,7 +8,7 @@ typedef unsigned int cmph_uint32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_GLIB, CMPH_HASH_JENKINS, CMPH_HASH_PJW, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CZECH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/main.c b/src/main.c index 4b9d0e5..537d28e 100644 --- a/src/main.c +++ b/src/main.c @@ -54,7 +54,7 @@ int main(int argc, char **argv) CMPH_HASH *hashes = NULL; cmph_uint32 nhashes = 0; cmph_uint32 i; - CMPH_ALGO mph_algo = CMPH_CZECH; + CMPH_ALGO mph_algo = CMPH_CHM; float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; From 2c79aa809a6b361c35c89c24f70e86e12adbffe4 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 21:06:58 +0000 Subject: [PATCH 064/739] It was changed the prefix czech by chm --- src/Makefile.am | 2 +- src/chm.c | 317 ++++++++++++++++++++++++++++++++++++++++++++++ src/chm.h | 18 +++ src/chm_structs.h | 24 ++++ src/cmph.c | 38 +++--- src/cmph_types.h | 2 +- src/main.c | 2 +- 7 files changed, 381 insertions(+), 22 deletions(-) create mode 100644 src/chm.c create mode 100644 src/chm.h create mode 100644 src/chm_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 5eb55e7..3b01af4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,7 +14,7 @@ libcmph_la_SOURCES = debug.h\ graph.h graph.c\ cmph.h cmph.c\ cmph_structs.h cmph_structs.c\ - czech.h czech_structs.h czech.c\ + chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/chm.c b/src/chm.c new file mode 100644 index 0000000..5739c3b --- /dev/null +++ b/src/chm.c @@ -0,0 +1,317 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source) +{ + chm_config_data_t *chm = NULL; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + assert(chm); + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + chm->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(chm->n/8 + 1); + memset(visited, 0, chm->n/8 + 1); + free(chm->g); + chm->g = malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_config_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices\n", chm->n); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = htonl(2); //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + cmph_uint32 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbuflen = htonl(buflen); + fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + nn = htonl(data->n); + fwrite(&nn, sizeof(cmph_uint32), 1, fd); + nm = htonl(data->m); + fwrite(&nm, sizeof(cmph_uint32), 1, fd); + + for (i = 0; i < data->n; ++i) + { + cmph_uint32 ng = htonl(data->g[i]); + fwrite(&ng, sizeof(cmph_uint32), 1, fd); + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char fbuf[BUFSIZ]; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + hash_state_t *state; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + nhashes = ntohl(nhashes); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + buflen = ntohl(buflen); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(chm->n), sizeof(cmph_uint32), 1, f); + chm->n = ntohl(chm->n); + fread(&(chm->m), sizeof(cmph_uint32), 1, f); + chm->m = ntohl(chm->m); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + for (i = 0; i < chm->n; ++i) chm->g[i] = ntohl(chm->g[i]); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/chm.h b/src/chm.h new file mode 100644 index 0000000..f98d83d --- /dev/null +++ b/src/chm.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_CHM_H__ +#define __CMPH_CHM_H__ + +#include "cmph.h" + +typedef struct __chm_data_t chm_data_t; +typedef struct __chm_config_data_t chm_config_data_t; + +chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source); +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void chm_config_destroy(cmph_config_t *mph); +cmph_t *chm_new(cmph_config_t *mph, float c); + +void chm_load(FILE *f, cmph_t *mphf); +int chm_dump(cmph_t *mphf, FILE *f); +void chm_destroy(cmph_t *mphf); +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/chm_structs.h b/src/chm_structs.h new file mode 100644 index 0000000..fcad1bc --- /dev/null +++ b/src/chm_structs.h @@ -0,0 +1,24 @@ +#ifndef __CMPH_CHM_STRUCTS_H__ +#define __CMPH_CHM_STRUCTS_H__ + +#include "hash_state.h" + +struct __chm_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + hash_state_t **hashes; +}; + +struct __chm_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + graph_t *graph; + cmph_uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c index 979b85f..6aed7ee 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -1,6 +1,6 @@ #include "cmph.h" #include "cmph_structs.h" -#include "czech.h" +#include "chm.h" #include "bmz.h" //#include "bmz.h" /* included -- Fabiano */ @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "czech", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { @@ -97,7 +97,7 @@ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) cmph_config_t *mph = NULL; mph = __config_new(key_source); assert(mph); - mph->algo = CMPH_CZECH; // default value + mph->algo = CMPH_CHM; // default value return mph; } @@ -111,8 +111,8 @@ void cmph_config_destroy(cmph_config_t *mph) DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); switch (mph->algo) { - case CMPH_CZECH: - czech_config_destroy(mph); + case CMPH_CHM: + chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ bmz_config_destroy(mph); @@ -132,8 +132,8 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { switch (mph->algo) { - case CMPH_CZECH: - czech_config_set_hashfuncs(mph, hashfuncs); + case CMPH_CHM: + chm_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); @@ -157,11 +157,11 @@ cmph_t *cmph_new(cmph_config_t *mph) DEBUGP("Creating mph with algorithm %s\n", cmph_names[mph->algo]); switch (mph->algo) { - case CMPH_CZECH: - DEBUGP("Creating czech hash\n"); - mph->data = czech_config_new(mph->key_source); + case CMPH_CHM: + DEBUGP("Creating chm hash\n"); + mph->data = chm_config_new(mph->key_source); if (c == 0) c = 2.09; - mphf = czech_new(mph, c); + mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); @@ -179,8 +179,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) { switch (mphf->algo) { - case CMPH_CZECH: - return czech_dump(mphf, f); + case CMPH_CHM: + return chm_dump(mphf, f); break; case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); @@ -201,8 +201,8 @@ cmph_t *cmph_load(FILE *f) switch (mphf->algo) { - case CMPH_CZECH: - czech_load(f, mphf); + case CMPH_CHM: + chm_load(f, mphf); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Loading bmz algorithm dependent parts\n"); @@ -221,8 +221,8 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("mphf algorithm: %u \n", mphf->algo); switch(mphf->algo) { - case CMPH_CZECH: - return czech_search(mphf, key, keylen); + case CMPH_CHM: + return chm_search(mphf, key, keylen); case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); @@ -242,8 +242,8 @@ void cmph_destroy(cmph_t *mphf) { switch(mphf->algo) { - case CMPH_CZECH: - czech_destroy(mphf); + case CMPH_CHM: + chm_destroy(mphf); return; case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); diff --git a/src/cmph_types.h b/src/cmph_types.h index 077fb60..8b65795 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -8,7 +8,7 @@ typedef unsigned int cmph_uint32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_GLIB, CMPH_HASH_JENKINS, CMPH_HASH_PJW, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CZECH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/main.c b/src/main.c index 4b9d0e5..537d28e 100644 --- a/src/main.c +++ b/src/main.c @@ -54,7 +54,7 @@ int main(int argc, char **argv) CMPH_HASH *hashes = NULL; cmph_uint32 nhashes = 0; cmph_uint32 i; - CMPH_ALGO mph_algo = CMPH_CZECH; + CMPH_ALGO mph_algo = CMPH_CHM; float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; From ff1b59d7c7b71a325176ce576a1be714c8f6846a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 21:09:44 +0000 Subject: [PATCH 065/739] The czech.h, czech_structs.h and czech.c files were removed --- src/czech.c | 317 -------------------------------------------- src/czech.h | 18 --- src/czech_structs.h | 24 ---- 3 files changed, 359 deletions(-) delete mode 100644 src/czech.c delete mode 100644 src/czech.h delete mode 100644 src/czech_structs.h diff --git a/src/czech.c b/src/czech.c deleted file mode 100644 index fe8c3bc..0000000 --- a/src/czech.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "graph.h" -#include "czech.h" -#include "cmph_structs.h" -#include "czech_structs.h" -#include "hash.h" -#include "bitbool.h" - -#include -#include -#include -#include -#include -#include - -//#define DEBUG -#include "debug.h" - -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - -static int czech_gen_edges(cmph_config_t *mph); -static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); - -czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source) -{ - czech_config_data_t *czech = NULL; - czech = (czech_config_data_t *)malloc(sizeof(czech_config_data_t)); - czech->hashfuncs[0] = CMPH_HASH_JENKINS; - czech->hashfuncs[1] = CMPH_HASH_JENKINS; - czech->g = NULL; - czech->graph = NULL; - czech->hashes = NULL; - assert(czech); - return czech; -} -void czech_config_destroy(cmph_config_t *mph) -{ - czech_config_data_t *data = (czech_config_data_t *)mph->data; - DEBUGP("Destroying algorithm dependent data\n"); - free(data); -} - -void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) -{ - czech_config_data_t *czech = (czech_config_data_t *)mph->data; - CMPH_HASH *hashptr = hashfuncs; - cmph_uint32 i = 0; - while(*hashptr != CMPH_HASH_COUNT) - { - if (i >= 2) break; //czech only uses two hash functions - czech->hashfuncs[i] = *hashptr; - ++i, ++hashptr; - } -} - -cmph_t *czech_new(cmph_config_t *mph, float c) -{ - cmph_t *mphf = NULL; - czech_data_t *czechf = NULL; - - cmph_uint32 i; - cmph_uint32 iterations = 20; - cmph_uint8 *visited = NULL; - czech_config_data_t *czech = (czech_config_data_t *)mph->data; - czech->m = mph->key_source->nkeys; - czech->n = ceil(c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); - czech->graph = graph_new(czech->n, czech->m); - DEBUGP("Created graph\n"); - - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); - for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; - //Mapping step - if (mph->verbosity) - { - fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", czech->m, czech->n); - } - while(1) - { - int ok; - czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); - czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); - ok = czech_gen_edges(mph); - if (!ok) - { - --iterations; - hash_state_destroy(czech->hashes[0]); - czech->hashes[0] = NULL; - hash_state_destroy(czech->hashes[1]); - czech->hashes[1] = NULL; - DEBUGP("%u iterations remaining\n", iterations); - if (mph->verbosity) - { - fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); - } - if (iterations == 0) break; - } - else break; - } - if (iterations == 0) - { - graph_destroy(czech->graph); - return NULL; - } - - //Assignment step - if (mph->verbosity) - { - fprintf(stderr, "Starting assignment step\n"); - } - DEBUGP("Assignment step\n"); - visited = (char *)malloc(czech->n/8 + 1); - memset(visited, 0, czech->n/8 + 1); - free(czech->g); - czech->g = malloc(czech->n * sizeof(cmph_uint32)); - assert(czech->g); - for (i = 0; i < czech->n; ++i) - { - if (!GETBIT(visited,i)) - { - czech->g[i] = 0; - czech_traverse(czech, visited, i); - } - } - graph_destroy(czech->graph); - free(visited); - czech->graph = NULL; - - mphf = (cmph_t *)malloc(sizeof(cmph_t)); - mphf->algo = mph->algo; - czechf = (czech_data_t *)malloc(sizeof(czech_config_data_t)); - czechf->g = czech->g; - czech->g = NULL; //transfer memory ownership - czechf->hashes = czech->hashes; - czech->hashes = NULL; //transfer memory ownership - czechf->n = czech->n; - czechf->m = czech->m; - mphf->data = czechf; - mphf->size = czech->m; - DEBUGP("Successfully generated minimal perfect hash\n"); - if (mph->verbosity) - { - fprintf(stderr, "Successfully generated minimal perfect hash function\n"); - } - return mphf; -} - -static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) -{ - - graph_iterator_t it = graph_neighbors_it(czech->graph, v); - cmph_uint32 neighbor = 0; - SETBIT(visited,v); - - DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) - { - DEBUGP("Visiting neighbor %u\n", neighbor); - if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); - czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); - czech_traverse(czech, visited, neighbor); - } -} - -static int czech_gen_edges(cmph_config_t *mph) -{ - cmph_uint32 e; - czech_config_data_t *czech = (czech_config_data_t *)mph->data; - int cycles = 0; - - DEBUGP("Generating edges for %u vertices\n", czech->n); - graph_clear_edges(czech->graph); - mph->key_source->rewind(mph->key_source->data); - for (e = 0; e < mph->key_source->nkeys; ++e) - { - cmph_uint32 h1, h2; - cmph_uint32 keylen; - char *key; - mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(czech->hashes[0], key, keylen) % czech->n; - h2 = hash(czech->hashes[1], key, keylen) % czech->n; - if (h1 == h2) if (++h2 >= czech->n) h2 = 0; - if (h1 == h2) - { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); - mph->key_source->dispose(mph->key_source->data, key, keylen); - return 0; - } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); - mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(czech->graph, h1, h2); - } - cycles = graph_is_cyclic(czech->graph); - if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); - DEBUGP("Looking for cycles: %u\n", cycles); - - return ! cycles; -} - -int czech_dump(cmph_t *mphf, FILE *fd) -{ - char *buf = NULL; - cmph_uint32 buflen; - cmph_uint32 nbuflen; - cmph_uint32 i; - cmph_uint32 two = htonl(2); //number of hash functions - czech_data_t *data = (czech_data_t *)mphf->data; - cmph_uint32 nn, nm; - __cmph_dump(mphf, fd); - - fwrite(&two, sizeof(cmph_uint32), 1, fd); - - hash_state_dump(data->hashes[0], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - hash_state_dump(data->hashes[1], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - nn = htonl(data->n); - fwrite(&nn, sizeof(cmph_uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(cmph_uint32), 1, fd); - - for (i = 0; i < data->n; ++i) - { - cmph_uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(cmph_uint32), 1, fd); - } - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); - fprintf(stderr, "\n"); - #endif - return 1; -} - -void czech_load(FILE *f, cmph_t *mphf) -{ - cmph_uint32 nhashes; - char fbuf[BUFSIZ]; - char *buf = NULL; - cmph_uint32 buflen; - cmph_uint32 i; - hash_state_t *state; - czech_data_t *czech = (czech_data_t *)malloc(sizeof(czech_data_t)); - - DEBUGP("Loading czech mphf\n"); - mphf->data = czech; - fread(&nhashes, sizeof(cmph_uint32), 1, f); - nhashes = ntohl(nhashes); - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - czech->hashes[nhashes] = NULL; - DEBUGP("Reading %u hashes\n", nhashes); - for (i = 0; i < nhashes; ++i) - { - hash_state_t *state = NULL; - fread(&buflen, sizeof(cmph_uint32), 1, f); - buflen = ntohl(buflen); - DEBUGP("Hash state has %u bytes\n", buflen); - buf = (char *)malloc(buflen); - fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); - czech->hashes[i] = state; - free(buf); - } - - DEBUGP("Reading m and n\n"); - fread(&(czech->n), sizeof(cmph_uint32), 1, f); - czech->n = ntohl(czech->n); - fread(&(czech->m), sizeof(cmph_uint32), 1, f); - czech->m = ntohl(czech->m); - - czech->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*czech->n); - fread(czech->g, czech->n*sizeof(cmph_uint32), 1, f); - for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); - fprintf(stderr, "\n"); - #endif - return; -} - - -cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) -{ - czech_data_t *czech = mphf->data; - cmph_uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; - cmph_uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; - DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > czech->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); - return (czech->g[h1] + czech->g[h2]) % czech->m; -} -void czech_destroy(cmph_t *mphf) -{ - czech_data_t *data = (czech_data_t *)mphf->data; - free(data->g); - hash_state_destroy(data->hashes[0]); - hash_state_destroy(data->hashes[1]); - free(data->hashes); - free(data); - free(mphf); -} diff --git a/src/czech.h b/src/czech.h deleted file mode 100644 index 64af13c..0000000 --- a/src/czech.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __CMPH_CZECH_H__ -#define __CMPH_CZECH_H__ - -#include "cmph.h" - -typedef struct __czech_data_t czech_data_t; -typedef struct __czech_config_data_t czech_config_data_t; - -czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source); -void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); -void czech_config_destroy(cmph_config_t *mph); -cmph_t *czech_new(cmph_config_t *mph, float c); - -void czech_load(FILE *f, cmph_t *mphf); -int czech_dump(cmph_t *mphf, FILE *f); -void czech_destroy(cmph_t *mphf); -cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); -#endif diff --git a/src/czech_structs.h b/src/czech_structs.h deleted file mode 100644 index a03bc6e..0000000 --- a/src/czech_structs.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __CMPH_CZECH_STRUCTS_H__ -#define __CMPH_CZECH_STRUCTS_H__ - -#include "hash_state.h" - -struct __czech_data_t -{ - cmph_uint32 m; //edges (words) count - cmph_uint32 n; //vertex count - cmph_uint32 *g; - hash_state_t **hashes; -}; - -struct __czech_config_data_t -{ - CMPH_HASH hashfuncs[2]; - cmph_uint32 m; //edges (words) count - cmph_uint32 n; //vertex count - graph_t *graph; - cmph_uint32 *g; - hash_state_t **hashes; -}; - -#endif From d831257c4f03d18655993e015064e14c8fe724c9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 21:09:44 +0000 Subject: [PATCH 066/739] The czech.h, czech_structs.h and czech.c files were removed --- src/czech.c | 317 -------------------------------------------- src/czech.h | 18 --- src/czech_structs.h | 24 ---- 3 files changed, 359 deletions(-) delete mode 100644 src/czech.c delete mode 100644 src/czech.h delete mode 100644 src/czech_structs.h diff --git a/src/czech.c b/src/czech.c deleted file mode 100644 index fe8c3bc..0000000 --- a/src/czech.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "graph.h" -#include "czech.h" -#include "cmph_structs.h" -#include "czech_structs.h" -#include "hash.h" -#include "bitbool.h" - -#include -#include -#include -#include -#include -#include - -//#define DEBUG -#include "debug.h" - -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - -static int czech_gen_edges(cmph_config_t *mph); -static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v); - -czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source) -{ - czech_config_data_t *czech = NULL; - czech = (czech_config_data_t *)malloc(sizeof(czech_config_data_t)); - czech->hashfuncs[0] = CMPH_HASH_JENKINS; - czech->hashfuncs[1] = CMPH_HASH_JENKINS; - czech->g = NULL; - czech->graph = NULL; - czech->hashes = NULL; - assert(czech); - return czech; -} -void czech_config_destroy(cmph_config_t *mph) -{ - czech_config_data_t *data = (czech_config_data_t *)mph->data; - DEBUGP("Destroying algorithm dependent data\n"); - free(data); -} - -void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) -{ - czech_config_data_t *czech = (czech_config_data_t *)mph->data; - CMPH_HASH *hashptr = hashfuncs; - cmph_uint32 i = 0; - while(*hashptr != CMPH_HASH_COUNT) - { - if (i >= 2) break; //czech only uses two hash functions - czech->hashfuncs[i] = *hashptr; - ++i, ++hashptr; - } -} - -cmph_t *czech_new(cmph_config_t *mph, float c) -{ - cmph_t *mphf = NULL; - czech_data_t *czechf = NULL; - - cmph_uint32 i; - cmph_uint32 iterations = 20; - cmph_uint8 *visited = NULL; - czech_config_data_t *czech = (czech_config_data_t *)mph->data; - czech->m = mph->key_source->nkeys; - czech->n = ceil(c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u c: %f\n", czech->m, czech->n, c); - czech->graph = graph_new(czech->n, czech->m); - DEBUGP("Created graph\n"); - - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); - for(i = 0; i < 3; ++i) czech->hashes[i] = NULL; - //Mapping step - if (mph->verbosity) - { - fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", czech->m, czech->n); - } - while(1) - { - int ok; - czech->hashes[0] = hash_state_new(czech->hashfuncs[0], czech->n); - czech->hashes[1] = hash_state_new(czech->hashfuncs[1], czech->n); - ok = czech_gen_edges(mph); - if (!ok) - { - --iterations; - hash_state_destroy(czech->hashes[0]); - czech->hashes[0] = NULL; - hash_state_destroy(czech->hashes[1]); - czech->hashes[1] = NULL; - DEBUGP("%u iterations remaining\n", iterations); - if (mph->verbosity) - { - fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); - } - if (iterations == 0) break; - } - else break; - } - if (iterations == 0) - { - graph_destroy(czech->graph); - return NULL; - } - - //Assignment step - if (mph->verbosity) - { - fprintf(stderr, "Starting assignment step\n"); - } - DEBUGP("Assignment step\n"); - visited = (char *)malloc(czech->n/8 + 1); - memset(visited, 0, czech->n/8 + 1); - free(czech->g); - czech->g = malloc(czech->n * sizeof(cmph_uint32)); - assert(czech->g); - for (i = 0; i < czech->n; ++i) - { - if (!GETBIT(visited,i)) - { - czech->g[i] = 0; - czech_traverse(czech, visited, i); - } - } - graph_destroy(czech->graph); - free(visited); - czech->graph = NULL; - - mphf = (cmph_t *)malloc(sizeof(cmph_t)); - mphf->algo = mph->algo; - czechf = (czech_data_t *)malloc(sizeof(czech_config_data_t)); - czechf->g = czech->g; - czech->g = NULL; //transfer memory ownership - czechf->hashes = czech->hashes; - czech->hashes = NULL; //transfer memory ownership - czechf->n = czech->n; - czechf->m = czech->m; - mphf->data = czechf; - mphf->size = czech->m; - DEBUGP("Successfully generated minimal perfect hash\n"); - if (mph->verbosity) - { - fprintf(stderr, "Successfully generated minimal perfect hash function\n"); - } - return mphf; -} - -static void czech_traverse(czech_config_data_t *czech, cmph_uint8 *visited, cmph_uint32 v) -{ - - graph_iterator_t it = graph_neighbors_it(czech->graph, v); - cmph_uint32 neighbor = 0; - SETBIT(visited,v); - - DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(czech->graph, &it)) != GRAPH_NO_NEIGHBOR) - { - DEBUGP("Visiting neighbor %u\n", neighbor); - if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(czech->graph, v, neighbor)); - czech->g[neighbor] = graph_edge_id(czech->graph, v, neighbor) - czech->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", czech->g[neighbor], graph_edge_id(czech->graph, v, neighbor), czech->g[v], czech->m); - czech_traverse(czech, visited, neighbor); - } -} - -static int czech_gen_edges(cmph_config_t *mph) -{ - cmph_uint32 e; - czech_config_data_t *czech = (czech_config_data_t *)mph->data; - int cycles = 0; - - DEBUGP("Generating edges for %u vertices\n", czech->n); - graph_clear_edges(czech->graph); - mph->key_source->rewind(mph->key_source->data); - for (e = 0; e < mph->key_source->nkeys; ++e) - { - cmph_uint32 h1, h2; - cmph_uint32 keylen; - char *key; - mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(czech->hashes[0], key, keylen) % czech->n; - h2 = hash(czech->hashes[1], key, keylen) % czech->n; - if (h1 == h2) if (++h2 >= czech->n) h2 = 0; - if (h1 == h2) - { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); - mph->key_source->dispose(mph->key_source->data, key, keylen); - return 0; - } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); - mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(czech->graph, h1, h2); - } - cycles = graph_is_cyclic(czech->graph); - if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); - DEBUGP("Looking for cycles: %u\n", cycles); - - return ! cycles; -} - -int czech_dump(cmph_t *mphf, FILE *fd) -{ - char *buf = NULL; - cmph_uint32 buflen; - cmph_uint32 nbuflen; - cmph_uint32 i; - cmph_uint32 two = htonl(2); //number of hash functions - czech_data_t *data = (czech_data_t *)mphf->data; - cmph_uint32 nn, nm; - __cmph_dump(mphf, fd); - - fwrite(&two, sizeof(cmph_uint32), 1, fd); - - hash_state_dump(data->hashes[0], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - hash_state_dump(data->hashes[1], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - nn = htonl(data->n); - fwrite(&nn, sizeof(cmph_uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(cmph_uint32), 1, fd); - - for (i = 0; i < data->n; ++i) - { - cmph_uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(cmph_uint32), 1, fd); - } - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); - fprintf(stderr, "\n"); - #endif - return 1; -} - -void czech_load(FILE *f, cmph_t *mphf) -{ - cmph_uint32 nhashes; - char fbuf[BUFSIZ]; - char *buf = NULL; - cmph_uint32 buflen; - cmph_uint32 i; - hash_state_t *state; - czech_data_t *czech = (czech_data_t *)malloc(sizeof(czech_data_t)); - - DEBUGP("Loading czech mphf\n"); - mphf->data = czech; - fread(&nhashes, sizeof(cmph_uint32), 1, f); - nhashes = ntohl(nhashes); - czech->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - czech->hashes[nhashes] = NULL; - DEBUGP("Reading %u hashes\n", nhashes); - for (i = 0; i < nhashes; ++i) - { - hash_state_t *state = NULL; - fread(&buflen, sizeof(cmph_uint32), 1, f); - buflen = ntohl(buflen); - DEBUGP("Hash state has %u bytes\n", buflen); - buf = (char *)malloc(buflen); - fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); - czech->hashes[i] = state; - free(buf); - } - - DEBUGP("Reading m and n\n"); - fread(&(czech->n), sizeof(cmph_uint32), 1, f); - czech->n = ntohl(czech->n); - fread(&(czech->m), sizeof(cmph_uint32), 1, f); - czech->m = ntohl(czech->m); - - czech->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*czech->n); - fread(czech->g, czech->n*sizeof(cmph_uint32), 1, f); - for (i = 0; i < czech->n; ++i) czech->g[i] = ntohl(czech->g[i]); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < czech->n; ++i) fprintf(stderr, "%u ", czech->g[i]); - fprintf(stderr, "\n"); - #endif - return; -} - - -cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) -{ - czech_data_t *czech = mphf->data; - cmph_uint32 h1 = hash(czech->hashes[0], key, keylen) % czech->n; - cmph_uint32 h2 = hash(czech->hashes[1], key, keylen) % czech->n; - DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > czech->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, czech->g[h1], czech->g[h2], czech->m); - return (czech->g[h1] + czech->g[h2]) % czech->m; -} -void czech_destroy(cmph_t *mphf) -{ - czech_data_t *data = (czech_data_t *)mphf->data; - free(data->g); - hash_state_destroy(data->hashes[0]); - hash_state_destroy(data->hashes[1]); - free(data->hashes); - free(data); - free(mphf); -} diff --git a/src/czech.h b/src/czech.h deleted file mode 100644 index 64af13c..0000000 --- a/src/czech.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __CMPH_CZECH_H__ -#define __CMPH_CZECH_H__ - -#include "cmph.h" - -typedef struct __czech_data_t czech_data_t; -typedef struct __czech_config_data_t czech_config_data_t; - -czech_config_data_t *czech_config_new(cmph_io_adapter_t *key_source); -void czech_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); -void czech_config_destroy(cmph_config_t *mph); -cmph_t *czech_new(cmph_config_t *mph, float c); - -void czech_load(FILE *f, cmph_t *mphf); -int czech_dump(cmph_t *mphf, FILE *f); -void czech_destroy(cmph_t *mphf); -cmph_uint32 czech_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); -#endif diff --git a/src/czech_structs.h b/src/czech_structs.h deleted file mode 100644 index a03bc6e..0000000 --- a/src/czech_structs.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __CMPH_CZECH_STRUCTS_H__ -#define __CMPH_CZECH_STRUCTS_H__ - -#include "hash_state.h" - -struct __czech_data_t -{ - cmph_uint32 m; //edges (words) count - cmph_uint32 n; //vertex count - cmph_uint32 *g; - hash_state_t **hashes; -}; - -struct __czech_config_data_t -{ - CMPH_HASH hashfuncs[2]; - cmph_uint32 m; //edges (words) count - cmph_uint32 n; //vertex count - graph_t *graph; - cmph_uint32 *g; - hash_state_t **hashes; -}; - -#endif From a6460501115fe002ac67bcbfb4c95f7ec25512bb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 21:10:46 +0000 Subject: [PATCH 067/739] generated in version 0.3 From 4b1d7a7713c3eb4caa7178dc944151834473745e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Jan 2005 21:10:46 +0000 Subject: [PATCH 068/739] generated in version 0.3 --- INSTALL | 161 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 105 insertions(+), 56 deletions(-) diff --git a/INSTALL b/INSTALL index b42a17a..095b1eb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,27 +1,43 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. The simplest way to compile this package is: @@ -54,20 +70,22 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -75,28 +93,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -107,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -122,48 +140,81 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + CPU-COMPANY-SYSTEM -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. +where SYSTEM can have one of these forms: - If you are building compiler tools for cross-compiling, you can also + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Operation Controls +Defining Variables ================== - `configure' recognizes the following options to control how it -operates. +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. `--help' +`-h' Print a summary of the options to `configure', and exit. +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + `--quiet' `--silent' `-q' @@ -175,8 +226,6 @@ operates. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. -`configure' also accepts some other, not widely useful, options. From 1e5c4f0f4bca28eb7491e153821111677ac4f3d8 Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 27 Jan 2005 00:04:11 +0000 Subject: [PATCH 069/739] Added gperf notes. --- BMZ.t2t | 3 --- CHM.t2t | 3 --- COMPARISON.t2t | 3 --- GPERF.t2t | 40 ++++++++++++++++++++++++++++++++++++++++ README.t2t | 7 +++---- gendocs | 1 + 6 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 GPERF.t2t diff --git a/BMZ.t2t b/BMZ.t2t index eea2831..4a9e2bf 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -21,6 +21,3 @@ Enjoy! Davi de Castro Reis Fabiano Cupertino Botelho - -%!include(html): ''LOGO.html'' -Last Updated: %%date(%c) diff --git a/CHM.t2t b/CHM.t2t index ae1fef5..d53dab8 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -19,6 +19,3 @@ Enjoy! Davi de Castro Reis Fabiano Cupertino Botelho - -%!include(html): ''LOGO.html'' -Last Updated: %%date(%c) diff --git a/COMPARISON.t2t b/COMPARISON.t2t index bc0fbb2..b6f9226 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -22,6 +22,3 @@ Enjoy! Davi de Castro Reis Fabiano Cupertino Botelho - -%!include(html): ''LOGO.html'' -Last Updated: %%date(%c) diff --git a/GPERF.t2t b/GPERF.t2t new file mode 100644 index 0000000..9c3fa4b --- /dev/null +++ b/GPERF.t2t @@ -0,0 +1,40 @@ +GPERF versus CMPH + + + +You might ask why cmph if [gperf http://www.gnu.org/software/gperf/gperf.html] +already works perfectly. Actually, gperf and cmph have different goals. +Basically, these are the requirements for each of them: + + +- GPERF + + - Create very fast hash functions for **small** sets + + - Create **perfect** hash functions + +- CMPH + + - Create very fast hash function for **very large** sets + + - Create **minimal perfect** hash functions + +As result, cmph can be used to create hash functions where gperf would run +forever without finding a perfect hash function, because of the running +time of the algorithm and the large memory usage. +On the other side, functions created by cmph are about 2x slower than those +created by gperf. + +So, if you have large sets, or memory usage is a key restriction for you, stick +to cmph. If you have small sets, and do not care about memory usage, go with +gperf. The first problem is common in the information retrieval field (e.g. +assigning ids to millions of documents), while the former is usually found in +the compiler programming area (detect reserved keywords). + +---------------------------------------- +[Home index.html] +---------------------------------------- + +Davi de Castro Reis + +Fabiano Cupertino Botelho diff --git a/README.t2t b/README.t2t index d03151f..8fb99cf 100644 --- a/README.t2t +++ b/README.t2t @@ -3,7 +3,7 @@ CMPH - C Minimal Perfect Hashing Library %!includeconf: CONFIG.t2t ----------------------------------------- +------------------------------------------------------------------- **Description** @@ -14,8 +14,8 @@ production-quality and fast API. The library is designed to work with big entrie can not fit in the main memory. It has been used successfully for constructing minimal perfect hashing functions for sets with more than 100 million of keys. Although there is a lack of similar libraries -in the free software world, we can point out some of the distinguishable -features of cmph: +in the free software world ([gperf is a bit different gperf.html]), we can point out some +of the distinguishable features of cmph: - Fast. - Space-efficient with main memory usage carefully documented. @@ -28,7 +28,6 @@ features of cmph: - Well encapsulated API aiming binary compatibility through releases. - Free Software. - ---------------------------------------- **Supported Algorithms** diff --git a/gendocs b/gendocs index 85ead77..71021f7 100755 --- a/gendocs +++ b/gendocs @@ -2,4 +2,5 @@ txt2tags -t html -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html +txt2tags -t html -i GPERF.t2t -o gperf.html txt2tags -t txt -i README.t2t -o README From 70796d938381baa25e84695cd454fd97f23ed4e7 Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 27 Jan 2005 00:04:11 +0000 Subject: [PATCH 070/739] Added gperf notes. --- BMZ.t2t | 3 --- CHM.t2t | 3 --- COMPARISON.t2t | 3 --- GPERF.t2t | 40 ++++++++++++++++++++++++++++++++++++++++ README | 8 ++++---- README.t2t | 7 +++---- gendocs | 1 + 7 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 GPERF.t2t diff --git a/BMZ.t2t b/BMZ.t2t index eea2831..4a9e2bf 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -21,6 +21,3 @@ Enjoy! Davi de Castro Reis Fabiano Cupertino Botelho - -%!include(html): ''LOGO.html'' -Last Updated: %%date(%c) diff --git a/CHM.t2t b/CHM.t2t index ae1fef5..d53dab8 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -19,6 +19,3 @@ Enjoy! Davi de Castro Reis Fabiano Cupertino Botelho - -%!include(html): ''LOGO.html'' -Last Updated: %%date(%c) diff --git a/COMPARISON.t2t b/COMPARISON.t2t index bc0fbb2..b6f9226 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -22,6 +22,3 @@ Enjoy! Davi de Castro Reis Fabiano Cupertino Botelho - -%!include(html): ''LOGO.html'' -Last Updated: %%date(%c) diff --git a/GPERF.t2t b/GPERF.t2t new file mode 100644 index 0000000..9c3fa4b --- /dev/null +++ b/GPERF.t2t @@ -0,0 +1,40 @@ +GPERF versus CMPH + + + +You might ask why cmph if [gperf http://www.gnu.org/software/gperf/gperf.html] +already works perfectly. Actually, gperf and cmph have different goals. +Basically, these are the requirements for each of them: + + +- GPERF + + - Create very fast hash functions for **small** sets + + - Create **perfect** hash functions + +- CMPH + + - Create very fast hash function for **very large** sets + + - Create **minimal perfect** hash functions + +As result, cmph can be used to create hash functions where gperf would run +forever without finding a perfect hash function, because of the running +time of the algorithm and the large memory usage. +On the other side, functions created by cmph are about 2x slower than those +created by gperf. + +So, if you have large sets, or memory usage is a key restriction for you, stick +to cmph. If you have small sets, and do not care about memory usage, go with +gperf. The first problem is common in the information retrieval field (e.g. +assigning ids to millions of documents), while the former is usually found in +the compiler programming area (detect reserved keywords). + +---------------------------------------- +[Home index.html] +---------------------------------------- + +Davi de Castro Reis + +Fabiano Cupertino Botelho diff --git a/README b/README index 8fc9cd9..f7a02e4 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ CMPH - C Minimal Perfect Hashing Library ----------------------------------------- +------------------------------------------------------------------- Description @@ -11,8 +11,8 @@ production-quality and fast API. The library is designed to work with big entrie can not fit in the main memory. It has been used successfully for constructing minimal perfect hashing functions for sets with more than 100 million of keys. Although there is a lack of similar libraries -in the free software world, we can point out some of the distinguishable -features of cmph: +in the free software world (gperf is a bit different (gperf.html)), we can point out some +of the distinguishable features of cmph: - Fast. - Space-efficient with main memory usage carefully documented. @@ -162,7 +162,7 @@ Davi de Castro Reis Fabiano Cupertino Botelho -Last Updated: Tue Jan 25 18:43:38 2005 +Last Updated: Wed Jan 26 22:37:36 2005 diff --git a/README.t2t b/README.t2t index d03151f..8fb99cf 100644 --- a/README.t2t +++ b/README.t2t @@ -3,7 +3,7 @@ CMPH - C Minimal Perfect Hashing Library %!includeconf: CONFIG.t2t ----------------------------------------- +------------------------------------------------------------------- **Description** @@ -14,8 +14,8 @@ production-quality and fast API. The library is designed to work with big entrie can not fit in the main memory. It has been used successfully for constructing minimal perfect hashing functions for sets with more than 100 million of keys. Although there is a lack of similar libraries -in the free software world, we can point out some of the distinguishable -features of cmph: +in the free software world ([gperf is a bit different gperf.html]), we can point out some +of the distinguishable features of cmph: - Fast. - Space-efficient with main memory usage carefully documented. @@ -28,7 +28,6 @@ features of cmph: - Well encapsulated API aiming binary compatibility through releases. - Free Software. - ---------------------------------------- **Supported Algorithms** diff --git a/gendocs b/gendocs index 85ead77..71021f7 100755 --- a/gendocs +++ b/gendocs @@ -2,4 +2,5 @@ txt2tags -t html -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html +txt2tags -t html -i GPERF.t2t -o gperf.html txt2tags -t txt -i README.t2t -o README From 928f08834838cfef2987601b99227d7583da2efc Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 11:14:13 +0000 Subject: [PATCH 071/739] It was corrected some formatting mistakes --- README.t2t | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.t2t b/README.t2t index 8fb99cf..e0ebc1d 100644 --- a/README.t2t +++ b/README.t2t @@ -8,11 +8,11 @@ CMPH - C Minimal Perfect Hashing Library **Description** C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hashing functions. The cmph library encapsulates the newest +to work with minimal perfect hash functions. The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that can not fit in the main memory. It has been used successfully for constructing minimal perfect -hashing functions for sets with more than 100 million of keys. +hash functions for sets with more than 100 million of keys. Although there is a lack of similar libraries in the free software world ([gperf is a bit different gperf.html]), we can point out some of the distinguishable features of cmph: @@ -28,6 +28,7 @@ of the distinguishable features of cmph: - Well encapsulated API aiming binary compatibility through releases. - Free Software. + ---------------------------------------- **Supported Algorithms** @@ -73,7 +74,7 @@ Using cmph is quite simple. Take a look. //Fill vector //... - //Create minimal perfect hashing function using the default(chm) algorithm. + //Create minimal perfect hash function using the default(chm) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -116,10 +117,10 @@ Using cmph is quite simple. Take a look. cmph is the name of both the library and the utility application that comes with this package. You can use the cmph -application for constructing minimal perfect hashing functions from the command line. +application for constructing minimal perfect hash functions from the command line. The cmph utility comes with a number of flags, but it is very simple to create and to query -minimal perfect hashing functions: +minimal perfect hash functions: ``` $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file From 9eadc88397c29a3f949cc57d32006805fe422696 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 11:14:13 +0000 Subject: [PATCH 072/739] It was corrected some formatting mistakes --- README.t2t | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.t2t b/README.t2t index 8fb99cf..e0ebc1d 100644 --- a/README.t2t +++ b/README.t2t @@ -8,11 +8,11 @@ CMPH - C Minimal Perfect Hashing Library **Description** C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hashing functions. The cmph library encapsulates the newest +to work with minimal perfect hash functions. The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that can not fit in the main memory. It has been used successfully for constructing minimal perfect -hashing functions for sets with more than 100 million of keys. +hash functions for sets with more than 100 million of keys. Although there is a lack of similar libraries in the free software world ([gperf is a bit different gperf.html]), we can point out some of the distinguishable features of cmph: @@ -28,6 +28,7 @@ of the distinguishable features of cmph: - Well encapsulated API aiming binary compatibility through releases. - Free Software. + ---------------------------------------- **Supported Algorithms** @@ -73,7 +74,7 @@ Using cmph is quite simple. Take a look. //Fill vector //... - //Create minimal perfect hashing function using the default(chm) algorithm. + //Create minimal perfect hash function using the default(chm) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); @@ -116,10 +117,10 @@ Using cmph is quite simple. Take a look. cmph is the name of both the library and the utility application that comes with this package. You can use the cmph -application for constructing minimal perfect hashing functions from the command line. +application for constructing minimal perfect hash functions from the command line. The cmph utility comes with a number of flags, but it is very simple to create and to query -minimal perfect hashing functions: +minimal perfect hash functions: ``` $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file From 71a55f697eae999f244f19b57b461d943dafaaee Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 27 Jan 2005 13:01:45 +0000 Subject: [PATCH 073/739] Fix to alternate hash functions code. Removed htonl stuff from chm algorithm. Added faq. --- FAQ.t2t | 27 +++++++++++++++++++++++++++ README.t2t | 8 ++++++-- gendocs | 11 +++++++++-- src/bmz.c | 2 +- src/bmz.h | 2 +- src/chm.c | 38 ++++++++------------------------------ src/chm.h | 2 +- src/cmph.c | 36 ++++++++++++++++++++++++++++++------ src/cmph_structs.c | 5 ++--- src/debug.h | 6 +++--- src/main.c | 6 +++++- 11 files changed, 93 insertions(+), 50 deletions(-) create mode 100644 FAQ.t2t diff --git a/FAQ.t2t b/FAQ.t2t new file mode 100644 index 0000000..f0d40d2 --- /dev/null +++ b/FAQ.t2t @@ -0,0 +1,27 @@ +CMPH FAQ + + + +- How do I define the ids of the keys? + - You don't. The ids will be assigned by the algorithm creating the minimal + perfect hash function. If the algorithm creates an **ordered** minimal + perfect hash function, the ids will be the indices of the keys in the + input. Otherwise, you have no guarantee of the distribution of the ids. + +- Why I always get the error "Unable to create minimum perfect hashing function"? + - The algorithms do not guarantee that a minimal perfect hash function can + be created. In practice, it will always work if your input + is big enough (>100 keys). + The error is probably because you have duplicated + keys in the input. You must guarantee that the keys are unique in the + input. If you are using a UN*X based OS, try doing +``` #sort input.txt | uniq > input_uniq.txt + and run cmph with input_uniq.txt + +---------------------------------------- +[Home index.html] +---------------------------------------- + +Davi de Castro Reis + +Fabiano Cupertino Botelho diff --git a/README.t2t b/README.t2t index e0ebc1d..8b12570 100644 --- a/README.t2t +++ b/README.t2t @@ -159,6 +159,10 @@ utility. keysfile line separated file with keys ``` +**Additional Documentation** + +[FAQ faq.html] + **Downloads** Use the project page at sourceforge: http://sf.net/projects/cmph @@ -171,9 +175,9 @@ Code is under the LGPL. Enjoy! -Davi de Castro Reis +Davi de Castro Reis davi@users.sourceforge.net -Fabiano Cupertino Botelho +Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net %!include(html): ''LOGO.html'' Last Updated: %%date(%c) diff --git a/gendocs b/gendocs index 71021f7..e7c5e3e 100755 --- a/gendocs +++ b/gendocs @@ -1,6 +1,13 @@ -txt2tags -t html -i README.t2t -o index.html +txt2tags -t html --mask-email -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html -txt2tags -t txt -i README.t2t -o README +txt2tags -t html -i FAQ.t2t -o faq.html + +txt2tags -t txt --mask-email -i README.t2t -o README +txt2tags -t txt -i BMZ.t2t -o BMZ +txt2tags -t txt -i CHM.t2t -o CHM +txt2tags -t txt -i COMPARISON.t2t -o COMPARISON +txt2tags -t txt -i GPERF.t2t -o GPERF +txt2tags -t txt -i FAQ.t2t -o FAQ diff --git a/src/bmz.c b/src/bmz.c index bc75015..895f2bd 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -27,7 +27,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); -bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source) +bmz_config_data_t *bmz_config_new() { bmz_config_data_t *bmz = NULL; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); diff --git a/src/bmz.h b/src/bmz.h index 13c0f87..2d444a0 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -6,7 +6,7 @@ typedef struct __bmz_data_t bmz_data_t; typedef struct __bmz_config_data_t bmz_config_data_t; -bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source); +bmz_config_data_t *bmz_config_new(); void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void bmz_config_destroy(cmph_config_t *mph); cmph_t *bmz_new(cmph_config_t *mph, float c); diff --git a/src/chm.c b/src/chm.c index 5739c3b..486d438 100644 --- a/src/chm.c +++ b/src/chm.c @@ -10,20 +10,14 @@ #include #include #include -#include //#define DEBUG #include "debug.h" -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - static int chm_gen_edges(cmph_config_t *mph); static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); -chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source) +chm_config_data_t *chm_config_new() { chm_config_data_t *chm = NULL; chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); @@ -173,7 +167,7 @@ static int chm_gen_edges(cmph_config_t *mph) chm_config_data_t *chm = (chm_config_data_t *)mph->data; int cycles = 0; - DEBUGP("Generating edges for %u vertices\n", chm->n); + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); graph_clear_edges(chm->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) @@ -206,39 +200,28 @@ int chm_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; cmph_uint32 i; - cmph_uint32 two = htonl(2); //number of hash functions + cmph_uint32 two = 2; //number of hash functions chm_data_t *data = (chm_data_t *)mphf->data; - cmph_uint32 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); - hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - nn = htonl(data->n); - fwrite(&nn, sizeof(cmph_uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(cmph_uint32), 1, fd); + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - for (i = 0; i < data->n; ++i) - { - cmph_uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(cmph_uint32), 1, fd); - } + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -260,7 +243,6 @@ void chm_load(FILE *f, cmph_t *mphf) DEBUGP("Loading chm mphf\n"); mphf->data = chm; fread(&nhashes, sizeof(cmph_uint32), 1, f); - nhashes = ntohl(nhashes); chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); chm->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -268,7 +250,6 @@ void chm_load(FILE *f, cmph_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(cmph_uint32), 1, f); - buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -279,13 +260,10 @@ void chm_load(FILE *f, cmph_t *mphf) DEBUGP("Reading m and n\n"); fread(&(chm->n), sizeof(cmph_uint32), 1, f); - chm->n = ntohl(chm->n); fread(&(chm->m), sizeof(cmph_uint32), 1, f); - chm->m = ntohl(chm->m); chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); - for (i = 0; i < chm->n; ++i) chm->g[i] = ntohl(chm->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); diff --git a/src/chm.h b/src/chm.h index f98d83d..0f7ac3f 100644 --- a/src/chm.h +++ b/src/chm.h @@ -6,7 +6,7 @@ typedef struct __chm_data_t chm_data_t; typedef struct __chm_config_data_t chm_config_data_t; -chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source); +chm_config_data_t *chm_config_new(); void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void chm_config_destroy(cmph_config_t *mph); cmph_t *chm_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 6aed7ee..490db0e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -98,12 +98,38 @@ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) mph = __config_new(key_source); assert(mph); mph->algo = CMPH_CHM; // default value + mph->data = chm_config_new(); return mph; } void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) { - mph->algo = algo; + if (algo != mph->algo) + { + switch (mph->algo) + { + case CMPH_CHM: + chm_config_destroy(mph->data); + break; + case CMPH_BMZ: + bmz_config_destroy(mph->data); + break; + default: + assert(0); + } + switch(algo) + { + case CMPH_CHM: + mph->data = chm_config_new(); + break; + case CMPH_BMZ: + mph->data = bmz_config_new(); + break; + default: + assert(0); + } + } + mph->algo = algo; } void cmph_config_destroy(cmph_config_t *mph) @@ -115,7 +141,7 @@ void cmph_config_destroy(cmph_config_t *mph) chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - bmz_config_destroy(mph); + bmz_config_destroy(mph); break; default: assert(0); @@ -159,13 +185,11 @@ cmph_t *cmph_new(cmph_config_t *mph) { case CMPH_CHM: DEBUGP("Creating chm hash\n"); - mph->data = chm_config_new(mph->key_source); if (c == 0) c = 2.09; mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - mph->data = bmz_config_new(mph->key_source); if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; @@ -205,8 +229,8 @@ cmph_t *cmph_load(FILE *f) chm_load(f, mphf); break; case CMPH_BMZ: /* included -- Fabiano */ - DEBUGP("Loading bmz algorithm dependent parts\n"); - bmz_load(f, mphf); + DEBUGP("Loading bmz algorithm dependent parts\n"); + bmz_load(f, mphf); break; default: assert(0); diff --git a/src/cmph_structs.c b/src/cmph_structs.c index d6c4306..553db3d 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -12,6 +12,7 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; + mph->data = NULL; float c = 0; return mph; } @@ -23,9 +24,8 @@ void __config_destroy(cmph_config_t *mph) void __cmph_dump(cmph_t *mphf, FILE *fd) { - cmph_uint32 nsize = htonl(mphf->size); fwrite(cmph_names[mphf->algo], (cmph_uint32)(strlen(cmph_names[mphf->algo]) + 1), 1, fd); - fwrite(&nsize, sizeof(mphf->size), 1, fd); + fwrite(&(mphf->size), sizeof(mphf->size), 1, fd); } cmph_t *__cmph_load(FILE *f) { @@ -58,7 +58,6 @@ cmph_t *__cmph_load(FILE *f) mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = algo; fread(&(mphf->size), sizeof(mphf->size), 1, f); - mphf->size = ntohl(mphf->size); mphf->data = NULL; DEBUGP("Algorithm is %s and mphf is sized %u\n", cmph_names[algo], mphf->size); diff --git a/src/debug.h b/src/debug.h index daab6c7..0f7ddb1 100644 --- a/src/debug.h +++ b/src/debug.h @@ -14,7 +14,7 @@ #endif #endif -#ifdef WIN32 +#ifndef __GNUC__ #ifndef __DEBUG_H__ #define __DEBUG_H__ #include @@ -39,13 +39,13 @@ static void dummyprintf(const char *format, ...) #endif #ifdef DEBUG -#ifdef WIN32 +#ifndef __GNUC__ #define DEBUGP debugprintf #else #define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) #endif #else -#ifdef WIN32 +#ifndef __GNUC__ #define DEBUGP dummyprintf #else #define DEBUGP(args...) diff --git a/src/main.c b/src/main.c index 537d28e..c010123 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,8 @@ +#ifdef WIN32 #include "../wingetopt.h" +#else +#include +#endif #include #include #include @@ -218,7 +222,7 @@ int main(int argc, char **argv) } else { - cmph_uint8 * hashtable = NULL; + cmph_uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { From 1825613fd112193f000a478907269a8d2bcc4ace Mon Sep 17 00:00:00 2001 From: davi Date: Thu, 27 Jan 2005 13:01:45 +0000 Subject: [PATCH 074/739] Fix to alternate hash functions code. Removed htonl stuff from chm algorithm. Added faq. --- FAQ.t2t | 27 +++++++++++++++++++++++++++ README | 10 +++++++--- README.t2t | 8 ++++++-- gendocs | 11 +++++++++-- src/bmz.c | 2 +- src/bmz.h | 2 +- src/chm.c | 38 ++++++++------------------------------ src/chm.h | 2 +- src/cmph.c | 36 ++++++++++++++++++++++++++++++------ src/cmph_structs.c | 5 ++--- src/debug.h | 6 +++--- src/main.c | 6 +++++- 12 files changed, 100 insertions(+), 53 deletions(-) create mode 100644 FAQ.t2t diff --git a/FAQ.t2t b/FAQ.t2t new file mode 100644 index 0000000..f0d40d2 --- /dev/null +++ b/FAQ.t2t @@ -0,0 +1,27 @@ +CMPH FAQ + + + +- How do I define the ids of the keys? + - You don't. The ids will be assigned by the algorithm creating the minimal + perfect hash function. If the algorithm creates an **ordered** minimal + perfect hash function, the ids will be the indices of the keys in the + input. Otherwise, you have no guarantee of the distribution of the ids. + +- Why I always get the error "Unable to create minimum perfect hashing function"? + - The algorithms do not guarantee that a minimal perfect hash function can + be created. In practice, it will always work if your input + is big enough (>100 keys). + The error is probably because you have duplicated + keys in the input. You must guarantee that the keys are unique in the + input. If you are using a UN*X based OS, try doing +``` #sort input.txt | uniq > input_uniq.txt + and run cmph with input_uniq.txt + +---------------------------------------- +[Home index.html] +---------------------------------------- + +Davi de Castro Reis + +Fabiano Cupertino Botelho diff --git a/README b/README index f7a02e4..c133566 100644 --- a/README +++ b/README @@ -146,6 +146,10 @@ utility. keysfile line separated file with keys +Additional Documentation + +FAQ (faq.html) + Downloads Use the project page at sourceforge: http://sf.net/projects/cmph @@ -158,11 +162,11 @@ Code is under the LGPL. Enjoy! -Davi de Castro Reis +Davi de Castro Reis -Fabiano Cupertino Botelho +Fabiano Cupertino Botelho -Last Updated: Wed Jan 26 22:37:36 2005 +Last Updated: Thu Jan 27 10:54:36 2005 diff --git a/README.t2t b/README.t2t index e0ebc1d..8b12570 100644 --- a/README.t2t +++ b/README.t2t @@ -159,6 +159,10 @@ utility. keysfile line separated file with keys ``` +**Additional Documentation** + +[FAQ faq.html] + **Downloads** Use the project page at sourceforge: http://sf.net/projects/cmph @@ -171,9 +175,9 @@ Code is under the LGPL. Enjoy! -Davi de Castro Reis +Davi de Castro Reis davi@users.sourceforge.net -Fabiano Cupertino Botelho +Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net %!include(html): ''LOGO.html'' Last Updated: %%date(%c) diff --git a/gendocs b/gendocs index 71021f7..e7c5e3e 100755 --- a/gendocs +++ b/gendocs @@ -1,6 +1,13 @@ -txt2tags -t html -i README.t2t -o index.html +txt2tags -t html --mask-email -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html -txt2tags -t txt -i README.t2t -o README +txt2tags -t html -i FAQ.t2t -o faq.html + +txt2tags -t txt --mask-email -i README.t2t -o README +txt2tags -t txt -i BMZ.t2t -o BMZ +txt2tags -t txt -i CHM.t2t -o CHM +txt2tags -t txt -i COMPARISON.t2t -o COMPARISON +txt2tags -t txt -i GPERF.t2t -o GPERF +txt2tags -t txt -i FAQ.t2t -o FAQ diff --git a/src/bmz.c b/src/bmz.c index bc75015..895f2bd 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -27,7 +27,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); -bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source) +bmz_config_data_t *bmz_config_new() { bmz_config_data_t *bmz = NULL; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); diff --git a/src/bmz.h b/src/bmz.h index 13c0f87..2d444a0 100644 --- a/src/bmz.h +++ b/src/bmz.h @@ -6,7 +6,7 @@ typedef struct __bmz_data_t bmz_data_t; typedef struct __bmz_config_data_t bmz_config_data_t; -bmz_config_data_t *bmz_config_new(cmph_io_adapter_t *key_source); +bmz_config_data_t *bmz_config_new(); void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void bmz_config_destroy(cmph_config_t *mph); cmph_t *bmz_new(cmph_config_t *mph, float c); diff --git a/src/chm.c b/src/chm.c index 5739c3b..486d438 100644 --- a/src/chm.c +++ b/src/chm.c @@ -10,20 +10,14 @@ #include #include #include -#include //#define DEBUG #include "debug.h" -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - static int chm_gen_edges(cmph_config_t *mph); static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); -chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source) +chm_config_data_t *chm_config_new() { chm_config_data_t *chm = NULL; chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); @@ -173,7 +167,7 @@ static int chm_gen_edges(cmph_config_t *mph) chm_config_data_t *chm = (chm_config_data_t *)mph->data; int cycles = 0; - DEBUGP("Generating edges for %u vertices\n", chm->n); + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); graph_clear_edges(chm->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) @@ -206,39 +200,28 @@ int chm_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; cmph_uint32 i; - cmph_uint32 two = htonl(2); //number of hash functions + cmph_uint32 two = 2; //number of hash functions chm_data_t *data = (chm_data_t *)mphf->data; - cmph_uint32 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); - hash_state_dump(data->hashes[0], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); hash_state_dump(data->hashes[1], &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - nbuflen = htonl(buflen); - fwrite(&nbuflen, sizeof(cmph_uint32), 1, fd); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - nn = htonl(data->n); - fwrite(&nn, sizeof(cmph_uint32), 1, fd); - nm = htonl(data->m); - fwrite(&nm, sizeof(cmph_uint32), 1, fd); + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - for (i = 0; i < data->n; ++i) - { - cmph_uint32 ng = htonl(data->g[i]); - fwrite(&ng, sizeof(cmph_uint32), 1, fd); - } + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); @@ -260,7 +243,6 @@ void chm_load(FILE *f, cmph_t *mphf) DEBUGP("Loading chm mphf\n"); mphf->data = chm; fread(&nhashes, sizeof(cmph_uint32), 1, f); - nhashes = ntohl(nhashes); chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); chm->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); @@ -268,7 +250,6 @@ void chm_load(FILE *f, cmph_t *mphf) { hash_state_t *state = NULL; fread(&buflen, sizeof(cmph_uint32), 1, f); - buflen = ntohl(buflen); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); @@ -279,13 +260,10 @@ void chm_load(FILE *f, cmph_t *mphf) DEBUGP("Reading m and n\n"); fread(&(chm->n), sizeof(cmph_uint32), 1, f); - chm->n = ntohl(chm->n); fread(&(chm->m), sizeof(cmph_uint32), 1, f); - chm->m = ntohl(chm->m); chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); - for (i = 0; i < chm->n; ++i) chm->g[i] = ntohl(chm->g[i]); #ifdef DEBUG fprintf(stderr, "G: "); for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); diff --git a/src/chm.h b/src/chm.h index f98d83d..0f7ac3f 100644 --- a/src/chm.h +++ b/src/chm.h @@ -6,7 +6,7 @@ typedef struct __chm_data_t chm_data_t; typedef struct __chm_config_data_t chm_config_data_t; -chm_config_data_t *chm_config_new(cmph_io_adapter_t *key_source); +chm_config_data_t *chm_config_new(); void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void chm_config_destroy(cmph_config_t *mph); cmph_t *chm_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 6aed7ee..490db0e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -98,12 +98,38 @@ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) mph = __config_new(key_source); assert(mph); mph->algo = CMPH_CHM; // default value + mph->data = chm_config_new(); return mph; } void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) { - mph->algo = algo; + if (algo != mph->algo) + { + switch (mph->algo) + { + case CMPH_CHM: + chm_config_destroy(mph->data); + break; + case CMPH_BMZ: + bmz_config_destroy(mph->data); + break; + default: + assert(0); + } + switch(algo) + { + case CMPH_CHM: + mph->data = chm_config_new(); + break; + case CMPH_BMZ: + mph->data = bmz_config_new(); + break; + default: + assert(0); + } + } + mph->algo = algo; } void cmph_config_destroy(cmph_config_t *mph) @@ -115,7 +141,7 @@ void cmph_config_destroy(cmph_config_t *mph) chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - bmz_config_destroy(mph); + bmz_config_destroy(mph); break; default: assert(0); @@ -159,13 +185,11 @@ cmph_t *cmph_new(cmph_config_t *mph) { case CMPH_CHM: DEBUGP("Creating chm hash\n"); - mph->data = chm_config_new(mph->key_source); if (c == 0) c = 2.09; mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - mph->data = bmz_config_new(mph->key_source); if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; @@ -205,8 +229,8 @@ cmph_t *cmph_load(FILE *f) chm_load(f, mphf); break; case CMPH_BMZ: /* included -- Fabiano */ - DEBUGP("Loading bmz algorithm dependent parts\n"); - bmz_load(f, mphf); + DEBUGP("Loading bmz algorithm dependent parts\n"); + bmz_load(f, mphf); break; default: assert(0); diff --git a/src/cmph_structs.c b/src/cmph_structs.c index d6c4306..553db3d 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -12,6 +12,7 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; + mph->data = NULL; float c = 0; return mph; } @@ -23,9 +24,8 @@ void __config_destroy(cmph_config_t *mph) void __cmph_dump(cmph_t *mphf, FILE *fd) { - cmph_uint32 nsize = htonl(mphf->size); fwrite(cmph_names[mphf->algo], (cmph_uint32)(strlen(cmph_names[mphf->algo]) + 1), 1, fd); - fwrite(&nsize, sizeof(mphf->size), 1, fd); + fwrite(&(mphf->size), sizeof(mphf->size), 1, fd); } cmph_t *__cmph_load(FILE *f) { @@ -58,7 +58,6 @@ cmph_t *__cmph_load(FILE *f) mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = algo; fread(&(mphf->size), sizeof(mphf->size), 1, f); - mphf->size = ntohl(mphf->size); mphf->data = NULL; DEBUGP("Algorithm is %s and mphf is sized %u\n", cmph_names[algo], mphf->size); diff --git a/src/debug.h b/src/debug.h index daab6c7..0f7ddb1 100644 --- a/src/debug.h +++ b/src/debug.h @@ -14,7 +14,7 @@ #endif #endif -#ifdef WIN32 +#ifndef __GNUC__ #ifndef __DEBUG_H__ #define __DEBUG_H__ #include @@ -39,13 +39,13 @@ static void dummyprintf(const char *format, ...) #endif #ifdef DEBUG -#ifdef WIN32 +#ifndef __GNUC__ #define DEBUGP debugprintf #else #define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) #endif #else -#ifdef WIN32 +#ifndef __GNUC__ #define DEBUGP dummyprintf #else #define DEBUGP(args...) diff --git a/src/main.c b/src/main.c index 537d28e..c010123 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,8 @@ +#ifdef WIN32 #include "../wingetopt.h" +#else +#include +#endif #include #include #include @@ -218,7 +222,7 @@ int main(int argc, char **argv) } else { - cmph_uint8 * hashtable = NULL; + cmph_uint8 * hashtable = NULL; mphf_fd = fopen(mphf_file, "r"); if (mphf_fd == NULL) { From 7d3d1248d33cbc364caeaaeab7b0650645b4d7e2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 14:12:28 +0000 Subject: [PATCH 075/739] It was removed pjw and glib functions from cmph_hash_names vector --- src/cmph_types.h | 4 ++-- src/hash.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmph_types.h b/src/cmph_types.h index 8b65795..3fad22d 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -5,8 +5,8 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; -typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_GLIB, CMPH_HASH_JENKINS, - CMPH_HASH_PJW, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; +typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, + CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; diff --git a/src/hash.c b/src/hash.c index 369ea3b..868e25c 100644 --- a/src/hash.c +++ b/src/hash.c @@ -7,7 +7,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_hash_names[] = { "djb2", "fnv", "glib", "jenkins", "pjw", "sdbm", NULL }; +const char *cmph_hash_names[] = { "djb2", "fnv", "jenkins", "sdbm", NULL }; hash_state_t *hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) { From 76bae3e585961d89084773aad592b9c896909d6c Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 14:12:28 +0000 Subject: [PATCH 076/739] It was removed pjw and glib functions from cmph_hash_names vector --- src/cmph_types.h | 4 ++-- src/hash.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmph_types.h b/src/cmph_types.h index 8b65795..3fad22d 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -5,8 +5,8 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; -typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_GLIB, CMPH_HASH_JENKINS, - CMPH_HASH_PJW, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; +typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, + CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; diff --git a/src/hash.c b/src/hash.c index 369ea3b..868e25c 100644 --- a/src/hash.c +++ b/src/hash.c @@ -7,7 +7,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_hash_names[] = { "djb2", "fnv", "glib", "jenkins", "pjw", "sdbm", NULL }; +const char *cmph_hash_names[] = { "djb2", "fnv", "jenkins", "sdbm", NULL }; hash_state_t *hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) { From 1e67ed9f88bc14bd91d6f7301c84982a5626496e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 16:21:49 +0000 Subject: [PATCH 077/739] It was added FOOTER.t2t file --- BMZ.t2t | 5 +---- CHM.t2t | 5 +---- COMPARISON.t2t | 5 +---- FAQ.t2t | 4 +--- FOOTER.t2t | 8 ++++++++ GPERF.t2t | 4 +--- README.t2t | 10 ++-------- 7 files changed, 15 insertions(+), 26 deletions(-) create mode 100644 FOOTER.t2t diff --git a/BMZ.t2t b/BMZ.t2t index 4a9e2bf..cb1b3ef 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -16,8 +16,5 @@ BMZ Algorithm ---------------------------------------- [Home index.html] ---------------------------------------- -Enjoy! -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index d53dab8..0aa2d78 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -14,8 +14,5 @@ CHM Algorithm ---------------------------------------- [Home index.html] ---------------------------------------- -Enjoy! -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index b6f9226..4176c28 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -17,8 +17,5 @@ Comparison Between BMZ And CHM Algorithms ---------------------------------------- [Home index.html] ---------------------------------------- -Enjoy! -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/FAQ.t2t b/FAQ.t2t index f0d40d2..add9cc5 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -22,6 +22,4 @@ CMPH FAQ [Home index.html] ---------------------------------------- -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/FOOTER.t2t b/FOOTER.t2t new file mode 100644 index 0000000..8e35d2e --- /dev/null +++ b/FOOTER.t2t @@ -0,0 +1,8 @@ + + + +Enjoy! + +[Davi de Castro Reis davi@users.sourceforge.net] + +[Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net] diff --git a/GPERF.t2t b/GPERF.t2t index 9c3fa4b..61190b9 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -35,6 +35,4 @@ the compiler programming area (detect reserved keywords). [Home index.html] ---------------------------------------- -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index 8b12570..0b25b81 100644 --- a/README.t2t +++ b/README.t2t @@ -54,7 +54,7 @@ of the distinguishable features of cmph: - New heuristic added to the bmz algorithm permits to generate a mphf with only 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. - [click here bmz.html] for details. +%html% [click here bmz.html] for details. ---------------------------------------- @@ -146,9 +146,7 @@ utility. -f hash function (may be used multiple times) - valid values are * djb2 * fnv - * glib * jenkins - * pjw * sdbm -V print version number and exit -v increase verbosity (may be used multiple times) @@ -173,11 +171,7 @@ Use the project page at sourceforge: http://sf.net/projects/cmph Code is under the LGPL. ---------------------------------------- -Enjoy! - -Davi de Castro Reis davi@users.sourceforge.net - -Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net +%!include: FOOTER.t2t %!include(html): ''LOGO.html'' Last Updated: %%date(%c) From 2fba2d5bf49b57578163f766dc04f6d6fe84fa10 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 16:21:49 +0000 Subject: [PATCH 078/739] It was added FOOTER.t2t file --- BMZ.t2t | 5 +---- CHM.t2t | 5 +---- COMPARISON.t2t | 5 +---- FAQ.t2t | 4 +--- FOOTER.t2t | 8 ++++++++ GPERF.t2t | 4 +--- README.t2t | 10 ++-------- 7 files changed, 15 insertions(+), 26 deletions(-) create mode 100644 FOOTER.t2t diff --git a/BMZ.t2t b/BMZ.t2t index 4a9e2bf..cb1b3ef 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -16,8 +16,5 @@ BMZ Algorithm ---------------------------------------- [Home index.html] ---------------------------------------- -Enjoy! -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index d53dab8..0aa2d78 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -14,8 +14,5 @@ CHM Algorithm ---------------------------------------- [Home index.html] ---------------------------------------- -Enjoy! -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index b6f9226..4176c28 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -17,8 +17,5 @@ Comparison Between BMZ And CHM Algorithms ---------------------------------------- [Home index.html] ---------------------------------------- -Enjoy! -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/FAQ.t2t b/FAQ.t2t index f0d40d2..add9cc5 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -22,6 +22,4 @@ CMPH FAQ [Home index.html] ---------------------------------------- -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/FOOTER.t2t b/FOOTER.t2t new file mode 100644 index 0000000..8e35d2e --- /dev/null +++ b/FOOTER.t2t @@ -0,0 +1,8 @@ + + + +Enjoy! + +[Davi de Castro Reis davi@users.sourceforge.net] + +[Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net] diff --git a/GPERF.t2t b/GPERF.t2t index 9c3fa4b..61190b9 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -35,6 +35,4 @@ the compiler programming area (detect reserved keywords). [Home index.html] ---------------------------------------- -Davi de Castro Reis - -Fabiano Cupertino Botelho +%!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index 8b12570..0b25b81 100644 --- a/README.t2t +++ b/README.t2t @@ -54,7 +54,7 @@ of the distinguishable features of cmph: - New heuristic added to the bmz algorithm permits to generate a mphf with only 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. - [click here bmz.html] for details. +%html% [click here bmz.html] for details. ---------------------------------------- @@ -146,9 +146,7 @@ utility. -f hash function (may be used multiple times) - valid values are * djb2 * fnv - * glib * jenkins - * pjw * sdbm -V print version number and exit -v increase verbosity (may be used multiple times) @@ -173,11 +171,7 @@ Use the project page at sourceforge: http://sf.net/projects/cmph Code is under the LGPL. ---------------------------------------- -Enjoy! - -Davi de Castro Reis davi@users.sourceforge.net - -Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net +%!include: FOOTER.t2t %!include(html): ''LOGO.html'' Last Updated: %%date(%c) From b4930a47f167f2d086a521b99565837ff8347ad9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 16:23:11 +0000 Subject: [PATCH 079/739] It was added the authors' email --- AUTHORS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 427eedb..ff3ff8e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,2 +1,2 @@ -Davi de Castro Reis -Fabiano Cupertino Botelho +Davi de Castro Reis davi@users.sourceforge.net +Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net From 2c220612ebe35fd40c1543b87d62b234e771a810 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 16:23:11 +0000 Subject: [PATCH 080/739] It was added the authors' email --- AUTHORS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 427eedb..ff3ff8e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,2 +1,2 @@ -Davi de Castro Reis -Fabiano Cupertino Botelho +Davi de Castro Reis davi@users.sourceforge.net +Fabiano Cupertino Botelho fc_botelho@users.sourceforge.net From dfa28a005a48e98ae4e7ec362101392d8661e8fa Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 20:07:57 +0000 Subject: [PATCH 081/739] history of BMZ algorithm is available --- BMZ.t2t | 35 ++++++++++++++++++++++++++++++++++- CHM.t2t | 9 +++++++++ FAQ.t2t | 9 ++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index cb1b3ef..616d6bd 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -4,15 +4,48 @@ BMZ Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- - **History** +At the end of 2003, professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] was +finishing the second edition of his book. +During the book writing, professor Nivio studied the problem of generating minimal perfect hash +functions (if you are not familiarized with this problem, see [1][2]). +Professor Nivio coded a modified version of the [CHM algorithm chm.html], which was proposed by +Czech, Havas and Majewski and put it in his book. +The [CHM algorithm chm.html] is based on acyclic random graphs to generate order preserving +minimal perfect hash functions in linear time. Professor Nivio argued himself, why must the random graph +be acyclic? In the modified version availalbe in his book he got rid of such restriction. + +The modification presented a problem, it was impossible to generate minimal perfect hash functions +for sets with more than 1000 keys. +At the same time, [Fabiano C. Botelho http://www.dcc.ufmg.br/~fbotelho], +a master degree student at [Departament of Computer Science http://www.dcc.ufmg.br] in +[Federal University of Minas Gerais http://www.ufmg.br], +started to be advised by Nivio who presented the problem to Fabiano. + +During the master, Fabiano and Nivio faced lots of problems. +Talking with a friend of mine (David Menoti) about our problems, many ideas +appeared and after of implementing them, we got a very fast algorithm to generate +minimal perfect hash functions that does not preserve order. +We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho +David **M**enoti and Nivio **Z**iviani. The algorithm is described in [1]. +To analyse BMZ algorithm we needed some results from the random graph theory, so +we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. +The final description and analysis of BMZ algorithm is presented in [2]. + + + **The Algorithm** **The Heuristic** **Papers** ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps], 4th International Workshop on Efficient and Experimental Algorithms (WEA), 2005.(submitted) + + ---------------------------------------- [Home index.html] ---------------------------------------- diff --git a/CHM.t2t b/CHM.t2t index 0aa2d78..1ceccaa 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -11,6 +11,15 @@ CHM Algorithm **Papers** ++ Z.J. Czech, G. Havas, and B.S. Majewski. [An optimal algorithm for generating minimal perfect hash functions. papers/chm92.pdf], Information Processing Letters, 43(5):257-264, 1992. + ++ Z.J. Czech, G. Havas, and B.S. Majewski. Fundamental study perfect hashing. + Theoretical Computer Science, 182:1-143, 1997. + ++ B.S. Majewski, N.C. Wormald, G. Havas, and Z.J. Czech. A family of perfect hashing methods. + The Computer Journal, 39(6):547--554, 1996. + + ---------------------------------------- [Home index.html] ---------------------------------------- diff --git a/FAQ.t2t b/FAQ.t2t index add9cc5..1ce1774 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -8,7 +8,7 @@ CMPH FAQ perfect hash function, the ids will be the indices of the keys in the input. Otherwise, you have no guarantee of the distribution of the ids. -- Why I always get the error "Unable to create minimum perfect hashing function"? +- Why do I always get the error "Unable to create minimum perfect hashing function"? - The algorithms do not guarantee that a minimal perfect hash function can be created. In practice, it will always work if your input is big enough (>100 keys). @@ -18,6 +18,13 @@ CMPH FAQ ``` #sort input.txt | uniq > input_uniq.txt and run cmph with input_uniq.txt +- Why do I change the hash function using cmph_config_set_hashfuncs function and the default (jenkins) +one is executed? + - Probably you are you using the cmph_config_set_algo function after + the cmph_config_set_hashfuncs. Therefore, the default hash function + is reset when you call the cmph_config_set_algo function. + + ---------------------------------------- [Home index.html] ---------------------------------------- From e632be10805b8a72bd15dfdcd373d779944fceb9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jan 2005 20:07:57 +0000 Subject: [PATCH 082/739] history of BMZ algorithm is available --- BMZ.t2t | 35 ++++++++++++++++++++++++++++++++++- CHM.t2t | 9 +++++++++ FAQ.t2t | 9 ++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index cb1b3ef..616d6bd 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -4,15 +4,48 @@ BMZ Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- - **History** +At the end of 2003, professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] was +finishing the second edition of his book. +During the book writing, professor Nivio studied the problem of generating minimal perfect hash +functions (if you are not familiarized with this problem, see [1][2]). +Professor Nivio coded a modified version of the [CHM algorithm chm.html], which was proposed by +Czech, Havas and Majewski and put it in his book. +The [CHM algorithm chm.html] is based on acyclic random graphs to generate order preserving +minimal perfect hash functions in linear time. Professor Nivio argued himself, why must the random graph +be acyclic? In the modified version availalbe in his book he got rid of such restriction. + +The modification presented a problem, it was impossible to generate minimal perfect hash functions +for sets with more than 1000 keys. +At the same time, [Fabiano C. Botelho http://www.dcc.ufmg.br/~fbotelho], +a master degree student at [Departament of Computer Science http://www.dcc.ufmg.br] in +[Federal University of Minas Gerais http://www.ufmg.br], +started to be advised by Nivio who presented the problem to Fabiano. + +During the master, Fabiano and Nivio faced lots of problems. +Talking with a friend of mine (David Menoti) about our problems, many ideas +appeared and after of implementing them, we got a very fast algorithm to generate +minimal perfect hash functions that does not preserve order. +We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho +David **M**enoti and Nivio **Z**iviani. The algorithm is described in [1]. +To analyse BMZ algorithm we needed some results from the random graph theory, so +we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. +The final description and analysis of BMZ algorithm is presented in [2]. + + + **The Algorithm** **The Heuristic** **Papers** ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps], 4th International Workshop on Efficient and Experimental Algorithms (WEA), 2005.(submitted) + + ---------------------------------------- [Home index.html] ---------------------------------------- diff --git a/CHM.t2t b/CHM.t2t index 0aa2d78..1ceccaa 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -11,6 +11,15 @@ CHM Algorithm **Papers** ++ Z.J. Czech, G. Havas, and B.S. Majewski. [An optimal algorithm for generating minimal perfect hash functions. papers/chm92.pdf], Information Processing Letters, 43(5):257-264, 1992. + ++ Z.J. Czech, G. Havas, and B.S. Majewski. Fundamental study perfect hashing. + Theoretical Computer Science, 182:1-143, 1997. + ++ B.S. Majewski, N.C. Wormald, G. Havas, and Z.J. Czech. A family of perfect hashing methods. + The Computer Journal, 39(6):547--554, 1996. + + ---------------------------------------- [Home index.html] ---------------------------------------- diff --git a/FAQ.t2t b/FAQ.t2t index add9cc5..1ce1774 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -8,7 +8,7 @@ CMPH FAQ perfect hash function, the ids will be the indices of the keys in the input. Otherwise, you have no guarantee of the distribution of the ids. -- Why I always get the error "Unable to create minimum perfect hashing function"? +- Why do I always get the error "Unable to create minimum perfect hashing function"? - The algorithms do not guarantee that a minimal perfect hash function can be created. In practice, it will always work if your input is big enough (>100 keys). @@ -18,6 +18,13 @@ CMPH FAQ ``` #sort input.txt | uniq > input_uniq.txt and run cmph with input_uniq.txt +- Why do I change the hash function using cmph_config_set_hashfuncs function and the default (jenkins) +one is executed? + - Probably you are you using the cmph_config_set_algo function after + the cmph_config_set_hashfuncs. Therefore, the default hash function + is reset when you call the cmph_config_set_algo function. + + ---------------------------------------- [Home index.html] ---------------------------------------- From f1b1f12dda025eb50b8488d2b493e80b0d5fc3ff Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jan 2005 20:07:22 +0000 Subject: [PATCH 083/739] It was improved the documentation of BMZ and CHM algorithms --- BMZ.t2t | 164 ++++++++++++++++++++++++++++++++++++++++++++----- CHM.t2t | 51 ++++++++++++++- COMPARISON.t2t | 8 +-- CONFIG.t2t | 2 + README.t2t | 22 +++---- 5 files changed, 212 insertions(+), 35 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 616d6bd..37e3101 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -4,46 +4,176 @@ BMZ Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- -**History** +==History== At the end of 2003, professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] was -finishing the second edition of his book. -During the book writing, professor Nivio studied the problem of generating minimal perfect hash +finishing the second edition of his [book http://www.dcc.ufmg.br/algoritmos/]. +During the [book http://www.dcc.ufmg.br/algoritmos/] writing, +professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] studied the problem of generating minimal perfect hash functions (if you are not familiarized with this problem, see [1][2]). -Professor Nivio coded a modified version of the [CHM algorithm chm.html], which was proposed by -Czech, Havas and Majewski and put it in his book. +Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] coded a modified version of +the [CHM algorithm chm.html], which was proposed by +Czech, Havas and Majewski and put it in his [book http://www.dcc.ufmg.br/algoritmos/]. The [CHM algorithm chm.html] is based on acyclic random graphs to generate order preserving -minimal perfect hash functions in linear time. Professor Nivio argued himself, why must the random graph -be acyclic? In the modified version availalbe in his book he got rid of such restriction. +minimal perfect hash functions in linear time. Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] +argued himself, why must the random graph +be acyclic? In the modified version availalbe in his [book http://www.dcc.ufmg.br/algoritmos/] he got rid of such restriction. The modification presented a problem, it was impossible to generate minimal perfect hash functions for sets with more than 1000 keys. At the same time, [Fabiano C. Botelho http://www.dcc.ufmg.br/~fbotelho], a master degree student at [Departament of Computer Science http://www.dcc.ufmg.br] in [Federal University of Minas Gerais http://www.ufmg.br], -started to be advised by Nivio who presented the problem to Fabiano. +started to be advised by [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] who presented the problem +to [Fabiano http://www.dcc.ufmg.br/~fbotelho]. -During the master, Fabiano and Nivio faced lots of problems. -Talking with a friend of mine (David Menoti) about our problems, many ideas -appeared and after of implementing them, we got a very fast algorithm to generate -minimal perfect hash functions that does not preserve order. +During the master, [Fabiano http://www.dcc.ufmg.br/~fbotelho] and +[Nivio Ziviani http://www.dcc.ufmg.br/~nivio] faced lots of problems. +In april of 2004, [Fabiano http://www.dcc.ufmg.br/~fbotelho] was talking with a +friend of him (David Menoti) about the problems +and many ideas appeared. +The ideas were implemented and we noticed that a very fast algorithm to generate +minimal perfect hash functions had been designed. We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho David **M**enoti and Nivio **Z**iviani. The algorithm is described in [1]. To analyse BMZ algorithm we needed some results from the random graph theory, so we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. The final description and analysis of BMZ algorithm is presented in [2]. - +---------------------------------------- -**The Algorithm** +==The Algorithm== -**The Heuristic** +Let us show how the minimal perfect hash function [figs/img7.png] will be constructed. +We make use of two auxiliary random functions [figs/img41.png] and [figs/img55.png], +where [figs/img56.png] for some suitably chosen integer [figs/img57.png], +where [figs/img58.png].We build a random graph [figs/img59.png] on [figs/img60.png], +whose edge set is [figs/img61.png]. There is an edge in [figs/img32.png] for each +key in the set of keys [figs/img20.png]. -**Papers** +In what follows, we shall be interested in the //2-core// of +the random graph [figs/img32.png], that is, the maximal subgraph +of [figs/img32.png] with minimal degree at +least 2 (see, e.g., [2] for details). +Because of its importance in our context, we call the 2-core the +//critical// subgraph of [figs/img32.png] and denote it by [figs/img63.png]. +The vertices and edges in [figs/img63.png] are said to be //critical//. +We let [figs/img64.png] and [figs/img65.png]. +Moreover, we let [figs/img66.png] be the set of //non-critical// +vertices in [figs/img32.png]. +We also let [figs/img67.png] be the set of all critical +vertices that have at least one non-critical vertex as a neighbour. +Let [figs/img68.png] be the set of //non-critical// edges in [figs/img32.png]. +Finally, we let [figs/img69.png] be the //non-critical// subgraph +of [figs/img32.png. +The non-critical subgraph [figs/img70.png] corresponds to the //acyclic part// +of [figs/img32.png]. +We have [figs/img71.png]. + +We then construct a suitable labelling [figs/img72.png] of the vertices +of [figs/img32.png]: we choose [figs/img73.png] for each [figs/img74.png] in such +a way that [figs/img75.png] ([figs/img18.png]) is a +minimal perfect hash function for [figs/img20.png]. +We will see later on that this labelling [figs/img37.png] can be found in linear time +if the number of edges in [figs/img63.png] is at most [figs/img76.png]. + +Figure 2 presents a pseudo code for the algorithm. +The procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) receives as input the set of +keys [figs/img20.png] and produces the labelling [figs/img37.png]. +The method uses a mapping, ordering and searching approach. +We now describe each step. +| procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) +|     Mapping ([figs/img20.png], [figs/img32.png]); +|     Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]); +|     Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]); +**Figure 2**: Main steps of the algorithm for constructing a minimal perfect hash function + +===Mapping Step=== + +===Ordering Step=== + +===Searching Step=== + +====Assignment of Values to Critical Vertices==== + +====Assignment of Values to Non-Critical Vertices==== + +---------------------------------------- + +==The Heuristic== + +---------------------------------------- + +==Memory Consumption== + +Now we detail the memory consumption to generate and to store minimal perfect hash functions +using the BMZ algorithm. The structures responsible for memory consumption are in the +following: +- Graph: + + **first**: is a vector that stores //cn// integer numbers, each one representing + the first edge (index in the vector edges) in the list of + edges of each vertex. + The integer numbers are 4 bytes long. Therefore, + the vector first is stored in //4cn// bytes. + + + **edges**: is a vector to represent the edges of the graph. As each edge + is compounded by a pair of vertices, each entry stores two integer numbers + of 4 bytes that represent the vertices. As there are //n// edges, the + vector edges is stored in //8n// bytes. + + + **next**: given a vertex //v//, we can discover the edges that contain //v// + following its list of edges, which starts on first[//v//] and the next + edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + the linked lists of edges of each vertex. As there are two vertices for each edge, + when an edge is iserted in the graph, it must be inserted in the two linked lists + of the vertices in its composition. Therefore, there are //2n// entries of integer + numbers in the vector next, so it is stored in //4*2n = 8n// bytes. + + + **critical vertices(critical_nodes vector)**: is a vector of //cn// bits, + where each bit indicates if a vertex is critical (1) or non-critical (0). + Therefore, the critical and non-critical vertices are represented in //cn/8// bytes. + + + **critical edges (used_edges vector)**: is a vector of //n// bits, where each + bit indicates if an edge is critical (1) or non-critical (0). Therefore, the + critical and non-critical edges are represented in //n/8// bytes. + +- Other auxiliary structures + + **queue**: is a queue of integer numbers used in the breadth-first search of the + assignment of values to critical vertices. There is an entry in the queue for + each two critical vertices. Let //|Vcrit|// be the expected number of critical + vertices. Therefore, the queue is stored in //4*0.5*|Vcrit|=2|Vcrit|//. + + + **visited**: is a vector of //cn// bits, where each bit indicates if the g value of + a given vertex was already defined. Therefore, the vector visited is stored + in //cn/8// bytes. + + + **function //g//**: is represented by a vector of //cn// integer numbers. + As each integer number is 4 bytes long, the function //g// is stored in + //4cn// bytes. + + +Thus, the total memory consumption of BMZ algorithm for generating a minimal +perfect hash function (MPHF) is: //(8.25c + 16.125)n +2|Vcrit| + O(1)// bytes. +As the value of constant //c// may be 1.15 and 0.93 we have: + || //c// | //|Vcrit|// | Memory consumption to generate a MPHF | + | 0.93 | //0.497n// | //24.80n + O(1)// | + | 1.15 | //0.401n// | //26.42n + O(1)// | +The values of |Vcrit| were calculated using Eq.(1) presented in [2]. + +Now we present the memory consumption to store the resulting function. +We only need to store the //g// function. Thus, we need //4cn// bytes. +Again we have: + || //c// | Memory consumption to store a MPHF | + | 0.93 | //3.72n// | + | 1.15 | //4.60n// | + +---------------------------------------- + +==Papers== + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. -+ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps], 4th International Workshop on Efficient and Experimental Algorithms (WEA), 2005.(submitted) ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps] (Submitted). ---------------------------------------- diff --git a/CHM.t2t b/CHM.t2t index 1ceccaa..8859eff 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -4,12 +4,57 @@ CHM Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- +==The Algorithm== -**History** +==Memory Consumption== -**The Algorithm** +Now we detail the memory consumption to generate and to store minimal perfect hash functions +using the CHM algorithm. The structures responsible for memory consumption are in the +following: +- Graph: + + **first**: is a vector that stores //cn// integer numbers, each one representing + the first edge (index in the vector edges) in the list of + edges of each vertex. + The integer numbers are 4 bytes long. Therefore, + the vector first is stored in //4cn// bytes. + + + **edges**: is a vector to represent the edges of the graph. As each edge + is compounded by a pair of vertices, each entry stores two integer numbers + of 4 bytes that represent the vertices. As there are //n// edges, the + vector edges is stored in //8n// bytes. + + + **next**: given a vertex //v//, we can discover the edges that contain //v// + following its list of edges, which starts on first[//v//] and the next + edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + the linked lists of edges of each vertex. As there are two vertices for each edge, + when an edge is iserted in the graph, it must be inserted in the two linked lists + of the vertices in its composition. Therefore, there are //2n// entries of integer + numbers in the vector next, so it is stored in //4*2n = 8n// bytes. + +- Other auxiliary structures + + **visited**: is a vector of //cn// bits, where each bit indicates if the g value of + a given vertex was already defined. Therefore, the vector visited is stored + in //cn/8// bytes. + + + **function //g//**: is represented by a vector of //cn// integer numbers. + As each integer number is 4 bytes long, the function //g// is stored in + //4cn// bytes. -**Papers** + +Thus, the total memory consumption of CHM algorithm for generating a minimal +perfect hash function (MPHF) is: //(8.125c + 16)n + O(1)// bytes. +As the value of constant //c// must be at least 2.09 we have: + || //c// | Memory consumption to generate a MPHF | + | 2.09 | //33.00n + O(1)// | + +Now we present the memory consumption to store the resulting function. +We only need to store the //g// function. Thus, we need //4cn// bytes. +Again we have: + || //c// | Memory consumption to store a MPHF | + | 2.09 | //8.36n// | + + +==Papers== + Z.J. Czech, G. Havas, and B.S. Majewski. [An optimal algorithm for generating minimal perfect hash functions. papers/chm92.pdf], Information Processing Letters, 43(5):257-264, 1992. diff --git a/COMPARISON.t2t b/COMPARISON.t2t index 4176c28..a6ff823 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -5,14 +5,14 @@ Comparison Between BMZ And CHM Algorithms ---------------------------------------- -**Features** +==Features== -**Constructing Minimal Perfect Hash Functions** +==Constructing Minimal Perfect Hash Functions== -**Memory Consumption** +==Memory Consumption== -**Run times** +==Run times== ---------------------------------------- [Home index.html] diff --git a/CONFIG.t2t b/CONFIG.t2t index 807454c..19dd4e9 100644 --- a/CONFIG.t2t +++ b/CONFIG.t2t @@ -1,2 +1,4 @@ %! PreProc(html): '^%html% ' '' %! PreProc(txt): '^%txt% ' '' +%! PostProc(html): "&" "&" +%! PostProc(txt): " " " " diff --git a/README.t2t b/README.t2t index 0b25b81..e491c32 100644 --- a/README.t2t +++ b/README.t2t @@ -5,7 +5,7 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- -**Description** +==Description== C Minimal Perfect Hashing Library is a portable LGPLed library to create and to work with minimal perfect hash functions. The cmph library encapsulates the newest @@ -31,35 +31,35 @@ of the distinguishable features of cmph: ---------------------------------------- -**Supported Algorithms** +==Supported Algorithms== %html% - [BMZ Algorithm bmz.html]. %txt% - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only 4cn bytes, where c is between 0.93 and 1.15. + can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are order preserving and - are stored in 4cn bytes, where c is greater than 2. + are stored in //4cn// bytes, where //c// is greater than 2. %html% [Click Here comparison.html] to see a comparison of the supported algorithms. ---------------------------------------- -**News for version 0.3** +==News for version 0.3== - New heuristic added to the bmz algorithm permits to generate a mphf with only - 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. + //24.6n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. %html% [click here bmz.html] for details. ---------------------------------------- -**Examples** +==Examples== Using cmph is quite simple. Take a look. @@ -113,7 +113,7 @@ Using cmph is quite simple. Take a look. ``` -------------------------------------- -**The cmph application** +==The cmph application== cmph is the name of both the library and the utility application that comes with this package. You can use the cmph @@ -157,16 +157,16 @@ utility. keysfile line separated file with keys ``` -**Additional Documentation** +==Additional Documentation== [FAQ faq.html] -**Downloads** +==Downloads== Use the project page at sourceforge: http://sf.net/projects/cmph -**License Stuff** +==License Stuff== Code is under the LGPL. ---------------------------------------- From 29d8ae69951d14a57e21c6659391b88063bd1b0e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jan 2005 20:07:22 +0000 Subject: [PATCH 084/739] It was improved the documentation of BMZ and CHM algorithms --- BMZ.t2t | 164 ++++++++++++++++++++++++++++++++++++++++++++----- CHM.t2t | 51 ++++++++++++++- COMPARISON.t2t | 8 +-- CONFIG.t2t | 2 + README.t2t | 22 +++---- 5 files changed, 212 insertions(+), 35 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 616d6bd..37e3101 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -4,46 +4,176 @@ BMZ Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- -**History** +==History== At the end of 2003, professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] was -finishing the second edition of his book. -During the book writing, professor Nivio studied the problem of generating minimal perfect hash +finishing the second edition of his [book http://www.dcc.ufmg.br/algoritmos/]. +During the [book http://www.dcc.ufmg.br/algoritmos/] writing, +professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] studied the problem of generating minimal perfect hash functions (if you are not familiarized with this problem, see [1][2]). -Professor Nivio coded a modified version of the [CHM algorithm chm.html], which was proposed by -Czech, Havas and Majewski and put it in his book. +Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] coded a modified version of +the [CHM algorithm chm.html], which was proposed by +Czech, Havas and Majewski and put it in his [book http://www.dcc.ufmg.br/algoritmos/]. The [CHM algorithm chm.html] is based on acyclic random graphs to generate order preserving -minimal perfect hash functions in linear time. Professor Nivio argued himself, why must the random graph -be acyclic? In the modified version availalbe in his book he got rid of such restriction. +minimal perfect hash functions in linear time. Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] +argued himself, why must the random graph +be acyclic? In the modified version availalbe in his [book http://www.dcc.ufmg.br/algoritmos/] he got rid of such restriction. The modification presented a problem, it was impossible to generate minimal perfect hash functions for sets with more than 1000 keys. At the same time, [Fabiano C. Botelho http://www.dcc.ufmg.br/~fbotelho], a master degree student at [Departament of Computer Science http://www.dcc.ufmg.br] in [Federal University of Minas Gerais http://www.ufmg.br], -started to be advised by Nivio who presented the problem to Fabiano. +started to be advised by [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] who presented the problem +to [Fabiano http://www.dcc.ufmg.br/~fbotelho]. -During the master, Fabiano and Nivio faced lots of problems. -Talking with a friend of mine (David Menoti) about our problems, many ideas -appeared and after of implementing them, we got a very fast algorithm to generate -minimal perfect hash functions that does not preserve order. +During the master, [Fabiano http://www.dcc.ufmg.br/~fbotelho] and +[Nivio Ziviani http://www.dcc.ufmg.br/~nivio] faced lots of problems. +In april of 2004, [Fabiano http://www.dcc.ufmg.br/~fbotelho] was talking with a +friend of him (David Menoti) about the problems +and many ideas appeared. +The ideas were implemented and we noticed that a very fast algorithm to generate +minimal perfect hash functions had been designed. We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho David **M**enoti and Nivio **Z**iviani. The algorithm is described in [1]. To analyse BMZ algorithm we needed some results from the random graph theory, so we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. The final description and analysis of BMZ algorithm is presented in [2]. - +---------------------------------------- -**The Algorithm** +==The Algorithm== -**The Heuristic** +Let us show how the minimal perfect hash function [figs/img7.png] will be constructed. +We make use of two auxiliary random functions [figs/img41.png] and [figs/img55.png], +where [figs/img56.png] for some suitably chosen integer [figs/img57.png], +where [figs/img58.png].We build a random graph [figs/img59.png] on [figs/img60.png], +whose edge set is [figs/img61.png]. There is an edge in [figs/img32.png] for each +key in the set of keys [figs/img20.png]. -**Papers** +In what follows, we shall be interested in the //2-core// of +the random graph [figs/img32.png], that is, the maximal subgraph +of [figs/img32.png] with minimal degree at +least 2 (see, e.g., [2] for details). +Because of its importance in our context, we call the 2-core the +//critical// subgraph of [figs/img32.png] and denote it by [figs/img63.png]. +The vertices and edges in [figs/img63.png] are said to be //critical//. +We let [figs/img64.png] and [figs/img65.png]. +Moreover, we let [figs/img66.png] be the set of //non-critical// +vertices in [figs/img32.png]. +We also let [figs/img67.png] be the set of all critical +vertices that have at least one non-critical vertex as a neighbour. +Let [figs/img68.png] be the set of //non-critical// edges in [figs/img32.png]. +Finally, we let [figs/img69.png] be the //non-critical// subgraph +of [figs/img32.png. +The non-critical subgraph [figs/img70.png] corresponds to the //acyclic part// +of [figs/img32.png]. +We have [figs/img71.png]. + +We then construct a suitable labelling [figs/img72.png] of the vertices +of [figs/img32.png]: we choose [figs/img73.png] for each [figs/img74.png] in such +a way that [figs/img75.png] ([figs/img18.png]) is a +minimal perfect hash function for [figs/img20.png]. +We will see later on that this labelling [figs/img37.png] can be found in linear time +if the number of edges in [figs/img63.png] is at most [figs/img76.png]. + +Figure 2 presents a pseudo code for the algorithm. +The procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) receives as input the set of +keys [figs/img20.png] and produces the labelling [figs/img37.png]. +The method uses a mapping, ordering and searching approach. +We now describe each step. +| procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) +|     Mapping ([figs/img20.png], [figs/img32.png]); +|     Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]); +|     Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]); +**Figure 2**: Main steps of the algorithm for constructing a minimal perfect hash function + +===Mapping Step=== + +===Ordering Step=== + +===Searching Step=== + +====Assignment of Values to Critical Vertices==== + +====Assignment of Values to Non-Critical Vertices==== + +---------------------------------------- + +==The Heuristic== + +---------------------------------------- + +==Memory Consumption== + +Now we detail the memory consumption to generate and to store minimal perfect hash functions +using the BMZ algorithm. The structures responsible for memory consumption are in the +following: +- Graph: + + **first**: is a vector that stores //cn// integer numbers, each one representing + the first edge (index in the vector edges) in the list of + edges of each vertex. + The integer numbers are 4 bytes long. Therefore, + the vector first is stored in //4cn// bytes. + + + **edges**: is a vector to represent the edges of the graph. As each edge + is compounded by a pair of vertices, each entry stores two integer numbers + of 4 bytes that represent the vertices. As there are //n// edges, the + vector edges is stored in //8n// bytes. + + + **next**: given a vertex //v//, we can discover the edges that contain //v// + following its list of edges, which starts on first[//v//] and the next + edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + the linked lists of edges of each vertex. As there are two vertices for each edge, + when an edge is iserted in the graph, it must be inserted in the two linked lists + of the vertices in its composition. Therefore, there are //2n// entries of integer + numbers in the vector next, so it is stored in //4*2n = 8n// bytes. + + + **critical vertices(critical_nodes vector)**: is a vector of //cn// bits, + where each bit indicates if a vertex is critical (1) or non-critical (0). + Therefore, the critical and non-critical vertices are represented in //cn/8// bytes. + + + **critical edges (used_edges vector)**: is a vector of //n// bits, where each + bit indicates if an edge is critical (1) or non-critical (0). Therefore, the + critical and non-critical edges are represented in //n/8// bytes. + +- Other auxiliary structures + + **queue**: is a queue of integer numbers used in the breadth-first search of the + assignment of values to critical vertices. There is an entry in the queue for + each two critical vertices. Let //|Vcrit|// be the expected number of critical + vertices. Therefore, the queue is stored in //4*0.5*|Vcrit|=2|Vcrit|//. + + + **visited**: is a vector of //cn// bits, where each bit indicates if the g value of + a given vertex was already defined. Therefore, the vector visited is stored + in //cn/8// bytes. + + + **function //g//**: is represented by a vector of //cn// integer numbers. + As each integer number is 4 bytes long, the function //g// is stored in + //4cn// bytes. + + +Thus, the total memory consumption of BMZ algorithm for generating a minimal +perfect hash function (MPHF) is: //(8.25c + 16.125)n +2|Vcrit| + O(1)// bytes. +As the value of constant //c// may be 1.15 and 0.93 we have: + || //c// | //|Vcrit|// | Memory consumption to generate a MPHF | + | 0.93 | //0.497n// | //24.80n + O(1)// | + | 1.15 | //0.401n// | //26.42n + O(1)// | +The values of |Vcrit| were calculated using Eq.(1) presented in [2]. + +Now we present the memory consumption to store the resulting function. +We only need to store the //g// function. Thus, we need //4cn// bytes. +Again we have: + || //c// | Memory consumption to store a MPHF | + | 0.93 | //3.72n// | + | 1.15 | //4.60n// | + +---------------------------------------- + +==Papers== + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. -+ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps], 4th International Workshop on Efficient and Experimental Algorithms (WEA), 2005.(submitted) ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps] (Submitted). ---------------------------------------- diff --git a/CHM.t2t b/CHM.t2t index 1ceccaa..8859eff 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -4,12 +4,57 @@ CHM Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- +==The Algorithm== -**History** +==Memory Consumption== -**The Algorithm** +Now we detail the memory consumption to generate and to store minimal perfect hash functions +using the CHM algorithm. The structures responsible for memory consumption are in the +following: +- Graph: + + **first**: is a vector that stores //cn// integer numbers, each one representing + the first edge (index in the vector edges) in the list of + edges of each vertex. + The integer numbers are 4 bytes long. Therefore, + the vector first is stored in //4cn// bytes. + + + **edges**: is a vector to represent the edges of the graph. As each edge + is compounded by a pair of vertices, each entry stores two integer numbers + of 4 bytes that represent the vertices. As there are //n// edges, the + vector edges is stored in //8n// bytes. + + + **next**: given a vertex //v//, we can discover the edges that contain //v// + following its list of edges, which starts on first[//v//] and the next + edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + the linked lists of edges of each vertex. As there are two vertices for each edge, + when an edge is iserted in the graph, it must be inserted in the two linked lists + of the vertices in its composition. Therefore, there are //2n// entries of integer + numbers in the vector next, so it is stored in //4*2n = 8n// bytes. + +- Other auxiliary structures + + **visited**: is a vector of //cn// bits, where each bit indicates if the g value of + a given vertex was already defined. Therefore, the vector visited is stored + in //cn/8// bytes. + + + **function //g//**: is represented by a vector of //cn// integer numbers. + As each integer number is 4 bytes long, the function //g// is stored in + //4cn// bytes. -**Papers** + +Thus, the total memory consumption of CHM algorithm for generating a minimal +perfect hash function (MPHF) is: //(8.125c + 16)n + O(1)// bytes. +As the value of constant //c// must be at least 2.09 we have: + || //c// | Memory consumption to generate a MPHF | + | 2.09 | //33.00n + O(1)// | + +Now we present the memory consumption to store the resulting function. +We only need to store the //g// function. Thus, we need //4cn// bytes. +Again we have: + || //c// | Memory consumption to store a MPHF | + | 2.09 | //8.36n// | + + +==Papers== + Z.J. Czech, G. Havas, and B.S. Majewski. [An optimal algorithm for generating minimal perfect hash functions. papers/chm92.pdf], Information Processing Letters, 43(5):257-264, 1992. diff --git a/COMPARISON.t2t b/COMPARISON.t2t index 4176c28..a6ff823 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -5,14 +5,14 @@ Comparison Between BMZ And CHM Algorithms ---------------------------------------- -**Features** +==Features== -**Constructing Minimal Perfect Hash Functions** +==Constructing Minimal Perfect Hash Functions== -**Memory Consumption** +==Memory Consumption== -**Run times** +==Run times== ---------------------------------------- [Home index.html] diff --git a/CONFIG.t2t b/CONFIG.t2t index 807454c..19dd4e9 100644 --- a/CONFIG.t2t +++ b/CONFIG.t2t @@ -1,2 +1,4 @@ %! PreProc(html): '^%html% ' '' %! PreProc(txt): '^%txt% ' '' +%! PostProc(html): "&" "&" +%! PostProc(txt): " " " " diff --git a/README.t2t b/README.t2t index 0b25b81..e491c32 100644 --- a/README.t2t +++ b/README.t2t @@ -5,7 +5,7 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- -**Description** +==Description== C Minimal Perfect Hashing Library is a portable LGPLed library to create and to work with minimal perfect hash functions. The cmph library encapsulates the newest @@ -31,35 +31,35 @@ of the distinguishable features of cmph: ---------------------------------------- -**Supported Algorithms** +==Supported Algorithms== %html% - [BMZ Algorithm bmz.html]. %txt% - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only 4cn bytes, where c is between 0.93 and 1.15. + can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are order preserving and - are stored in 4cn bytes, where c is greater than 2. + are stored in //4cn// bytes, where //c// is greater than 2. %html% [Click Here comparison.html] to see a comparison of the supported algorithms. ---------------------------------------- -**News for version 0.3** +==News for version 0.3== - New heuristic added to the bmz algorithm permits to generate a mphf with only - 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. + //24.6n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. %html% [click here bmz.html] for details. ---------------------------------------- -**Examples** +==Examples== Using cmph is quite simple. Take a look. @@ -113,7 +113,7 @@ Using cmph is quite simple. Take a look. ``` -------------------------------------- -**The cmph application** +==The cmph application== cmph is the name of both the library and the utility application that comes with this package. You can use the cmph @@ -157,16 +157,16 @@ utility. keysfile line separated file with keys ``` -**Additional Documentation** +==Additional Documentation== [FAQ faq.html] -**Downloads** +==Downloads== Use the project page at sourceforge: http://sf.net/projects/cmph -**License Stuff** +==License Stuff== Code is under the LGPL. ---------------------------------------- From 8401ce6d925e20502440ab339cb6c3ef04d9cb91 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jan 2005 20:12:58 +0000 Subject: [PATCH 085/739] Initial version --- figs/img1.png | Bin 0 -> 174 bytes figs/img10.png | Bin 0 -> 344 bytes figs/img100.png | Bin 0 -> 395 bytes figs/img101.png | Bin 0 -> 456 bytes figs/img102.png | Bin 0 -> 453 bytes figs/img103.png | Bin 0 -> 319 bytes figs/img104.png | Bin 0 -> 1009 bytes figs/img105.png | Bin 0 -> 1482 bytes figs/img106.png | Bin 0 -> 923 bytes figs/img107.png | Bin 0 -> 286 bytes figs/img108.png | Bin 0 -> 1064 bytes figs/img109.png | Bin 0 -> 788 bytes figs/img11.png | Bin 0 -> 181 bytes figs/img110.png | Bin 0 -> 464 bytes figs/img111.png | Bin 0 -> 479 bytes figs/img112.png | Bin 0 -> 270 bytes figs/img113.png | Bin 0 -> 454 bytes figs/img114.png | Bin 0 -> 755 bytes figs/img115.png | Bin 0 -> 191 bytes figs/img116.png | Bin 0 -> 329 bytes figs/img117.png | Bin 0 -> 200 bytes figs/img118.png | Bin 0 -> 199 bytes figs/img119.png | Bin 0 -> 258 bytes figs/img12.png | Bin 0 -> 271 bytes figs/img120.png | Bin 0 -> 284 bytes figs/img121.png | Bin 0 -> 341 bytes figs/img122.png | Bin 0 -> 296 bytes figs/img123.png | Bin 0 -> 331 bytes figs/img124.png | Bin 0 -> 316 bytes figs/img125.png | Bin 0 -> 331 bytes figs/img126.png | Bin 0 -> 377 bytes figs/img127.png | Bin 0 -> 644 bytes figs/img128.png | Bin 0 -> 284 bytes figs/img129.png | Bin 0 -> 210 bytes figs/img13.png | Bin 0 -> 332 bytes figs/img130.png | Bin 0 -> 475 bytes figs/img131.png | Bin 0 -> 744 bytes figs/img132.png | Bin 0 -> 453 bytes figs/img133.png | Bin 0 -> 728 bytes figs/img134.png | Bin 0 -> 290 bytes figs/img135.png | Bin 0 -> 443 bytes figs/img136.png | Bin 0 -> 252 bytes figs/img137.png | Bin 0 -> 411 bytes figs/img138.png | Bin 0 -> 5097 bytes figs/img139.png | Bin 0 -> 178 bytes figs/img14.png | Bin 0 -> 219 bytes figs/img140.png | Bin 0 -> 264 bytes figs/img141.png | Bin 0 -> 305 bytes figs/img142.png | Bin 0 -> 533 bytes figs/img143.png | Bin 0 -> 195 bytes figs/img144.png | Bin 0 -> 283 bytes figs/img145.png | Bin 0 -> 501 bytes figs/img146.png | Bin 0 -> 525 bytes figs/img147.png | Bin 0 -> 379 bytes figs/img148.png | Bin 0 -> 607 bytes figs/img149.png | Bin 0 -> 589 bytes figs/img15.png | Bin 0 -> 416 bytes figs/img150.png | Bin 0 -> 596 bytes figs/img151.png | Bin 0 -> 706 bytes figs/img152.png | Bin 0 -> 600 bytes figs/img153.png | Bin 0 -> 534 bytes figs/img154.png | Bin 0 -> 540 bytes figs/img155.png | Bin 0 -> 944 bytes figs/img156.png | Bin 0 -> 389 bytes figs/img157.png | Bin 0 -> 332 bytes figs/img158.png | Bin 0 -> 579 bytes figs/img159.png | Bin 0 -> 1117 bytes figs/img16.png | Bin 0 -> 772 bytes figs/img160.png | Bin 0 -> 695 bytes figs/img161.png | Bin 0 -> 542 bytes figs/img162.png | Bin 0 -> 566 bytes figs/img163.png | Bin 0 -> 396 bytes figs/img164.png | Bin 0 -> 238 bytes figs/img165.png | Bin 0 -> 271 bytes figs/img166.png | Bin 0 -> 453 bytes figs/img167.png | Bin 0 -> 374 bytes figs/img168.png | Bin 0 -> 255 bytes figs/img169.png | Bin 0 -> 208 bytes figs/img17.png | Bin 0 -> 355 bytes figs/img170.png | Bin 0 -> 416 bytes figs/img171.png | Bin 0 -> 5643 bytes figs/img172.png | Bin 0 -> 211 bytes figs/img173.png | Bin 0 -> 386 bytes figs/img174.png | Bin 0 -> 320 bytes figs/img175.png | Bin 0 -> 632 bytes figs/img176.png | Bin 0 -> 657 bytes figs/img177.png | Bin 0 -> 344 bytes figs/img178.png | Bin 0 -> 262 bytes figs/img179.png | Bin 0 -> 581 bytes figs/img18.png | Bin 0 -> 316 bytes figs/img180.png | Bin 0 -> 198 bytes figs/img181.png | Bin 0 -> 350 bytes figs/img182.png | Bin 0 -> 632 bytes figs/img183.png | Bin 0 -> 170 bytes figs/img184.png | Bin 0 -> 457 bytes figs/img185.png | Bin 0 -> 721 bytes figs/img186.png | Bin 0 -> 697 bytes figs/img187.png | Bin 0 -> 340 bytes figs/img188.png | Bin 0 -> 777 bytes figs/img189.png | Bin 0 -> 173 bytes figs/img19.png | Bin 0 -> 350 bytes figs/img190.png | Bin 0 -> 455 bytes figs/img191.png | Bin 0 -> 621 bytes figs/img192.png | Bin 0 -> 637 bytes figs/img193.png | Bin 0 -> 719 bytes figs/img194.png | Bin 0 -> 702 bytes figs/img195.png | Bin 0 -> 338 bytes figs/img196.png | Bin 0 -> 209 bytes figs/img197.png | Bin 0 -> 888 bytes figs/img198.png | Bin 0 -> 354 bytes figs/img199.png | Bin 0 -> 326 bytes figs/img2.png | Bin 0 -> 377 bytes figs/img20.png | Bin 0 -> 214 bytes figs/img200.png | Bin 0 -> 474 bytes figs/img201.png | Bin 0 -> 348 bytes figs/img202.png | Bin 0 -> 442 bytes figs/img203.png | Bin 0 -> 4001 bytes figs/img204.png | Bin 0 -> 240 bytes figs/img205.png | Bin 0 -> 329 bytes figs/img206.png | Bin 0 -> 534 bytes figs/img207.png | Bin 0 -> 2835 bytes figs/img208.png | Bin 0 -> 303 bytes figs/img209.png | Bin 0 -> 532 bytes figs/img21.png | Bin 0 -> 342 bytes figs/img210.png | Bin 0 -> 1360 bytes figs/img211.png | Bin 0 -> 9580 bytes figs/img212.png | Bin 0 -> 4654 bytes figs/img213.png | Bin 0 -> 495 bytes figs/img214.png | Bin 0 -> 2405 bytes figs/img215.png | Bin 0 -> 644 bytes figs/img216.png | Bin 0 -> 438 bytes figs/img217.png | Bin 0 -> 343 bytes figs/img218.png | Bin 0 -> 330 bytes figs/img219.png | Bin 0 -> 893 bytes figs/img22.png | Bin 0 -> 210 bytes figs/img220.png | Bin 0 -> 576 bytes figs/img221.png | Bin 0 -> 357 bytes figs/img222.png | Bin 0 -> 415 bytes figs/img223.png | Bin 0 -> 355 bytes figs/img224.png | Bin 0 -> 322 bytes figs/img225.png | Bin 0 -> 118 bytes figs/img226.png | Bin 0 -> 523 bytes figs/img227.png | Bin 0 -> 773 bytes figs/img228.png | Bin 0 -> 559 bytes figs/img229.png | Bin 0 -> 700 bytes figs/img23.png | Bin 0 -> 318 bytes figs/img230.png | Bin 0 -> 1606 bytes figs/img231.png | Bin 0 -> 1907 bytes figs/img232.png | Bin 0 -> 893 bytes figs/img233.png | Bin 0 -> 972 bytes figs/img234.png | Bin 0 -> 1138 bytes figs/img235.png | Bin 0 -> 1223 bytes figs/img236.png | Bin 0 -> 329 bytes figs/img237.png | Bin 0 -> 333 bytes figs/img238.png | Bin 0 -> 314 bytes figs/img239.png | Bin 0 -> 412 bytes figs/img24.png | Bin 0 -> 509 bytes figs/img240.png | Bin 0 -> 486 bytes figs/img241.png | Bin 0 -> 219 bytes figs/img242.png | Bin 0 -> 490 bytes figs/img243.png | Bin 0 -> 267 bytes figs/img244.png | Bin 0 -> 223 bytes figs/img245.png | Bin 0 -> 287 bytes figs/img246.png | Bin 0 -> 263 bytes figs/img247.png | Bin 0 -> 482 bytes figs/img248.png | Bin 0 -> 320 bytes figs/img249.png | Bin 0 -> 307 bytes figs/img25.png | Bin 0 -> 282 bytes figs/img250.png | Bin 0 -> 314 bytes figs/img251.png | Bin 0 -> 167 bytes figs/img252.png | Bin 0 -> 25779 bytes figs/img253.png | Bin 0 -> 22062 bytes figs/img26.png | Bin 0 -> 4678 bytes figs/img27.png | Bin 0 -> 487 bytes figs/img28.png | Bin 0 -> 228 bytes figs/img29.png | Bin 0 -> 344 bytes figs/img3.png | Bin 0 -> 644 bytes figs/img30.png | Bin 0 -> 456 bytes figs/img31.png | Bin 0 -> 333 bytes figs/img32.png | Bin 0 -> 229 bytes figs/img33.png | Bin 0 -> 479 bytes figs/img34.png | Bin 0 -> 446 bytes figs/img35.png | Bin 0 -> 879 bytes figs/img36.png | Bin 0 -> 214 bytes figs/img37.png | Bin 0 -> 214 bytes figs/img38.png | Bin 0 -> 210 bytes figs/img39.png | Bin 0 -> 393 bytes figs/img4.png | Bin 0 -> 262 bytes figs/img40.png | Bin 0 -> 362 bytes figs/img41.png | Bin 0 -> 236 bytes figs/img42.png | Bin 0 -> 244 bytes figs/img43.png | Bin 0 -> 336 bytes figs/img44.png | Bin 0 -> 377 bytes figs/img45.png | Bin 0 -> 356 bytes figs/img46.png | Bin 0 -> 366 bytes figs/img47.png | Bin 0 -> 493 bytes figs/img48.png | Bin 0 -> 936 bytes figs/img49.png | Bin 0 -> 488 bytes figs/img5.png | Bin 0 -> 298 bytes figs/img50.png | Bin 0 -> 281 bytes figs/img51.png | Bin 0 -> 682 bytes figs/img52.png | Bin 0 -> 345 bytes figs/img53.png | Bin 0 -> 421 bytes figs/img54.png | Bin 0 -> 445 bytes figs/img55.png | Bin 0 -> 430 bytes figs/img56.png | Bin 0 -> 416 bytes figs/img57.png | Bin 0 -> 278 bytes figs/img58.png | Bin 0 -> 330 bytes figs/img59.png | Bin 0 -> 564 bytes figs/img6.png | Bin 0 -> 339 bytes figs/img60.png | Bin 0 -> 200 bytes figs/img61.png | Bin 0 -> 820 bytes figs/img62.png | Bin 0 -> 194 bytes figs/img63.png | Bin 0 -> 298 bytes figs/img64.png | Bin 0 -> 554 bytes figs/img65.png | Bin 0 -> 578 bytes figs/img66.png | Bin 0 -> 495 bytes figs/img67.png | Bin 0 -> 432 bytes figs/img68.png | Bin 0 -> 614 bytes figs/img69.png | Bin 0 -> 818 bytes figs/img7.png | Bin 0 -> 210 bytes figs/img70.png | Bin 0 -> 320 bytes figs/img71.png | Bin 0 -> 524 bytes figs/img72.png | Bin 0 -> 393 bytes figs/img73.png | Bin 0 -> 336 bytes figs/img74.png | Bin 0 -> 467 bytes figs/img75.png | Bin 0 -> 822 bytes figs/img76.png | Bin 0 -> 472 bytes figs/img77.png | Bin 0 -> 4740 bytes figs/img78.png | Bin 0 -> 540 bytes figs/img79.png | Bin 0 -> 199 bytes figs/img8.png | Bin 0 -> 193 bytes figs/img80.png | Bin 0 -> 240 bytes figs/img81.png | Bin 0 -> 236 bytes figs/img82.png | Bin 0 -> 331 bytes figs/img83.png | Bin 0 -> 343 bytes figs/img84.png | Bin 0 -> 330 bytes figs/img85.png | Bin 0 -> 441 bytes figs/img86.png | Bin 0 -> 1298 bytes figs/img87.png | Bin 0 -> 561 bytes figs/img88.png | Bin 0 -> 830 bytes figs/img89.png | Bin 0 -> 395 bytes figs/img9.png | Bin 0 -> 362 bytes figs/img90.png | Bin 0 -> 327 bytes figs/img91.png | Bin 0 -> 406 bytes figs/img92.png | Bin 0 -> 411 bytes figs/img93.png | Bin 0 -> 409 bytes figs/img94.png | Bin 0 -> 290 bytes figs/img95.png | Bin 0 -> 293 bytes figs/img96.png | Bin 0 -> 141 bytes figs/img97.png | Bin 0 -> 283 bytes figs/img98.png | Bin 0 -> 491 bytes figs/img99.png | Bin 0 -> 437 bytes papers/bmz_tr004_04.ps | 10732 +++++++++++++++++++++++++++++++++++++++ papers/bmz_wea2005.ps | 8159 +++++++++++++++++++++++++++++ papers/chm92.pdf | Bin 0 -> 191651 bytes 256 files changed, 18891 insertions(+) create mode 100644 figs/img1.png create mode 100644 figs/img10.png create mode 100644 figs/img100.png create mode 100644 figs/img101.png create mode 100644 figs/img102.png create mode 100644 figs/img103.png create mode 100644 figs/img104.png create mode 100644 figs/img105.png create mode 100644 figs/img106.png create mode 100644 figs/img107.png create mode 100644 figs/img108.png create mode 100644 figs/img109.png create mode 100644 figs/img11.png create mode 100644 figs/img110.png create mode 100644 figs/img111.png create mode 100644 figs/img112.png create mode 100644 figs/img113.png create mode 100644 figs/img114.png create mode 100644 figs/img115.png create mode 100644 figs/img116.png create mode 100644 figs/img117.png create mode 100644 figs/img118.png create mode 100644 figs/img119.png create mode 100644 figs/img12.png create mode 100644 figs/img120.png create mode 100644 figs/img121.png create mode 100644 figs/img122.png create mode 100644 figs/img123.png create mode 100644 figs/img124.png create mode 100644 figs/img125.png create mode 100644 figs/img126.png create mode 100644 figs/img127.png create mode 100644 figs/img128.png create mode 100644 figs/img129.png create mode 100644 figs/img13.png create mode 100644 figs/img130.png create mode 100644 figs/img131.png create mode 100644 figs/img132.png create mode 100644 figs/img133.png create mode 100644 figs/img134.png create mode 100644 figs/img135.png create mode 100644 figs/img136.png create mode 100644 figs/img137.png create mode 100644 figs/img138.png create mode 100644 figs/img139.png create mode 100644 figs/img14.png create mode 100644 figs/img140.png create mode 100644 figs/img141.png create mode 100644 figs/img142.png create mode 100644 figs/img143.png create mode 100644 figs/img144.png create mode 100644 figs/img145.png create mode 100644 figs/img146.png create mode 100644 figs/img147.png create mode 100644 figs/img148.png create mode 100644 figs/img149.png create mode 100644 figs/img15.png create mode 100644 figs/img150.png create mode 100644 figs/img151.png create mode 100644 figs/img152.png create mode 100644 figs/img153.png create mode 100644 figs/img154.png create mode 100644 figs/img155.png create mode 100644 figs/img156.png create mode 100644 figs/img157.png create mode 100644 figs/img158.png create mode 100644 figs/img159.png create mode 100644 figs/img16.png create mode 100644 figs/img160.png create mode 100644 figs/img161.png create mode 100644 figs/img162.png create mode 100644 figs/img163.png create mode 100644 figs/img164.png create mode 100644 figs/img165.png create mode 100644 figs/img166.png create mode 100644 figs/img167.png create mode 100644 figs/img168.png create mode 100644 figs/img169.png create mode 100644 figs/img17.png create mode 100644 figs/img170.png create mode 100644 figs/img171.png create mode 100644 figs/img172.png create mode 100644 figs/img173.png create mode 100644 figs/img174.png create mode 100644 figs/img175.png create mode 100644 figs/img176.png create mode 100644 figs/img177.png create mode 100644 figs/img178.png create mode 100644 figs/img179.png create mode 100644 figs/img18.png create mode 100644 figs/img180.png create mode 100644 figs/img181.png create mode 100644 figs/img182.png create mode 100644 figs/img183.png create mode 100644 figs/img184.png create mode 100644 figs/img185.png create mode 100644 figs/img186.png create mode 100644 figs/img187.png create mode 100644 figs/img188.png create mode 100644 figs/img189.png create mode 100644 figs/img19.png create mode 100644 figs/img190.png create mode 100644 figs/img191.png create mode 100644 figs/img192.png create mode 100644 figs/img193.png create mode 100644 figs/img194.png create mode 100644 figs/img195.png create mode 100644 figs/img196.png create mode 100644 figs/img197.png create mode 100644 figs/img198.png create mode 100644 figs/img199.png create mode 100644 figs/img2.png create mode 100644 figs/img20.png create mode 100644 figs/img200.png create mode 100644 figs/img201.png create mode 100644 figs/img202.png create mode 100644 figs/img203.png create mode 100644 figs/img204.png create mode 100644 figs/img205.png create mode 100644 figs/img206.png create mode 100644 figs/img207.png create mode 100644 figs/img208.png create mode 100644 figs/img209.png create mode 100644 figs/img21.png create mode 100644 figs/img210.png create mode 100644 figs/img211.png create mode 100644 figs/img212.png create mode 100644 figs/img213.png create mode 100644 figs/img214.png create mode 100644 figs/img215.png create mode 100644 figs/img216.png create mode 100644 figs/img217.png create mode 100644 figs/img218.png create mode 100644 figs/img219.png create mode 100644 figs/img22.png create mode 100644 figs/img220.png create mode 100644 figs/img221.png create mode 100644 figs/img222.png create mode 100644 figs/img223.png create mode 100644 figs/img224.png create mode 100644 figs/img225.png create mode 100644 figs/img226.png create mode 100644 figs/img227.png create mode 100644 figs/img228.png create mode 100644 figs/img229.png create mode 100644 figs/img23.png create mode 100644 figs/img230.png create mode 100644 figs/img231.png create mode 100644 figs/img232.png create mode 100644 figs/img233.png create mode 100644 figs/img234.png create mode 100644 figs/img235.png create mode 100644 figs/img236.png create mode 100644 figs/img237.png create mode 100644 figs/img238.png create mode 100644 figs/img239.png create mode 100644 figs/img24.png create mode 100644 figs/img240.png create mode 100644 figs/img241.png create mode 100644 figs/img242.png create mode 100644 figs/img243.png create mode 100644 figs/img244.png create mode 100644 figs/img245.png create mode 100644 figs/img246.png create mode 100644 figs/img247.png create mode 100644 figs/img248.png create mode 100644 figs/img249.png create mode 100644 figs/img25.png create mode 100644 figs/img250.png create mode 100644 figs/img251.png create mode 100644 figs/img252.png create mode 100644 figs/img253.png create mode 100644 figs/img26.png create mode 100644 figs/img27.png create mode 100644 figs/img28.png create mode 100644 figs/img29.png create mode 100644 figs/img3.png create mode 100644 figs/img30.png create mode 100644 figs/img31.png create mode 100644 figs/img32.png create mode 100644 figs/img33.png create mode 100644 figs/img34.png create mode 100644 figs/img35.png create mode 100644 figs/img36.png create mode 100644 figs/img37.png create mode 100644 figs/img38.png create mode 100644 figs/img39.png create mode 100644 figs/img4.png create mode 100644 figs/img40.png create mode 100644 figs/img41.png create mode 100644 figs/img42.png create mode 100644 figs/img43.png create mode 100644 figs/img44.png create mode 100644 figs/img45.png create mode 100644 figs/img46.png create mode 100644 figs/img47.png create mode 100644 figs/img48.png create mode 100644 figs/img49.png create mode 100644 figs/img5.png create mode 100644 figs/img50.png create mode 100644 figs/img51.png create mode 100644 figs/img52.png create mode 100644 figs/img53.png create mode 100644 figs/img54.png create mode 100644 figs/img55.png create mode 100644 figs/img56.png create mode 100644 figs/img57.png create mode 100644 figs/img58.png create mode 100644 figs/img59.png create mode 100644 figs/img6.png create mode 100644 figs/img60.png create mode 100644 figs/img61.png create mode 100644 figs/img62.png create mode 100644 figs/img63.png create mode 100644 figs/img64.png create mode 100644 figs/img65.png create mode 100644 figs/img66.png create mode 100644 figs/img67.png create mode 100644 figs/img68.png create mode 100644 figs/img69.png create mode 100644 figs/img7.png create mode 100644 figs/img70.png create mode 100644 figs/img71.png create mode 100644 figs/img72.png create mode 100644 figs/img73.png create mode 100644 figs/img74.png create mode 100644 figs/img75.png create mode 100644 figs/img76.png create mode 100644 figs/img77.png create mode 100644 figs/img78.png create mode 100644 figs/img79.png create mode 100644 figs/img8.png create mode 100644 figs/img80.png create mode 100644 figs/img81.png create mode 100644 figs/img82.png create mode 100644 figs/img83.png create mode 100644 figs/img84.png create mode 100644 figs/img85.png create mode 100644 figs/img86.png create mode 100644 figs/img87.png create mode 100644 figs/img88.png create mode 100644 figs/img89.png create mode 100644 figs/img9.png create mode 100644 figs/img90.png create mode 100644 figs/img91.png create mode 100644 figs/img92.png create mode 100644 figs/img93.png create mode 100644 figs/img94.png create mode 100644 figs/img95.png create mode 100644 figs/img96.png create mode 100644 figs/img97.png create mode 100644 figs/img98.png create mode 100644 figs/img99.png create mode 100755 papers/bmz_tr004_04.ps create mode 100755 papers/bmz_wea2005.ps create mode 100755 papers/chm92.pdf diff --git a/figs/img1.png b/figs/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff303145d65386a0dcbe38127efdb15324673e86 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^+#og!GXn$TuRA;E0XbR$J|V9E|Noykb7pyYd1z?p zyLa!-oH-*XD7b3Xs*aA1w6rv!Di;?QB_*ZZyLZ1jv4tJTXDkWw3ubV5b^|171{ym@NMFtd{J%wx_3!2|||r2;ID U2QIAJ2Gq^q>FVdQ&MBb@08j8b`2YX_ literal 0 HcmV?d00001 diff --git a/figs/img10.png b/figs/img10.png new file mode 100644 index 0000000000000000000000000000000000000000..f1802b901af59a0e4a79e96ac705893e36a237eb GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5Z!py+HD4X&IBw!HW6XN>+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{69AXCuTIQ=K1{Djg23@OYfcFJ2x z+~C!7h&jVy&hjFejkPG&LF&OxmQDT)XUdv5Hs&x0c?DE58=Tydv76zr8C%=c<6V*x zcFnDOWPdPAm>Fy^IKpiCU;_KApU3${k{(zbIKc4Dp4pkP`72Y~XP!0saoPq3KF$%< o>`ou+9g4d2X3TN$y)Veiz*-^4-p-Y>66iw)Pgg&ebxsLQ0A9#^GXMYp literal 0 HcmV?d00001 diff --git a/figs/img100.png b/figs/img100.png new file mode 100644 index 0000000000000000000000000000000000000000..0794acddb7f9180964cc8434241b0a0a0dc770bd GIT binary patch literal 395 zcmV;60d)R}P)Q0AX`MF$2Q~AZ8&(J3jCr0Z2G7Brq`oX-cLo8|ZchaL8-`ISazR#Q+yG0Z|H2|3Jk+ zeggTHUjZr>4HV$Iz_5D(1K5w;duZ#Wfdx`5@kl)83rq)C43GrWt-;g=aGC>xTWSoT zMC<(llyZT9cToa};)bdM)1P#qn%6)mex(Z#2C}Ly6{sTK{a}h?kply=DkFv-1|-9{ p4ltk^#*OBWOK5yv1%^?83INifGsHHiN2mY*002ovPDHLkV1i-Ri{k(Q literal 0 HcmV?d00001 diff --git a/figs/img101.png b/figs/img101.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf4b4ab453a3795f3137f9f1206da6aaec67d35 GIT binary patch literal 456 zcmV;(0XP1MP)FVhy4AL4+8X zIcpIEHn1B)aWEu+%z$t{Fz|u7P>{-?0Hy^Bu$q7{YB$IM3=S8d{Jn4)4hDwXKr`5( z-0T8okWtTom>W&|g$?-aAOh^(jKU3IVA}mU0ptjF4u}XZ#Eu6H{HzcGE|}T{AVNU^ z>@0JTN~rju3n1rjaR5aC7c35dfQgeqECIq4fO~~~_wE30cBn7|_bvvu3WN?u(}qW6 z`;1b+vVd8D3AZ#4DB_qeFdbkqKnUict3n8{thNGC4Gi8NfCLak@7}$Yfx!@62Uvi0 zH!xV(8O}n4)&MbY7z-ppz1u7RqJZHB*3S~c`GDbSf;(7_Y3Dl!5Y4+EtYQgPhx2`4 y7GS8}<$xl{bpT{*0*e4v9S;9E8NwJG5h4JM7)0<8H*I+U0000!p>~ybE+!IJl zYjckf8*2-zfUu}=ML@5x5Jb36%it3P@&eB6oq9PeqK$sA^K&z^^UW*=SV&iq?4pJO z4FqL|^kA-=vF{Q1DM?{%&t4uwRsKfs((Mk6HOCPN!^K8VUx}VW{!UAipC}Efqq2nC zxThC@-n`9Eu*TkZ7M2GiW|F|dI$FRZl_Dm}Q5a$iAwU#!0}0`yM~d>>7(uu_z=^Ai z70=*|K3niu?Yp83{BJnJ>z0JS3H{xg}6F3_=kk8WbF#xO&FLYHQj!2TX^ v{zW6mE90cVOG#{58$dLFh3T)>^XGU6B#k(W9|4x400000NkvXXu0mjf?vu&Z literal 0 HcmV?d00001 diff --git a/figs/img103.png b/figs/img103.png new file mode 100644 index 0000000000000000000000000000000000000000..88a9a9770143f17cf69d3d74979d9abb1c5363d0 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^azL!W!py+H*pT`37La2Q;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lkz5ba4!+n3J5~z*@t@UB+&nx?4yP0nn5|C~w28Dc zh%t5u{&5KAcy*j%56>I{HwNp&>;{V)IaByfn@*U+e1SWMhe!B8U1D0o4W>|KhRxYb z%-k=_Cb3vJ{!0yP_&ilYVxN(LLG#VH-$D}G3^U%}J9Z$S;faxN!VQL&9R7x!fPf-n z13d<#3Mrw6d(5A1#@#kDn3JAx@6CY&GZ~EE^Ue6vzac<8MbmdL3nRnLOj+*G6FnP& P9%1lw^>bP0l+XkKzqfH# literal 0 HcmV?d00001 diff --git a/figs/img104.png b/figs/img104.png new file mode 100644 index 0000000000000000000000000000000000000000..4debbf6c4330525cacf67816af7c6bef5c44d309 GIT binary patch literal 1009 zcmVOl1U}v8%$wsG-vuA3>QptJOZLY{fRrDjKCk^pSO6~Hjp6oZV1OT za@2&pMflN@mZAtRgQ}SW0DS`@EiE7k^s&hjM&m%ig68poo&D5vqGhhJPmuyMAqxl!#IIVqf@Ot3%I4v zW+Zjw_A2?g%eTERZ13(R#hr2Yg5u7Q_!OX&QUGpBJzoL5 zz5xJkmnWruUZ3mAw@cDKg3x?Ced+%azxmA5+>y|+Mm)(nob{?d1Fm{BiOCi)N^Ddc#_6aP9{;*o+SNxc!J~zl2bgs z5J>iY`-AW!RY8#A8pYKRI)581(03nNy@ElSkAnB!& z(Ey71Ga)-aw*}NDzM5~@iybx;<-H(3iBGR(2Po4wA?T8btu4jaNb%r6l0l=Lv_l&- z*#fefivp@y7QM-7PT~Ve*H;A1j{GD(mvtGEnw+(3M}{Ik+pl8sl|8nAZr%DPXt^ZD zA)H!nJxL2J!?AHRXmnFWa0ts)JlS$&6aY-0s?s5lbkLUU(9K1BIi?*~(69sGIY5(E zjCo(xKA~Z(?@tAVR<2cwBlumpn*QMKV2_i^g19X!+P_7!6&!N%-=L_~+TZod*T#2z fUmM@?eQo>#t!sOy&E%ZL00000NkvXXu0mjfIep$J literal 0 HcmV?d00001 diff --git a/figs/img105.png b/figs/img105.png new file mode 100644 index 0000000000000000000000000000000000000000..d29b1bf264f22024dfa2e083f8f8cc31e34a6649 GIT binary patch literal 1482 zcmV;*1vUDKP)LE?@J-Ei&zMJY zm0{>a)1Y?L?mwQ+zXzw8di?^xfXk;_RMPHW#`SK65Txf(xc{MUu7V-)l&4`lu z5LTRV^{MFHrg98wn<_iaE%48k68v^1Gg{aLKcXnowv>U} zbzvTWl!6B2&H#kT$*rfYs19#{YeSx?w1cWIr06&5rf!x;)`+M`SFBYXnkK)fiSnos zbu;Y^{y&&B(oUKvcTQF*<6;x#hVK$LujN@UKYfF0Uy4bvlp0G1dMP=koQ^vg-*gJM z40T(YYmNA9Zrm0I=CUzW)UbVvM6hTwEuBp*Q(e#eTlnrxjsr+J$+bH$8;tZR4K-tu z`$5?@G4V0eDJglfW9kg-l7B&E5nPkzEMUUZbgzKOmnQ;FtvMbaQMR4goOE@%8{;iu z7!#Y-0{ctQU5(1Kb40iqGrQzz6H2hW=<>%wFxc+-c#RbrJ8b zi6goSfq&9oHLsfjfTyopOu|gBOw<3Uh%adDh`)Q=+RP@ zW78j2-9A`!d*^V3cI?ORtWLG8r9ek0vaM^oh1(<`;R{z@Ew96CP{oU62i*}@0lvqr zJJ9M6z%g^(j=+sla0?JYWFH|PK!ViVpBnYJFj>~TUT=klw z2z#E_RWx;GTHQIIs~B>%aoe`RIhx$u{%UsZa{zrG-ox0JagEz9#&YIli`DDh-sUpK zZ-bu-w@ILRw!bU6ZB&0IF#?C|C<3{P7yW)RVs!)0i=1&(zAk?`qds5MD&pQ$Xs*+l znG~ZqM-P(SIf+wzi`9uGYsuiqkKa{f+iES9+az2Eq(6Y~^jWhdgN4i&Pch zH?Xco#VqkaPqI;t!u>D1hbC$rFC58ImdUg;JAcmVMp$C1;yADM^I9EYjoq1CcrUBW zvWmI%qUgfn_u73mw8}2kA0^M#GQp}}x#|d)?ZQlO*7bUSWKFyZ->!?;{(4=^2qRe= kwG;jqsW;eQgF6p@0XJ_(hI-fUApigX07*qoM6N<$f?B4~0RR91 literal 0 HcmV?d00001 diff --git a/figs/img106.png b/figs/img106.png new file mode 100644 index 0000000000000000000000000000000000000000..69fa53e1db2948b8f2e9512eacefa98ab9c34d3c GIT binary patch literal 923 zcmV;M17!S(P)U;0I3+4c!(?HTe4s3#I6w}!i-?>#&-fV!Q6BBL4b?W-U`Pu8uKsP1QvuhfOO!g|ZvfL}#9#W|{ttD>}6$sKA9&s>ik+)~Okj&{~PU4#pZK1GNoc zG#6w-3@V8qi*xWjA8u3qyyfBiXSWp>n^ZhJQ`IrtHq$q+ZN16Wt6+0&P4 z#&~Iy8M`a<;{Vxx{nQ>`0D18;*W-BVcnUtPDe$YzcI#xuQTRlZWlV6u zW9EJuFEe-&2VW1yy(~zu=dsOM`!9gLj&r#xCs;B2rj%sO?Fr#mh_Zea3(3riuP23j z^+u=ktzq%o$DU*@SmlJ{v8&}+Z@b^2Yj-XVb+%t#~V+rXGA&@7k+ z8XXoAdpYA}`rNgq+?rl;b21b(2`NkWwT}2kbkj6X;JwIJk&p? zj4_ic9w)P@vE=H(Vsxha=hh7UmWG^sKUiFIS8d8=o7q!Hjkr;BHI`TiWX~V$H33r) x4H0`shq%J#N+sVQXLlHAjeVjV!4Vt~{08`6&2iHtwfF!4002ovPDHLkV1iqxtaShY literal 0 HcmV?d00001 diff --git a/figs/img107.png b/figs/img107.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0b60664500c5eb74291d264772ce3603267629 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E!!py+HctY8*2gor9@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaK?Rx;TbZ%t=lF0`^CoJOUFA95`@{IW3n#@cO$C1`C?G9nSEk6`p1kEqot#AfSoC zpjcf8s5X_!$V@CJ;lZAG8Yi4>xkbsA@IfQ^nR`4Kra1gwx zgfWL)JU9pm1PK@qLfFed4!O?3lM6Bjy(yHU_*1*=9L1H;3CYF1wB{mAB+XvEz-ik^0XuBEao_xbNN0D#K?ymzoZ%2g^2t zS9E(j22P4t;%mSL&)lpNWw z3O(mSsBii?!G@9+POsU>7AbLIl8GJX318elASkqk?$d9JeqEyc(1-NU!BRq>K{kSf zd+{m-i^D}+`o#N6<^bcA2i!IEC9+mWtCpiX5IN6WxTLV*df5y~e2lIev7jxA;l!i? zqrFaqIH6yaX-Kt&CoI3CPJ;~mJsWPI zo=l#!-J#8OO$Us#M8g(nC^bOzmUca7+&xNn9~;lik>Dnidp8mXi4wP0M`;!H9|MQe z(DuIZAXZI4(B_fX>o+NJ1?q}tIn{dnIMTHntt@m+bBVYK=c37zG#$?5aViRO^7ml5 zR~l;E+ZA(x1qyKXR4uoIkCbHN;szI01kT5(q!ty;Z^O&!wXUEuz@LK+jo)R2bI2`hs|5_zHeZ&g(el=?{OwshQXn<^QN=O z)CZDl`5d>4U#bXpVXtX5>7-FA;LLV66Sm@#+NmPfy;VVQg5o}BHCZs9VNx2|72MH| i@16fqZGi>;2lyAAlIZlbe$eLt0000WP)jRV#_bHdcq=o7wCp+2p(vv^cmIb~5wc z_q};D@4W$PGJpvI$}*mB>37tryWa;g5C07O>MZ0Tp%K0fg~@#E8RGtHiXS5ZnDxH&PQM`#`WJsxKcW>t`_@+ zRO$(1nf7q*iAoWN`T;iQt3Wjvb&>ylK@cJ00ngVIO0#nVKi3uB#Q? z6(J(@^kR)aZ=g{am?l;cHVPW2^F-+*=erL1f0TpsODeyCHn@Sx<(Pfh%3h$PKqCMJ zU794}IzrLnFo;?y)M#M1o|xz*m^b}au`tUp?_a$+t#at`WGFfAigFs?*r6JF#+ zTp}B(@ok2A2IV{AJ*r%>=05NditzIkPOnuk9$M`c#C`(r2CvV~xH6Lh6LeC{y4pfw zg9)Ev#>5qjhrWDXG(u84p_OUOv$>-SI8uh1@L~?8hMU}#DO>h<*}peo_=Qnp>`prC zs@3!Gi(Lika$a^Tm{3<`UqF+aa;s~-g`Y>1#QM?Z1~2cbGvkV{>RMY7POjq0a0)A5 zVY6&1Klx1R{a@GZIQK~VxU+;%!7A)S)Wr&Gu3$f2LRf?yLhQu&TgtH<8Tk$DT&qN0 S|L!>e00000WbcEP)CLR&BtbTW*0C>%@PTGg`4ma zb~&Pa{n=*e0U43C$P;A-jyP0Szl|ycn1^td1qVa6!h*oO%G*X&!ofj+!rK>>icr>0 z`m2BU1DCjLLOQw35j%JpjG2k4^D^<_g;PwK@|gP2rkM)QM_L(C!qhF8a``OdBbt0}P2-C^8_Jc$SG zoMYt_-AQS@HX}hgEpqh@8v(Pcr_pT@C|!lqiZtn$U48GH8x9J3CqU*VxK2EUR?XRJr}5Jy|#XPw@$9fkEi0M<$8@0000-E(|5fTzl-tio7XJ&U6=)mooxO5_t zyyXditkgVO468%ZI#5L@-*J}DC`FOkpp4g@8mofi(6V4kM>)Pb2D zPKYeM}XZNg002ovPDHLkV1lQ%&)@(6 literal 0 HcmV?d00001 diff --git a/figs/img112.png b/figs/img112.png new file mode 100644 index 0000000000000000000000000000000000000000..2f806bebb16bc3c193419128c9d18632c85ddcac GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^8Xz_cGXn!-+%`sEAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlJD_!aSW-Llbqndmcyh_-ns)57*g|g z9OzipD%v8Yr^Ei5O_8mQJz$wd(@B8?oZ$fq3?@0>8`*dB&tVLTh+$-Vb4D1_x0a1|^onf5{PCYR`={3{#9M3>g?a-paA@8O|vN Px{JZn)z4*}Q$iB}a&BAb literal 0 HcmV?d00001 diff --git a/figs/img113.png b/figs/img113.png new file mode 100644 index 0000000000000000000000000000000000000000..97dbbf340ddf343c9ab47366f38c5a4946349dbe GIT binary patch literal 454 zcmV;%0XhDOP)bA*EUsPr2~uz>qWATgCTYcplb%5CNAA7n8+z4mdriwQqu%BXWFrEDUs{wfk4#%#R_* zMgyiMC2bpz$zJpu?(fi7Vm8%+oK5ZekrAO`BcnI1li>|3Mr5X2q}FO7FpG0nYbR;g~ftddAx@^KF*XbYSV>}Oj32v69gYZz8) wH2l=CztBW_7?>#4gvKyYVe-0k5&k7U0OtcgI_o^fmH+?%07*qoM6N<$f;pJQsQ>@~ literal 0 HcmV?d00001 diff --git a/figs/img114.png b/figs/img114.png new file mode 100644 index 0000000000000000000000000000000000000000..681e3d30186333d2858d206a22b5c1ef1110b99c GIT binary patch literal 755 zcmVGWT*rfoMA7A3f-VPD3|(*W|KCf}T-tgZh;VRUo0s?U z{onWg_wpwJN{C>0B}6=-es4?4GCzlg74V4~QR9w>Ge>F)a0ItLgsdbxLdet$^;t-K z9KQ?&{RM}b3b0AZ!m|0&b&*Ki0c`M$CWlE=w4qp6g^FvXS=}_R|AMAcXghZ!J?IvQ zv62?nwr%h}xnCe?Q6|c#V@iid%!4ju11+p_l;D42Vg1ubG18%X#*0Ylqm5pAk6YZV z4~0EqFQsCjuZc+8FRg@|N7u-S$FtT@5 zz$+8AN}?+26&)pPxQ)!YLQz-gJWd2;fc~brwUAAprIUd!MUh4+DKJVnpLZs&`&6VW z6!&w|AETPiNbzo;>V6}=iLa@=e2jNt$|%kLAQWenMAF;}^~1wllRMvco>K)0R7nPm zbT}_u=M{4kk*AF7PGjNT1`8%tmXxFm|G3i8?dnm z%PYL4#f@L3MV16koLfCc&Ov_X>S#VLj|RAAsLg z5%vu`&G+haFtaKP{2?(?tRsC98T;-YML`VJo;V76_aG l%Rd;);D*+5C8szs_yfx^pKidDBW?fy002ovPDHLkV1g3RS;PPU literal 0 HcmV?d00001 diff --git a/figs/img115.png b/figs/img115.png new file mode 100644 index 0000000000000000000000000000000000000000..325241fad51f86712a450727b7bb77b11a4bfbeb GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#p#JPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3EJ!EiDbG%EiUy?%lgeN=mzT?`~gq@I6q7u_VYZn8D%M4UoKp zr;B4q#hm1Xga=6sjPrPT*6{HZFbG{?H579&6bLae_^`=wiNlQPt&NSjs!rUGS+27S ltYqTY%HU|IU67N&z>vF$!!dj9)&QVc44$rjF6*2UngDqMJ_G;& literal 0 HcmV?d00001 diff --git a/figs/img116.png b/figs/img116.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b0af44a13273102d8bc1508569fe4dd876dd58 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-P!py+HSgfk#0^}G3_=LFr|NnpH%$eoo<)NXW z@7}#LHa0$U=8T}A;Hp)tIyySi($atmU0hu5-o2}&q_lhYZh2Y7sX!sdk|4ie28U-i zK=Q{uT^vIy<|HRDFxIiLrLmbjC}@1hIBNov@OKtAJ9ag;Hr6>@FJ4`2WHdHEk+8!m z&Pj@cVI2#{UdE0_zGx<4dxmn^Rxts#s|s8APwhN%-~g|ig1Ll2O;W?BqIG@y&6I~!VW4bJPLNK-RtyN0{5)eGg#n} zuM^I&(ZrFZeIoM}o;;SBTuKUU9}Yj6$g`g>>8Yrxfr8KVdwbgz`Fx(e30!byag2c)I$ztaD0e0s!4VZ#4h_ literal 0 HcmV?d00001 diff --git a/figs/img117.png b/figs/img117.png new file mode 100644 index 0000000000000000000000000000000000000000..85c13a98d7e92c7b65697c31cd9c64db6b6489b2 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~i!py+HxR`CDK9Hjo;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKP?atx8Kv11fQGak+c-O@6k;q1@(X5gcy z7*a7OIiZ2+-BF%`0|yTrU`^e$IYuKP;X#T6+Zi7no&duQoAxR!Vsz!ad}d~Gnjf=K xkz|CZ1j~V>sRk#V17;O6wVazHnaHq&L8FB$^^VKq7eI3vJYD@<);T3K0RV}EN9zCp literal 0 HcmV?d00001 diff --git a/figs/img118.png b/figs/img118.png new file mode 100644 index 0000000000000000000000000000000000000000..79436640a261c406449adce938cf606f6aae2a64 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!py+HSmSZp0Lak|@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!H$lOw6rv!Di;@*yLay@DJkvVy}NA1W(}YaV@Z%-FoVOh8z6ZP zPZ!6KiaE&%2@imH2E!4aHwlxP86{;H9@JQ&?3W6{Q)$IvFo z^H{v*zysdn4$@`s?GA*To3N{zQ^vVb;Ot)y8wQ3ce0s^3SEwih-NNAM>gTe~DWM4f Dsufef literal 0 HcmV?d00001 diff --git a/figs/img12.png b/figs/img12.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b34f34ec6fa56d87d12aaa158700865e153abf GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^S|BzHGXn!-l=H;`AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlJE6&aSW-LlbqndmXlD#EMS~_)z2v507DVa9Uf`34~7OGnkP6hJEiS*suAqj`_PF= zdX`(5K-Lb1wBlw#<|f^90b3aLI~BaHqVt`;hRx(U^xRamKqw#?owwoz?eQ zS`5s4?li2C(EBy%Xp{0w#nWsd7nvQJ{xVHw>e(;ib1pR?X~xll*^?O=Ha?a+Tzo*k Q73eSqPgg&ebxsLQ0Bw*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAq=2;uumfCpm$E@!egX6AjWXDh@Y%dKeciTExS1X0Di+7*7PFvDAFQ-9~p3m^m61 z*xDN#=Y||EXv%6+m2co+IT)wIpeVpnD6nl&p$MOdh75zFj+$1$+1w*d>kn|O%uZ;S zV8FxV5WYY4L?Vbe^#(&XX1uLE a#mMl1)zUV4nk6V47(8A5T-G@yGywp)KV8!R literal 0 HcmV?d00001 diff --git a/figs/img121.png b/figs/img121.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3f77c2ef39a5d9ce0ab3b9e5efa1329b2b0887 GIT binary patch literal 341 zcmV-b0jmCqP)wzMNj$2shU{ekT z+$=0W(t&{+#>c4=KLF}00KyF*M-+g$8=w$`Xa<-J7+D!v85ov)Sn`n-;tsG63K*&x zkhmKdc4Ol*b1-vo3Md>i$5OvHh?gY^MJt{grPj9-MbI4MelL|VWx71 n)ZI%!7{o(&xeyIQh1LK7kSaaWaxUH200000NkvXXu0mjfs6%}S literal 0 HcmV?d00001 diff --git a/figs/img122.png b/figs/img122.png new file mode 100644 index 0000000000000000000000000000000000000000..b33ce5b657897220701cd4260463698d8dbf4107 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^u0Sly!py+HSXtR42ILq7_=LFr|NnpH%$eoo<)NXW z@7}#LHa0$U=8T}A;Hp)tIyySi($atmU0hu5-o2}&q_lhYZh2Y7sX!sdk|4ie28U-i zK=R8xT^vIy<|HRHG~AUwAR^6d_26Ew)~O>3T3V+hBqRbt%PH0 zCpeBUv6u)kn>8r*98x^e=X6mj#MnURCqt7#SEIB>6hoUqm-OMeH(ayydUC+fiho%e^Mt0v5;@H*IfIJBhF1NJj@94g*uFMh rx$7;FATgDlxrgh7oab ztp~?d6&)Ou6E`q&C5kXJD>JtV$ZQDCkvDAUoZ6Upl3k!BFrk|JfPkB!@q*pK46!Y} zt-%ft892loG&(dh7{n5}NK-^gNcm`q#WB=6n-`w1PSoG*31QvuS^1*hgaB0B!oD8)6~kp!Nia&lNfhBYQGoI7Yv@R KelF{r5}E*VC~xur literal 0 HcmV?d00001 diff --git a/figs/img125.png b/figs/img125.png new file mode 100644 index 0000000000000000000000000000000000000000..c73bb65d98ae5a60d77cf44eb336706e3ead3b58 GIT binary patch literal 331 zcmV-R0kr;!P)(RCt_YV1R(#8^9DB11eBp;NH!^z=R?uDk{nt7#P67z;0n- zF}b<9fdM~Y#3dm>KqEoG!oaWr3}F-l2Lpx>0~l%N(u32_OJ z56g}e+c7W3vZu|vxi%22q$(X~$*ht!jIi#<4ORkEceZbKqy$jBv-&`D-;bkM>PdU*mNFq45_c$TO zK1x7`4|O^=_Q#$7lCk_$-%hnk93Lfh$K5)y8HiSrwO_fU|LKh+mGwmcZ4ai?oQ!NF zY?DrLbt2&J60J?=-b<>d;rSiu5mgH`EfDYy&JHg29uZ}I8YJ8-QO*{V*?;-w|BLtp X^Rv{#x_p5TU~$$qS6i(?lsGY_vJqsk7TL4!%HZQYUo;8q0^HbIs zI%VzOt8j+jz*BrHrF@BpG`4nLy#MK1EAgj`x{dAU6UXgMc}^iGo~wY1-mISEW{2vE# znxp$p6dgBurmq9JF`I4^(d_uc=Ii#&A)VuuoTC;Wm3|R|BC^~-&ZKOyPT~XkX+sC$ z&)fi}=hv!N;Ch`fhr9C79k>-r+eMxd0npu+}Nz%Hypee78gS e>%bXK7e4?CC4CpKM352y0000(Ml$LAJxZpjesZhocAMipi@P6nDsG z9Ajf^ySv-m;fJ)|1Ct4&Em8uX?j*3V++*U{XEDK$G189V&9u9_nHSV7xZAJrX*a*k zjoJr1cKQjdudW#sec#6!@nmPB$`yAzdAnxW4b|VnL|#tU5mUHUEwhW?Va9n0nTt!N fH=W$cgebIs&a90xqJ7nl9JNy-MghC_~n5@j3q&S!3+-1ZlnP@ z!JaOTAr*6y6A~UIH!!faF>o}OGBX=xFid9UiEwCSU_Q*4BgAoFJ7dPHMsA)teLOsG z9RBJ2Ikl1D*`b%$8?G=rv*{}wEo)2^_PDTzLuI=6tU!hjc|50f8_t>yG@ilJ)z4*} HQ$iB}nGZ-% literal 0 HcmV?d00001 diff --git a/figs/img13.png b/figs/img13.png new file mode 100644 index 0000000000000000000000000000000000000000..5b76fcf656fac76efd34129a8a20687a4a6c8676 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^S|BzHGXn!-l=H;`AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl0W6?;uumfCpm$E=^YyzM?h-A1KSTt%oC2jT0SlHKm+3wi5-$=IS-N(E+i);h<^xc z=*UaB@uBgdV~t?T*$W>U6dQSclUbRYtqvEl3ryzMn7)7^h+~W7npWL~8O$wv%b3^C zaAXSL<(|MC^7(--GxKe|ur^zsi+oIpGu|~a9b;W5-!Nr^w@$O|X{{L=7Y;CO=>BIQ z!^Iadka@tBpz*-=kidZt-HBp{ cbN$#D=1kVza!`9IKhReUp00i_>zopr0BzfQZvX%Q literal 0 HcmV?d00001 diff --git a/figs/img130.png b/figs/img130.png new file mode 100644 index 0000000000000000000000000000000000000000..cceae99f957e4254cd5ebfbdcf80caa97130f4a0 GIT binary patch literal 475 zcmV<10VMv3P)9LZU@QR)V|b=s6R z^|CS{br&sN%?e0o>|AX_AkmDQtW!I(RfcwNpd* z7?@-e^hc82wIbo$x`f=6V3pN0`oqx1$i+PWH)!lpPn#=VZe8RaSbTHwq~P)x(tmAuv?j`yBQH{&J|UzXBm%yM_(K{#lAvW6;$@ zuTY*7Z4T#gw}{VbsnG`?EHwj4Vsz!x7z?68`QRknq%_C+zaeLPs}hVf^in1Z&B*Wl z`6>S;SXeAuB{HK4>7>gPgwD>;Ef!)mbYmm}rb2xT+bC+MYL&na_Sm@N3$3;B3juWUOl9i!r8_sywM=6CL|zmi1hIz;49`ALmMS~f2U>iK-`O(Dr#==P4baaaV7 zhl;yv?D+JwXn@kaWoGFfO^a=g=Y*2pi0KK3b&jwF(n|(hj>#a{0 zm{2nJ)t~zz@0~O2(kZQHxLQertFnGOggVV?oG$U3u;P}iJvo~+Zt*u{=SOaePt!5} aPkaMAh;FKD#V|bp0000XP!Rs|lKx0jlTOZ|h?|(*{@Z81yRK*cOoFKYdi_D zBm9Zf*-iipmo!Waj_W$E44VeV%JKRa-TyFG#(7i&TRUNsF+`AEYeaN?B!GPlyUDmQ z#|k`V1A?f*$jw1d)~iAOlW}m)Plz1`_JUNz9C%1h4C5a11+QQg0#pJw;lS)x8^$x7 v_X`9CkC4FWBEzQyMmQ|n?D3X;15Et_4Kq4Lfn*C600000NkvXXu0mjf5y!&j literal 0 HcmV?d00001 diff --git a/figs/img133.png b/figs/img133.png new file mode 100644 index 0000000000000000000000000000000000000000..432cafb2712563c49a1c4ae9d692912991764e2a GIT binary patch literal 728 zcmV;}0w?{6P)aPGq@8Y~%|6fT^!q!B&WJaNebGE9(UnTf1FQA=ujZ-emISe%-B{RemsU-h1=r z&6}AwZ-5d!m+6RF1J+0Cn&{%xXx^wR&WC8iZ0o1@k--j$gi5HX-t59HS=Df+&@7;% z__~oswgZUFghRZ@OiN1?-e=etQe-N40hg^GsCaLkZN&eMF6i2NwffS_v#G^$n{h!a zXu9tGZF!Ts&~|fG7jmEG^zDE2#Ds&dPuMRTu?AGBKfGok)(xz5b;&TTK6;UJNPar z_xx0`6Crfq5qF!#1|{4haJrbhbgV%x=E9(n)&~toEVdvMRAypJKjPdPjys&f(RBH(vVL_#z+aBK)@{4sv(_AYx-2C;hw~(LWPxZor%bVLE&Fp5npic*;~}8hC70U z-^Y?)jE&ue!xL!14-f0I>`c&}fccr=hv&#WTwCZ;m5y!DmX)wQ$CN)DE_C|$=S8*l zVsEBP8=992^ZqK<53t@=p3?LAi6^rEbm%4uDqH?n{`A(QU^so^vjCVl>Cur(S~pZh z2l{?j1tnv!x(|b7;4*Oc4p$W+1^s1Es4)5)BCpK+=+??{UlO^?d~Zz||7Jnh%%?aW z%7wa|VCOF|{e~^>%<;TyoyODMy;*8~U#TBQuTSi&LWK(d1AhQBR%;o2BPw420000< KMNUMnLSTZ@&0>%M literal 0 HcmV?d00001 diff --git a/figs/img134.png b/figs/img134.png new file mode 100644 index 0000000000000000000000000000000000000000..f8920ff1a777b714650d04bbd79e96c321834f04 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^W*{~TGXn!-`o#@mK#oCxPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3ELKqoX4&Ee)v9#l_|B-MdOkO1pROmX}qW3KU{23GxeOaCmkD zB)`DZ#WAE}PI7_+dku%0amS4U24~L4%xrpgV(e^f><;IuSb2W_P|{HDN)?{qlfb+& zvO!J$(a`{J29aEbiCjEB`8&BJByR8sImE=X#XVzID7UNNeiWCGkf_N}$a+X&)(o#1 zhO(}*2PS@*kjmV1_z8o`6p3li?NTCG9&L_KV7eK-SDHnuVGS>jPQRqY4#%R+5_!dk jzBEdD=`8A#ZrsIqtVv!|)2pii=vD?#S3j3^P616GKrq0YtC@@grnW?mc`= zyV-UT;b=@?zz~Ze#=L>Sfx!h+?FL2$RVdRN=#l`g5{NJ-P&otyd;kRu$l>NZ`xzK^ z!gMBpgwq%pxR^kJ1_uHl;fqLdz)-z=D+40~)DX4`WZSDZ1aR+R-9ow-k$tvZfv_SL zAifD=FeMOH401ZiOuy|Dh*HeOz@UMaIG8?s1qK9zx-|oXJFv`7=AG@0088KIg#e6cm4nX002ovPDHLkV1nm-qLBG^#H7Jvv=5FxODfe;XY8@Pdi;RBFj zW?(o#P#1Qd z0W84Hpb)?fqW9$NZ~+Q8{`)dgfe>jDOr)s;XRA}Z>@!0-uKo*R_j_#Z%h&9wkX z_@K!HQ|SW+J}~b$P&>m4Wcf)TVj?hp6ca$I9i$t0K#c0$Ko9_AcuxSuTLJ^m1h8_6 z%}N&>(9CDwz54*veju>k!+<7_LSq1>1`x@pflGb}0RUfmF;P$gLZkoy002ovPDHLk FV1j1Fo5278 literal 0 HcmV?d00001 diff --git a/figs/img138.png b/figs/img138.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef03e27dd9f5d3bb2682ab9b4bdc790ba0f1afe GIT binary patch literal 5097 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 N!PC{xWt~$(69CTXN#+0m literal 0 HcmV?d00001 diff --git a/figs/img140.png b/figs/img140.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca3189eeb23384843d8fd28675e302d9140d83d GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^njkg{GXn$T#*(aJAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl5g{LaSW-LlbqndDEwdz3maQriliNzngOrS9cJ;TS`0!_1*$weI($4=cW*Z`*kqW% ze2?QZvz>u~h)u)Iqw5P84~Zls-1yL#`28I(PmjYqIhPGp%wd-e7%#W4XPU9-je~Kc z$p8CH6U0}QGdnVP%-PB4vdQd&l6G2)#DTZFSv)7?GM#2(V|cMj@=KB4f<&N;7(8A5 KT-G@yGywp&j9d=@ literal 0 HcmV?d00001 diff --git a/figs/img141.png b/figs/img141.png new file mode 100644 index 0000000000000000000000000000000000000000..a7a8adba2109f69d70bcdad3289eea44862a916f GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT~Hu;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0LicSba4!+n3J5)z?jKuv6-=BXSwr@J9iSgE=J`sGpjxL#v06|(9~)D{Q%>F0JX!6 zI$9GM52>;J<5VzWP&st8;JrEXVYZxW0_;1?3l8Vn9bgf^SHRdilR=5k(B`T2_TF^n z8m`*4qqjrp*c)$a*F_nw@tVc?ah*$iYdc)I$ztaD0e0syJ% Bay$S4 literal 0 HcmV?d00001 diff --git a/figs/img142.png b/figs/img142.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4897661e7cbdcedff1e4dbeab17e19a978fc59 GIT binary patch literal 533 zcmV+w0_y#VP)sbb-r0y5nQN%!q}gCF7qp{2M*KS3Yrw*ZIEL%^V~TrKT*3MDl2$jewCsey&l&i^8`R~NG62`G*DiEP6@ov=hp|9yWEp8(&`|!1Z z!nyl>meXkBm<+mU!h8ciSL|9JW>YBAr+Bl19a1k zx$;~8C@7nzc)|s3_l|B}CJK{h%|3+iiLpqfl96h|1GX~;IZd|$)usb)B(p+1Qy2SK z3y_&ff~(5!GF~P&9-^)-^>htARK)d2cBorOPq^b95Zz6!?^JwbU8FkKQ0PUkwfp$7 zO~Qs!vyO__cu1^w6j5_?F5WiPH798-+h3HKa+GWeJ$~7>JFKnSaS@oDl`Q|a^S|*8 Xl6zH2oGUYr00000NkvXXu0mjfhZXHb literal 0 HcmV?d00001 diff --git a/figs/img143.png b/figs/img143.png new file mode 100644 index 0000000000000000000000000000000000000000..f6922edc7c1131553558cae6572c058620f86778 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4zdz`*$Z(8-%Xj&6WYi0l9V|7XseSzcZq8XEfU z-8*ArV?jZ|RjXEYbabSpr2$pBxVYTCdsj(GY4`5k(+wh{fkKQWL4Lsu4$p3Y- zLn`JZCnP*bOGpS{NMc*Y!p2c?;J|^`45|7S3`$870SuQ}7O=50va#7Kq#tEvoAcnO nA)Bv(@|;B8BNop!nRpnCPH@XN-|21u8qVP9>gTe~DWM4ft3f{t literal 0 HcmV?d00001 diff --git a/figs/img144.png b/figs/img144.png new file mode 100644 index 0000000000000000000000000000000000000000..b0518cbbf1d86b9ac0ead438b9aaea0e0373c857 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA$!py+Hn6&lZVj#yLz$e7@|Ns9pXU;4yFAoh3 zefRF2v9a-)GiL+^1y`+F)zQ(BmX-!o=;GpX_wHRKC8gcFcgxEvP6Y}vmIV0)GdMiE z0g|8T>EaktF()~}ftf3Tg+<(fg?*QafKNlWQPMb^YO*iAb?E-WpgQu&X%Q~loCIA~tUrYc1 literal 0 HcmV?d00001 diff --git a/figs/img145.png b/figs/img145.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bf9a802c2b713fbaea221e80f1dc9990b5a44e GIT binary patch literal 501 zcmVDu$R>sK8UzdNMzPa_8q4+8Q1_}rQ z03!evDEOuQ27A_)^eRE18&-B65Go6Rn9T=J&3|vdKdDq*yLFOum7b;BRo5>Y!c8*h zCij8ny^(-ssy{|X2mOf64-=3mUKprhtatjrOMj1Z!0Uj_Lb?2q0}i^Jvv$C49v(p; z7{TT~`fYQ%OvzcHtM$(!(3m5XfUxVc5V!=;LNns>S!(I}O!3Q{e0gmO?YKk~@?0zM zhbH+;-TnKNBiZ~TMh8`lF-FqenA5wY*Q+Gyet9-*`$>-QJ4)`#t z+lbtfatqi-kKL9LNWcp#YrdR=Jsd5Yh#596h2B6O<~us%xcFH;jSVSRAr z#zo~3H5Yo0geo>E3|$;;yF#^uT@zg6Y%4n({pair7_wY|>H@3^ P00000NkvXXu0mjfU*qR_ literal 0 HcmV?d00001 diff --git a/figs/img147.png b/figs/img147.png new file mode 100644 index 0000000000000000000000000000000000000000..d63a4c58057305421a63919ae4a70cb9aab7da6a GIT binary patch literal 379 zcmV->0fhdEP)^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H`AI}URCt`NQN4=7KoI`27foa@KaUWE>nwbP^j?wT+Jn4__9Dd6 zLa-JNwzw`LYi)6P1bds@6Xa$m20ern(GO+w;b9nU6GQ}2r z&|u6X%C&hB(7xxKF04%Sb;vnjN{29!#Q0*vxf1Sif0)rSZ4puC&nLFh?FKgIB%evd`iP|co^+}U?f z?fV1p(x)ycN95wCwQ7tNLY5?)&^2x~oxowaY$fdKvSvjumFi=U$VBNr$aG`iXj=Xv z*ez*LitwGX0CEonUiXc|0x|8_)=S7i*=+(-@UMY5MZ&&SaF!n>S&O4%Tnf_?ypq8_&D4f1B_0z+GG@@s^x(fes{f@e9x tN(!&qUD`$S2gv$8;1>IsXY@ZFiyL_1avDhOE=>Rc002ovPDHLkV1fq{9Gn0E literal 0 HcmV?d00001 diff --git a/figs/img149.png b/figs/img149.png new file mode 100644 index 0000000000000000000000000000000000000000..45c78c59698120473e1e624cec2db7e23c70b080 GIT binary patch literal 589 zcmV-T0d z(+YAtAEN{4VWT0pgXRS5S3pz>V~?uPTwfp_S&9B2z~<@wJ}hZ0cROjD#BL!>luNxv zesxCZ0yLFgNf4*XLL03cOlAQsO?}Ws23q;l>}d3LBr|Asv0Af;6q=+? z+p!<*Xim`|PauoILoO%KA%*m3<%^*`tX_5ru b@j2cAxk+YiGEdnD00000NkvXXu0mjfoZSSi literal 0 HcmV?d00001 diff --git a/figs/img15.png b/figs/img15.png new file mode 100644 index 0000000000000000000000000000000000000000..c09c8dd78260b01099b3dbf99e100bc15e41ca79 GIT binary patch literal 416 zcmV;R0bl-!P)K=!P&M&dw&#>9DZ45sKW||7m(@`G>(JljTpM zPYQZ62r001Ba0{{R4NGZ)p0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*I(n&-?RCt{2R544#KotIriEVmq+C>mt4slTt`V)e)gOiI(ccFv$ z1Ns9LI=Q&`2ZZ1tXhe&Hn^;#7$q#Ud6eovz?;lce20FWqTn0i5NYh_M6`dNK ze#C=1g__LS2GhcVprtbCl}9G)B|b46>{k($cZK1TviUaREb+}%5GyCTuRlaYp|6MD zSJq`B=%L}@ZKlb!1~qKOU}GWz>7ra~p~afAqO88bO4bZj(Cw}oztT5ZpEXvOM#5)} z$b2-*nvx1LjZM6B!x3c}Y_c92ki}s@r=C7lvoh1&?ssH!gQKK74rLMKWQVKNO{}i83GlCp&b)(Y&0000SHp`)fVjzFQa;;aSuoEGL zbt-$eve6=yAcv4z2n>e^I*abv9^z^#BC)YK!Icyi7W(GR?2p7dP!QqZzL4R~n{VEG z^WK|TpoK&a4*hC4I2zK65tsNpfuu8^W3C}wAYkbX2?Fjhmj4nn8>Tib!zStg z1;;7Mia{YsX~nSkNACX!vWK*fZn3oUQV;LwpCc;pturc3s15|udRM}EB>dECu+@>h z5?$Qx;Z~?q-`MhiaVOd_3R$~htQ~f+sW`bPTJn-d&RD-zP=dQU!G_Y|yv!-fxsNe! zhDH$w@cR=?tf7>2L+V#Z7pX_xq7}Lb5G`*K3)bk~_l<%&Yo=8qvHoRc=?Qc-9-991 zbR^M^5QFhuQp6krk>2RFBsU6%dLP9CH>NNr? z)%K0&AJ&(**BXf%MoC=D3Qcz}sYPBhB%GX|(kcc%Fi3oJJ-1# zN3|ti;w=eJadwXNo1?KZyw$}jCfq|m(sVoq->6k>2`__!g&zq*^{lqhojB$=8sWeS6HAsbYFcr z&o1k07*qoM6N<$f)4>gGynhq literal 0 HcmV?d00001 diff --git a/figs/img152.png b/figs/img152.png new file mode 100644 index 0000000000000000000000000000000000000000..90e01e0ddc373a4e6c4f4a564ac36d5d94be5171 GIT binary patch literal 600 zcmV-e0;m0nP)K~#90?Uvn@n=lZCFYbUX0hhqOn0-SRy&ZVdC>|iq=XHFa z^aTD=4SfmbhJo@jHjI;vHZv*9vP{w?%MNEr-+xGwE~ob_`#2w@%W2Tuj%#O_3K;s| z7yw&_i67dxUhg4SK5VZ^9|~v%bg@U}f#Wa>x^QT{V$(>HUl8_3<+jY7$z>)sk)!Dn zS6p}j3rWp&b1_a|EXHLTz*F0(mDsGzI9CObhhb_5J7r=sza}SMY1QHvL>iqcd^fRa zlCc`T0oqC`DjPo`8ow52t$OLX_eE}6Y73NwA0GU>EN4O++6ch=PNI_ynQ2s0bN+03Sin zRn4r+38I1sbrpmng2;))*(HMykiAPl>FjscOSB~g1qX-zAm6{c`||y}14>+IZlDrw zwVA;6xeO*40~0YHyLTMYZ*lwgS~a*jNI#?v~#CK6>tyqri^ zMnEu0mzjO|Qrn?#x|Vo4Msfo4uJFjq@c$ozN~?p|g_UN0p{^Dy3}K714H^U0HKl`D z9}yV!8!^z5b}CVySW7jDgP7Vuujx45x(K&*402IbA)U!g$ z$3{K@)mwD2@s#3(`mi8wllJhkBZPPyJ+q|hP2DuMh;b|rtxmz{$4Y7+EE2V(cnp{3 zgKgsm>Opufw+D*OpDJc1*e@f?uOx+c5A*~lsld9t^J}{0ENphlXy=p#IHdXL>R&6o z(P#IAfyM5fOAl&xOm&!MtMU5$LSdf`<#I{s?@FQOu8b7HO|+nH`p;nM$Lja5+yqtl Y1V-jbcV2;KN&o-=07*qoM6N<$f`&ux>i_@% literal 0 HcmV?d00001 diff --git a/figs/img154.png b/figs/img154.png new file mode 100644 index 0000000000000000000000000000000000000000..889bb93b7d85565dd945fb5de602e35043294d3e GIT binary patch literal 540 zcmV+%0^|LOP)$|^#7EdoM71a;;fd2vajsq(?j%+9y7JG-;HKp%xr zClQNU5@HGsqyg>qQHQ21ebShTD4`x0IUoV8zetgVj;xCKf5w6@HJBa_3+M(;Jwwat zStc6}9NHKR1mcsFxzCK1f~gs96a%11tV)l9?N7N+}z{qZ93(f@^sMED4t?&K<0!n?tD- zCuUv8l&d$V$XyTYCpzZ`=yZV9gZnnBV;N7+J=*42i{- zKc54Q-qt#zM@q;WO!rEG$HF$J(V-thy(vZd88}n#tK_^G*-L}Ae}Y)FBSUuM2gG12 e)U)}L<_^E%n^sS4k6yw600000000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*KE=fc|RCt{2R?TbFKotLFo9s3_-E0u`;w5-#Z53Akf^F$Z!RDkO z3PF07^(-xW^tin!=p}!EhfrIk24t_&g9|!qV7G9e+I9Jlc)k^Z0$7RRt0V0C0lwX-h5)X9zf0pd6!U#pbs zp6{X0y*>s4SNiTQQ|6AOZ;mtwvwE{gNx>vXTez-#i%L`OmOOsCeKBt(eC}mC)O+K2 z0X<{$j}kPc0+o7zSDF{Dy}n&-w_xORw!SB#o=7?)=V4xemY&E{8cCb6xK%?X;&nBv zO3|Te$O6%qIQPMAMp4vRCxA!sE{tWW#l#WDmcytN`?>x)-R{`uu_kDDDc*z--Ke$0 z`xH?UFr+RM)ozfnzUrJvNl=e8z-+uA8_NoO%T(d{iG?+u3&xAxqB73*49nCJuVK(? z>)d)de4;YX_Z&2eG6VJ0%}#4m+yQAo7bQi00kT8Oe3njlN>lnbwC~ZdC8jG?=}Ceu zJnzBuss?uD!{$yddr8B+4DJR!4F%CVZdDerBHu|>yDHPg3Ma~^-_%mVEiOF-3xI>y z9=;bXRyG&7pt-*YC6J!Y`NJXc&+Xqrw-PE|Nu;u8fk92-?rtEulYldK@Pk9P-TOgd zQ?#uyHaO!Fo@t+Qyo}a_@%TTK_LKP$NIBV_!k~Vfb|S2tS3nJ~o1{!Fcx$Hy8&eww z>)RpcM%V~c&zGKe2!?l7^ON`(sd$!J8V2T`!r=b|H(k6_e(1w%<_+djG`}nWPYMvt zuTLjjaN+9hp%O^U2YVZWe@Oc&ZcfsBiB!%u$Cw|$c}p1G97OxL{6< z{R2<)e^wmhV@(zW8D6$5`e}&2-%%ClB!S@D6*ke8ifSnZXNI+YrZlDhhJFDy%()QB S(|pJP0000^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*I14%?dRCt`NkTFifKoCWro!HLeICg`CM3a`z2cWQ0Q>3SHPeZ{0 zasY~O1C9_;Ai)TU6QDf+NbaF9HAR@sVvz<51-`U9fB$~X{#j52$&{awb!6FNf_TA* z6#)RHw+}0QGmk7IF25Wf_%GSL#qRDD%*FU{s z<)T*`Ppdq2lx1AZgW`nN_nB_x$#o6?9&J}ViO2(2%4Vnc&%>`!gKNzf>S4cvBL-eQ zvojsBW>0Ui-EXOy=*WjE%yk9wD$+1k=~CVf^o#26AlYNb j*4z0)>#O_5W@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaFhkx;TbZ%t=mQV9sM(lfXR3A&hm&4s!#Mjqi@F>r{BqHY38J?;bA`W5G5f7nTgE z_C?H_q?+40dAQ4zx(y6eCL~M0Okg%@XFn4CiSgX}HVNOU_rxVaaZnTbGa;J3||~%V_UY1Ek`ImQ8SPEaCDnYj@AxAEi;FRHD6!N{;=A^ zAmzm2g^w7U%{vZ$Yj}8*^^I0gxqf1RenNs+LWj45#)W%(+1D|#NQf3#h;e*Kk&-Ji czM{a&(3N9s)u{a>0O%_QPgg&ebxsLQ0B{0#5C8xG literal 0 HcmV?d00001 diff --git a/figs/img158.png b/figs/img158.png new file mode 100644 index 0000000000000000000000000000000000000000..087859682aa34419e12e320d1fdf374626d25160 GIT binary patch literal 579 zcmV-J0=)f+P)^rq43mBj@}c*EFdf+&#(m zXt$(RY7R=ss`D=W${dN79AE?aSiS$zwlnJIKE~7yze;2sC5l21QMnST)x4z!nU(TI zWlX(;K^XGOfysM<3iocpJfcsV&P5Lf(bO;Wvau8gwJRElNR9GZC8`#wx1qeG_EENO z*Rz>R{FUeOlE*WHS$8JS5CuO3mXUm=ickK7RX(qvQhrh;M2zaPInX Rgj4_k002ovPDHLkV1n>G2x$NS literal 0 HcmV?d00001 diff --git a/figs/img159.png b/figs/img159.png new file mode 100644 index 0000000000000000000000000000000000000000..7658f2b7018bde59027fe30d70db390400fda61f GIT binary patch literal 1117 zcmV-j1fu(iP)(aRS^E>P4~{u_Dpvla+c>3h`13JZz4!%4dk#M z`V<5~8ZWs7S;;9034Qb+VRDI}m%+cF6V?RNAr8btK+pjXUOY6OBnx3cgC~Df)qDM8 zdS*02Fo#U>ru%jE_r9vGS5@5utdta+bSN~R=H<9XXZ5;8@h558=2i%Sgy+fA(kNia z=Mm3|%;q(S8U7nh%vls>ma8|SBU%9K1TI5sJV zx3J5B0r@X`kb<8q&tBrkl4qk?=4R;SeqsWE4NFE-jWlFiJTgSgRbaEzd&ZCWJYYJWEgQIr*EO~C2X$mA?7v1E@=u}&cC!e z2iYGAkzz;FOEm#~7oxJ5{_9vrrf$L97(uRCb~Gs8b zUN_$(bPE>qHZvqJ`wdRu7>&&C)Vd`_(I|kF8;OrPuRyJ30@H3JVLG)gwF{(k`f^#p zDEr+ZsHwgamAThB1*xUX`9_K)&$CL0-&MQ5%3AWNWevK>JY$FI?IwzZTnLMUOu8JT zaEy+l;0QR+(IKkIF2P*0lnW`?OfwfMDq|HFpt9VEVjPzss7l9o$MdC1u(B+Dv6ZQ2 ztO^cJ5^B^nXms3e4&=;^B+9~03#?~rk{v3W$5s3KA_@tgZswx1?BUbnogbxJ~*m?#M%V3AXN?+eILwcFMwD-T4U1VKz`L+-;~!_yG7-M&*=q z;^&ko8b(iyH+03OCb+_O_oE>0elCk5cV>LaYNssBIm8nL@4dSOwuLtC4Y@bl#zUd? z8cv-=Z|WJNhAmKfkXCG7)F1O?8-E7n(oc9@ETeSF!jujQa^?I2>~c;Lw{XV9VGzsr zrQ2}o5TEf(j2bpCdQ!7(9DO>)_n+hz~v zaI}(`cOFv+Zpf&d`tYkOOd&=Mo4Wr?&E^bW2Yxb)gQKr8G^v5VWK_A*gq@)`cN^x| z#A@Qc%V#wGar831*k(M$h8&|GbV*^@h8I=XG|KW?Jyr7g)UW>y;%Q*rRX8&pq49k- jPw}rt*Rqzi{BQC%vUMPeL&PAb00000NkvXXu0mjfYEcu# literal 0 HcmV?d00001 diff --git a/figs/img16.png b/figs/img16.png new file mode 100644 index 0000000000000000000000000000000000000000..e715e726c4c5d4715a69aa751f45ce33a01f8147 GIT binary patch literal 772 zcmV+f1N;1mP)001Ba0{{R4Piqrg0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*Jf=NU{RCt{2R=bPTKpg%hn`E<_>}|NhPMEtBRyd2j!hW%}a65}b zSp-{6XR(Ok(0UP&gC*_WUq><5|r9^Y@i zdF271!cA!Fso`2+0m2pe6%jIowj4Le<%}5NLy9v<%2e~RjX@6l1^8k}1*qeeE*ni# z%9DAug51F@-!B%_OTg0Wgn2KkF8;qjA7Wv>I4`5)d}{{n8vr}?vK>A-!y+Ac7*jg| zCws`tJmQS;F*hZ+Tc2{%q>W{pxsTGYWex5ZZcMX#SKS?xH0+T4RkrgR3W`**%gXro<6ZouZU%SA} zPSn_fZ`5jHf@7B5Aa80Kx(9w_qETIYOu1z5;rgT?YqgyW-om#0&Z8{8#humhAfAQ05b~~C!)?@QGYSviezr-)f6^>X!%f%J|0000Nf;h@6duHixav+;JeXf?FKc0sla-5aF7D*6Mq2CL!+b;ejkz+_y8soAGPTyf|RpNjS)_l_S!M33O!>3&!bo+`W z;BFX@s_@wrBZ2M2#@>6)O(K0w9mvhdyOINvuwuDD1@0p5#e36`H3TS#s9bf(2r23%X7MDyWj z!KE){RKR=lPQGGf;_as$;Jb`2%`)xWhx=0`Q%AdkVMWZFS(5v&<)Hv~?bA^&O^=q` z-ePB_xCxCT9O4xl7w|J_A05ph-#FDv)2HEqIG?dUceID^A7k8L8&~%@NT&LBOecRS zqf67L-4oiK=OlMnI9m2uBc2O&eEhLBku*HSiv`+^*?vd+g_b75SBvIu_rKP|5-r3k d+8O>^{0133hae3MDZc;!002ovPDHLkV1maNM=}5a literal 0 HcmV?d00001 diff --git a/figs/img161.png b/figs/img161.png new file mode 100644 index 0000000000000000000000000000000000000000..32140661dd6acdfba43dec8cfc7ee1bbc3da9caf GIT binary patch literal 542 zcmV+(0^$9MP)DPG=qZR5^!>hyF=;hkjMnMz@ zw<3tE4)q`S6QYBlhvF}g`~ZhcE;>Y4hkCC`)22<@4q6cUK_0n#-+jm3%ew$M7?_P4 z%}L*af?W#;CpC3|1l@Efnj=Lyth~7oTnsHva2m#4GM*B008eP@)BzqTePP=Aw zbGDN$rD*U|oyu6^ufRw9LPU?aVx!f5c&$45q1N!GM5mj~uUzvf%N)Db1h!Ban~X(c za%_{=gRsS)qK_Jj@d$0WQ$+T@I!>X;4to6w@!f<)_rg^wqE>7*DiTre#8qSwjX&-U zc6kLN9qt=(1CC%F7KljnPCV)BtZ+#m>wKmBQ4yKwc_e5X%G>1TfNy5h-i%%rAgfSL g|4RC(bBX_sA1MWBhGKX5NdN!<07*qoM6N<$f_um7^8f$< literal 0 HcmV?d00001 diff --git a/figs/img162.png b/figs/img162.png new file mode 100644 index 0000000000000000000000000000000000000000..fb23886c42ed23293c0b492c5f4df289a6fe7413 GIT binary patch literal 566 zcmV-60?GY}P)hYvwA!UD$tUu>j=iSU3uwL1*t&1*k4AOFC{_!#K=OS!`0Bj zR$1bfCeVp|7WXj)U6rn|%Y>1)h?(}I$YTbe@hww6utjVVy(T5VDZgFEVWH15Oyr3^ zkfNF{j8Pt+659%CHLi}umF7F=PUy2mWa9WoCgh1PRfkS@u-5kq)LUi2xpY_Kwnuo6 z;wIA25dV%EAZ-w{X*~3FWUR=y26hKaz1Vn!5}kAdTtLj-TXvdHgULp72t7ChzxE1E z&(N`X-Pvg>jt@NeT3Z;4HHb7EQk^7n8ENvcE$bSk7f8Wm3vSOr!T?kfxmV1Z(g`FsolC?>K$0EI7R z+zb)G3Gs~+P6bL(+5nrRQ=JCGHU1m13{8F}1z^x|BgwNc z#Di&W2hIhc;O2Jl2L?7!fPFU*Yy~nn4uBP~y`Fx7;XKf!eF+Q<(~wMHeeqfWY!a^# q1H&DN7(Y^~L<72D5?4+b@&Ev+OfSScf-TVi0000;HD literal 0 HcmV?d00001 diff --git a/figs/img164.png b/figs/img164.png new file mode 100644 index 0000000000000000000000000000000000000000..5e28bdd767c65696c9c8de7fc47a5a1fa5523965 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^nm{be!py+HxM@+w3m``~z$e7@|Ns9pXU;4yFAoh3 zefRF2v9a-)GiL+^1y`+Fm6nzURORC0a`*0CB_*ZZyLY!QJNO;_0a z-_yl0q+(8T0s~VTTSx&z@A?A=4xDQcmoPAhVVK>rZmPwBLk9x3W+_HSePmd$c-4Y4 ztUNq14ySH2o@03wx>~GZrVmHpid&3K{((DVG(?`iDq;2sWWUB9amA=4*;sK~xu8&Z k_SGzr+dEE{o9i+#97-2_GU>(xN1)XVp00i_>zopr058W_$p8QV literal 0 HcmV?d00001 diff --git a/figs/img165.png b/figs/img165.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcfcb279455e1709f47d895d2e4840946e6eefc GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^(m*W7!py+H7-8Vy4CELD_=LFr|NnpH%$eoo<)NXW z@7}#LHa0$U=8T}A;Hp)tIyySi($atmU0hu5-o2}&q_lhYZh2Y7sX!sdk|4ie28U-i zK=QqwE{-7;bCMGh5+1NW;^pCJIFpuifPq!v5kp5n0fSJEw87K^j%HUx(%97e7Pv}B zm}~qwuvmt9hhruu$5D<_K7IaXrW04W?j#&9%H1$8fnj3e{l5(&p9`5;MdY5>g`D&~ zVWZx5n1|=l?sDfV8(#j8KYZZ82ibHXR)#&k5*trF SX_5pwjKR~@&t;ucLK6UWd1I^q literal 0 HcmV?d00001 diff --git a/figs/img166.png b/figs/img166.png new file mode 100644 index 0000000000000000000000000000000000000000..ffef2a64e4b3423954961ae499d35b89ee992a01 GIT binary patch literal 453 zcmV;$0XqJPP)Tyy^A`gWmX}}+ri~V~ zGGt91{snTsj!9L>f(SK}LXk5!9$WE#NaM;?jw&(?a`3vB zs7}%S^^X1!Pn`2xoRT&=ynb%^Zlcf5Ikjrj$94+r8i5^sOvH#Lm|=_jAPjq?C%%Uj z*@2G~A-~e51GORf>%qO0`y#tXV;#UP=dXi@;_-$|V-ky(oEPYm@r1waNJo0qwpiBQ v70fHeEt9i*c4t%k%IwlMD^p-!iGPSs0g*w=GU5q000000NkvXXu0mjf9y7vo literal 0 HcmV?d00001 diff --git a/figs/img167.png b/figs/img167.png new file mode 100644 index 0000000000000000000000000000000000000000..0f322d4f76e4919d5f54188ade3e259ecd46cd06 GIT binary patch literal 374 zcmV-+0g3*JP)2hd~zeum!*AhHJ(uxh71CvB!xEXds_1=Kc0uyNOYU%(^ zD9uuaA;lKr=Kx_P?!b^_XHYu;W-xv@gdxezvH+Y&7<3tIfPtrg2wadPGb9B8Ls%Qg zb5H*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKu=mX-!o<>KOU_wHRKC8gcFcegJ)_#P<4SQ6wH%;50s21vfa z)5S5QVoq`b1Ct#aM?pdZ^EFl;o){jF2U0U)4jf=qF%~=|>TqT%Pg>Jd=A}Es)+Rkj zO+3IgLr>v`%^ioNGDhYYV{PUp-YKi2wu&6ux0<2wlF*y9B*sZPg%K{|1{<1JDBn?Y z2;Z=tscC6KV2AzQ3s;(4xqBk`6gs60ON<#9%1cC^{r&yJ0O%G5Pgg&ebxsLQ0QLe~ ARsaA1 literal 0 HcmV?d00001 diff --git a/figs/img169.png b/figs/img169.png new file mode 100644 index 0000000000000000000000000000000000000000..3898a7c467c298ffcffb45a9eafcaf041b0748e5 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#o>`Pl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$c64;4rKJH?xwyF8y?a+lNhvTmpcxAo z_!u5AFgP$U0C@}_fOz%>+*(io3lJXw;sp?HGteZE2os3ZR)7eu{y?N*1Oe+VFvYx; z+kkmd3SeLZQd}UlObi#m%D5ST1nYJOh^x0k4dmXvomy_A z959-(=z-|w-4Itv1BD<#_xl0^2auW!Q~3zwFEC(>-k!jKh;&9EqYcagh6c+4Agu$H z;ZuObE&~J4T81tM5JLuH5AzgW4Tu^Cs(Wc50RTQnCc$JQ{z?D<002ovPDHLkV1f*w BeoO!W literal 0 HcmV?d00001 diff --git a/figs/img170.png b/figs/img170.png new file mode 100644 index 0000000000000000000000000000000000000000..3aed625f255ea2f4df71e07518cd9d95064fdc54 GIT binary patch literal 416 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 literal 0 HcmV?d00001 diff --git a/figs/img174.png b/figs/img174.png new file mode 100644 index 0000000000000000000000000000000000000000..4d02f0d4c6dd03c9023647920d0646934dcc884d GIT binary patch literal 320 zcmV-G0l)r9xI0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*HzDYzuRCt_YV88+t(D)lRFfe?;rVs%h7%*@t6fmq{U|?ZzU}(Uv z7!z1;VBluB0Aw&R0u6vUfqNbUBhaYt2S_yzCt%#lUjSzC?@nNlWdbrbTwwSDr1*gL z@GBf(*Z{H?q+mlVg8`6Y2eI`^71<+~+dIvcowfzG{q_wKzQu6F`doSVhU5vXkel&g$pA;0zRZB%qWod5ty{2+Y2 S-x}Zm0000MG{d)hsCu@$%lx1f~Zl%OfWQ-V^0w*;pI zrG%G*WLr{Z5MTlX!D9bO5=DNJqR0kixZ77JHEMQQgRNgC<#Rp;l*#$}h^;RCJ5^607ZaNeB@$w4-ekQ@P|6+A46r3y(4 zKo7S$e_LE1+Ivac)8$*~xY_p5VGztMBbXz+mB9c5xRj(GoFoK3I68nKq|`;U11sS1 z066gAHG;6RkOaBT4*%}tGl}>DrLT7{zV6fYiv?m5yCS_qmE!ogOk463lT9X`B}wPp z>S-@6`+P9D-~hj3r9i#7bs3-+5U-ITpsaFchRCweNH z@@qApKEUrn_x^7sE()`*%>2_|8PEWJkfeOhElzWJM*zXL#?IRav>IWx(ZXe-QT@_x zGT#QE&#gL7UpXzn_CUKPTOMnnceV9w8K67HhypO?M(qkiWVV*r_LOc;<6%ny-?75c zKC6hBvjB!bD0u*^Hd{x>S&XK31^Vcwm6=)-fGNv+M%0X~1 zBmwBzfha>770G)flfc*D*QC4m+r-rz#~l~oT&yqSa@A0EfaEd{34*6i9*zy9tGjL^ zgnxe9d&J}FLtfPChxD46+HW(@!_zQGsi))Q3%KY2WFfAiQb-ar;GX7cnxl*Kav4cBEJ7!A3jgj2SX& z_LOEExhzNCe@k$baLyNJ3H(~8fOGH&d~{UMQICmx`4)aC9|s=1n&cIhDZdqf0pF!CO=@rmE6Z4!8@00%vBbZW zlm9!z9U9%uxI>$}84C@^lce@=XeGVv^sU#I9nQ7!Yd(29{9Kr4Rbnkr08ub@yUl{# zDc_mV8!0bm2u|lM_h^gKod_`iy$cBXguT7NDOI`&nzhbmlIixnKw>ekH8m)xQ5_ r?>=(q0+%Gr@aU5X4-E+q4GF&hY0Df##7&d~00000NkvXXu0mjf=#w3d literal 0 HcmV?d00001 diff --git a/figs/img177.png b/figs/img177.png new file mode 100644 index 0000000000000000000000000000000000000000..790d3b279003daa9e5c46c460749174e5a3d5c2b GIT binary patch literal 344 zcmV-e0jK_nP)f@Bf#;kld3n@Au*3v9nw1&-Kw6cl%Z7w5Gau^? z=A-7%RSYqcDZPX=;KB&nF6vF1Z1s+EnwtW%XRK#+#454f;!;UWAABXb^Ww+>hPxHa qm1HX&I6WIwuSv6(v$KD1`KAZ6P9v-KTD4990000*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl5g>JaSW-Llbpc7RL90qkkG(Mz%E#s~I{EvmeRk637W#@qa#k)0dyj8#}}t zYD!vyyXdLr}`IMa+O3>g@N*hH+9D~vY+-NWGN>gTe~ HDWM4fn|N9~ literal 0 HcmV?d00001 diff --git a/figs/img179.png b/figs/img179.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd7dfa1620333838b4b18c3ea5a81de89637afa GIT binary patch literal 581 zcmV-L0=oT)P)Z@dM-&vLI0%f`~8ZcQ9pP0S3;#IB`;|tr$R{UTXK{<=y#wxfq}@TY(rLfraK5 zusv7UlF~@Pv_Vq`LZF{?ilfB~Et7}Ly)W-Qfn$MOP)M2`-OzlnmI@zQx5nGF*h^Rb zoVf<*!hTNno1B%?hHZo$bs8H0L%bJvF-&RpI`9#(FT*+n`YI%vvrk*Y(Koj9 z7p>)iNyPgt1h(g^q_^gW)r{hzcs54}ciU7b*O& zJ|XF_D?_0>BHe(=3y~vvhAv>XEW>WYqfVGvm&_aI8ESA=XQ&J0$AHLf{x`m|Uoz)< zN%oY+8=V=`5?hbxJPtJa{J|8jVDpyY2ClY`dZcJ8eKCa7*lN5@b38>K!ZEd@uYaIr zR>fQQ892M4uDs3SWi&N*k7RuzrgId<`C4Y1RG1U`cP1RKJuXQHV~)r4J3{SjLWe^- z($*}qJNO!AN%Zj1P(K?nDbbgRPqQ_wvf3wIj%T8mFuN;et6QP>Mn-yN|IfYve2#6R T9Ajnz00000NkvXXu0mjfZ|nid literal 0 HcmV?d00001 diff --git a/figs/img18.png b/figs/img18.png new file mode 100644 index 0000000000000000000000000000000000000000..49a5fc89ee5564be180f7c41ab90ed3f26bb332c GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^+CVJF!py+HXmI#cHISnl;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`oN=r)vs&a90xqJ7nl9JNy-MibD9efWIVk`;r3ubV5b^|28 z*VDx@q+(8T0t1s7TgifkL&eCJ3KsW z3TDCr_d^*9CAWyIc+957{E%fiw?|B&puy4YZH)^Vk60YaWtx&E*5I{#omR8K9tW1| zt3p>da7pqR7*sU7a`!|uFVdQ&MBb@0OpQty#N3J literal 0 HcmV?d00001 diff --git a/figs/img180.png b/figs/img180.png new file mode 100644 index 0000000000000000000000000000000000000000..33e9d0176a5a86b8b3a3f38e673f747c542ba5f8 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#p#JPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3EJ!EiDbG%EiUy?%lgeN=mzT?`~gq@I6q7u_VYZn8D%M4UoLM zr;B4q#hm1XgoIQEMm;vRZJay>3{Q+IG#NU%6Ij?T%QhTgTCj_SjZKb`!}=8C!sC6Z tY8|%@eUNf7Y%_OgIp5U5&^Dci;Xxp`>-XET*MLScc)I$ztaD0e0st~6LN@>a literal 0 HcmV?d00001 diff --git a/figs/img181.png b/figs/img181.png new file mode 100644 index 0000000000000000000000000000000000000000..57474281e88ec124a94a4d208b15358afebeb8d7 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!py+HC^^w4AILEX@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaLFZx;TbZ%t=l-z*6JGoG)Gwl8dKbaZKG+}QAtky-vk zW(|+DM8wYq9z8Zz0e^-ylm0TE;P-jq79?N5Wl)hDo><`2p<&1nd*tka1cqmpS2GQA zm@nm=myob)W|_ffaD_>fVXycJh9EW-84K|S7rBNVYZL^xUB9f~aLB&&yAWGjrh=eY toHARRwE*`Idj*}#tdoT^Uc2)!Ft~9j^FEc=od@(MgQu&X%Q~loCIHL;b)x_P literal 0 HcmV?d00001 diff --git a/figs/img182.png b/figs/img182.png new file mode 100644 index 0000000000000000000000000000000000000000..241cac5a6995486c3297a4cec591fea580d9d085 GIT binary patch literal 632 zcmV-;0*C#HP)OfYeDm z0+z_xleTrabY`-w%KI76Tex&UpAbn}R5J>wJR>H;a_fhFDpQ?+PhuJ~%f8fc&XUWuk&rgtS;2Uk)L|Kn1(O{)<< zRK6B18zQtsZ-5PfK#0^(gXs#?i|MIEcZF>Q!y zX?gWcaa+GZihBh$>*gS72y1Dru)ra3{ZLrj%H~Tsuw~Edn%0Eu$vi!3{7-AP=eZTu zvL;}p{HDeYb-mDI+}57bP@qfO`$?@F`@kQmoJd!Bq+e!b*vcARa(omsHjI|73S4dH z>i2~yX(E0#oGlX~XD9cqKIL{#tVzpjdl^Z-RKxo&;OTgDv@e1>rF SuR^E*0000W+J=QM9r;*O05)wh85&{k)K1PjK3=FgzdJEcTvMgb^Ig|O-!EMRs QfMzjxy85}Sb4q9e01M+Ys{jB1 literal 0 HcmV?d00001 diff --git a/figs/img184.png b/figs/img184.png new file mode 100644 index 0000000000000000000000000000000000000000..36ccefc39d06dcf0266571427b4664dbb90e16cc GIT binary patch literal 457 zcmV;)0XF`LP)<}eYi?ShjisN_ZXW#P~DB+vGi#CYOl+cK1 zWUV%7olQ07M1xPO00c1y%1Ku(PxuLe_Cm-zeJXUKd2c`kr3B7!0eCqSw24yL4ZVRE zG|!3H(=Xx9Ohd3?Wr8@IlBtXz=(I8>$aJbW$L+k9PsFU0qKGf&m#Pl1PbV!zuDO9i z-$jvpYwBp^GSjGFi|((&lJ5wYNA=VtFkK#MI=TY7rs>uzY}MGB^QZgcLgZDa9(r?Z z>fn4Zvmf6QZoh^fHDw;hd*@7@<4FW@km&raS#~9X-&8yUg{kKA;lV<$f8DG$u10ld z@*blU&g3P=w%4uv@dZmiJ9YNB9$DjEx_^u{0WCM`=S=vQ00000NkvXXu0mjf+XT&X literal 0 HcmV?d00001 diff --git a/figs/img185.png b/figs/img185.png new file mode 100644 index 0000000000000000000000000000000000000000..013477d5e87f4c8c1849bae44d45ba595ea0d068 GIT binary patch literal 721 zcmV;?0xtcDP)?}BT>@1CT>?}BQvzKA zRKm*vAO(oDt;Cv1X5xR4NMQHx;$yL3fi7?-Nh-9H3LPX#0EAz@0u(E+)ySP5w3kkj zq=WVn7E6S-NYpkF0E_YMBpw|Y8&fy1jTIozC};`l5*lur*LlNu0^_mx1#fW`k{v zW_I%A9}?IJnvj&WK<8ou_RzIUoa!9XoSl;#s`R~FcGWC)QyC{4kIz$p<*Jd7T~)wX zsVgVu@6^#qtq155!IK=$23s1`O0@33eK}9LRstF$bzmEC43XM1H5OpXb`F=e_I&DE z_~w;~G3b{`8ex;WviqZ`IbKU4!)Koi_{<^TGlzg*va<9AYSr7Q00000NkvXXu0mjf DWBfyJ literal 0 HcmV?d00001 diff --git a/figs/img186.png b/figs/img186.png new file mode 100644 index 0000000000000000000000000000000000000000..f492beb0ac84aa31613e8b08414bf6532dc7bda3 GIT binary patch literal 697 zcmV;q0!ICbP)Z<6#XNup%JH-M*A)N1Eh(n)$zqB%)` z9a*$V0?_jgL>bbrLdtz5@HO}~>E8MFaWlvH9T%W07Ke#7E;|cQwSaWpEs-F2>g3_r zfB-5_k6ny%T#(gPriVQ4nP)So{*|bB_UOSD*)V> zJBxur@(8L_%OwGP&M;d64bTkr8bGPW5ELcQrVHJ=of+(U>w)R~yA<~yr z^CBYMN)I;Lv1SYaJ~r9C8OGJ%G(?Wi5*#IT*=D5980u7HMI0+LW2h(*v`S19Ln`J; zXw@Zk?n>_@q4aV=ph&UT!)4<;ofJvx0jzI;E_eh!Ix1+X$HE;2=6Oi1;)jND;K8d& z&S6>dVi!N9kmUx4u(FJuxzRfd_|?w8RFnTZ!vhB0-FU#5yBiA)=T}Lm!{H?9vOBjf z$EU;T@&V(^%;E5B5i;u%Yk>lYf^pid8&>Z%@Z9K)l(#bkr*0#HXp7Qzpa58z-h@Q3 ztpNySU>B3o7ZGOT7U!uKLqq_!28w=I1rv?t<8G~?uQtEL7Dh$pvl82bNusO;T0dqk zLfeq%F}<Je)R6ESJ<}XbgsaLj00000NkvXXu0mjfq{%ug literal 0 HcmV?d00001 diff --git a/figs/img187.png b/figs/img187.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f6221e7d2481ea24e4a5716d19de15877b78f3 GIT binary patch literal 340 zcmV-a0jvIrP)U7t(M9Ds4T& z#=?e%-a-ywK~F=XosBa~%odPX@spkX^LDbcv%pwk0wGLlbrUrtfs&%n_5--nMMe#k z_O$1%vVElF-ZCGUxFQ1Ve>Y4k_?aBi(x#x>3t%PbiD(hJjG*9z`Z%TuA+=q!JcGdO z^0;4(%#egurhuK!vf~CfVA&ISF%UHl^kl3#=s)&T??Q>Fsw#%V#O=-v9%SxBPE71z m4?KqkQE!@Ubu4EcajY++8YM9aF-Ot>0000>^yd6 zXLlz+4FX7cOzNu55E)%IsiIAOJ^DiW;!^aRmkH7U8291%fNR)ZH;&X`>uFeOl0+B9 zWAc@WyG)6m_@raQI4gq%l{Id%i8bY7M#`^!t*QSjy31A8r=N#m3|!=L4|j?F8K6aH z;4PFe9Jb{WQYM=9$jpH=0p3pf$P|vUB+*k^{1N8h(@Z>FNyUoEbMhQ5XPAdYJYa@t z963RE&=>1-XVthq4a-ZjMKeSL+Z$wqHCUPE*k$6C^MbYUJ%)FlHw_!7v?d*Wa7?#g znwcGzZU%dl@*+jAA)a4|?X%2N+`dFx%8_Oj_JExhopGj6d9)~NdSr_s??wDX=R|L< zV27loi;c(7Q+DGG?r_VqDTzUVU$N3E*1?G0GUBK!@+9eLBXaHT0KGP*p)Nsc6-Fulm_2y_~wNOLdSj<}~aL4?c ztVngFE{E?w(d$vmx;-`=GHo7hriKRN5Q3KakhNs$Z&H4&O5e~?P#>|+xuNO0^dtCF z(}T5nv|aTNSu;j(mf(S$ieb<(5?z&AmlyAKtzO7?xF5m2{L*x8hw?LPDT7qJT5s&0 zO1VH4RjF>9R;b2?TViN$Y&5kk3t0oev@ z5C}kUlp#Vu_i!lQLQ!SVFp*)wh8M^}3=9cm+e!vN4I~~AcgY8YKs7`GQb2G+L^d$6 zJ*eG)D#CC<;Q+(#-4CE53I_@}Sse0_)nKt&0jFbz4%ooJRM&uA>MJZ=ZeV!Jkb_+f zH$u$@2#d8|eP`+>{Av;m8Cn@`<52T}!5hS2d%$plL5U5!n$+D(7}N_Gm<9L`Fq~FE wDAC@%2d)ML7?I@AtYd&@73_cquk6qU0DT}jOdl$h@c;k-07*qoM6N<$f|kL9LI3~& literal 0 HcmV?d00001 diff --git a/figs/img190.png b/figs/img190.png new file mode 100644 index 0000000000000000000000000000000000000000..80c9e67b0ccb652a138c7ba1dc7464b50e614b35 GIT binary patch literal 455 zcmV;&0XY7NP)nwup ziKMf=M~Gl80TIzfxJL;10%fEv>5F1jExM?x#4 zm3R8YJV7}!PG?nsO_n3!r1OpuzC*xT2!++BM2Bp91Inco5bFZ{0wq{P&Fp#pzz^DS zD2nq7a(;wsbL`TJSt=pgIw4WH)_?RRj0TmK+Naw&RrlIQR~ZU4!vuP4#xuKM+n^MI ziz<;=Ma!3)Mg?nle-)N`#m>Y2qU)5Zyv*1fo&$Z;bn6+SY<;B;zTr$;E~uSNr*6Fr z%e?wk+`S~&uH7q$gGRCt{2RWWPZP!Rt7>`1nsVrj@yT!`otFaZ(h)J1sd&>{W_ zS-J(f1TvHw{ee;srCl>*>+%xXEH4!OgKF#2LAwbUk}1j1yC=z#8rOtEh7^Awzq|MD zzIS&zoq-A@pu9ptfQ9G@v-l83P>Zc{G^WI*S&E@?i`i1^B@meWxy3iP%q8WHR1phO zS+f|h>ef&G_40cmX{>R2!8{(FN8HJh9;J$^8k$Ia;I00KG{|iIz}94R<&Bzc<|u1A z@zDh*q9kpKQ@DA~{{zTA}w*7S3NA9RU620m31aSTO){c{ueQ&R!= zi^6j~5rNw_Ra@Tye&xl=#$t?n!J-J$Qr$Mccm5Jqc#QZBT_tR*X(8Zp00000NkvXX Hu0mjfM@AZU literal 0 HcmV?d00001 diff --git a/figs/img192.png b/figs/img192.png new file mode 100644 index 0000000000000000000000000000000000000000..95997dacaaa59cf576944796ed22a367f0e13c25 GIT binary patch literal 637 zcmV-@0)qXCP)lJi8>Ykc0 zZr?-Q55GHogjja9H%fu^5&tIP2izYHz}|4IxKmH?&aqfhD?VGR-J%D^v4eH{Aez=I zK6`mP#?RzOt$4G^h^#)oNy07`mY)J&o#m$#mg8c2S9y4C?MIQrF2YY~)5eRw-E2RA zSA{sd4l!*Tb~-Tt=JWUG499AdP{U*)kuNmvNrKvp`VKH*U2rf;^epe&t&4p`Lu|+s z;K*^YdFdwNU0*3Nrz;SD5Ll8u){1MIY=7pc4@|MlLl XFqv@Xu?XV$00000NkvXXu0mjfd_@~( literal 0 HcmV?d00001 diff --git a/figs/img193.png b/figs/img193.png new file mode 100644 index 0000000000000000000000000000000000000000..6330273f2281b35093171d5d91ab34a9329dfb32 GIT binary patch literal 719 zcmV;=0xs zlpwk_!Nl7(C-U&;yS+y|t~K&5?e!!bB}vbcq^+J3!EKhssD{$h>v33uf*i%|`y>*U z7BG@jB$1A>wp3swhrs!k0xAyR5{hQ3&1tfZa~&wANmyA1U4J@13G906e&PJf6t{2W zb|(gg_v=++eeH&E$VvgVcggt#n%VgqMF*i_7~cl~6W;;VGWQ<9_@OcrhSpE4d1BPt zXggRhBW)Y$N@yh^^08ZlBVr_}1+#GBF!1#N*44nFbBH1uwv@BNZPP6caPbJV;J~R4 zambm6@DhGXQ-Dio5he#3q932Zt!DnEn*84x?$GFN#vR(+&6xY}x|gKgZQcBcLKwpdONiM0TE58cpDMkIo*1qx2X&QGYTr1UsL*J{x=!o6)x zZVwP-r=K8KEd&Ehmzzs{z>PMX@x=Z(ZopA4lm*xlF#TXB`Bl?gaQJl4pNj(=CKK{N zoi5rQs^FBhK;r_nJT&!aCkK4^ObjJHRF0{Yn=z|{a54RfR31Nf0miFFKITk7m#Z;7 zP&$CFkZKR}doL{>eV>s!VF)1GT_UHfG-~ceggzv^WNBp2W0>N002ovPDHLkV1m#b BOuzsD literal 0 HcmV?d00001 diff --git a/figs/img194.png b/figs/img194.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c4fd54b3edac47fe2e8b9dd09de1cbd5a3cb41 GIT binary patch literal 702 zcmV;v0zv(WP)dsFflf~p33pcJtUyB@k>IsY!j^$WRP#Kds8Jmt8^ zNN;5T8|~y713*htm?F$(Nw%Z-ufb6>8cCCLG9*^2I5{(8Xs8kNN=!3Dk~9fTPB)W; zNDEF9N)HzVs+2qB_*p10Hcd$y0IctTQ}76UbTrV@PR31{ePQFYRs6Vp9C+~R(&VtT zyx7HW>0F-{9Ky;n?aYn6vw&ZX{7atv-x+Su=&r^M+T7JxXgIz|Iy^iaB)#wVt@r1< zZ?B&SJ{9qYw=!C8Lu*N$APVNbwA!%FLfHb@3wk5v+Zlq>smw^s(N?uRfdXJ<1``s& zwuUOy)ovrmgT9JDTS)Y@i(CQN7N~~tE|_SPx4V@Fc^LNUkOvikE|1y)OcG@+(EE{D z5&CX=&iSXPcc#I3rskc#bR?zEokh?@VkrUUqed}r?4ed)4M6LGV5BZWcF-*}V5_Fz zDMJ}_Kfj*?zLNmcNIh5sp3}q}8H@!OidW~0)?S1zMKn8skm^^%`gpSEPxk$lUXDEp k1-|-Z!k31GFAWKQ0Nh*@l>!q>x&QzG07*qoM6N<$g6Swa1^@s6 literal 0 HcmV?d00001 diff --git a/figs/img195.png b/figs/img195.png new file mode 100644 index 0000000000000000000000000000000000000000..37a9713a3539aa38a3136406a584e27f6b72a29c GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!py+HC^^w4AILEX@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaEWDx;TbZ%t=l-z*6JGug7QRyMHBB z4wN)3oW>{;;OlUPSLk8cgBS)ePR69L2^_ayzZ91^$1JIEF;hWMEKZrN&02u_hrNQ% iW!A~U8BZ)@7#McyDDC^VTT2A!HwI5vKbLh*2~7a#Np&j# literal 0 HcmV?d00001 diff --git a/figs/img196.png b/figs/img196.png new file mode 100644 index 0000000000000000000000000000000000000000..396778ed3e28a87c2cd0cb05afa809aa9a111eba GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#oCxPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3ELKqoX4&Ee)v9#l_|B-MdOkO1pROmX}qW3KU{23GxeOaCmkD zB=7I(;uumfCpjVEL25$6jROZbRMZU)Fj@-~+a@He2u?^aXy~e}Pe=&hNJ#Kt-(=75 zlAo1_XBCGokBxAU;}pr3?I#@tU9K7zG;4Uasj)Hm{NfI|t=_r;Xf%VTtDnm{r-UW| DGR{QF literal 0 HcmV?d00001 diff --git a/figs/img197.png b/figs/img197.png new file mode 100644 index 0000000000000000000000000000000000000000..9dac2cc8f8a50e71b944b96ae9c1b1311c756e14 GIT binary patch literal 888 zcmV-;1Bd*HP)s?Tyev8VqqHlR0=kx5kv(&=RT4U;6j!#5fSMFJ)_c+uO!ZtS5j{<%da|t;q`e=tOixHpH#6GMr*{o85Vz&f zzBOP4hb|E}a&suQ1GB7=q}&7}P3!Ls>~icV4cD@2ZtI2b^q40#nC7bpnP(ke?H&m%rtY6Nx5t5Fi*I#I7c zqgC>SHT>u*SgComC|sEE)>-GVg-*Afua&~8TOf36(SrD_DS%FYX~xRsTjo;!zLZ1x za#J;5c}I2Bp;R0+3>wjM?@Z(x{m>3gPthNLrPMP;Hw zukt(s2t7lkuKFQehR)g0WISYfY5QI&M7e-YMCl*3^(=WVgQ=Fyk3l*1Ko;}5+z$h-Z8wQ`@DTT>{$D(dzl`Cfl{nqO{G>?`+}o9}DZ z?N_sckG%oLKOpMrYv=NfnYeDL=|){@1LX;T@n_fO8lN-Vn-Sac+QBzIMaub&O4hvK zbgvcWf0X=V_oZcXS9HhoxIoj1>|&kun&2hk?&5=li=NPzVuCy7h zcQV$yutuz=oYkffswUgs0-eugdV4#-MP1|aP2epn1!la^s0n^VefbAw+pDrZ+T4mP zr{4u~H+Seq&oHr;k@cPspJTnT?t_l|P)C_Q^EL4rXWBfW9{0K{g O0000Cs*g#?juqkF>V1erbv4DyjxIjF1 z?5Z&>69`~nU<9*S88!e(1qNQQxIx22s2ZS|3<<;;hZk@OfGI`+u&bAR0NJtuB2~b^ zpbcYhU|`_}x`Khh0L13!X7C2Gc^MQA6d=??6#~r!yBKHS&;>*RgQ%_n!sY=6;{^y4 z=)AWKIbbG>HX>R#fDnY!52W}YqMQnFVI~JqTq-7jHST0!cmNIn2JPLuH!<)`fE$v! zdkKR&Fx+^6!boO=0HXqgh6yuiAUl^4g*V^;03eqkr~Ss^L;wH)07*qoM6N<$g3ES* Au>b%7 literal 0 HcmV?d00001 diff --git a/figs/img199.png b/figs/img199.png new file mode 100644 index 0000000000000000000000000000000000000000..02743e9af33a0595f44a39f2abfb245b6e1cba03 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!py+HC^^w4AILEX@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaH&Ox;TbZ%t=l-z*6JGuS1QGGdx6q?M~l%N(u32_OJ z56g}e+c7W3vZu|vxi%22q$(X~$*ht!jIi#<4ORkEceZbKqy$jBv-&`D-;bkM>PdU*mNFq45_c$TO zK1x7`4|O^=_Q#$7lCk_$-%hnk93Lfh$K5)y8HiSrwO_fU|LKh+mGwmcZ4ai?oQ!NF zY?DrLbt2&J60J?=-b<>d;rSiu5mgH`EfDYy&JHg29uZ}I8YJ8-QO*{V*?;-w|BLtp X^Rv{#xHATXI~sR5O&~zF{2XKl-z^_ivx!m7-!6EI3g|3T`JkZ@^apV zLkAibPSMZ0C}XggWd*~T6<3>2Ryu3VrM44$rj JF6*2Ung9e+PqqL6 literal 0 HcmV?d00001 diff --git a/figs/img200.png b/figs/img200.png new file mode 100644 index 0000000000000000000000000000000000000000..22ef4d7880ebc1219bc7702708fe72b4d40f48dc GIT binary patch literal 474 zcmV<00VV#4P)Ss1+lZR zvshg63ESCP><0`1Eu1EQU_QVir63Cy_Bu0}O|nUf)keevnR{|_xHI?O46p>c7@<)S>$9tXQz+!C{7IKG$PpCg%{< z!?IDj{X{a80#0A&*1eLT@LKv}XYzEx&&&IxAk(O(I3CE2Z}=9*ePQap>?LUhKJ+}8P1fI5u9A@Gv(&&Jnw9LU94)BMlz1#aF%eK?R% QD*ylh07*qoM6N<$f_y{TBLDyZ literal 0 HcmV?d00001 diff --git a/figs/img201.png b/figs/img201.png new file mode 100644 index 0000000000000000000000000000000000000000..40dd4853586a9975464187d69ffb4f4100c360d4 GIT binary patch literal 348 zcmV-i0i*tjP)VQ-NGL{v0LC?`OaR6Yr!M<9;i zDzrHQqDTrTxB(o1!aa?nP$Omx$Vj$C15eudd77Ph56TD)#uTlycPfU!kVqU}I=^z} z23zBiNsiMwFLb3k*w}ZKGYcYc?`^0?<66Yg-&yFCx;)-3ypj^CG|L<>gy4-2aVWi_ zmZ}F++WBwT0Q-_N#e uV6KoET_&c`ybQ&6J_Q6NP~5hqyX1U^FU5rJ|8 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 z zxo?WjWbWd7<(n<2M0YezVgTX!j=k4yG*$-JQXUxr&cK5d+T*U5>H|cpQz*`*&WK1l zBN>xww@^5TK>NPCeCR)8sn$zZ?M0A*!pV|e->u8Yp#IT7Llg=}BHkfv@3oVKNr(O2 z+gME1tS4HcOL{vJ)(QxXpR*ayZG)w~Xe47rXUct@%c^Kr7D$%|kSm^SJJ};5qh+Po_`-o1&K|U^()^^6I*tx4flqC-+^{o)4WHfT%FvW34Xm85JsES+v>f z$t9L2cw4{9R|+vuF<;r)68O;CwO^|CR>yJIyY3v7{JEKli)0UXk^Gle{p{{V#+xof35%SuU8v@#Ah zKYH}mweMDtk>#Pj{p`jcyntw6cg#Mp81h@#Lfz+aDUyqkHjN(R;Xf9 z6KY)Cg##ilr&-kj{?-_lyOT`}m=^`GWqN-Kx z+PP3q#7rSo{yr3wMH^_=xOXWf0EgT81km{$()k>MKyb2?J0ki|`RicPYI8vL2L$Yh zD8Ft;L@AxmQ-9*4Q(;A*RG14)Hx-5QbFQ!ul`FI^(4Oe*fUfAC5Lx%e{2nnF%mH&E zZX9tSA`S$D12;cXx zffX`cdJgf^J6{G1fDLC3a{Zwhz@#=-6b)y}|ZC$n4_>rgv**ojCA| lNAcK}>hFwPcf7J07#7%y%#Q^88$Eg z*#X>F7!*Lt6=2%=;U>@u@Vws2z%UWabb<;Q11*KRzyM6LZDU~IPGC@9z{kMw87#sK zl;CFIXHwt=(IAk00nFld@Mi!ACWG|8V?fhCFfi>)U|^UAw~zM##A6>2PGADZ;{;mx b4i5kTZ@(U+UK%un00000NkvXXu0mjf9_4zr literal 0 HcmV?d00001 diff --git a/figs/img206.png b/figs/img206.png new file mode 100644 index 0000000000000000000000000000000000000000..8919988badafbbb6df1e483e09e69a230c9dd994 GIT binary patch literal 534 zcmV+x0_pvUP);qQ{I#M*NRvX8fM^|j06E_vrJ!IG zE2})hRo2lLFhUZGMNMVv6_ysMY%B~|Scu@v?B?gxD?}^tgPZ+kZf167XBU{FV9R3L z_!{+37GKpgnPX7~Itigk@D+u5L{3=&nr!r(j)Yvd~$_kpXt= zdWWRj_Ls4Cj_gHk)?yu!$Shux%suvG4ulQ;(|c{0Q=MQ_ba{5GK*d;f$~~)_|9Ifl z$dF7Q=)*qZVLgi_#0t&eEavVU7?P^-php#cDZa#yklMnMYUs`Tw_@4X&AM=P1Ka{j52PGV|EKq7z2`-q80}s!#n>yHK|u*7hr4Wg{6`|* Y0ik_T4l4F=w*UYD07*qoM6N<$f>mkrrT_o{ literal 0 HcmV?d00001 diff --git a/figs/img207.png b/figs/img207.png new file mode 100644 index 0000000000000000000000000000000000000000..093f134e4a4397844c3c8fc405a7e3fdcb775830 GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/figs/img208.png b/figs/img208.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9b8a7314706037e28d80fa0ba33fa80ad33eab GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!py+Hc>7CX1(0J9;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0LicQba4!+n3J5qz~m;d(Z7L_ZHB{F0C2(iSW~I5Uqi-w-^L!}6K`Q0EzrK(%Q(+F_0CtUQ0DBg_p7 zjB^_@(yH^$<_ZKjG%9m2tK~FpwoeE=v9>|+*rEf;4T>|q{J+jvVt9;Y!F7pk8*?6~ z%_x}N`1S@%%N4dZ-a9g;v~I-J4N)z4*}Q$iB}x-4-g literal 0 HcmV?d00001 diff --git a/figs/img209.png b/figs/img209.png new file mode 100644 index 0000000000000000000000000000000000000000..2715a154566b168495036be87ba8dd18aa8db330 GIT binary patch literal 532 zcmV+v0_**WP)QCsAk@}Uiet^Ol&MUyyjX7Z_hE#(O$Axx;bM)CE65=gO2!7A+udkzc0x| zMsoT?{$<=S#><)G)u~j^9%2iXn5~zYD5BD$qAmgR7O)Zzvrg09iOIDMN$rIcqJunl zLKqjn@{u=oYWz)FlG?x}7$xG@9r}9ZjmqM;YqJ&8yrcRs-n$Nn)&xFy0u|zs5Tc W(^jKN_ZkrZ0000&*+(55x0J0tc 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 z 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 literal 0 HcmV?d00001 diff --git a/figs/img213.png b/figs/img213.png new file mode 100644 index 0000000000000000000000000000000000000000..f378f2f01098af352fd196dc679d60c7ef48321b GIT binary patch literal 495 zcmV*aXf#lvvs&KNXuK56xK@vgLn`E%xKp&P2Y| zB`8E%jr)t3{BvX64lwj_F8!BAu`bAUmg*RSHg&hEEgy`k-agV!AK^a3H+g>f-3%?#JC2OGh>M4|UZkVWi=Kp;c(I*GfuH9J!(_%cK*fdnx>R7Cb= zBK8uOfRU`{+*`N)x_V}MjrdXrx~lHI=brQ3bN{}&)xiCWi#9Mp064(yvB5VM8&~4{ zH|c6k(6+fKg2B0hel;`_Bla%eItJ_O`ci2C&sJ`B{|k`!D~19B(Xj220z@tSHRBOp zPBT=%%{VD$bm<8}xs6omU_Pd6J5H&47&q9)yD0tBsl}b4#fZ>5ouPm8#l?WS)S@Tf z-bdt9bUuzTX9{>^yXhm`rp)uoI0eN6ru^(vb43k;#)GHQ25egzq9V4@diB79vQf$Z zLi#*pOT?w0bzH4ty2Mb?Mo1m(wX#EvMuFR+&d&|Esk+U1E=2tFIM4`e*imcp<2Y@* zFylF9x7kJwsbO=jyxEP|zb$xd(ST$~4K>76=3o%dH#uGpvV&MydMxhS7S!~$1!cLi zLSmR?mmy0-lT1633IBJsU}$;cB^{ogtrj%}Y(TS)({|j(oD^(SQpvGm&6CF&oI5sx zHb(fWnz*%iF#U4|41s$CE08nr1sF}RW{5krp;U>@3}^C|Xlm)Xlqb5F^w10=nHA3{ z=Mqq-+npZIq_CM-jLYpV!5BG%2U0{-zD=`0<7i62c4VHgX-i6`bzjx3ZK+wxu9>kU7UOc; znaAD}M1r;Y365*Dz9fjfG@d4e5LVdb1;vHcvGFH*YI%V(dQ33eP--)2a5|eh;Y`NM zq{W6bN43G{`&1-!yhiFSHHG^G=HKnK-UHch)0ybb(ZqMUxZB>KjX7>bN4Cf6G$E$u z0Avw&*=<~IgBp)Bjlfx#eWBZCBsjL}7!l$=9uoLM?K4$?VV3DIIF!zDW4P9G+bH zBBG@D7#!(BOk0pU0K}EsD(+$8FljOYvDi9K^1&*kWs>g$o=L;uup*T3TnK zYiRakJ{7xJM5DvqUa)JE5$Nd&mqFPu(<2G(vTe^I9?4DL=i%J){Q=R_sRYdNA|`tdJaB%h zsuSJu{fI;4)BB^=)IO=-nA{pu_G)`Nl$4(cM&c=5DqOt74warplS8)WoFInu%8D z;m>j7WFC*pB@C2Zmor06LZkMEosuhAEOA))T7hpOb2``%pG8LGn2uhi7xR)uw69&t z+8n@kC=a7j=Bc0N-CiJWJKa{cKKD<*N5Rb#!nj1uvOc};g2vAGn48gC zK*N6yS1IS>`ps7|Pr;XN zeCTAG#{*|4s{*Gw0^K9u_d{-Y0b`*)giS9ikL;aB)fvgGVm$Cia&@Z&YB3(Tt8V7n zWTDx;r}#ax2`3_#M!N!NVPRXmRjGtdmUy}bKUn56&htImDO`Ij- z|0VTCm&h=OQXq4%yl8Vlq>~(QcCs??voi51rrp%=1&sAVui<0zHRV`Up>;W{7!TBE zjI{)6As#yMfv#I%db${vQr+=24orvtaW!7bJ0#0ZvX<2Yy|?THoSnK@DHPSg0@XIC_H~jVk$a{70W$<6j(P@m=M&Oe1pf zOJq^fDqzPpNz-{2IP%rtY>r(CD~Gc8g$&r#ruO?t4te4v1DqaK2QI&V)dN1|vI`hX z>eGTS{~1nDO?yrL3i0@~JRU1RMM*qVg4RCKxPA1%P5kgOKI49JEJGz%NSwi#J^W5p zMvL082J!-5)nTa@joG!TbLjTzvG*(HD_%k_FCZq$>lLy|yvt@YouodGs7% z#A1Ek0?)=Em#b!aZL|;%^Sb)yQw){j!B9)$ArsDyz(f92@VDw8koH?yg_cjX$je7L z(Is;~^51wL)c;20w{2^j1#hn3^iq6W`GxH{x-ceLquc%-*OxZ=Lvs6Y|F;trC3VdE zlN`!#_)nz0mfFMtQvkn(xAC`kh<4oi#Xpt-XD6!y=Q?6--}m=r!xctbVO*@wTj(r~ z(Q;LJHP|?172;9zkK}o-hN`x6Q4){y{$2um|E*`PMTfs1J~+PN^6{;Ns}U*b1zP#Y zy>?*j8+-E1yX=T8$S0eZAi=yjG1vFp(t>EYlT!e{uu8*MP(|5y#&_p5TU~$$qS6i(?lsGY_vJqsk7TL4!%HZQYUo;8q0^HbIs zI%VzOt8j+jz*BrHrF@BpG`4nLy#MK1EAgj`x{dAU6UXgMc}^iGo~wY1-mISEW{2vE# znxp$p6dgBurmq9JF`I4^(d_uc=Ii#&A)VuuoTC;Wm3|R|BC^~-&ZKOyPT~XkX+sC$ z&)fi}=hv!N;Ch`fhr9C79k>-r+eMxd0npu+}Nz%Hypee78gS e>%bXK7e4?CC4CpKM352y0000JkNKd%kXbt-N3-jv;pc41Bf2(Jz$FMxiz;zKmo(<-4Dp}+|U6`gq5Iy z*&i^)co$)csawOW;8sAF<5#+XE(8MH5Q;^C#{f-c9aMdro`5$N9ZCOx9Y8mX4QfX% zgA$O8-o1PGK7+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6(yNvRL+3B29#yTL)CjrT-DVdHCdgT0N8U8?gO z?@H-0o9tt7SKArLBkxoXH!@Q4*RcupkGE9H?qhUf~!u|tG7^WnKJ+L?+ n%J6Ncpfi6&n%Lo7KQ@MFRedGj&t}_!9%S%z^>bP0l+XkKpn!mN literal 0 HcmV?d00001 diff --git a/figs/img218.png b/figs/img218.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d0ac3ad3af3a3034930567577763dec123e6fe GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6mdKI;Vst0J$}HLI3~& literal 0 HcmV?d00001 diff --git a/figs/img219.png b/figs/img219.png new file mode 100644 index 0000000000000000000000000000000000000000..83f9a54f0c2949938bf6bfa27def26151ef56c56 GIT binary patch literal 893 zcmV-@1A_dCP)JJ7lih)o(3H6W)o(hta z2Ycv(ha$PG_D~^+J$WjavmnHS2tCNyRw+)ad(w;0`~e;o5y6Yi%|kD~H#@u8O}0N2 z#UJD&nc4Tv_r85QnVk$k26EI$;ps5ESb7^|X^(;uH3kRoR%+)MBAyMVm_vHc0Y0yy<5FzDhCam4%)SmXM_0q`2wW6UAuh$-Wz9w&Gp z)c7)kR>TRNF|~2hnQ64t>mdZ0^tcx|(WXW?pdjdxI4VZ@Y0py##R zGDH!2OnBld+ul`q_A3kC!`x*#24PM3W)#<&ovN4$YhqiG&ImQ=B*SSvU%;9c3$5pH zIEopZpNj0QBiM{E!oP`!KIFRxDsr7Gw5Q3}ZJ0FYjm4qATx3;$LP=ACG1Z=(9`-v( z*1q09&t-$rHWThkf=*IHH7OSFGOMK`m7C~Ne*4SvFy1~j;p?$W$=sGiG?bFkznB+k zm!sf*tumXciOfvSv@{_|-fX~cKN;0j+T?M`1E-moq;Wdy=$hazoI%E-n*>o!51?O@ z7N{yJ8S|uT+DFy~*z3Y3@Kw_*z#e!Duxc(HyP5D9;}d?N0go{M0<4f%zEcwIzJS;# z%95lhLDp}l{SK48fzA$ei&#_bGwi?zcOh%Segc^j|AVqTx4nbLM;Kv*{}JB-+mq@@ T_oAdN00000NkvXXu0mjf7RsXp literal 0 HcmV?d00001 diff --git a/figs/img22.png b/figs/img22.png new file mode 100644 index 0000000000000000000000000000000000000000..690cb14e0ae6b06167d984315dffa8b87739572f GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eV!py+HD1B`~4UnT7;1lBd|NsA)GiR2Um%n@W z&e+)a%$YNSf`Y47t?KCLNJ~ots&a90xqJ7nl9JNy-Mcv@X9xm?7)yfuf*Bm1-2ll4 zd%8G=RLn_EXlQ2V5nr%|ljlT(FQZG5Q37Ml83!fC**s1s85fkbv-0qCH=1l_Wd2;V z=hQ~Vt(Ax4u^jJg@GeqdRhS2D*emc4e zsMUu&Mz$@mNNV*q@5MC#82g9#;sTDg#tb`mI|+&FO&OfjB66RS0aF1YBL0m$y9X^B zg$&NR6m;j4FPjrT!sHQ4odrCL)als@{iLCiuuT6IQP!Llq+rU}_HCp^M*q1%hLF{I zQ!SbzrAoqBc+_7(B&6VKwBJ2Ka-Vt#f$j&wSFWp=YZEiI=GYlG*j}k3H!rsIPUxYb zsD`gk@f%2&04L#;d48S#)5|`W(}}npRwPo)05x0#)7}CDuhZ*RY&eA7h*f7xQPanx z1x3gWxHaWy%xt{yc%(+_pdVsnH|%MEXmKhNZ}jOBeG&J7YFyk{1w+B2pr7-4W#!PP zu>^HEbu^BlC5_0#0qVvR-6ZWenCoawu$}~c?Cp%t*TWHPhVP!@f8ZPB+Hhlma=WMi O0000 literal 0 HcmV?d00001 diff --git a/figs/img221.png b/figs/img221.png new file mode 100644 index 0000000000000000000000000000000000000000..0dadf659cbd76d2fe65b19c7692a0f2f27e8d946 GIT binary patch literal 357 zcmV-r0h<1aP)_7~n{~*agM7SAVvRE)2W02-ZddRW?RptN?bC$X? zuwP&Txt&>o;{aCxgAqdy!(0X>h63Ir46_(+b20z`y@@)SHZ+np00000NkvXXu0mjf DD6oO| literal 0 HcmV?d00001 diff --git a/figs/img222.png b/figs/img222.png new file mode 100644 index 0000000000000000000000000000000000000000..1a55143ae15da756430bc0ba07333054c8c5faf5 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^$v`a2!py+HXl?bs5y&wJ@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 z0Oc8FJzX3_D&{07II!(DZ_rd@`|hIpuwwAE(=p;<<+AuU+?mWQ zmaPXx%)TeE37OPx3_QHundt+2gU45Kj-GSP%$kfE%u_D>(Ayx}kXRze?EGVS7Hh|? zb(#gb2X5SCIQ+tf%`A;^8@qt65z~>(#1qL6PO}E-MDd>BOHP1DvpKU}OZSLNy0!Or zLltB67d>`~G%fdMikiLm_Evwl)0iE|sG88i!Twp}05d~gTe~ HDWM4f`XrOn literal 0 HcmV?d00001 diff --git a/figs/img223.png b/figs/img223.png new file mode 100644 index 0000000000000000000000000000000000000000..c94fc02d301c538416920d19e09c8bf51adf2bd0 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6!}EqW zhF{Df)r=u=E|ar!jbO|70|y%#rz$q`9`4|p5cZy5{D6$zfGnqofK$=%$8BRvjMxdqxHu-X^7Xlm)PIakeBDtIHVZ75rsbvLxb>WQE!i zqdE8XRx^dLWz;amGWv literal 0 HcmV?d00001 diff --git a/figs/img224.png b/figs/img224.png new file mode 100644 index 0000000000000000000000000000000000000000..5c314131f7df3d0c8e68b97e9ccbaaccc7640a56 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6|=ky)RaIsT9_qrmLkOtIzL7@5r!jvqL?VPOKZJTr4Ovp}Kk zgZ3=;g;uO=Z9kM0-ZwG}H1c>P95!&|Z`otN!Kp%=k71${gE{k|86^uuU8NKD@H5`Y zVdE@_V>Cb9yxqZX%i-n>_RzMw>@0^i>=Nc%67guE%K4TMw$kjDGi+>S8kua5ij+?m zIG^<8>r#;HThgv09gzCUQAZ(Z|A8e8lMItyBt~$lsY=c|V6<5xuNW9Ef4>g Q9_SYaPgg&ebxsLQ0Q|>rE&u=k literal 0 HcmV?d00001 diff --git a/figs/img225.png b/figs/img225.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f6c365fee624919c9fb7dcc6502ae21843114e GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^96&71#LU3J=&d5Q8_3}d@CkAK|Np(n-aq_YrG zXnsI`fJ!PG8-K!*BA^>gu&@))UgUm&#fey1=*-^594Bd_l|I;+-I=#v^9GopXsioF z3ONKgWY++~T&7OLG5b_8oy~;+%409+85+usd+^fd2y$A?eR38RbgQt!$Siys;T8&f zi=d0TDT(WFR7IKjF)VZ{i0lK`@H2=f6ZtDo`!Vv$FvbWhyc8N{5hSsaB-I?))fQSN zVAE(y78f5d6;I$L3#~(l9#36q;!F_I{J%t_5H#_|9g|ArYjZ4@6(=g~swt)|QlI0K ze+XKmsPEvAEZe(RkD1JNmgaBj0XZ=?1zQ0YC9s-h7o(|E^OT5ix!~JqLvov4DX!p-Y&NbG@@Z*_mY<(pr zfGmrpja!L@#oE}|TrCL0c`D}|Y!F*9Hda@}#zuvprG>sXlWelAt`;IF_d#YSZ@%~D z&G+79fi^-QuBJ9rjGtpHXz-A)p!65sY)pXw0y7^d=oiAnjTP>{3(nGS8zxA4cAY~| z5TOK|Hc9Gnz{98Ng;?<)NaoiFoWcb%mhNh3OeHKc@g{35S_D1>rzc}bul7t>H>D(H zYzyy9LPx^5!z-_Ww3lQdc&)5!c-~4}?CeLz+nheCgE?H0IZ7SD#ZHtb7Y0!&YiqP*Q`!trQ4YMUq95#u@n)BST_^xDIN5b zN_8Q-g$$YIK?FQqxZZxhE*;ZNAA31u zLgAX4TFsdwO`D5gYib2Mr8Naxm_j@zETeK$rAeF%zTa@*%+#Q0QlE!FN)rCp4b{-Iq-67I>e-HJYhS zvj?#+XbXK>@2ZcdbRv?>oX>q;_J?iFwjU2Pxii4EArTtT=|w%CmvOY~tMWl{F+-&H z`i5mxWc^v0!_LF`{L+%kl>fo~C38cb{&4LG|1Q1*MN5-xHqI(l00000NkvXXu0mjf DtK(?t literal 0 HcmV?d00001 diff --git a/figs/img228.png b/figs/img228.png new file mode 100644 index 0000000000000000000000000000000000000000..3477dcfe189632bff32a015984b2767b24caa810 GIT binary patch literal 559 zcmV+~0?_@5P)dQgF>=nlUN&m)Z7TGEvFi5Z!mawu>eW$-#+2NJk!X>`U8JfyxkG?poZs z&MoHR&Y^*IQ)#8Z;3nwVWVDkw9$#*g-#k^wfIE0+bm^i_fe{k(7!TnUUm^v4O~&ic zS{&xG6j5qhLok@apzqWD={n5h{ISHi9&FrVBU5O}@ws@#7Nc`Kf_6bVDYLa8;fye*=002ovPDHLkV1kT30t^5E literal 0 HcmV?d00001 diff --git a/figs/img229.png b/figs/img229.png new file mode 100644 index 0000000000000000000000000000000000000000..bd31a4d959b99c972198ed3e37eabfd703452982 GIT binary patch literal 700 zcmV;t0z>_YP)=bID$>E@QQ%N zHCtNAbymVvHa2Htq0M0_2#a4SCW$9l2tnLlixWG8upnZo@6AVU_c$9#z#>1`w{PCO z`OW*<1)3;>xn5u?iUqCH*iC6EFt%hyN-4enXgT9QLjW@NOC11kvUUmbfL{bGP>*%NT`x3@(Up?wJzwCK)7SwQycR{U6XBu6VGxf z=pjwVKRF%Y)52R+s3#PAMV(E0XN%lO9+~vSCfwU)HlxfVDkr*bqE^FMiOA}eIlwMv zB0J7y$j4e%S1h7i7*YMQQl%0rTK8#ex<%Vv+GBBj&z87fy3wUROp7dVF&L^86}uet zgukeTepscrR}?lDo0K`^KL8U#nxN3N9t}A=HFxn%5C2xFbDRpeeNR}4H1Hj9*I2jf z-C~4S_MQO`Nc(h9vntQgS<6{7hc3F^ttLmXOI=lhkHnLjz2!N!d2Yp>P5OD^HLyOR zY5dXTcuG$)l{uoL^|EHqwj77TH=a((ivpQY2?tf@$X=3It;n>2N7mHNg)aq(pu+vp zoCC6VgIo*;eJEPLBIOO$>z(zun@7hVzU<$|(LQbT4Tl&gG0+f)o6pJPBV~0+<$1VJ zkHL#BM}oDhH%Erb1{&ul!8q&=@!17mE%e18nVMI0yrHYdGeL3uHip@P-(@4m^?%D8 iqHM0?B|hi)Kkx_B-hy;d0<4w*0000gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lkz1ba4!+n3J5qz*NSj#+I^yfy0pDJDZq~W6A;MBU}nu-`VN}?l&$J*w3a?z~Hoz z$x!^n3^um5a)-@44R2}%G}9KHJ(O%`1T?J7$Xc42ncLpwh42Y(ht;dg^HU$N?P}dB zt-&smRMl8;*q60S#!2hJ5j~xb&?$ioorhl++~D`v_@1q4Ef3G1dhQt_4v%!C7j)S- zXkO#L!>5pXhHGEKK0B9bvr`2(o%E4kz%xxKC2>X4wCma&RW0)v7&ht4-pbF--VO8z NgQu&X%Q~loCIHqyaee>* literal 0 HcmV?d00001 diff --git a/figs/img230.png b/figs/img230.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7dbee51edf8eee53ddf1b3a1b9517e9467d82d GIT binary patch literal 1606 zcmV-M2D$l(P)001Kd0{{R4&a^6v0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*M#7RU!RCt{2SWSo=MHGHr(=)rXHPbVPMGr>PiU)CtnOv2?5Ofd8 zM)sz%9$Jwc+_(%Pf~;sCB&fOcLGU1$IV_$8E74?Edt(~WRau2mk$_&>OAx#ai=Nh? z@4c$(>E0iAH)NyWyq&Fn{i@#k-g{m3s=5LGk)D9o;D%X;e-a>35mW%05D6(G>Jt3B z`II+WF#-kp9}*JPp$|}w@pk!IOI1wQts+bYMBqh+ZRffkK#8vh^(Azr9-*5$|1^2A zdJz2M5EyOU(bIi)%zpX5C)z%<3d&UhoqKZsADVa{GZed*s~|o}NZ^7r*&2t+x0}Y(lNqB+TBWg?s^BRn%kue)jgI9V zom;A7XeqIxmSMW0x6?}2K8U}cv?I>z<&K99W%>GCi5fmeRZ=p1E=GeF=#G-)UzXg4wx_ zZS9+cv%GG7x>5Y|QN_>nK-EE&c#I^TsS7<^xT*(g%x)~6@q|%huHX&ncS+VvVNBuwT6ycpq8oKwE(hnm^5i->NC)1 zKrS>%km_m}$BGLN(PFLXmo5PqThc)@1VmNT0%7B#(=eG}6Xt+I19Wx)5UH;nUfKh{bO{KG+lj4V1`hSc?PH3$VU6UPfV60}*ej$HkSN z$0%knZe*1gBkZ2U^odZ~31u7w+Vi+v6N*+&iWR%THN8-`g_mW;P^2$$9Jkzl8xK_; zbOR8g&1tn~LZRceY(3Lsx#stBew)earZ+IvvEA@cQQUtS)DG^8QzO!1Xlfl`YL zo3!Y8Iez0{DqCr_AexVfKHLoy0g?4H1w3Q7Pzx>cA!>?vskwSZxtHrV0sZ+J+|{a2 zQ#tD`ZmCiTJK=d z$deqfwDOX*rsc{8bTz>H0AH1`YXaacer?jioVojGxCrwIvxU1|1SCA)xWE|3u7pge zr7r>esyi8Pg}26S6x zi6ZzJ_*m1p-VtOs9}u3I) z;jFjP%JYhw1A=oo$aCg8ccB{h-$}(XzaS~s&nrAl%~PwG?jPtR8^D3@%*hX4Qo literal 0 HcmV?d00001 diff --git a/figs/img231.png b/figs/img231.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ba522d6f4defbc99ea45d7326a2c24c7255fb8 GIT binary patch literal 1907 zcmV-(2aNcMP)!+l5d)H4TMl4BU zjg$t!D!i4svC;#>SV_h}^4TGLn!!KkNvtDD((7AzzLTCp%~}OR_*-G3>!;_I9zL&w z?JO*2WRIYaU+Pt5cED*akDJ%g(6(^%qwsDf^&olDxjHo>2=X>S+V^N|Bw=GIpza|n z$F`TK@b$rn?gmNk>1TDm#OLSm|6PF7>nKT*Q`K*hqBqZKytoqdW#yO3c?xDRKG zhG-3r4tl20B<>#HW>w({PC?fC5+h8Ieif1ueZ9&4<*VQi;OZKtRuHr?KFd^kUJ%y(B4-UPu4+GKLW&LcyK%pa<#Ki(YXk<13?{x-in?P*EEbS zt0tufhG7xB4EtOzL2vH3in<0mJPz`>!Uo$dW4xfkp|b79Asa5O$&-WnVd;GX1ZhyG z_Y4KJIZbfFZlQoQR=a2*BdeoLtA+eG6@ZNj=!$`%wee;4SB-m^8*DJ^m=PEY2R7Sb zYNBl`qOq~dbbnvn?S1U~DYgfoltJZG2n6wFS5~KB0glNs=V_ah~w` zWMPO<7FngYsN!O#2lTtWM>yIfPNITwll3PF0eWa#BP*w!DIDEA@YsH`H1Jo;QCmevzShQQ;T#CC!6We8)bo-O^Lma0Zs#% zscb>Ar0;v6AOq@rEL;SnQ5NzesOEEbeu8X@a3WK^77y<`(pNAj_V;{ z{1YzWp5_G7t9_qv|EB$hC%;~JoGBjfEq9i@O>EwuAClzh?Qy^DS^n?O_sQLpY0fzQ zct~C(JtcQ@hVCudSMGb9Bl}YUcV9(mlp)(De?9}}u=8jer#qHoE6a&8DvW+Y7Q!n^ znnh>VorWirH@G;}P}=#(jcj~w$2NC(XSLxUKab5@7YSCk>R6qJ>xzBE7lwZTZRytM zRG0RLP|96fzsCXt}EyY2umTACiMaF z*u0b#-9(8~X8qUEk8rshxZFY`r_9Z>xYzK6@`}j-ykrT%Y-ZCGQdaorPD(5n{f7TC z29V0p*%dAHE;Xwt0K1OyDt(?d@m*ZRzwUrMHdi&kP^Btr2TfNwoJ!vcXREylrsOV; zDI>~y@pJTl4#y48wb-S&MAD1-U(9ijJ#f7(;8IlaR?*}td#8d{HF;V=_XTIj+s1b) t_{Q;_3chiC8^Dd@+W>AH-v)5w_z!zeRzvF?&-wrW002ovPDHLkV1n1vtkM7g literal 0 HcmV?d00001 diff --git a/figs/img232.png b/figs/img232.png new file mode 100644 index 0000000000000000000000000000000000000000..56ea7c95cd0fd2c636044bf3353504045bfc35e4 GIT binary patch literal 893 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 literal 0 HcmV?d00001 diff --git a/figs/img236.png b/figs/img236.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b1e4ec105582ddb2adf87ce7842c1247b4667 GIT binary patch literal 329 zcmV-P0k-~$P)17ASYZ1t75n&1CAhmxci7CI0A5Yq7c%C|AP3umG1_ojwDq4_WKgH$mkX zJc3c>5)2vgAaV)}43{8s)w_Wp0GJ9MFg&{emJ8ZlY}mlZ zz_6TwfxUrU03!2%VFSa45Aj7nra%J20|$nN1U6K?EISz(^cd8^Y*u~-h6@K06u=yi zI-usF4M3U^#9q72AOU0!SX|-3TcAC=Ss9`o_Am&9G2jABAHIS#NU_8-2)o3>MA<<` zfG|4{|3Ro`ZUBpNGaO@(=16+T0#d}l2=)s|l(W>8f&Bs#$bD=RSQc;vFc>lPFck0} fVVK2mo092F5V9lnuWbnVI=pPEKM<`DCDzc!2H3!6z&N2iby7w}gsbIm5YIT|`5N zVUwJMjX^=WCCjCi29AxL2U+{|9yzESW@KxtbvSXFTeR>ogHW*4G7}k-n+z$r2{#TL zWB>A)wUwJo=1q-&DVL74#1kXd(NNGL z(UT&%L5^T3kl+c46QDf+g?lJWog&Px*A7iYq)=p}-Sy1-_<7dA20Vlcg?kzl`vSwb?8X+VOg!XP001xs+K zN#qo|!D1RRek3(h1VY}Gyx6V-D{V}+!P7nlK0+ych~RTUGD)aiSOu<=3UWh zvtls9;c9FwoscLzOy~4D)&n+q88RkTDCw4Xbxv2B=t^=#TZ0}g9R%2qshm8|7?>go z$($TCp<-jpVlau6<)Kt4lgNUP`&#=2DeR#uAg7_yY++svC}CiVDoJReY|MK z%pOLjVApNa4A0{Y;L9;>$v*zk49BDKFSUFFaVSxt%`snR00000NkvXXu0mjf&z|8i literal 0 HcmV?d00001 diff --git a/figs/img240.png b/figs/img240.png new file mode 100644 index 0000000000000000000000000000000000000000..78e703584a8cbe548365e0080593643b95d3c69e GIT binary patch literal 486 zcmV@P)EX7F$qE3P*bXNQVz4w|G*t}UXVZu%0Ew-0YVKGF}U6+x>&M^4x! zQXw*BEx;3}pM047O4JwCYEMdC7UrD)NIj%|*m*JNaAJZWmHmS;3K-i}zJ!ha9&|n~ z^qmro*E;--?!Ku)Y`NHc4fvu{1U8 zIqa*zQUt66!_U$##T_>nSUiQCg6D49T6;+Kohwfa3dL&#pH1YiZKpTknq&ZGR?<>v2&R?!^ym#4QXzHBlft=-Ep_}-sGUwJ=aW`LD@}5_hF5EO}FYZYeJo9 cp?@j81M#g=?Y6`ti~s-t07*qoM6N<$g4~wXF#rGn literal 0 HcmV?d00001 diff --git a/figs/img241.png b/figs/img241.png new file mode 100644 index 0000000000000000000000000000000000000000..9f31282b4fbe11f650a2683c178d4a86f7c37fda GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^A|N&kGXn#oPG$0MAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl8^LsaSW-LlbpcN#O`1tcqHKg^Jc+@lMLs+i2Ys1u;hk>ki>?Dr*CdKT;(~L!^3lj zr=~_+;)a$)Q0i|l*17Dud%W5FO%>Iv3)FJjgdUtEhQQDck)dO3IEy& Pw1mOa)z4*}Q$iB}qE1fU literal 0 HcmV?d00001 diff --git a/figs/img242.png b/figs/img242.png new file mode 100644 index 0000000000000000000000000000000000000000..2173e404bf1f95d56ae45665154a6a2d2cfa601b GIT binary patch literal 490 zcmVS8g$fRvdj>Iy@5Bvb|_ zIz$MG4dnqq>VTL#^a0F*1cuT#Xf~D(*#Rktk%c=asc6-u-QZW^vp=7Gcea64DmcRe zDTIq~5jG$&LJ#~crI=P5IWKn3WX_h8+lJ;0>UCIA?4$`J_5dvfXI^6Dh5eqSgpVzp z*Wk=-F%Mg^R zP}Ks$7mVbn9Z6Mzhk|>6qR1nXCkm!FgUrFpDf+7_UWU|ew&mxN1n#lkhqTwi&7+TpjYP$AbQVJqK34{(I;6NhUKwH^Xv;7Y%5(&R1XFJ?NP(+>EaktF()|z2v{C5uyH&{ZD7=7V>3I(%yXh)>fFZ0`-~?H7(Pl#Y+yXcD=^Ey zQ8**Ymf4vpELGybtVH9ENB#i}ft=DT4p&%MH-ySZIKE51b%1%}jK+lx7RH=Sk?ax{ z`VKdR7fH-m;N!>kjdN3h*?T_L8A5Dr_r)#t$O^En$yhMSJAjd4$#Y@#=>k?CfsSJE MboFyt=akR{0NM*%X#fBK literal 0 HcmV?d00001 diff --git a/figs/img244.png b/figs/img244.png new file mode 100644 index 0000000000000000000000000000000000000000..201f9ba953bfcede35fc887006f0c3e8022a6c95 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^8Xz_cGXn!-+%`sEAV)XAC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^LyDq_lhYZoipjRX{#tNswPKgTu2MAjt$z z7srr_ImrnQOk4$G(ag-vX3S~{?2mX0^&&xE5NY(rcijr SyWS|ET@0SCelF{r5}E+3z)dCq literal 0 HcmV?d00001 diff --git a/figs/img245.png b/figs/img245.png new file mode 100644 index 0000000000000000000000000000000000000000..317800115a22fb06224373ed0bdf49b7ab1f0e57 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LrKMGXn#oZ=&N)AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAr78;uumfC$&$J?@)k%i~Q34yi=AuWfQH?NoQbIUm(_g{0oPzQ|!d8Po!-)A9C0- zv7LV-?rLx{uT0%|a-*QI#3|*QlTY`jxbaHX^2=^{BQ=pZNn1l}&QG@^<`pw9JpJV* ztTutYy=3B}CzH;tSy}$;&)j;K_x&L@d-AXSbPVUpTJT0R{i>l)_HFLy*%$V6dTu6{1-oD!M*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl5h2NaSW-LlbiqqsSQkdY;3G-+m_zqS+RgoV`CySbMtm4X8XfT6HYL97__9hhV8z? zcw#?8Qf`C9@dMKsQa&)VR0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*IU`a$lRCt{2Q$0(=U=V)t(WLok4gP|FNCYQm7e~>dbrvLp-HK#$ z5d6T&LD13NAMh#^!DJ}?1=(CPiHo3vO9%0C&5MZ`so)^!b3A!-dG2zT;{p`W9lAI% z>fno72^v7EJsv;7<}iggI~on^Q)1dQ(& znGPn+gN+ceA@Zf@!Ihd|t01ZzzY?aHd4`kO9lHaiky}X=lP@#LdQP2B_-FamVBpWn=Ms!RoB#-xlP}zS~>n8UVycmeE%143U&XGNeCX^`3Y$L zUA%(-PCTN|1lp-Flq9!t5L|yu19pg4yFRbNWF3e?lH72KW2$ME$G5%uG$X@(N~;wU z21T0U8QkO@GORPHN$5h7T+PE)SSq#{C$x?Uf~cSP=*5@JATl;@S0uj}sN&aq|M)Sy Y0Yze2@n&J$O8@`>07*qoM6N<$f{;*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlHcd);uumfCpm$E=^Zyu!i2M@4jg!QVnbtNWA4E#I=O5q2bk1$-jpJ}BHu{LWbNIl-YbRgn37ONhehd8wk!yG$cCOn4~QEIFgJFVdQ&MBb@0BM|e761SM literal 0 HcmV?d00001 diff --git a/figs/img249.png b/figs/img249.png new file mode 100644 index 0000000000000000000000000000000000000000..1f808c97202c8437afa4f6e279f079c1c430c4c3 GIT binary patch literal 307 zcmV-30nGl1P)Jabp`Z_D-@bisW)>7;=wM;qP+07J`&2bNhwG}PDky7_8zd}4QA5*q zisq|aMv>qye8Y1L#j8_`w57uIy909FFbETtYAn_>Hcl`uy&9KjLii7J5TbhHl>;8m zort;y(b;=t^dBXZABOY>Gg$M>IFtF&m=sx~Jl*xS@CK>$D~`Q@`H=ts002ovPDHLk FV1gYReklL| literal 0 HcmV?d00001 diff --git a/figs/img25.png b/figs/img25.png new file mode 100644 index 0000000000000000000000000000000000000000..0b3799f4842ee839043dc1f2bf8fb34be29725fd GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^h9EWzGXn!-EAQ%jAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAqz};uumfCpm$Ek&n&I;B3O_1IHPdd(swLHcH0!EzG#hW^ndbETe~= z#exF|_EncNNXG~#9{5$eifP8db-XGpObX9bHyavkFf>_VSn&Sd*#pPR8yjcNXH+_T z!fVe>mnJjY#@E?99oM|N>mYF8z{D>TSd*f4n}wYDH${Ep_DOhNq?d5>(1$hho@ru- dbN$%Z7=)|kX8n)&y$Hl5jm?cC-sY^}GC`llrIracY;6f_Y+JW%*}}xe@O&-X`e`{m-9S?q NJYD@<);T3K0RYm!GV}ld literal 0 HcmV?d00001 diff --git a/figs/img252.png b/figs/img252.png new file mode 100644 index 0000000000000000000000000000000000000000..9164a99f5cb4e1ef5d6db34a50718ee51a422027 GIT binary patch literal 25779 zcmV)zK#{+RP)>a5H!v$C_Y zvcCM~F9CXhxvX@#7F5)sv&tfX3pG&?zPEUA)ux6B26Glu zt;agA0_*<98e$M&|OTR%7O?2_k zu!=0O=4H^KHt>?TuKnz~fz6a=()g#$UWS{+?U<6G?5j6J?f7AMxdxfm(2L#|*DZ2} z7gxnEoNDPZkN#I_A6d+bZjMs2p}%OtFnI$84kI3Pr#m488hIn zDs@&?$j>p+*R}GEVH9WxU=CRLK**iA^sVOY*M zKhlw+Co-cj`oNo+Na8?#KZg7eKUk3ogN-8m{3?pM3RGQYivrj*%z-qHTe9#j;Bqv% zj$`AlV5>@9rO*5j${|MXG&-KO=$m+kwcB9_U&4{&z!?83hjB5abYB*ImKclJPt4WO zmXDp47!5hYDDMhD9dZ?N6XMC^jfkIq8gf;7TgowN2iIDS!s2jRguRU6gmp7a0aR8w zPPESaaCUa=RW<=*SN_}Ts!W-vOXKP})6l^KJ?pu7d)+FIv0rY93cswC#)bi0T(WZ+ z{6Eaf_O>!yI8d+w8~G(L?a}Rb75uFDEY`%}IJ>&rF}1>Ula4+TWm^?qK}-3I0AE<{ z+uYirh~0;%*n*3ntcY)$Rs4jxp!>^+URm6m8Tg`zaZ$XIj>1#w)Lf2+iRK{DSyukm zs;{6ARyTHyLESA3JKVQ$SQKOAiY~nm7t$PNVfLWAq#a*b$_q=UaF}2AW^icSq%53V ztyP2Ccxq~xWnT(j72ve^Yqdm!!0wiQ`qScN`^732YX$G6!NAE~ajAH*CKEe2Zd?VX zPJ{DK4u$ffbG<#f8cV>h z+@|fJU6BdqWG-0~!wRmul2nVAk2BQ?Pouk6)O9}QWp979_czE z9wPh+F~WSoras4m!#JMiKEp?gYw=U-?1@LH-q-TLVWJepDrZ@a!wri=w#;9__s!}m zhp1L?lXQ2~cSjj+hVoynZV<@)eIje`%&YM8FtI92(BTWIN4}|sR)a^ykdc2y-0oJb z;fCkMFaD_bGrk8tmJ&tE|A<>~7RFZVT+8)48NRfVk2km%DrPv9@d5G(P@`Vu9fKE? zcI4f`!Wt8m(&E=s4(wYMd@}!lQEM;xTwRCdUcb7mdjf|$`Ek5bk4hki0Qi1C!#_hK z`@_@u7Vs=TjBnYHxt3!b9Ej9DvqojwgkbEdOXw9?49jyTp2*De`xCT#s4 zw&CsrtK)!x19geq-E^)Zy#Y>8WPZ3Bw4@w^8*g|}U@tVqFIp6@G5i-qD$%e-lb*L&NsNn~U%)iKAk19B zcvHk+4JbNS92Ak5%`4V*r)|capA&Ir`Ijx$sKLb}BdjC_XCjL)Gilr|T2STuViheh zE8P^Szf>-JXOA*xrnZrTwm#r%Gs@p)c#t(6&dZSZYp^fHSmmL!ciIf!{8>@FLOQN! zhyJv+uOM1%f!8rf$`dD9o;7_g64@~FAqO7??$e^dwkG{mPa^ff(!3o#SR04c%|>-1 zTYVDvt#mkwO>6v94j$h+UdKNp_yvdj;^rT#%M_`RTj5DOEmHmdZOfRy8W_dWele(| zhHf>nOi%5`SC%i0(*t(|ANjg0Gv01=NTdp1g8k#Iaq!#hSAV;(rXI=7gUln;^=3r# zD9{8;0k9Dle^TY}4p@oDZ`N~J7nmeW~j=@-)iGI7OE05=K z(&Jun^en&&{wJ`L;4k=M7<_md&liBZfaf=QDthfv6CEGFK(9^y^hoBByVzU28UCBI zaABiMrcqz*jQmhQJ>#vqAb8Ko$Cxc&|FY;yeUcuEj2@8qfVr{?aMx`Zh7Z5{WKz-A zo}_1_NPDY4ArG^n`^D#{eJl1e1;?fknMd#GM=Fhf(ZVzyG7k#seZPS(e_3E+F?O5#F{_*?%$G83guH#l5|_`r*Bl zw95xa;`}F2^3VPg^;iSe`Pis|dIGL7^4J%QVJ{ZS;ps( zfi9id`%WBX4)*E|hqr&6vseQ?J4Mm3XFcyL?kq6d-&+HA!|v(RKj)wF?3XR)3Rxy* z@l~&S+2mlHSX81TDvdF?Mto%kV|K}$RN{zvz7>X=nP|aO$?UNFSHh=vPBnN>KkLdNet1kFAi(RKXr{Bm{Pc_ zMz`aia(qbZbWB7Qr&+cN=mR2xy%;$w-_hz29sA<2cKj)a&g`#>aC$)3X_z|x)D>9P z{MaQN=~p7EIL(S!#i_!67n4-A?`WH1?7~?wAP`L!-X(st5}#!0HT6!e6hmQ6uM0#| zG8kp!F8v9gzxCCwTna65)fwCd>LBt|_5Y~Rcn?mlj@6X;<5)skq(L1%d9x@ zsM|t&<0~fMES)azssksim}n|4V=%{~pHO;HQrtMO(fHyq(G?UJ5KsR|1?D=bB_$ z6gHf%!6Z@?O8gcYmfDalWN989-p-V9KO+*4{~yXy8uJpPSy9^RMOh@5e*q*%X5Z8nrWQ)CGR_e^`~;IDZH#b3P7eGbMfj{SwYeq87PNXG&@u zoc}}7vsl=N7wyS;8UbGz!B+XZOZbHbfVik4x^u7=a5b9@b<;D*2epBJhUU%lG;8pJ ze+<+(*e8Et?if93YQ)L=44uoZPBsK!fcLndOLJ6$$T*m8*Qg_IlZ6L~ zjt|KFKh4&Hn`S~b&7S;XSt06S9lYo|?i!Y8lfh!YP-@UoBMd}l@CG0w`BvyJ72nRu zA7_q!#2oql{dF(W=;RB`*$rY~Itk7d`|-ZJ?wZ-+D9bXdG)Dv74aBJNxd~C&P$E&v z!WG_5EOfjqDy+3ZW6o5m;1tG{`{*<JYZ09laYA{AM`RJ z{gl9_odt&#vZK;t$kL8HbG>Z!Gy+zxUK}Uy7U%merCKI+XG!S-&|y!7_yn`%Q4!6wW?)lj5yy3|p>vb*wSA)-w{z zgSw-)>1)}_Vc&``x7rVZ4cnzZb$wp_t*J@7T0p|MkLVQGd*HwEI(8tMLyWlV&Ww03 zlpJC?8FJTcXq*uzxd*Pp!EW)N$)cp$6C>d5_h#Ud5gv4&=(lAwxq&O7igdV;X7lfJ zxRh;zOkT7|ayj3R?}L7WybY((huaqKg(9TlcsHZ(l*{3>WgY1~D!U3#ed%WLyrSm{ z&t*JOh8C0}y+C0?f4!WV8uB}4_anPGRUpy3Hkui4q3%k+Y6j#%yW%o1e?4)Qvz4U5pXVoeQO_+uWMDv(i5a*M9r=Ji?DcW8wdC4JdQ;?nu}2D#6}qx zt-0~g|G4u`KJS%2X8)mlbzzX^!+&>+0H2pH_;<+%D$Ye914q2B=|}bAzxWrl5db;u zkO1A5uWjpb_w{ibuL(zZ>tV!!Nq#GhNNK_%pcBigqj9NAhq2#F506vBbV`3hbaL*36Fp@q_U8twl21WaS&79CaVqo=5#e+YFIHjpsKp$|V$8GBO~}1q+diDqy6 zHLpl*zIdI8HRK|7VA$8Z4M6Tk*;M2hZIe9E{L_y825PXL8jYtQRoyu6V1SMeIC;S% zM6@4h@hlB-8}t?XN1V@)6m%z^mWVs8q2HbE(_@W1NNpcn4)(iHrx}TTHVUQHZo>Ht zB;eShlxG+X7;Ikq=-Hc)rRbb-)?jG)f=}vyNWc+;*!;N28Rgh!)LrM}d0|l1^cxVR&?FVw~$fs@$#it>O{(PRY-a<6o^ugr7B$ z>{c50q8bFP{?kmK)gj{1mCJV+x?8WsccfxY+>%&4Z&HNk>hiv%B|QumM&DkPohj#a z4w*EHF%MyE8TIG_RsgwMcjNJw95E!2{2Z(pU&g>~i3ndh_$B&_)i`-Cxod|y0(S?C zHcIZFILjdyJbJd}aF;_tIjoT~PK&`8r@_tLo$i}#E#U>djxCx&jws{ehdI1q1rkNF z{d1PhaQn0Q`z%rsWaV7Nna^*64$|4^0z_d9)lzlb>Ly&6<{D0bAhZ_yu29F#gL1W& zQ~73gE>*vp0(V*UL)CPlhGW*)r1~WGI8d;%xmp-i^tz5XkP!}N=cF=hzF?uj;qxZ@ zgJogAKqYtGGe%dBNVXn;!FmG4Y(LUeXQZ~6l%(gU|uZ3jV|z0 zGr|ZSpnF)fMPwenZ0u@L^wnV+r`Av5*ukj@iz8nrEH(2xRQiMB6*fhV@XVwltc&c8YHn$5}C+c>K)^b6Wsl6bsbpfyX6pHv; zxSdK6)dklP2gDok;YW|tqk@lQEHt>@et_~YjHDOh9GI?~C_4<)flYs*CRVen)%{bGSJFYh;e> z2phgIJmpgQZR6^5y4-R-A2WRy&u?1d_F!-a+Zoec<6>-LjQ&Bp(Nf)RJq!&aw1dAb zc;s7KygjTGqknLqp_eQfy~GT7vNz^0ouV#Dy)htjwA0B)w`HqzQbfliHRx%|Wf2Q4G(of0;!XLKiW3?aV*oOakwMrf zsn?r+?@E^Ugf3(r(z7DfiL!M{r@Z)*2tZR8UotW}QSMT5%6T##)hMR0d672I@I0sN zre}>2b{UwHU%<<1oy*pb;d+7N`2|cyFWoN{#)F7Ewh{+OjQs4xP7hLY9*cTUAy%#k+H15i;`YOO`$o4W z(vbPs4Ae7MY;-|3H>yx@3U_RDDKNfWde_crK{lR8oQM_Zol=yG&EX?w9+d?%s%P(^4v4$9vUFj}@ zH)-8sdGqihBky%ndT38H?sw8>9lA6Ms7og=&ZA4;@QDVC_=91}I*;!|Rp27(#rY~m zEqPzGcbAV!A28O4usOA#mpy^zlq+IwP8qbNu)HyIH-B)dz8ni{z#v;0T<9wgg{SFl zV5W0DRt5&xFcW(q22qzVCE7BZ#VC)i&GEnp*Zskzwj)kg>2=Y9Y5X3_hL%n(@_G~+FfPs2hksSWhVF-kn4voAviA?} zK_~a2i+Fl}IBu-zqlU#myM${xVd(~Kt_lgZ2~c}pE=-ah(|z?NlayWMQr#lA%WCli z=Wq!e2R?dKe3Kqidj#?e&gfC=<3QcXgQOIw-JB91BRbG&zLGJwxj)Mza}Y z=BlVgUwo90aC8{#5Fsx@s$Lj<93~~HHbkyb8cRJf$(WUa8{BqNMLkg;f4A#8KD0|a zs+Rg9G9ps9AI(hS>+4Rt=MoGKO|~@@bvqnHjO4oH5jj8{eI{`7YLI_c`J~d3(>kMu zGDJ3PP!Trmh~6jn50P!@d)PtYn}{kl&G6$jlb#u5#?{6YrIvIBYbP%#S_%1QIafpg z^R&)LW!YXUxz!QA}z0p>f#o@QeVRZSQ8tSravAoDHf!$&8Da12 zmU-`K=!1@1&d~?E*mx$Si;)R)xxj{ZUWVIIpsTdWzgD3&f2Rc0MO9PzJZ z&g}7E#;;1wyb*o+k#CJohvif=b!vhy_;utauzI>rW=08%C7YX*fU?MbTg?~7jnm2y z8An}F1D8~xH!(vZggojE$B{1 zkA;7J>u_cgB-qkm1*g}kx^e77e3YE3UtJKxOet#Lxf)|5wb<))e zINQaCAS%Pkz&G56-|$JOh6dY?D?V|lq@I4`A_~AM7j<%EEv4#(jFtZ-DQgo{-7aXk z&I5H)z=7>kOA&O+;dI0DSCF~OPLW_MLn-Kh;XYC8BFM>`s@EfvZ*(v9bVY>I2iv84 zDk>5;u97&=z?bvjwv+23Y;y8`BQm=tFFZ?2aMKPh#ZV3cQg7vvmr(JJUVIgrXw@HJ zJD$ymViTrd5sz?{#3=RFEt)bTot%sFRpsRM+UDfjUKGXge)yPmi}l!v)9iGSmye2I zTv~DEem-mY+I|_zZ?brL4v6@z6nC}-cBr<=;Bbj@DG^^Ip@Nhvw_{Pw2JFYPA)v(- zBQTAQPx6t5Yb3DKkwF>l%Ee%8bybyG`AbdePUz}Yq1^@%vUcT-XgX~-E7a--)_UZr zo5)9+)t*<+)2>ygDTY<#{3Xo5)j%sN(C-`iOFcE&fD0>tolc1Xdf|;a4T?CnY3&>~ zO*9CXRJnKw;9xp!H!%)C3d}oBJ4d+=n)yY!-riADDONxSSfRgE7}VGX1BL_z`O=>j zPyPxnrbq|dft#W@7HH)f)Sej)$5l=!I)g9zmZNHdJQBGc13PjNbG?xn&@5%ZUH@mK>BTnI41^#fi~#qk=U{ zBee;ZcPChDOwz!PKiTVisA@#F(GGiHa}HX35ojcsdj{%uKEpEL`-~~2bNPm^*I?9e zodpY4U+e(LS~{p|iK8TX;SP3Sv`7>Urj*V_ExAS-F+>&-b$6Oqw3;PiHS$~l#5X_usFAtN>`HqT6 z#us4@rr4uch2$WfeO$SVw+e8=V`(`bwWrIF;jD$xwL_ev>qd?`y|rBN`MOeUtKIXs zDX?=g|b7cI9GkA!d8M>GB?A%Pw zA*){|>Z}&+u|03x5b8;Ns!9yfKk3l)*%XL#bVHsi9(8(abvx`l(;=~5)owW+aS+FD zDMP4-2tAwTj!Q5A$~4n)WYP>vDV1?3yPr@n+XDTCfK;~ zC0Y-m(^l@34y8nOVF^@wp3xI7krAdV|8!j)<3#D@E<_(`8NCFBVr?3g&vbzbIihRWFB|RZboznl8tyuXjsxs2Xl#DWXDl4i6BL`%B}?|NT%E z4KAOdxHf3WUp{c0aM3?OBm^L&Bt^spOH!V44E06zwdImIIj|>Q$GX4kz5DM(sa-L6%ROTi@ENz?X~+pN$XtONM=)?|bamo|p)tuw zvBRm2W^psnUxV5Vy2K0OJkNY?rkQ&tSRuzyqbS_c6L;_|SLqCz-@jYL26>~=U0Hyl zZ*2BizOx7~Gal$+Saa}^Itq*xeKhE;-_ZVp%{avkA#rUl}yMD{BIpODTs1GP|!Iy)A= zkkGgVl(WE?;zT{%61DBV z4Mrcw1H8eBM{ZFsXrHL#PO2N+FRg5!DkuKXq45Ge<6Jya4q)}l*5h?dHYy!8pP4i{ zzrnkqjODDTm@CH%!!U9<&U%Q}T5NYhr_ZYUAgX5LchyhXDNMu!+Z6!=M(zuSknP>B zu_pQy8`1b8Obi?~!7C>_n)ED`U68x=xDj3$EVU`x7K55h>(HZc;}PkF!d6pmvX-LC zX3<$YJFF zB?k6xIeoi#mfliHCC_V&;h;JXat1hfF3|2MWXIyO#U`tkaN!T8-(s!FM8^hx;~i1D zstwq!7L5ygI_3g9!Dw*{`|zSmn7Yn%@9LG-flai{OM(pm?|9K|bdR=UAqCK}qvghH zs?inI^QjT)Eq0qYcK&u_mjk9oc>B$CdoQ-yo07b`lYbQg<% z`umr*}Y>!IPu+ZeF7 zRG?Be{E=iF@O=l3muV-uY+bFJ_L?c4nU`y$_wnO?=`m3bc-VccxsP_W`}g4G7U(Cj zeYmS$!>5W&Dc!}#Shg+>!i-eahb6aa`32x|4Rti?k++4#B)_!l<7BmkS=A!CxU2W* zs^9y)C?QW&dDvkukmi-Z2yQorlWr6HFwuOygPSSJKSBH+{G2~PwlQv8HpIgX$(qkaqB!R(o20T zs#;q_I#B4B{zd1Ic$M{()>O5pI>bsnx>2_8{+C^5yMfo*=_lcDt zkB{`ft|hh97owKZVjP>)(h^82XaF?I8(o3~33e#@_fY6nl`FAehMcH{d#mPBUg=fU zp3!A^RXfxkX`OK3Ro&-oEx8J&JyH%iQPF35xAJ)gURCWGU4~ax`G5mfuT;>{Ue!&p zbLK4iIro578$AkBaGb$oO3S`!m&TumK#RWVk$?bt@4hz-Qgh?Y{Mm0uaH0YvwoUq?49yi&!$ z+eqOZK~B`#$ZzG|p=(KdRgGHe?p1Xm?o}lpu)*rJNoPoVRWa7a4_2s_Y6Uuy>*IV1 zM@=|@r!W*FU?7w0zd$)r(PwHb3zuG1?HTRqRVCXIuPXU~uL)SaAlIC0uPVmca89^Y zv(Dok$E{mnmRp{)sD$pT<+gnS+xnD$Z6zE|E9Zu}gBrC*sXozk2GWP!P@zz>%k-T01X zso=>nc^FU2C(Sst93_T8$mVK?swkPD)fGr%U!-nF2y?A&QVNHvmu027t+0SVa&#f4 zR2DQ3rGDl{w-i=T8(T~p`e$s6;zeewd?lq|n^FqXP=^MY+Zx>zhnK^B-xNnTs3jCX zc)5tgm^u!s%15Laf?TcSiP5P4Zz@s@K{g-e!Huq@7<{b3xfF3ADTQByh?GLn7awFU zv++ZsB|#irafwkqH=`{bXq>aKfsD?C8!s!+ULO{iVhGGC;gl#Q@FqE@5fhiH3y(yk z6j-Y*1{L$0Q0%Q6h@%_sj;D|gronyq(c^Ugq+6mJcE!6xIDjca=|tW2r5J*0OQOw{ zQkgs82DjbhoJ1TZrRu^vBT@<{>f`Tr$=p_vy5ikb@4_)J&u1n(wx?F;@r--B{8Ob* zN2k=Ub1GrlC39P&U+MujJWMaNh#2Gaiys*yUt@lWKE%RG!Cf9Gqpk3iOORlAD2Mx> zAqO^hI^u_IbV*SVBxkNo99Z=rYU0j8 zcswTcrEmoPd2Q-h`HYse;7QL&KKo7 zho;y1>s{atL8$;`<}4O#kG<$yHJF1oI}KB?cVt%4 zYZXU#N8+)FAJ#l}*104J5^PgsU?5>S2h;#+XN;2~$mVJV3*EY*YgT}xN8_@HTcdzc zTTb&oX6MiY+L9%H3})4qX)QSF~+ur2h5tQ2g0|L zvnG<4S-o z-L9Kbr)8jY@KUuL0Qlj!dd6){uEX%5{H_YhZ>w%KXD9CUks!h95lsGTL0p`}9+N>0 zeNI#8M=9(G_?o4Ids34Rs2LdZw905y5~Adg;$j74giZSF4Bj{N{*}ht zimU!QM%mw>uY?An4t~(m`@0RP0v_yH89WP((<-CLOOaRE)O%avwu*4v2Pr&|mz$oG z>@5(>cIsc39!q;{id`xWMNp;))-+Y^2#y=7c8ycNu4ua#$B#b;d$?xYe!YB75j8u9ZPWn1W5|C&nGzwQfSLLbc>*+NedoOz}nhq0I?qz$!{Qs-;(w z(>|Y~?I_wVMg<=3>`7q3=^!J@hD%o|{217zO%aNHc3as<1hquM18OS@O|HdSDzY|R z4gR|kN+WfurM#wDKBeqP+OB_I)ske~s)^pLIxYDsl#$Gv$!YY*#M=)^9c%bp%PyQ~yP^|+Q<*t? zF)i(X>NQH@5cJ<L4Qg9!7m6W)M#JB4hs)d$as!HSc-TEZcaH4=?<+Na#Ghz* z%@1t7{S}4*8V!p9-tCcEq75he*XziN?SGq6U`*l=X*;YsLt#I1rFto*1 zq*Rt5L4v+mnpbg?UKx-Ymp)%dpXtW4kbWw9+Y3*-(eo1IziGtNM&WiVVJ2#_tMQB~ zIlg^5EA$)dk+j?h7!mRS>havU@&Q%F5jqX18^``j@+=If6?oEoTc6%#)mx6Xs#ngb z1$V+APPZ5Jxd_Jt6Yg$~MwuT}N>aHGr* zD)QI?y?!rdT<*O=aYj|sa>3XNd3ng>VLv6~)|}(WT-?k9^5l&l9kWFnwOodWFp2vT zJJ>!Pl8=xZ3}a2aEDKWOH@cRrZ4S7^j$78KDBa6?As*mH#W%XSXU1&3a*h_<0dApz zep0+6>S#}LJe-zQ(g~RxY9OBva(vwVta=UhNxPa?3p~SK4t8N)|E? zXa(LV&b8EhXzSCvpylFLy`|FF7?UgK)Pg(AvMOsS_S%gHJy!ZH2u2S_;vXR}ld>k1FPZuCC9xd}h+Y1IIWW zEVg6uXI!YOUFv4KP>xp8OUwPhlsdy& z>eEQK2nxVX7v2b85&v;D!@$7nxGoWe!6j7|@RYl#pDDdGaFoN=_B@P13ZKQr zaNYrS0Cnxixt4}@Q`~R|&1j5q1`WS7rUN4CX8}+zEmPDETZ!$^mP|PPDWwWkeXxU` zaV8GW4-jbuF3}ZCTqH=aJrN8E!)=5cda;S#c>-y>3ovi4cEj$-TJQriL8l%^5hBuI zTeQOpu0U@iY_d1x&J#r2Wn%b!cWf~mUp~!pi`G(EZs05Tp+Ge>g#&*jft>1XEI5%8MYz6XCQK9BhDunSvPFO8`!8`PG) zII^+y;w-iEgrx0qb1|GGobVfnyjy&=_$mzwXyw>gH|FK_pqkMZRRTkfE?ofaL-D#R zWT>hox$}gi?Q(N5oT?=z29G5)Aa2NOR4w7D7RHvUAaWQ`(JYNET1#cQv4z@)qC^eB zp(Sj3=Lt#MEqRf}aI+lu3@T3Aj(s9Mm!2zw*C?|qaPx|(;xV69wfz_2le}0HZ#-AJ zu)XxsdaRG@i(p@h1PKxh4vxy_>ez*j@eQ4F!tV{^+_s<6%StXOxno<a0 zK2~F3wISU0gLX#dG+d{9@+(B$1s)M#+iYNJmp%B=<1h)XvkO|tdfgp$%@PsT6`dH; zdDZ@tRdI*3n|PE~3|NK@1h=yQV#$h6$35jTw{VB3mQ&JFg?qR?as_M2#rzMz!O|EM zoZ{Bll7Neg*KF5d7m5%EESQN9!YcWUc4{y0UeQ!qt7F@yEupE_|HsTtHxxNnR+gJy z;kxiLs)#6q3PstsyDPGnAi);Gm~`x3dyDf9GliZpl?+Q@>Ozs4%8s@zgoCbNugoOK;W zZdDwo-{1D3_5pVIv)qp8l$GJg+Za5-c}c{gjVx#r;t|Mmh6206mclaGKF+4#;TuUi zjTM~CeCaXRH@A@IW8V|eQ9$iscaF2OVeafKyOh~5dUTWTawW%0wz$e%kMBoTT`VVR6ZmEt?C!pe+~6-3A@x9deaxIyF&zd=?@)W%oPfqhm0dg*@Ev&_)*I{Dqdqi^qKN z9`76ySBqN;Q!>jhGv~_vq@7mg|1V5gk2UrkIc;$^FQTJ>8VWkVoRR%pk>e)Gw`^^J zka3&5C9(15auw0K7udbXhfE^~>p5=mVTUg1#OI2v zCD#nD8pk0?Ym1U0Rs+!}G7pe?f+X2G(3q_83`76x-@=V9x?Xe7C=mv|%LO*Q+6?Y* zvAxKWOCTgiw!q_mT}#cO|5eR>@Q{-$zr%InQ$+CAw~!l&8(eWWF;~~p-#L!Uz0u++ zm;9_ac&Q*Kx1I5I3J%{8XHL1ezr~JfOI^|FXHC!v!_V3i3Gp^Tf@MKFX0Z#hz>3Q0 z%FQSY?{1{C*1it4F-6&xTNazAdIKrHngG1{9|4+`>&UMWIbF3Gh2h=RE;j&!b)t8` zsHrWBBXA<$f@wUW{DL9?Z~kE_IcAT%4XR8Ox)PPswQ(~F?cJpp77j;z+@Dw+ijPas z0js2Vzux$O^z^c~R4$GK9A`wx6|weU!r7nA%-glvK0bPs9iCB?-{VXYfc^Ep=w(B) za`n`GR8H5X%_vOot^?Nt?N1DWf?2RJMXn;ZEdH^c{MSo%eDSB$63K3p1dY2vQGP`n zA^_j8K9{-*kYn~i)fY_$a=P>`A~&Njy}KMLGern$Nd}S>?=|9%lUo))0seXA+m^Ag zf*B^eN%mK-2Sxc6afkriT(_%TDabKfJ}L%2vmB~1IbGb0f+_DVH8GCdk}24W$9s#% zeCrlaQoLSc%9UFd*P;BTV$Jd#NywFVoOtt_Vvll5q+ms?WTgCB-X0EtKTARw+I=nK+BByG><#eO?3f#dlK+8DZJv?C95j8 zf+cfE2g#Htc^q(0D1CbKpo@;KQomKS-L_VsWk!5)rEILb>Vk;Mn-Fa;8EsYNR!|Jy zkR1#z{YWFC*|FgCCO{t@U8#O6X}f=>6=+8oxHBq#3WtdvbWvRZ+)tInZqs1lt|9OK zJ5X&#S{13Y8I-uyH!~$GB1O6~PSkVpS~<6Q9)P`dbfx;Or0t4$N`Y36swqA?b(vM_ zrn-PN#GN)$Bw3J64(kc6N_pE!kt60nQ~^q6;i}emJ}=JYA;Z<_&4AuIx?25~XuBD$ zKwDx^b+kY&-5B*Qsta`Ea=Lq})>G&=ev*!%MOG*d>SoxC^0$^wO2Gy4`J`h5!oRhilmVNYki91G zyg%o&@Zk!1U}rgbVcW{zdi5;&ThSw1^1e9bUVP^-Q9y3T?u-^8*)$`kLjNR_PLPBf zK-j5GWgr~s;iM=$yl|B~RcOkPzc4ZATOHl54`7ErSeG^ zo|%5`2z=jrJCybMO(WP2?Avxti!=QAH@(G)gVHISAShliYEsCHoO_<7?QMdQN z^7!mA2lC#}G{HLKh+qB84BT|)A%HzoTm-|ki1FBqkU8;5SH`#TZ<_*-b4Yt$GmlTh z@+Sa(v@kAzvm(9OVHz}yaWF2$!NA{+=DzyemoY*tTa^H_m6s;K3mnX-CDX6A{lMW)R7AikECPHRaAZ%Zqvg^7!^W!_VM`0F^#AuSfPO5F zYuzuaatuB}<{vf`zp2^%O$bw2!;dqVaF%5LbQD-+j${>tP5P_*mHk#>d&J6~8BUTI z585^`cz?w$)v)!}Dp=kfXmVWFMYm|&xMTmR@D5*}pf#33=)QQ-a* zsc8K{Swr|y^(PDo0*Ai}sWCQ}#wnpMFj+|t>%%MWHr6~tmKssnqmX_ca*d5?k5)=W zJC`M=YfohBBQUnCr`)4hGh!c*#rDD3KrX`G{gf~!cVEzPC(+!n>Z9J&UHhc!r85?L z*er4Lq8QauX#<0mO^nC8)6}kfL)L8{!6O6NIEnXq#mYL7f&Mldho!E=HJF}$p$;=` zi4(~k3Sjt#!+nGE)J4Kd&lVtE9F?N49_<@5^cR?A_Lr3#0=Ac@o2tewcXRiM%kuk; zD%=5egoOVLhO=-^0~M1{dzF4_*NEhPhUWb>HW6pQ9!HiHQCX7v9u=5U%pm5hnE_TJ zTgEsul;*6?Z0@^jlyBd-zufGf6?;TugBgM!8|OR6&p+c8>U0C~Y1Aml)xNC<*r#o% zOi-$!{I%XpL0Nde$VOfuP+8n(z*$*URmBxS$1!CG_3LRhaPf}p^X$vhzkZ_}qjqh1 z7-o4@#K_aI+DX?p>s{YXJ@BOO!M;$I99Ecj_C8uh`x4qYVkoim`bX%GNOwtr#WEjI z@+TWv{rA`(Qd*1V<0GAONSk7Ri2zji0W9qCD7%krVRZRd@Xmqk!J~Co5bDQ|#MJy} zchgyKS|xWp&jD{oZnPw+G$foEPdNp(9vI)Mr`P%tU3~^^fLVVhD;CQKg+Q4<(FR(- z8qRa%@NW#Xr($pKZYj>dd9~(SyrG03U&5V){AJ9;NhYa@SV*CjB+A)S0C@_o=SQ)h)cY01AczNNRQfbj5KiTqw{to}N0LP+@w({E- zKE9kc(XX#!D{X?~3Rk*|Ir2EWvM1fCrBVj=b|pviv~XWOtkZh{&7hq`Rhm@q3GMdy z^(srgshx*MgPH#gd9+UAo0RbEUtYQOkBu`a#p}ol*9M(Lm^2jM(+;R9z>>;Dv@`LqNZHHL)Qr<~lBJ_PP z)@Lzx?l^0L_(TzTE0=a<3%ndc%etL!xC{SZaQlp(5ZHEW{ON@&I?ZKq4z!~+U}CCx zVfoH@n+I5Y%gAl#tQ$xi!`;(}R3j-_Shd6+UX#fiVOzwg@HE|AJYKu+Q)yOPdzC=D zob(=|C{w>2%%r415JPa1&rNqA9QiGmA|U?xIe+=cd!1GT?_VYmYJy8OOO$uEG0N~d zI!>;)Mbn7pq|o!rU1VdSYz`^vRm#W29Wn%RUmP;}j)#zHR_b^d52YHsMfi22(?fh@ zcp_SRq@-;X!Lbp{>l}>rq!Bz?PMR(miW->x*5M_jhSv+;phw|0Iwyt>EF`}&F$WK@x0T)+^9rBEtkSk*jh3r9(E3wwub!0)*x45+V4D>diWZI zNL4M-r}$$8#@LdceYy;TTLeH-{x;ZSvb?(nCI`u;6)x00K}jm~!R!y=D^!2lEti@= zN+L4KI@(HLqvKg=mH;puQn&=^3QBmh;YeZ}SjnjnrGqdLPL`+Y#nlW@KYcWdF|evi zAhn3dvsQ(6G0M~QI78IW{WdSVOe`Tx?Z9scNL-ukE``7_}rdd zjPVvk$xMR!f=c;bM71Ij>9sT}i39m)$?ztdI*wtrsr>xp6tb45(Z9Od? zuQtHTRF8LKeNdyd8oD-_t+vl&1u9$B;NL{%9ttpFe%GI|zz~4#g~%98yN;wX4P`ag zlF_HDe|F(Wo1fq!uut{_9^h(8(t}_t1NG_4uFrZlWww6gZP$ecbP(3H@}(@2RuOct zC&}zSZZ>q zSk1vLrrthrLzQZ&cApoQs5y5kf}_DQh81^XjZcIa6fnjpuuVR%of>j%FIFT>nRFZBso z5hrP>PLcl-OBo3ozb3+%&V&gu|HeHVOrq~uK;YGojr9Wq;Kzny?>A-tEm0M)tcB#&>0UD;yeYx0;z1u+=IoBw@hH7O=04T+ z!=f0-^+82)OdmO<1Q?osYZN=$ou*YQ=Am!US(G*^P{E?90#0dj=wlDoA<_+%JsFl+ zQCK@&#)@C)0_y_GP-eYQPGi}VahE1Kcx5^szx*UPPl4hB>_uM zLdR}Jgm=04GJcO_N(3>;xoWV?VV31L3NSo!6KclJG&d9TePhJoHm-4zHW_b%lDjN%w840w1(R#FBwLS*+N5W@DF5 zQfib#`{d$6^z+koBrpAb^8^u3SRwRn*J+f`1W9&}qn9YH-BX1~ol5(?20!I2}^y0QSg?Ttz$F_QHzqOJ$#4z^yW1d&$14~U1YY+-ma2}-R! zh^Ht|G*g`olc1P!oktG_t%xwTngljd&R<`b-o44qwT}DTwy?wff|XS$Pylm&gTWr$ zd1Pzs4Vrad&Fb#rw-RSgHt~p=WX*lX(=U#8PRDn<{vaEVUIkX09|2@)z|0!#NEh{^ zSdKD~+v#UX-Bc3h+}WP}QJuzL-;k_Na^=H13AEkhDa33~y^zjf`-5tH^!;ORki!E8 zZPF@tY2#>#u9lIW@nxE?>1r+n$^e(Fc)s`o-fmSbz{1`^L7& zUXbtV*O{~-She8<;}%R`^!ylvc>`T^iT=T6`7K!oF;k1 zi}Bxw0P3|>qM*<0w#Z$6FZ$718^0{%)7etABd|$gknPD1BavWzX;L~>ldnU~r-|Sw zuhML-G2lZq%^VimdNUt5*`*~o&VJ8AB2GGN#Qj*oak>hx{r-^m#}lb)pyQa>gl+L} zru9Q-Iips@cQqk>0!1y&I?kT+BO7&67(APY)DiPLO@j^gcs8acg{XgFvUl`K=z@Q) z3b)<5o(y8O?bxBi8&z~Mz_V^TgCoXFhXB9y@{gn65K4NaGtXeNG|CINZFHV_dKyD$ z3zF7-#fI`dryyRz$)(eH87vD_GvD!Sa1zoT3y&2D$z1U~u(5vQ85TYSA*-nQlH%r%c=NI@U9S`rsprfs`gcwS7mSyC zQL1?2K?tC;G*u-3Msu#~cy}tbe=h9uZnenx1_LDW8PV+!Spi9jUFAm`%4PtM@Fy2b z8hXX3M)jj50;TD|2v5cxbeTFOG?XYSMHhaLTu42xZgFEx_9DMrT(Gbp4|<+$6HX2? zST*@a8}g>anB~!o=mfW{&Tj$N7cezopUOPt*B}cmtEFO?zLc_|(o_<*^o%?_hF`N( z?qq5T3jc?hEV@fg(zE2+mP-7P3qb0at;8p@plh+FHG zTL|+*LBJ=s;eClJhKP!>7^(fzB=MhypRKh%0S8c$VD5n8!5C>$3_#{x2b3&0-A8}k z181%8Ne$7ml#@yFM@gVKrUuOLA?hu{IaIhD|e9qsqAi0S& z(H_>>w?1JuYbu!XOI+70%X>wpx&r&jf2cFV^4^h0QfDx5Sa#Dra&1;Gz!sqo>-%;n z`D%?^8g-!r=zGQ>>-P3%yez`=TmN71$*biEceo$!8zl~w)uOY`&bBo`H-xi4#bwQ? z^&Lf1QLe=F{W9-xZJ3FD4ffocBR+bI1ME5Ma2BaJFF)Eba8h-unAox(#=F6^+72!7 zTCt~wt9vg2Xy4(X@K5WS8J+0Pe+A-xaR1N#HF(!Zl1URwv9)|ebNwl%gQcP{Wp+~} z1!R;ug@+{haP+8FKkM#fO(S_xFDMp-ZH4iCSk7bP@~`W;oa+g8N#O4MsAF@?&y=$c zM|CgCq6>=p6XrS3KUBpQ+1L5lnZAA-)ha&Xt#6|CF*fm~$5)l##zodbN)@@{E0v>) zd8zT-RRy2zMxH5|r%1WyW3uPxJ=6$oZEG(ALj2Kt zGZGl3Wuy9U4rU= zgqL+;^_+&!6A&R5?cDPE9$sWi2 zSnW&2`K#?q3au(CqXrcn1H7y%Dl8XEoj9DtVSw&l5Q^$AWx7oMW^7Hhdgs~H&~E-a z{;*RNqBG$lO6ipQ{=e=M0lSW^&4(o~B+^8`WusBmGQq0k31%{{ydB4++*(cyKLSb_ z&ree!bO)Ys8vCVRiy^NTiIo*JA;!KBaL2rE1*jbNZ@)^WfgQ02S_FxqO`8qa9`uRE zkj@s719Og~z?~7JZntqAJq#jECfuL&)5?m)(m8nsK}HV8q26;G1E=!?JO2hM$P{22 znarSTqQGa2#E-&~Lw^+Fz1+Y^o?=A?s?J>(938$4XrA!>r%MSLJ(s|=iAPYtI?>~D zHWbu-S5BSuBKjQU7wb(v6MU({%iM!DIRRf`t`qelqKJo&v7${K?nKxokT9sXAH9OQ zwaczPpCi|vw*VoJu4G=UkSW-Yi={k-m2oXE+AUQKuQVn8a&9ZQxHdD7f=pZ4=08}$ zg?2zzPrx=b>eu}GX`atTrgXqLALO`;X?#{E~;}W-`B79A-L(^QqCx8r!KB9Upfb8@$ zQQCvP4~^s~zh9clM@KWKKw8Ww2)pW;ZXAOLN{xHA+!mSM$mkjK(Pix1{FS}f8w!Zg zOiiP7svnoM38ND!LDU$*R1=RSZ-;ok_!_ajbDi1hpRu1PM%uW*;@aS~H%=o+RS)>B zV2dYZ6n_<>iLs&)R4S9JwsC0CCq--Y_P(msnt|Z5km{T+4sP0$dAhK}$MZPtM{)pjlY!EZ#RX~IET(n(?b%(o5{k$8wGi2Ju8?ENS;N`W%sa#}NH zqRRqVnlI|YFLQ^JlXX5tWe<~DJKJ*~b*ZbY^jIa7%QaXZ4<#dUiip0n92D{&{zgrJ zH+q@$yFTL1yxk63D(>l2>PrF*7FBfI$+Y2?Bj2Uxd}3+ZUAg#{9%o;`Jwo$e$YjGT z?)LkrSK*xAp$(nmH~cDQhIZ!wkE)o<@>SHF1CS`08l9=IES)&8m#8(NuuG+Q_9uR| zu#0W`h`?|D+`L+v^ioTg(e>Q!in)OSd$@?h5Z03W%$P4t-X1#Uyhhb!G0c|0W90Ia z-xuHdST}m*=GWgPA0rq*o5}g#Z+r$^0y9=Ekhl{oLd&e-R?e09HtA|~4b+*Q?0x241F^pDDg4M|f@`yR9Avl9 z)zJ`@{6}g-&i@9GgVMmsmfo)H`Ixg0nPFHe``@aA&ByH~NqUB~<4|g#s3$=Bb^jqRrV`Gue z?Y^?KbgfoXx;y>f1P_6uT|)#{A)eoIQqnmVKuQ_oR@1Ra@n)imev*zMsE2)r-|D--MT;UOEuk>Bya60hdeD&4-EGDSWk&mEtXQD>Ehcj_NRKtsr!9 z=WvU6Yw+?V!H#xZizoP*%^vFz0j`11(vJWu$bNFx)URJ>>F)<70b$PKV4HHp2o-&t`}6)Y^06niWIqN(>h1AazVGm8!K_ zZoOHm$V{T(MzLL)Y_1VWr4soreyJN_Gd;$bQMNks$uN42UI}dkh5sMr#5D8^Ka=kt zZ%hzA9$;Nd@_1B9=c$fVgyfb%;Ty8#Uc6Us(EL5|oYMPzW5H6ip!bX`o2Cm4vU4lEcDs z^b0av3R0ej%73i(|3CFyCH`O=z6O5J&OK?RJ!E=a>xu+!v4McmgvKLqoOmVcZTmiK zkPr^GlmBu|nMFYcDTziM#k4XM-a`M>LkYLLZ)#|!bf>4U^;zvbDx${_$`p>OvPYg( zQ^>Y$DO-chA`Z(#?19MVXxRl@)XODXn6d_!pCWR3Ch5_oo3)M@&BYy>LbYg+3-9*CI?Xd}{~=V20WCDMf`roSxmm_WLn$|q9h}w8Z*b36pCk4vo_4V zBP*q6EA^Kfxn2BR2z4mjw+y*`rj`1_XcXC>=yl=J^`IE(C)KwC+6#IJ0dw$S>fD;9 zFD#4Fa(TBH59@R>MVPU@A5|H4Nk1x-aD+r7OEnm&Ae=2*OPn3g&?C1 z9N~B7wDhe%5_%O|e=t#?tpTpsX6(8B)jbzSBIF|1=o&bh*;J%9<*IST=|9uD-%XD= zqaxZ@V&AN>J;K+aYX|L91^orY6|hMsVVBTNnl97l&|a!iqLS8~eghN>GMgSOZoU-I z{^`qX;!9EPNN(f`#D8B3E#ekg?^GV$t$pg0VDRejeAAl;^CQ1=D{0wh%Cux|Yy5^xFhZ>A=`1CfFIAZ@HaDG`3!{-kun7pYakUsKuL1NLND1abk|@j6 zK-VfFyR!Tphq!6!@AL8N6=QLI7{VaE{9Z6IWCcu5rBovKiRH_hcmb5+{YU6giRPy0 zy+zx+!UkD?H2NWD(kZx3SI_I>W?h-QnyPek#XaGKL|JJ6T#u>HP*7^?zO~}fi>b!; zPQ5FHm?Oq0iVpi%fxQxkE}U-Kl9Z&>M!XQGG`^gAL|Er3Im`yigbs#JkoBM5X7X|! z@tZ|YRwsO0yc`3z8PhzYR(gKz8EbMXAB8j$0LVK&sa`8cN5g0w_a5Yxf;kv$Z8&p- z6O8hwe68Ct3Q0VW&T#djsW)#KowwgotVbt*Ok%)AB#5iPiVZPaz97en6!|VhiLnW* zX@gC{2*hN_LQ`*S!WC5TU4V>=C`qF(r%T(3L~d(E4@E$;1-Iq+GTx$k7!uu>&(Oq; z|0~f&Q$?0&)7G;f4O-e$OxcEViBzIsZByD6lB<<=MrcO6+$g*?3(#r*D7&YUzp|jy|ZBF=_K6(M}baXonU~!@z=Yr!TTRzxvSJi*>7>l5wzy zW6ZXZuZGFuL0J^ap0urr=+vbY9ad<7i1V7C!cw6&{AzkmL3#SBDO<-wq*RV^8pHqa zTXZ8}R{QH>{ka6*bc^0-%jXw$8q+A9bgG?IPF``n=cD`MQeoDb%o2Ad{&pXZ7A?_z ztK4E1+v3=CFER-&j`5WPzlG|*tIj>kshE#Ccp>lXX>rJJl_wIn)>y1>Rz#^bEEvbv zu+`z|nM;{8lIH}-P4Qa+u!5jyx}e-f=>jza`18>}I#<>xN}5_?RQI{F(HZc^8k(lK zHCQC(?7^RQvScD6$UeCyu{rGCpEh09@2^v#Rszr|%MD?EpsB475w$a9^To9= zY^Vx{Eh{U?7h7Q7a*{`dg2&Jkqh3}5PUBCNdO zyG9;w{$5GJXl9^Kf7Pxjoj>uF@$EEKRd!qRl{j%rP+2X5H=UiuNo+W|o8JlA-~%(x zjroO0tWk#s0r9MChQ&5!v@SGVJ$J~4Q8 zSlMH8d4+1LSFN`L|MrziVf2_m*BLbgA8o|;0lm>^sv3?+jyfJw>FU&Os%!5nhFkTE zbFa4@g`w0k4iW8l)Ak&_1*dWP9LD(&$NoE{(864SAHWxHl`4yka8C8SfJS&=7hu#* zmn$=bgoZ@j=7&e|n=pSZgrQ`)qQ3`2vr=$ECkk~1m-dyAvF&p(4jeZ*-nWZ8M5LlA zdiAp|{0(0klP0GM{IcAE)G{0q?SR~kD>Tc?Ph;HU#3*q#&thD0e}A0DI-8InG|Hlh zl-nUx^Z?48FogA6z%JRW=2RdYk4IK1f669vrdre~<@M>$mbCtpZ11GXwDDq1HU-cO znbqSKS6gY)VU@b=x5LUs{r%sUnMwAk3c!Ghmpb*~nTez)`yxR!j bhk;Rl-q`kITnmHVBmx5j$ctBs8U*|gTu!01 literal 0 HcmV?d00001 diff --git a/figs/img253.png b/figs/img253.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4414e3dc2c3b879867e8da94fc9c8d325ca25b GIT binary patch literal 22062 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 IM6N<$f`@7;oB#j- literal 0 HcmV?d00001 diff --git a/figs/img27.png b/figs/img27.png new file mode 100644 index 0000000000000000000000000000000000000000..b526e06bd980578992b42d555d98caec918f9b63 GIT binary patch literal 487 zcmV@FgL zLl<`)>H`QqLJ%$JDf9_!9zdbH4smvc|L-h~D1aQ`vU|j~lstFN1g_qKA5@ z_>~A)F9&vjjiOVvOZh2kVlJ^co1(%HI7LhUUi)c}S6}A(9-&RQN5?gWT7%Fyqu13>#f|wP>oJdE&9;{zfqMJBvDRMh|g002ovPDHLkV1kUz+~5EJ literal 0 HcmV?d00001 diff --git a/figs/img28.png b/figs/img28.png new file mode 100644 index 0000000000000000000000000000000000000000..b128d5038a45818c0dbe63e90a72827b9bbdb09a GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^f+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6Fr~ zmyl4~z`0;WqQ&;=@9*{|h<#>aV`DYY{@o-Ta;@#5eapdZy^W2WM-uM*t@{3sori}( Yb-lpG#h08UfVMGsy85}Sb4q9e0LF|_UjP6A literal 0 HcmV?d00001 diff --git a/figs/img29.png b/figs/img29.png new file mode 100644 index 0000000000000000000000000000000000000000..646211cffbf20176281300f41617a97c788abd76 GIT binary patch literal 344 zcmV-e0jK_nP) z-CG%WnDf9cWSRh#;b-7w0@3U+rEH87F3`%M0|PcNfZ}ZTS)`_p5TU~$$qS6i(?lsGY_vJqsk7TL4!%HZQYUo;8q0^HbIs zI%VzOt8j+jz*BrHrF@BpG`4nLy#MK1EAgj`x{dAU6UXgMc}^iGo~wY1-mISEW{2vE# znxp$p6dgBurmq9JF`I4^(d_uc=Ii#&A)VuuoTC;Wm3|R|BC^~-&ZKOyPT~XkX+sC$ z&)fi}=hv!N;Ch`fhr9C79k>-r+eMxd0npu+}Nz%Hypee78gS e>%bXK7e4?CC4CpKM352y0000osEI@o~Oi3y^k8t5Zn4g+$40=x=f9WXJr2Mo`^X_K3A_v_ueAE4X8s=ZwW)m6*_ y3~>oiSHT^E;wltLWB|_+50FJ4ph=DbG5`SoDp8Di90%C|00003_XGwu0Rskx08RyT z_2^&&GdGk07a^ntF95oS8)nJ}B>n-4OeGdD0j*>Ldc2xpA4Gsr08D|M!15oY0?MD# zz`%zhzkz{|1+1TefeXmLpgpl*2w}#BPzEGkx#1D)wH@Mjj+G85 z(i_VafDEPyF#QKnbu%!e!Waw;PAf1CzYb)uJ=Z{T8Po3F2Us64Xz$*`kh4btF3h?c f2p*8()4>V=e;z6LkS-UB00000NkvXXu0mjf24Z#i literal 0 HcmV?d00001 diff --git a/figs/img32.png b/figs/img32.png new file mode 100644 index 0000000000000000000000000000000000000000..7282509bb60f399d410b856079961558c6fcce94 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^f+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6xA)#Y+zi|`1s4dW{1xV YZ2m%)Qeo;gKRZ^71TSE%#x_PSg0U)ihIwToZNeJ$p94+;1HjK zH&TVL#(h)72)!VlQsO;oZ*w2H4Ga{gWR_LGSZg+T3&%bTV!8#Kjn`CHT{fUW#IwG} z3NGD`DBaBT5Z|=iK)SzeoF73>yT>w-xiK`$*eKQ56>%P7bQ-=@s;|{Uz#*0S>4G@w zUFD5Pb+>F?oNW~Ja#M1o7+IZVSPCs&=5O@@Ecg> z*PpoTMXI`0L&eu9O6d6f{W~g|l&WkZznCB*{aj?4$Ed8iXEIymPsV>XK|El~rau^8 z-}0q)I6EiwhjH|LPNlulvLk*V?M1)_R&BQRe6m?wpEeH+Rx~|;CCVf)I;5>@kNueE z4b}^}!Y#FhOl}EiTZ%BVL;@_NRCg4NS~H7OLsJaTfLO7nctv=#6_=dS99CrNKO#ul o66J+i-`YrYH}o?O+DZQg@3?9^>gkk%=>Px#07*qoM6N<$f)HWDfB*mh literal 0 HcmV?d00001 diff --git a/figs/img35.png b/figs/img35.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5b65060160a3b21e5e89fe86191dd4a89ab1aa GIT binary patch literal 879 zcmV-#1CacQP)}(98S6Bz&?QZ4^kA`SBKW1(D)-9++ z)LVWE1iGUC;z+YhZ7>Y!l`*@LIIzM{T0p#?TOpMo;f>d*v-)x`@_Sy4t2?;)CZpc> z4^&t5o*@hw(xz}AQ(=75phhnYqaD;*aqgSvzG(B!Nc>}%vdAVAxwP7zH;1|<40xMS zHnn~wcrG~TP;r9t9&fs|n6{d7j-Ix}4TAj})X}A=^ou{3tg)h+7DCX%4+{yg64v$}7#SgBi;{??EGz(=? zP?ag?UAWDO9f;L>CQaW4;wN;CIpRgN(yS(;Qf`uR#qo$&hejt1`CTT}mL%;nb0-W- zZSCTU5#!p61gF72n9@muoYXQWI1A?tks2xw(MVx@{7i{0tC_qc<1Il|rgSnfJKw!D z=J7=$-kDVKeQQ6T?D-mLmq~c$T}bmRj1RdvJCf8*RVQy@9E}B4nTgec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lh1Vx;TbZ%t=m2c#z!Cz|h7kz_y=(St=nhA;3wTnX!?bhbQNT%7lgv24?vHUhNZ7 z3TgEY4z_9qt1dH4@?n?AY82Vd{G3VQ=(nn0tP>7b^m-U_G8|;)bf^{fIt?_R!PC{x JWt~$(695_KMBD%X literal 0 HcmV?d00001 diff --git a/figs/img38.png b/figs/img38.png new file mode 100644 index 0000000000000000000000000000000000000000..dc88155690e942fcb40fdba02248516bf62ac763 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!py+HIB&`YPawx2z$e7@|Ns9pXU;4yFAoh3 zefRF2v9a-)GiL+^1y`+F)zQ(BmX-!o=;GpX_wHRKC8gcFcgxEvP6Y}vmIV0)GdMiE z0g?~!ba4!+n3J54@E|22p@1QYZ6CYBq=$^m+!N*;U|{TVU}R=v@nA?&uxD8Dt(k$j z*`C>G$6j%tLOlkdoaI;b88m&{A{7?$@@!R@d#UXqFT=cRd>)A+N?t&-89ZJ6T-G@y GGywoaPD4=u literal 0 HcmV?d00001 diff --git a/figs/img39.png b/figs/img39.png new file mode 100644 index 0000000000000000000000000000000000000000..a6177f706e80b8763322469276aff00445324e87 GIT binary patch literal 393 zcmV;40e1e0P)m{h1q54(ft7*(0hkF-3d{)UZ9vS1ES(#>EaktF(*0U0IQjVfx(7V3posnjSV*BrX)N_zrpZCG~xR9UQU-HBf|nl&D=I- z8H-#8#x+c*5B@T1sQjZOe!yftll=sr1hE@u4;+X-e_#Papp3_ynJkRYrP$hb8koIi zn(>iGSVBuu|G>@dvn3?t8m2PHZkyhi%y@{wuAW`Xl9iQ#p}ALR;OXk; Jvd$@?2>{;%UUdKf literal 0 HcmV?d00001 diff --git a/figs/img40.png b/figs/img40.png new file mode 100644 index 0000000000000000000000000000000000000000..2febee93dca0751dee4392e6e6ae138f3a1ae289 GIT binary patch literal 362 zcmV-w0hRuVP)JQ0~buraU^5B#R! z!4knjuvU&P->JBE8~_{i;hco@4^@qdh51wU^zE+6oAYnD0prFgfVhdx^#A|>07*qo IM6N<$f>}tN0RR91 literal 0 HcmV?d00001 diff --git a/figs/img41.png b/figs/img41.png new file mode 100644 index 0000000000000000000000000000000000000000..9b193e63e04a8369b60d0c0d18ed5315384777e7 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz1!py+HxYAnq9FSuW;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lf>0x;TbZ%t=lF0`^DzJP8X99AH*)obi&8nJb|wsqMbQnX?VN77ZtP<<}e(DKkBh zz$~;gios)p1&a^Etwa1m3F&bRfnR4Wu&iKw&2F)oT~X>}f%L1mK4zY_0QU`b3Axz~ gyVy@=USVc9ygec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Ld45x;TbZ%t=m2NO-{Zh?ghe0MpW$b}9x6%oCLK7*+Vx8aj4u*u-XFAQG`LF|?V7 zuhEm;U}Xq{l6lRKy9W*|_%QDwL&ss3X)DDJESkz9z@J_y(_kE_{^3x~ox=xo4jjM0 q7brFH;DK!{%R1IJPBdD5k&$6pj$kmKylOGfb_P#ZKbLh*2~7aqM^|P5 literal 0 HcmV?d00001 diff --git a/figs/img43.png b/figs/img43.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7632dade97bfa9b8fedc3eb1df17df3b3ac0ab GIT binary patch literal 336 zcmV-W0k8gvP) i2R(q&eApz15C8yK&oT$^S-C&}0000zkfI*cpFo1#2!GIxUar*&u z^_YMKXfR<_!~&p&1q=)u7&d%hV0ZxGGlKZ+4%D*)H(&zV%J5%+VaW%R3t$080S1um zKsNy$a=-wn0?2Ow3MBvqKS1O`VY*>z00TpU09gNo1px{Nc}GC zxd1|#aUp~bVE6|l-!kMdJY#4A39zg#1WRzNbO6(N44{zW2IAi!t|m^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H;z>k7RCt_YV88+zP`MX?n8$#D1)EYNzyX8|+z`Y_KrImP12HQQ z3jlGz1)$-)%n$g0><=A41K15NFhSLE0^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H>`6pHRCt_YU?2=G05Jzc0}Eb7JU}HJ3=9Gc4BSA~jD$^Pg<_x% z22P+J243a|d_XE7j9~!-yTJt}s5(v{Rv^Naga8x7Ct!1aRU%PfSMlw6x_ga zguwyGK49>mU<1Pju)Yr+Yz_eoDq!^t3<&}XNbUieg+Eki33xU^856-Iivom#xSD|p z!ewBF@D^jT=%nE-Q#`|gblyayoc|ENx60tGZA*aras0KVTR-kF*l?EnA( M07*qoM6N<$f~;eGAOHXW literal 0 HcmV?d00001 diff --git a/figs/img47.png b/figs/img47.png new file mode 100644 index 0000000000000000000000000000000000000000..03d4a291d0dcab7f19d80577cf770961ba118373 GIT binary patch literal 493 zcmVdOCbIMnuRi$}UC4IkYxaIMLCml8)A35>>tQVw|xoAX9la-4TY_3px! zsUsXuWv0W)j6Y-1amrhNVw{jLw3o)S4p1FOC{0cSd#7vs20lwLT4b8XrNH1t^0$g8 zR|Xu|9|J$5PS#8n|B9`#^53A{H6%a3lFC@ZSkx(|zTTPIZA~mL`M0nW2^RFF$739G zPDWF7;QSE#*hCRN1TcJv977K!klCh`* z5tR@FL&}C&GBH4h>3U4CCpENfem>m6HCMdQ!QWu2JY@Xr%uvF{bQn6)pz%D zfA8M+&IbCZ1XzYCVgT60oNs0u=)%MHiTvxpYY`d+8=kR)AWUt|T5k~4V6kke_|395 zDI~U0PxN<~O{li0B_AE2zGegi_xT$Mpmf~^^~~*ceq*`oIj=-2?h>}2zJ|necFT$ zZ_UhV(W4T+Qd&TG;Uj6O%e0QDDCLrUAvR{B2l9tx3i(U$Rn?^}&Y$N6LnC?^E zo@dJx3<*jELeK(k$)tm$v1Iu0ET0kW3vz;3RSX>Cow&XG%}K6P5qH969*=<`0Sa>G zy|r#bVV8H#;PrX45iezW*NMu@^K6Z01JsX`p7T4EFXB=`_C9cs>Rj>r@f&EBBDqpS zy()ko?0KJ4S5K<)`jWwycW@l<-<1E4{_N=sXMPBX3FQf<)}vIilk#j0m>Dt!_`Pyq zbYat)7aJ(|y{qLd;?vd9rF>E>qt&a5B|b;6IqWl2)+zMf()ntEzh(v!(f^{>ziNI$ zo`sImDow?W=5V6Sf-n5He6u8p9)wGhFCEkE!!#wx|~(# zOcz#H_m*9hAtrR_+}sLn!O%^=jmS+8-OLnOOiJk!I2%a4R)D0kMVM80ZdSBuRR=D< zOq|6KTyrFY#-jaOW3oRwqTB@1B(00+h_ZK^9Hxf6>0JW8qqx9FG|euQDY_boXxk$zJH4mj_GzECN`C?NgtTkPWHQtM0000< KMNUMnLSTYvez|G@ literal 0 HcmV?d00001 diff --git a/figs/img49.png b/figs/img49.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6aebaacb2f32a96531f26df90be123dcc49d61 GIT binary patch literal 488 zcmVP)#wIKomXg_Oab=O9dnl%mf7_B#S{eNP<|0!1M<| z;nr-hAo>Y>LKOr?(BKILy`pL{h=N6wndy{tmXr{{kZ_X8J-InOy^k3{B19_^n~0z! zeSp;5H2{Z`;-TGT7Jlu{$VtuJBBr%KXU1Q*YeUk<*n^qnfnt`pI&&YhGF;e{4v}u< z30D^|any${)zOj%*?Pea`Gtypj!cfbffRv>XKhfZY2u*kMTm%+E>X=kWPwr`oHHep;Y;>bslYYv|ty~+c$b{Tv1K@<3oMCIO7|A{dFYZ!=$%x0$_XpYGRPtXVVnx zsTkf0un+=k=zJ#bCb(zh9KAE}8!$Ie#XA?l-phzoVq80!Ag>{OddXQ+%=T<`0xOr| z8~K&Z7QD>ZP>4sA@^>Nb$szm$DP9*2cfcuqT4bw^6ld#k6`L@pQe0tDld`?R{GDx7 e!BLX`Xu%t6eNq@&sVp@B0000%9M~XplT-SDnDXbwXPe&NlVy0m zIkaJ>&+bUcMY4+uZ@0@Dh&IpFIV!||Y(@feO9Fc`8{4$cf7lY(-`v|P>N!jLkpbI2 r{)p1UONAp?0+#M%lIW4BIv~N&7@->zyr%Ix(9H~1|~bUkOvA04Tr*0ACxAfcqATR{UIT7a0`Q avNO!f5WD44Qlt!YC4;A{pUXO@geCwi+Fkzu literal 0 HcmV?d00001 diff --git a/figs/img51.png b/figs/img51.png new file mode 100644 index 0000000000000000000000000000000000000000..08f8031fc56803ae308aa3cd83dea0926d4e9d9f GIT binary patch literal 682 zcmV;b0#*HqP)831Pg;=@AqcL-R$Lvw_>4qUy*t5%{TA8 zdGlrh)N#ZDQebO>HQ>fTnE@{W=NHs4*8sed+75$-A?*o*C27=MCwdEpK)whl$ZWup zG~fb0g?Cv98<#0X9gp99q-F)=Wz0)spuSQ64<)uXE=j_~w1pEQ6;fo9WgRO=mo*y3 z%3$47`c2G{`G&+TCAJ6`wBFOJeYz@)JRv#mJZeTP0ehjOc9Zar;&{G_+Ei+)+u8}0 zbWkK0N#O<81gnfL#*pF-ei}+WI7bsbjz8Pjj^$z`!Prn79`I|1&XhXSYYXvV-1zK) z0S~rAL!M{QL_CrEWaNIbp#wbB`u(XIJmyy!IWIbav_Wq*H=NIY_l_$U?c{O=9n!746AkNrE&?~ykM4T)P4ve&QJeMh z=Q8Npx`!F-l}fHB`Qt7_y%pgQ)Nh96`l6WrZL6qx*+|^_1M>mFoWlsc75f8R1-@dF zrjP0$=FM9Qglm0uI;ZxU8;C0ne==(G61`D7@vG+471aX!!?XPo5AZ+W2U2%-EkY#H Q;{X5v07*qoM6N<$f(dvx?f?J) literal 0 HcmV?d00001 diff --git a/figs/img52.png b/figs/img52.png new file mode 100644 index 0000000000000000000000000000000000000000..0faf8c97502883b44515d8185adfc6a623a9672e GIT binary patch literal 345 zcmV-f0jB1%kJF)3<3!td7%175c%B)9z;9r!RH06K%YMlNJ_E9 zGYGrHVoDb6%*QUK*L8K#&fDkTSCmGcet@zoZWlLt#keG-+E@kI06fsx>(Li9{na zu<6qAS)lZx<)vk*@vaTGqC#0@{HgVq3YE73rNL1`oMnTMH z3WzCRbVx>3uWWv(g%~4(tf{$me)~#k@~{ikpKpn?99Mh|daUsWI0oO|?fDGfnwKP0 zthqred|LK`upD8>&MmNmoV^Zt9G8wTG;;E&PMe6>E&9%tY`oS}`A>WRhwnw(JVG^B P00000NkvXXu0mjfG6J?* literal 0 HcmV?d00001 diff --git a/figs/img54.png b/figs/img54.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9e627558c295b24758057b1d37a999648e8812 GIT binary patch literal 445 zcmV;u0Yd(XP)b40zGi@o~8w! z_HF(F5o8Gr;+lBCS2&=9U7#H#d4+vO#o*nAoSgtZh7lD73wOpFgf3o!Q1c=v*D=Rx zD3*l@Fl{K~*y2>^(c-pEk(3LSO9b0z3w&@o;Se&VqJ6pfK@0FQOZ%qaQfneBaw#%% z?NfIaZ!LNJNxZ3Yx+FUD8@23TwoJVix|z60YG70N%&^862psR+3SfM{2WWj*t5#AP z*7(km*r`JrM?AmM@{B&ecrFcVd=%gXHrTg|M-Xc9S<4Qp2ZR}LbggWYia^79RVCee nP(5naZr=VHq95#6$3Md-PkceoSB$Bm00000NkvXXu0mjf*Oahm8(-L=n>e!w00#)g1s6B~w(!I61_qEH z6rhqDE`S&tn84iqFtrL)aRNyI8Wh$6n;{JD4c-^vqC7Acf!)cl8Wd3h4EGr(fOrZF z9H5wEaR>+naTh>T`Z6&51Zm)BU;`V^0T#Ug@f$nyf&>PJ2Mpc;FzX?@Sawt0UxOO3 zen8<$GcYisitrp@U}yxhdQf#fg2e?KFl}JqbO5s=8E(VO2VzEG9JV1;ft2v?hsGzz z0R}^c2OI@ZNj?Q=(yQJL0u>vK-kR*CXXY#Jp)^A9tGqB Y0GUrW%dj})+W-In07*qoM6N<$g10r7%>V!Z literal 0 HcmV?d00001 diff --git a/figs/img56.png b/figs/img56.png new file mode 100644 index 0000000000000000000000000000000000000000..23a0358cda345a93eab3afd84b5a1216b2160011 GIT binary patch literal 416 zcmV;R0bl-!P)hU;_g;gi?T*0^uy+ z-hf*RnSh6(0m5Kpg$XekfbC=g;@!I;ma`-4_yA=vb8rf<2w*jpjq2{C7;qzVP6P1) z28i3ax%^=sWZwW%rN9Z(0Tg9|u)z}lfw+42R-gos$BQJvGy$dq$eX~x3JSIj$l=D# z#KX?81xW{1SD{HTVOKTM05C9FcArHO;AUW|Yrs_Z6&6lR2N(0vM^Kw z#|DOr45%{D45+<(8#WCL`#CRQ*TD7ws|^f?AP!>R4Fp@kG7lKMK_Wa230O5~q4|!R zA$9i>2K534=FJWWQSIG(a3v0iFrxx48BAeZg$vJa91^1d4FCXCQ!|<3#h$MK0000< KMNUMnLSTaTgP%(P literal 0 HcmV?d00001 diff --git a/figs/img57.png b/figs/img57.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3d10c4acfeaf1bab0e341f6673cca0cc40bc80 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^`XDw7GXn$To-8R7AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAq$~;uumfCpp1^iC;oU;)kM7o`PON@&N{)Gn_m+JUltQj2Vx1D}E^|%T>5}?7-e? z^9ww7`?zPgDKKo3ymR}2$mwH0loosxF!W<{vtwhEV{3bLH@fi-%L0SVj1g`A2OIe3 zpX7P7LuE>V=ar_Cw`@!kLha=3w!h@8XqMf`5P7wFgVzSdJ9zopr0AdDYn*aa+ literal 0 HcmV?d00001 diff --git a/figs/img58.png b/figs/img58.png new file mode 100644 index 0000000000000000000000000000000000000000..09cf9a357a3bc3fee64516f50754b77caf64d771 GIT binary patch literal 330 zcmV-Q0k!^#P)@}j8AzYpd3(x`(KXIYP>uXbo%si&S4pD_6B>f44 z;ASQfh)rV_e!)Vv5LQ7GBxVYQm_vXlVu}Q~?}M%TOdwN)lkDC5&b#;B`_6kEkVZ{f z9aA_Rt-8oeuS*z!W3b5k=eaR+QB3(c1+i!;sq=k#&DJQO^7H-YLF@H}b8I8fxaWYK zQ=GXPb&zMIVX`sk0XEq)OLpp0qroB2Kyt48%EacZdxYHeme=w!;SD{54R4tepE&Mn zk?TOGqhCVz6Uu`;Lbv5}h{Xn6nJ8+p8!|~Em8Ny_eKs|H9@;|NL|mfKJX|hl#yt>) zSJYS|^-NSWEiABFX)sB70jlYZFNsi2s=qq?AIAPs_h|;vfOS3M9z1STVb*+LJDnm3 z#ep%`;xz1$%qHLFH0J{P1=JG~jCu`uNyi|_@Y3tMwBi-yPm0000RCt_YV1R%Pst{U%fdj&L#@Efjz}CRPkQJ1+fB_F+2kGYK zMiOXXU>ERKU|`@XfEW!#9~d5h8M}9HV0hrbz|imjw}E;L4C)Na9pL;62N)6*K$^V; z7~lr7B``2dfVrJv?FL@39Q*Fw0bqHs`bQAyXom-TfCN52U;|Pt@jz18C6>XSWfi9M z28hQQ{xBQ?Vj%GO@EPoY-MhDfB|sr^j6s@#F}wjJ{T@v>NSd?M6-eF#2|QzPM3OdQ l=wVpOP{4bHA%Ni*0|2pqHec9#t*-z8002ovPDHLkV1oV}hX()v literal 0 HcmV?d00001 diff --git a/figs/img60.png b/figs/img60.png new file mode 100644 index 0000000000000000000000000000000000000000..6d439e078873aeb4cb53f24a8a26d48dc640e65a GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^f+|NogYXO@?jzkByi zP*8Bys#P5w9cgK4KzSDzm%DfG?%ut7U;K-0Kt5whkY6x^!?PP8$skV`$B>FS$q5b& zVG8#c(h7|X3N#u#G#(@vFid3Q(MVuwW?*h+lAf?t`ber5gOJV&F9|Cvi5b>ujZ4)T tM4jJcCPZ*deU}!^km?)MkQvB6nZarcXWUVKRyLsN44$rjF6*2UngF%pKcxTw literal 0 HcmV?d00001 diff --git a/figs/img61.png b/figs/img61.png new file mode 100644 index 0000000000000000000000000000000000000000..36839ebc7382285520565ab4eb811a752c729ee6 GIT binary patch literal 820 zcmV-41Izr0P)}4lrpIqHu-oXsI+uPu;-lp%0Z2sP&9#U7C8?7kNu$Wgvti zw|VE51TB86QkaF5fH%%%iXsI~M@pl(q{A}0BrMXiK~F3kQ)Oyf?K955BMPt|X#!Qr zq`)30wlc3ZIqsB^JId?xPGTThVH-8G+eShr@YQ@1L-lfTmWGI!C0LXMG^8#B@}j1Z zS<6Hzdrc&NT?`qn>33Avquy1g&bj6qXq$Gad}Cg<*|+rwP01Z&V19PX&!-45Q!c** ze7verWf___8B@s#kRlLhv7-89=n@C65*9EF+%?8TD{-S_ zZWNKA#|9Ua*Ypok^7cT@wKEIu(W9PLXFFzE_IBy#q;crxc}G?o-m)uqVOXd8U>$ul zi)UCTt=Ox3ctz`ZXVi(=w%DcTk>x+z^_aY!H1684yNhFWY2V4|$LRSVf ycAp4T8g3%~ik#h@>PodgCI94snp@NVKtBPtL4zCFc;BV~0000 literal 0 HcmV?d00001 diff --git a/figs/img62.png b/figs/img62.png new file mode 100644 index 0000000000000000000000000000000000000000..8c02086ea677350be962f203800473960707ea9b GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#p#JPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3ELKqoX4&Ee)v9#l=NQNon`)-F`F6s(^gPk|4ie28U-iK$6a$ zE{-7;bCMGh5>gl#ud(yIk(PMSAlbP0l+XkKwXZ(g literal 0 HcmV?d00001 diff --git a/figs/img63.png b/figs/img63.png new file mode 100644 index 0000000000000000000000000000000000000000..86975a2fdfd289d1d14a458b58a493a558a448f5 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^sz5Bq!py+HsK@o|1dwA8;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0LicLba4!+n3J5)(AdIU@GMHeknvO}tKc7=o$LaiI1X%L>{QQ@Zg!+5=r%hTdc*23}-&Z6nN&fU3V}vQ|OjGQTN&Ep~-~G zUo6bbcbNOXomak}C&XC)fc4n%6;69n9h`VWdv-Ghzs^^fXUlr5nn6vHTQ=gHfx({i tr+FSX4m8N9^5|FOH~-ne>RRxCks)!iT5E54pa#&*44$rjF6*2UngFgOZu@eM*si-07*qoM6N<$f+&ysQUCw| literal 0 HcmV?d00001 diff --git a/figs/img65.png b/figs/img65.png new file mode 100644 index 0000000000000000000000000000000000000000..b91c16d0b4450a6702e811e3c7b5ad311a6f0d3e GIT binary patch literal 578 zcmV-I0=@l-P)I0R>>>zVikpbwEDpul!O6v?dqFz5 z3jP5Kom^b}6GG8~URyi42%24y>~*M!lY`#9yrj{_U#OcOy_fgice!_W?`wc@?6A2` z3c)b)6+J7au)^7FQ_+T<9_5?J?}X1y88UIy?dxF^uA2HsngV5h<;Wy#_=#1+EW-2y zHJ3V_mL`Zi*aQbUTV&aqxzeLmkLtjpiLC+xtL}_?l*BNaRDUo1zech-T;kej!HqL< zZ!D@siOoPQ;cCGu*7T0WcHn7(Xic>>)}UN+!Yj>)|hbNK?mTb!ziud zQP!az+@c4Hk2Yl3^VAKEVEeZo7@>8ixX1cIh1S=b-Hwj`zKbNAL8pFh) zT*NFeT?OWnOem~eH(Plpp}H^O+nD4KuXXwmhVD;A|G4!xr!V7~M-NX`xOAd@lpsP? z)@z(qZqUCip9dEmDAf`jOFnH?iibSMF7sEbBR&P{1E#!L?h*AQ3je%UpIL*rfdOy@ z?9$zg#1J1P>-~{iZcsTmvwN9NO2u(&H(TO^`99(jKf}V<{907*qoM6N<$f|vLU6#xJL literal 0 HcmV?d00001 diff --git a/figs/img66.png b/figs/img66.png new file mode 100644 index 0000000000000000000000000000000000000000..a40e4a4a7806e74e20dc96556573ab4d930cea9d GIT binary patch literal 495 zcmV`0V#5F2OYBY+aM|9+pAZYCsw%RR|Yp>Y(Z48KAzOo7qW%}8IocA;Ff z7W}JhCVZ%fm2*npX;d;|*P5SJatP$z2`1Q

3s3>U?vJVEHO);nGOrdN}c@7~6Gg z+9x!ZqH)_T`KndxskHPvpNN}2ddg&aRd0_Ecffwoh40EKk4FuCmsK$Tv~pUvO)}qX z)E++{)3088+&fuMIv4mWeEI(m(}J=I3e}n99HY3IcDx20%_diRiTM+(1cI(8U*lXB z`E)C44Pr4`YZ8|5sw=i$Vphg`Zd7OJ>r_I4XNYoN?dAv={21jO5FNR?$WDy-k l2FlGR(#xctMO4 literal 0 HcmV?d00001 diff --git a/figs/img67.png b/figs/img67.png new file mode 100644 index 0000000000000000000000000000000000000000..2b207a610684c0a61bd24fc6163a9ece101d6c93 GIT binary patch literal 432 zcmV;h0Z;ykP)=<^AQTgK?tud!>e&XMY$n5j*&7(RcPbETEOvm=a z&%jXVHsL)hcSFJksIf9ocZ1~Kvoh>p<3`xWz;KMM;05n(kQ25bi9)~&-V4C^$09Kb aNCyCCFjGzZ7H1~_00006I231x?p-1{2!e>X ziO|W(q0TP;35TGluNHSv@&_oyxq@+U64ZCe?P#6&xL4HaSY`Dugkq0VsV2->} zch#CHO}iS6RbUA|5>j&143*0Ktp!!Q07zGI;kxFJnQ3PfuKB!cYs1^e{wCb?A!tU# z(?}KGbh4|{LOUI|L#L270|n_QJ$j_*Vor7}wLMZRN9#sk*w(`r|%)smrAJdAJIboh@X2~-1&PcHyNM|Ne-E3${jmw4cO zc?Hp13opTD%T;5{(Jn^js1Q)agYiV&_?EZhgx8j_j)!fP1opJGV7*=TB~v!djMw4i zMQY|DyhKfi<<3mP+>Xj__8&j}g8;j0gcYjxyvw5VF#u?|G* zfz+W5FksgYR$7!Vt53apv*eOg0D`7jT}N6ZEzYp%EvbtJBNkvQ*5r|BkW|pjhJ|pB zu4JrLb0-TzK@0NQ_wpi0$RY2li==W;fp=puRezHzvfT<1mtz~rS;(OzpGfjC7NTys z5VouA`X;5Yl3I4pBKwtU#NEHp9crJq1)(L&Zs!9 zaRBfk9k7c9#@fZOqPmn!>FSB2ioCwo*OVb5_7nx`(hkLZS4!qI_BB1LJsHy^IX2G$ zCmBhSNi1+`q4J5Er~m)}07*qoM6N<$g8$QufdBvi literal 0 HcmV?d00001 diff --git a/figs/img7.png b/figs/img7.png new file mode 100644 index 0000000000000000000000000000000000000000..3313a941f7c283f589623494808754280e915ca0 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp@K+MO&%)r1{7`D3{$T0};332`Z|NqRHGt0}%LqkK~ zy?bYDY<%X-89_n8RjXEYbabSpr2!SXxVYTCdsj(GY4`5k^0JCkfkKQWL4Lsu4$p3Y zZlZhQKIKY4%>_O!g9DEI; zK4@>kp&kXWGH}A#8~DJsvN8b)o;?j4HZU-7a}#3-9>5ZP0nQd-P=K=+Fu=w69k@4u zXf_b>fsyw&+lJQ(r-AJ5hd>7~Y=A1`e5bZy|2#_FLkajQ%OGcfA$mQ5fq^LjLwE;P zBlv;7;oRwfB=P`EiiU0Xs5oj?WOsIw{=Kt4fm=j=Z5Cjxj zXt`}0jI>ZRhuY;z+(Xy(m54HWKJy~!3Q;tE3|9RkmQv}p)}eIm_uW`v7VKuEJWdsi zWMm2)<}OaPX##)4B(ET ziH~310IfMHvj0fwV{Iz z8^F4l8W*R|B0LiqmWZIK(q>?of-1tx-~%SwVBSN9JeUNx3Ph-SHwaXKm{aC5FoNiKmWK>bvv}%}EaLC)Ao19+szCx5fcOIt z2RzuoU%=o1WPK3`VDJKoF>PYtXJB9I;BQ{0tIc zI>1m1bTU7a0?>clAQ5f{&ILdbAngzI4@iXV_4Er2=YeYXB``2d1BtNk8Zj{3ff&sH i0b!Xgm_&{)dH?_mtsr~S%P4sO0000KoEW2I3&h#YzibK8g~e)6dYhhjYN7H9|0i_ zkONSJ8~6w=XkZ0cR5VDYr^o>)j3`p12ygsBBvFtos=Q)mJTp67Svm6uE|7GA5xOuenvbRM46vHiSV0e?Hrm-Fpgjc!RIY;j27M|!MlM+* zu6j@lXN&H`fBn7@6c#3yBFOM*4f5h^M|yEE@ghVa{49iAY0mk(kX2xq!59`9i^rt{ z4;nF5hcPQSMOmk13Kjl{8a}E;Z$3B&+q~k2=E?c}yB+=xei;){sZ{Q-7~0jqAzDT7 zAQo0kb(z{t@J7Bw*p4B*_Juya3O%aZy55sR!gB{RjlQ|7-h->pD39x$XX$`B9qwSC z=1`pKQTni6s+=PcLd0wHu}30A>u%?zwKZQq0#&}kW-oBV@C`dgL^h)EX7~UA002ov JPDHLkV1gvUz*7JK literal 0 HcmV?d00001 diff --git a/figs/img75.png b/figs/img75.png new file mode 100644 index 0000000000000000000000000000000000000000..93cb705a5de0bf26fa069d9dee8b27eecdb34141 GIT binary patch literal 822 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 literal 0 HcmV?d00001 diff --git a/figs/img81.png b/figs/img81.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0eef17ec5ca5bb9318bd0281dd57ee74d83390 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^nm{be!py+HxM@+w3m`{5z$e7@|NsBx<>jHFq3_SitaDhvAbX2O}$6*apQp32{u0Uo#q5JI^|=N?X&w>6EJAV$pD8 zR^!^mhZ)a2aqJLNn8C;KlzYV^zDWlJ*DR6|&{`tct#O^nF(+%LbOXzU)v~g>9*cT3 jK5AUN*m?XCBRj*3dOlsJq{8b!>lr*<{an^LB{Ts5%db?C literal 0 HcmV?d00001 diff --git a/figs/img82.png b/figs/img82.png new file mode 100644 index 0000000000000000000000000000000000000000..121fef45aa7cf58847a86692bf11663418362312 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^20$#w!py+H_`Y{T3P>QpC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl0WI`;uumfCpm$E$&AgUfT445V`F2nIWx2HX-2=el2U;KtRaW?GNyPj@lR;YlwnL@ zSop(%#aQ68ih)5vgT?PM>xQ0`yL)H52ybM%mMc*8{T;JFwL=19Gt-HaJUX0Q9(o^` zlH3H;c{}yJcCl?`qi0(E3{MzyTxnGfDFqlpGy*F&uet zm*cDC;gSxo`7EX!kH537xaY;j7O8NwNR9DKDoYS=fOZv2!=vL3RShw9>}=CcntV9P bz{qffUqS!>$y7_Arx-k4{an^LB{Ts5`Js92 literal 0 HcmV?d00001 diff --git a/figs/img83.png b/figs/img83.png new file mode 100644 index 0000000000000000000000000000000000000000..131b9ca80bbf09aef3bbb3822bb9e9f1f7fc9a1f GIT binary patch literal 343 zcmV-d0jU0oP)9xI0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H)k#D_RCt_YU;u*!K+Mbl1N#ab7!W`KL~w(M4GcKI29S*Pf=vts zK>EWG1{Pcju>l3B=?qXScvxUo>9Mb74B{(Lbud6u&doqB*ubETVGj46-vXQk+$_6b zO8B^Wc)?D3uph|gW8eX@w`ohU9?)heVn{$}XG1dT5!p^66EuKH7EmC0BMI{tKxmLS zN-%9;U}xxNV0gly2^8l_xViu?&a3#Hf#Cp96bN_k4uFbp@#DUb?adItAOsX=`oMCa pWfqG4DR9;U><;9dK!&eq3;--KDXT}k`@H}F002ovPDHLkV1nD{g*X5J literal 0 HcmV?d00001 diff --git a/figs/img84.png b/figs/img84.png new file mode 100644 index 0000000000000000000000000000000000000000..5798151a2bfc5c5d78a44850230268ac9024f961 GIT binary patch literal 330 zcmV-Q0k!^#P)W52EXF#~07@&^a;N!r+zz1SY z0CT}^N&?~nMi7_D0jjs4kpUw(NDdvk184}NIFu`TcLIhS?W=>*Mn|mb^<8QL2_|@n^4{Id*ANeC1`Gm-o1PGK4kauL8u4B c`gza+0PlP)0=r=NaR2}S07*qoM6N<$f}pmCT>t<8 literal 0 HcmV?d00001 diff --git a/figs/img85.png b/figs/img85.png new file mode 100644 index 0000000000000000000000000000000000000000..3479e31816ecf0116a41011b622833ec31c16c49 GIT binary patch literal 441 zcmV;q0Y?6bP)KolH1PK>c(lb*s*KqMOXX?y~dn#v8mi!^jO z0^9&<8jAu6El4?nkB}=+q@v+{)`=|{2}MFkjAXyJv-3Q=Z`XigTuG=(^r7kwa~CaA zs(k1z>4G%A*to9^VMm;D z-+UiDYMAhApm`qB%F=o46bpG1RYIt%M#pE6NfQlX`_42`9s-_N5((}{6{5(ckXrEh zvNdKZ)^;_Ak^II6{|wjkY$OYwZs~&6tvNHZ(h2UA_IU`ib}4S2S+a22orW&Q8po0x z)n`oSN=Io+b5Dk+h4^ymz-fZloo0dp$(^J=m*Ql(^}4igxF``?yK3Z{&c58Q=cO8B j^uV9CN8Yqg^H1;v>L@cwTNFm$00000NkvXXu0mjfh8@6C literal 0 HcmV?d00001 diff --git a/figs/img86.png b/figs/img86.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5af38ad12df3303b648e8c266f86144f6d09d7 GIT binary patch literal 1298 zcmV+t1?~EYP)LG` z!n#s}4-pqaC}EeOF9T>Gxwf*W&oBDD^VU$r7vVKrCMX3UWr_WB}1lBm(65r zxS#Yc%haUw)79Ccz6vl02vTkC?V>O;_l#PAi$RcMQABc{U5>i4JaHTS<;65InCape z2KWOzc5iJNS+Q}VtE#qX$X>gt9*DBB2 zPz}SbYLXm3YTyk6ADf&$8Ne;}#M7@eg(F%(i>`aZ@}b(9>gC!ShOl&prbu!ZHp(TW-=t!+1+h2y1$HjI@rFYcgii1KNM);EJ$yj+V6c>)&W<)Ij5 zE&Gwdtw#%hE8i6WFAptrG>uKlni*?W+n!O~P*JFswK4vqUBqV{WiTfJ7LHAg3np}? zCdFYybgueQ2pbT}Vz7b)H7rFO)MH;6sU*ndMl80}*!nSL%$&^Rq(XF&C$O$z?2uu| zlln;6R%IIp|GE$IFARs*;Oi+O5EEP;T6H>*5IF9r=_EZOJu0;BCmM{#vdS~=Yp@yu z&tU$}8R){1XwEc)qg1#og4e#iJeksoXcn#O12F0SH0kof0&_mbHEJ>`dKT?GgEhR#&xes=8n1} z8HA&|HIPGDv2g4eub!B9@fuPbj6H9CydGi-YHJ~`Ucb7g8N;e)Y#C#)NlF`qh(B2# z+UynJZR24n!$=M|hjRspPtaw;uXoUT>0scpYfv^X>B9T!YNc&UK3!|!fUEJ>2Z6~F zY{siCl_sc4pl)w2ve{u=v@}|1#`Jq_lk=j=mAFNude0$#Xpxwef2fYm?W!jyd(imu z)ebnFeRe1hT-Akg7>=EbzkvMUB=vr5_dJ_D?9*NKpejuKBmV2*txKaV`Qm%H(CQI`68(&!5q}XAqn_A4`$g%wZ{U$#5N{kIu!M;(P678o6;1p* z0ruYB{`JOh=w@{FXcG;}pLvxT_qK&wWz5BYlDtrI`PPMO+0u@=FZnQ-_`Cr|vPazu z^#)U4P`yAG`=+kFoB@`}g+Y}`(8P^n7YLe9;@^5!6`j+2=d0 z-PI#wDf60sY~`82b^4GtT0`!$rSB^zetw{CH^RBu?odqfFM-zz<#dc&mH+?%07*qo IM6N<$f_cwx1ONa4 literal 0 HcmV?d00001 diff --git a/figs/img87.png b/figs/img87.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd1fe1f5a8261c912471ca6ed460efa6b893642 GIT binary patch literal 561 zcmV-10?z%3P)0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*IuSrBfRCt{2RJ}{XKotKqA0}zi#y=s5lOkjlL5hn*myCj-MFbZI zrK3wn2a&osi>pf%QScl(h>M{40~|66E&*{>@7`V7w9*Rd*k5w@-o1D4?tR=HP(UXQ zh}uDbLA1U}x=4Dg7s3#NPVFVddCisNM zQ_<5ZEXE?Vc~r4+hni6DbFZv0(a6X&8)a@eO;!RTj-YQ3Ekzy^m8T_JFDWi#FlnV^kx#ZoMq}hB!PBc2Wg!;XLLpne-P#12l{{eqdbyh@ z<#nN%{b_7d9AgMP1d2JL-Uy0H??N$-Oy-gt)s<9Jll7vFkr!@C(UAI?*)KZ@T0Iz3)vmW`wI*D4T-!AYll2!r%~8v2MZ_I;LH=umscL~aaZ-oGE_Q} z|HJ^6**Wkmc|YsdY4rFxgC+`d)VGId$M_jv#41;g*b;xf00000NkvXXu0mjfwcGcP literal 0 HcmV?d00001 diff --git a/figs/img88.png b/figs/img88.png new file mode 100644 index 0000000000000000000000000000000000000000..a45e3b578f5967764414d6afcf2b3ac1ef20c48b GIT binary patch literal 830 zcmV-E1Ht@>P)q-SZpOi zKo1)cL{2P%q`A^U#56W(f^C{rf+xNZuMiOgbAN!vmVziJB6jM```FvPB#i_Nk~wzY z%)H;u%$qlJ?*Y3g1NsP^6bAg-jrvO(<#tQz2KpY4X&WiMRokfj1M^#^+_`hmqzD?! zyu@4qCjg2h(1<7qP*=pMKr0$E1=OLTs(ow%NAerSK#N!tu83H6RHw)1)wC+v9IZ|z zl>SDwg*d?Fm@7e3j38JLQnZYv@Z=ZPKD7Z5e!#n`kePPLtu zIV#VccQDKUPe@EEvt>tWoX7j1rI~gcn}mt00-CANE~j~^24?6(x4GMoevcXex&eg2 zq#9zsU{pd5Qtu6yg5oAXEa1%qjalXbM6r+gg~s+IEP%FU+Kw{Zc7tDBGL zA5inTWmfgu3rn+p+uOJgybqnY2j~ZIaoTE4O?c0Cg|J^$O335Xx-!FJE*3$ysCkH{ zUFbQPXvNUbJvL*Z|}i^3Ld`Gv-W!BO3^bdfj<=r~eLmm|w>Y+VL^2J)&LryTvu^ z@PRn2qw-3d-$C`$=g@(ShmP6;o)B|(@N@h0*P&RZENyqVfacFRJD1cmw1$TNUD~jZ z6ZV4|=b`~M^Ep{KvG*sTuU6AHrZanqyRKFHoh(OmL(&Nn=xktMQs95^0h;0FYi|-o>Bk+002ovPDHLkV1j9GjvN30 literal 0 HcmV?d00001 diff --git a/figs/img9.png b/figs/img9.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecf93a492a1dcb87c2eef9e1b04b168ebb37b20 GIT binary patch literal 362 zcmV-w0hRuVP)N4t~G{r8^iME`XiIzyF1l|J>n*RfmAOq6{Fg1Z%9wi$906u^wWJuN#_5c6?07*qo IM6N<$f-u*E8~^|S literal 0 HcmV?d00001 diff --git a/figs/img90.png b/figs/img90.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce3cc347b60eb366f45e4553da357bd8407c012 GIT binary patch literal 327 zcmV-N0l5B&P)d0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H#Ysd#RCt_YU;qOL1_cHp0Sky&fJXrzgxbK3N;7a{RgDwyFf<_R z;AR3Ez`lET07C&-_5;j3NAip(3OqpJZ8*Rn0A&K*ut9+nCZPc2{Rg{Y_ihG;3qT&z z1gI29%?5UuLT(2j57kU+JDGZbn*rz>mfdHuxsjWJ=>Wvv$f94NavU2NE;69XY46?! zkz?4;c>zt1?EzFD!yyF*s9g2#-JrN;;Au#J%4sn$py^}Y>;RQxz>tFiJ{aQxc0Ue! Z007On>bFg_^03i?ouHIi7rjx1SzSIPY_wO z6tOsgX{b2@is;f%QlS+maFvF}5*-z9*HPF|Sb_pZ^6b3XdCzMvSd{X3DGoAxve0)e z26{**G*q&*T{7;fJN^xWn0aVbV@rtO=7^aTFEZ_Mn2uD{wBd@raPLPi=tj0v=`3o6 z2MJ}o-71OEiUJmjnvgMYm;bjHWa8)RYWwU+#S3J!&xsggV(z%ccHEqNu2o)+WUS50uLQdJ@{;2*lj;Bdr z^*cKw`6{JQGv>YedSi^*;D()6I`T^jXKWpu^aQsoaTgE^lfRU3WLh+(oINO#oVaqu zFm(#&m3j4$>b;Sy)Ok?6?Z=|y#Nwz>9&aVo#MZmH9DYP+C~3%QO-aLeX0cuKL68`$ z{XDQ;O z6cPLj;_B4hMJi6WI6B_soXOq)z`IMNtuz%Ep%3!%?t72-y5&B*gSjz5?wG<3qC_t00000NkvXXu0mjf D@m+oZ8s9yWwD?bgZOEgXrg&0){}&GZrF=OnPjr zGxAzF6}%O59&)hhD;(Y1p3%IaX>Yr^b#J3G#IEetWBQ7kjT7OgCj9l zCt(KTk}VVe*b6kgWo$Yd!c)v+eBq_vH-o~C6{`>17@VyTi2P#Ptk`lozeVL&%m0Hc lDoc4z%)7FD+T~1chD%#yAIaPsg-ADA_r zp|ZyykyWVY0OO2^g+1OpZyY8)wP!x8&bC4Qr-X!sgBS>FVdQ&MBb@00BQ`P5=M^ literal 0 HcmV?d00001 diff --git a/figs/img96.png b/figs/img96.png new file mode 100644 index 0000000000000000000000000000000000000000..e0ad667420b500deb016aebf505229bc27eb326d GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#oL!Pl)UP|NqO&%R@s$jg5^3 z1qFe^E-o&+ckgye)X4;L7)yfuf*Bm1-ADs+ls#P>Ln`JZCpa)1V_=yr+Hq4dfYCTa kMzUQ^;fZUAVAaMz20vcLaw&$Y2B2~VPgg&ebxsLQ04iQ2C;$Ke literal 0 HcmV?d00001 diff --git a/figs/img97.png b/figs/img97.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b89ba872e357c31c241adbceecae3ed3264816 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6^DWqS-O4^K|QHzu~YXUq=fPIDd~IB+P4;fbNNL+CUE z?FZW%WS92{`OS>7@Mc|9Q2EZe&DBBdIn#vB-Hr*>%oBDtHa;~p*%8B%P^H%Jbwh_$ d9?L5hhMwzEN8|2&&;UA;!PC{xWt~$(695Q9Wi$W) literal 0 HcmV?d00001 diff --git a/figs/img98.png b/figs/img98.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0b70846d81f53df5421b550a04e8d24bf9cb92 GIT binary patch literal 491 zcmVQUbRGr3AO2ocE*_=n|w7TvOz>FL zFITl!Csxl$MuVId)u=uMb*pD3t5ySHtwaSb-eRiE&SQN(_3H#2YYS(938oy97OCaB zR-J5rDVdXoSag${KjTG3U5S<}YFK=pOF`<@wHs;+FiS>W*D!;G(sie>`to|66b6NP zm2r!?)T(%_wKKLD3#lu*)a}SBbitc#^rNImnuiLp zOV&ui%!e2GxO#AsEWn|f)EoMxLL7avGsa3ieTZK!MXrQeY)f=5+u9lJa=r2n3gTGU h4Sw8<`k(X@@dix<&=dRUTtxr?002ovPDHLkV1lMD;t~J= literal 0 HcmV?d00001 diff --git a/figs/img99.png b/figs/img99.png new file mode 100644 index 0000000000000000000000000000000000000000..211c1df31c63eb655b746322d2aae92e1762fcfe GIT binary patch literal 437 zcmV;m0ZRUfP)O9a0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*IGf6~2RCt_YU_gKm4A{X2AZ`%AAqfT#fS7w91A_uSMYsXbf)<7a zP&W4lZU#OBxEu?4M#2Hq*lGxM;eY`n*trG)47+!4VBm%bbAc@K1QK2lK2(^8fkA+e zZvv*FTogKriU8sih#Q$8!N$zQ!ob16#=yXfsubv}3k=LaE&L4ZyLSh`gn_;^VC4f! zbHYSeckgCkxDQm#4-71JRL?E|8qI<&r3|7l86d#98HLLqfW%?iy?fv8ZIA?ZdoM`j zJ*wsnNbGzDRs{wDNZRED5sWcg6L2YJVCV*0p1{C%TKxi$#rJ`C18&8SKtvJ)gC@f) z5Q~q&4`>lEIqcrO6+)f Fy(2)59 b(the)f(probabilit) +-5 b(y)60 b(that)-161 4605 y Ft(G)55 b Fy(is)h(acyclic)f(is)1036 +5049 y Ft(p)45 b Fy(=)i Ft(e)1418 4981 y Fn(1)p Fr(=c)1620 +4789 y Fp(r)p 1786 4789 398 7 v 1806 4937 a Ft(c)37 b +Fx(\000)g Fy(2)p 1806 5011 358 7 v 1949 5163 a Ft(c)2184 +5049 y Fx(\001)1316 b Fy(\(2\))-161 5434 y(F)-14 b(or)60 +b Ft(c)52 b Fy(=)h(2)p Ft(:)p Fy(09)59 b(the)g(probabilit)-5 +b(y)60 b(of)e(a)i(random)g(graph)f(b)5 b(eing)-161 5633 +y(acyclic)40 b(is)h Ft(p)k(>)841 5568 y Fn(1)p 841 5595 +67 7 v 841 5690 a(3)927 5633 y Fy(.)69 b(Consequen)-5 +b(tly)-14 b(,)43 b(for)d(suc)-5 b(h)42 b Ft(c)p Fy(,)h(the)d(exp)5 +b(ected)-161 5832 y(n)-5 b(um)g(b)5 b(er)44 b(of)d(iterations)h(to)g +(obtain)g(an)g(acyclic)g(graph)g(is)h(lo)-5 b(w)g(er)-161 +6032 y(than)48 b(3)f(and)g(the)g Ft(g)53 b Fy(function)48 +b(needs)f(2)p Ft(:)p Fy(09)p Ft(n)g Fy(in)-5 b(teger)47 +b(n)-5 b(um)g(b)5 b(ers)-161 6231 y(to)76 b(b)5 b(e)76 +b(stored,)81 b(since)c(its)f(domain)h(is)f(the)g(set)g +Ft(V)37 b Fy(.)136 b(In)76 b(this)-161 6430 y(pap)5 b(er,)80 +b(the)74 b(algorithm)h(prop)5 b(osed)75 b(b)-5 b(y)74 +b(Czec)-5 b(h,)79 b(Ha)-5 b(v)c(as)75 b(and)-161 6629 +y(Ma)9 b(jewski)53 b([1])g(will)g(b)5 b(e)52 b(referred)g(to)g(as)h +(CHM)f(from)h(no)-5 b(w)53 b(on.)5 6829 y(Giv)-5 b(en)63 +b(an)f(acyclic)g(graph)g Ft(G)p Fy(,)i(for)e(the)f(ordering)i(step)f(w) +-5 b(e)-161 7028 y(asso)5 b(ciate)85 b(with)g(eac)-5 +b(h)85 b(edge)g(an)g(unique)h(n)-5 b(um)g(b)5 b(er)86 +b Ft(h)p Fy(\()p Ft(e)p Fy(\))95 b Fx(2)-161 7227 y Fy([0)p +Ft(;)28 b(n)49 b Fx(\000)g Fy(1])74 b(in)g(the)f(order)g(of)h(the)f(k) +-5 b(eys)73 b(of)g Ft(S)83 b Fy(to)73 b(obtain)h(an)-161 +7426 y(order)50 b(preserving)g(function.)72 b(Figure)50 +b(2)f(illustrates)h(the)f(p)5 b(er-)-161 7626 y(fect)58 +b(assignmen)-5 b(t)60 b(problem)g(for)e(an)h(acyclic)f(graph)h(with)g +(six)-161 7825 y(v)-5 b(ertices)54 b(and)h(with)f(the)g(\014v)-5 +b(e)54 b(table)g(en)-5 b(tries)54 b(assigned)i(to)e(the)-161 +8024 y(edges.)5 8223 y(The)68 b(searc)-5 b(hing)69 b(step)e(starts)h +(from)g(the)f(w)-5 b(eigh)g(ted)68 b(graph)-161 8423 +y Ft(G)e Fy(obtained)g(in)h(the)f(ordering)g(step.)107 +b(F)-14 b(or)66 b(eac)-5 b(h)67 b(connected)-161 8622 +y(comp)5 b(onen)-5 b(t)66 b(of)g Ft(G)f Fy(c)-5 b(ho)5 +b(ose)67 b(a)e(v)-5 b(ertex)65 b Ft(v)72 b Fy(and)67 +b(set)e Ft(g)6 b Fy(\()p Ft(v)g Fy(\))66 b(to)f(0.)-161 +8821 y(F)-14 b(or)54 b(example,)f(supp)5 b(ose)54 b(that)f(v)-5 +b(ertex)51 b(0)i(in)h(Figure)f(2)g(is)g(c)-5 b(ho-)-161 +9020 y(sen)48 b(and)g(the)f(assignmen)-5 b(t)48 b Ft(g)6 +b Fy(\(0\))46 b(=)g(0)h(is)h(made.)72 b(T)-14 b(ra)-5 +b(v)g(erse)48 b(the)-161 9220 y(graph)c(using)h(a)e(depth-\014rst)h(or) +g(a)f(breadth-\014rst)i(searc)-5 b(h)44 b(algo-)-161 +9419 y(rithm,)62 b(b)5 b(eginning)60 b(with)g(v)-5 b(ertex)59 +b Ft(v)6 b Fy(.)87 b(If)60 b(v)-5 b(ertex)58 b Ft(b)j +Fy(is)f(reac)-5 b(hed)-161 9618 y(from)63 b(v)-5 b(ertex)61 +b Ft(a)i Fy(and)g(the)f(v)-9 b(alue)62 b(asso)5 b(ciated)63 +b(with)f(the)g(edge)-161 9817 y Ft(e)56 b Fy(=)f Fx(f)p +Ft(a;)28 b(b)p Fx(g)60 b Fy(is)i Ft(h)p Fy(\()p Ft(e)p +Fy(\),)f(set)f Ft(g)6 b Fy(\()p Ft(b)p Fy(\))60 b(to)h(\()p +Ft(h)p Fy(\()p Ft(e)p Fy(\))39 b Fx(\000)h Ft(g)6 b Fy(\()p +Ft(a)p Fy(\)\))45 b(mo)5 b(d)47 b Ft(n)p Fy(.)89 b(In)-161 +10017 y(Figure)50 b(2,)h(follo)-5 b(wing)50 b(the)e(adjacen)-5 +b(t)49 b(list)h(of)f(v)-5 b(ertex)48 b(0,)i Ft(g)6 b +Fy(\(2\))49 b(is)-161 10216 y(set)60 b(to)f(3.)86 b(Next,)60 +b(follo)-5 b(wing)60 b(the)f(adjacen)-5 b(t)60 b(list)f(of)h(v)-5 +b(ertex)58 b(2,)-161 10415 y Ft(g)6 b Fy(\(1\))55 b(is)h(set)f(to)g(2)h +(and)f Ft(g)6 b Fy(\(3\))55 b(is)h(set)f(to)g(1,)h(and)g(so)f(on.)5061 +1844 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 5061 1844 a 5061 411 a + 5788794 5657231 0 0 5788794 5657231 startTexFig + 5061 411 a +%%BeginDocument: figs/perfectassignmentproblem.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: perfectassignmentproblem.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Aug 11 10:39:00 2004 +%%For: fbotelho@donabenta (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 88 86 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 86 moveto 0 0 lineto 88 0 lineto 88 86 lineto closepath clip newpath +132.3 307.1 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n -1195.1 4178.4 299.6 -46.7899 67.3996 arc +gs col0 s gr + +% Arc +n -3217.5 4972.5 1720.9 -11.3099 -41.8202 arcn +gs col0 s gr + +% Arc +n -4641.4 5663.6 3746.7 -32.5994 -18.0930 arc +gs col0 s gr + +% Arc +n -1645.3 4362.2 338.1 70.0577 171.8700 arc +gs col0 s gr + +% Arc +n -1353.2 4406.8 288.7 18.8384 127.7632 arc +gs col0 s gr + +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n -1474 3656 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1508 3704 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n -1069 4466 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1104 4514 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n -980 3926 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1016 3974 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n -1519 4646 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1554 4694 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n -1969 4376 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-2005 4424 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n -1924 3837 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1959 3885 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1260 4860 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1935 4815 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1620 4185 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1350 4185 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 158.75 scf sf +-810 4320 m +gs 1 -1 sc (0) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + 5061 1844 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 5061 1844 a 6488 555 786 7 v 6485 746 7 +191 v 6587 689 a Ft(v)p 6770 746 V 206 w(g)6 b Fy(\()p +Ft(v)g Fy(\))p 7270 746 V 6488 752 786 7 v 6485 943 7 +191 v 6589 886 a(0)p 6770 943 V 310 w(0)p 7270 943 V +6485 1134 V 6589 1077 a(1)p 6770 1134 V 310 w(2)p 7270 +1134 V 6485 1325 V 6589 1268 a(2)p 6770 1325 V 310 w(3)p +7270 1325 V 6485 1516 V 6589 1459 a(3)p 6770 1516 V 310 +w(1)p 7270 1516 V 6485 1707 V 6589 1650 a(4)p 6770 1707 +V 310 w(0)p 7270 1707 V 6485 1898 V 6589 1841 a(5)p 6770 +1898 V 310 w(1)p 7270 1898 V 6488 1905 786 7 v 4136 2267 +a(Figure)48 b(2:)70 b(P)-5 b(erfect)46 b(assignmen)-5 +b(t)49 b(problem)f(for)f(a)g(graph)h(with)4136 2466 y(six)56 +b(v)-5 b(ertices)55 b(and)h(\014v)-5 b(e)55 b(edges.)4302 +2996 y(No)-5 b(w)62 b(w)-5 b(e)61 b(sho)-5 b(w)63 b(wh)-5 +b(y)61 b Ft(G)g Fy(m)-5 b(ust)63 b(b)5 b(e)61 b(acyclic.)91 +b(If)61 b(the)h(graph)4136 3195 y Ft(G)52 b Fy(w)-5 b(as)54 +b(not)e(acyclic,)g(the)g(assignmen)-5 b(t)55 b(pro)5 +b(cess)53 b(migh)-5 b(t)53 b(trace)4136 3394 y(around)f(a)f(cycle)f +(and)h(insist)h(on)g(reassigning)g(some)g(already-)4136 +3593 y(pro)5 b(cessed)57 b(v)-5 b(ertex)55 b(with)h(a)g(di\013eren)-5 +b(t)56 b Ft(g)62 b Fy(v)-9 b(alue)56 b(than)g(the)g(one)4136 +3793 y(that)g(has)i(already)e(b)5 b(een)57 b(assigned)h(to)e(it.)78 +b(F)-14 b(or)57 b(example,)h(let)4136 3992 y(us)67 b(supp)5 +b(ose)67 b(that)f(in)g(Figure)h(2)f(the)g(edge)g Fx(f)p +Fy(3)p Ft(;)28 b Fy(4)p Fx(g)66 b Fy(has)g(b)5 b(een)4136 +4191 y(replaced)56 b(b)-5 b(y)55 b(the)g(edge)h Fx(f)p +Fy(0)p Ft(;)28 b Fy(1)p Fx(g)p Fy(.)73 b(In)56 b(this)g(case,)f(t)-5 +b(w)g(o)56 b(di\013eren)-5 b(t)4136 4390 y(v)c(alues)70 +b(are)g(set)g(to)g Ft(g)6 b Fy(\(0\).)117 b(F)-14 b(ollo)-5 +b(wing)72 b(the)d(adjacen)-5 b(t)70 b(list)g(of)4136 +4590 y(v)-5 b(ertex)45 b(1,)j Ft(g)6 b Fy(\(0\))45 b(is)h(set)g(to)f +(4.)71 b(But)45 b Ft(g)6 b Fy(\(0\))46 b(w)-5 b(as)46 +b(set)g(to)f(0)h(b)5 b(efore.)4136 5139 y Fv(5)270 b(The)90 +b(New)g(Algorithm)4136 5502 y Fy(In)80 b(this)f(section)h(w)-5 +b(e)79 b(presen)-5 b(t)80 b(a)f(new)h(algorithm)g(for)f(con-)4136 +5701 y(structing)i(minimal)g(p)5 b(erfect)79 b(hash)i(functions,)87 +b(where)81 b(the)4136 5901 y(order)53 b(of)f(the)g(k)-5 +b(eys)53 b(in)g Ft(S)62 b Fy(is)53 b(not)g(preserv)-5 +b(ed.)73 b(The)53 b(algorithm)4136 6100 y(is)e(based)h(on)f(the)f(MOS)h +(approac)-5 b(h)52 b(and)f(solv)-5 b(es)51 b(the)f(problem)4136 +6299 y(presen)-5 b(ted)49 b(in)g(Figure)g(1\(b\).)71 +b(The)49 b(main)g(no)-5 b(v)g(elt)g(y)49 b(is)g(that)f(the)4136 +6498 y(random)j(graph)g Ft(G)f Fy(migh)-5 b(t)50 b(ha)-5 +b(v)g(e)51 b(cycles)f(and)g(ev)-5 b(en)50 b(so)h(w)-5 +b(e)50 b(are)4136 6698 y(able)56 b(to)f(\014nd)h(a)f(MPHF.)4302 +6897 y(The)79 b(new)f(algorithm)h(lo)5 b(oks)78 b(for)g(a)g(function)h +Ft(g)90 b Fy(:)85 b Ft(V)121 b Fx(!)4136 7096 y(f\000j)p +Ft(V)37 b Fx(j)29 b Fy(+)g(1)p Ft(;)f(:)g(:)g(:)f(;)h +Fy(0)p Ft(;)g Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h Fx(j)p Ft(V)37 +b Fx(j)29 b(\000)g Fy(1)p Fx(g)51 b Fy(suc)-5 b(h)53 +b(that)d(the)h(function)4136 7295 y Ft(h)46 b Fy(:)g +Ft(E)56 b Fx(!)46 b(f)p Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h +(m)36 b Fx(\000)h Fy(1)p Fx(g)56 b Fy(de\014ned)g(as)5273 +7660 y Ft(h)p Fy(\()p Ft(e)p Fy(\))45 b(=)h Ft(g)6 b +Fy(\()p Ft(a)p Fy(\))36 b(+)h Ft(g)6 b Fy(\()p Ft(b)p +Fy(\))1256 b(\(3\))4136 8024 y(is)68 b(a)e(bijection,)k(where)c +Ft(e)g Fy(=)f Fx(f)p Ft(a;)28 b(b)p Fx(g)p Fy(.)108 b(This)68 +b(means)g(that)e(w)-5 b(e)4136 8223 y(are)65 b(lo)5 b(oking)64 +b(for)h(an)g(assignmen)-5 b(t)66 b(of)f(v)-9 b(alues)65 +b(to)f(v)-5 b(ertices)65 b(so)4136 8423 y(that)j(for)h(eac)-5 +b(h)68 b(edge)h(the)f(sum)i(of)e(v)-9 b(alues)69 b(asso)5 +b(ciated)68 b(with)4136 8622 y(endp)5 b(oin)-5 b(ts)68 +b(is)g(a)f(unique)g(in)-5 b(teger)67 b(in)g(the)g(range)g([0)p +Ft(;)28 b(m)44 b Fx(\000)h Fy(1].)4136 8821 y(Notice)59 +b(that)h(w)-5 b(e)60 b(do)g(not)g(need)g(to)g(tak)-5 +b(e)59 b(the)h(sum)h(of)f(v)-9 b(alues)4136 9020 y(asso)5 +b(ciated)56 b(with)f(endp)5 b(oin)-5 b(ts)56 b(of)f(the)g(edges)h(mo)5 +b(dulo)56 b Ft(n)p Fy(.)4302 9220 y(Figure)72 b(3)f(presen)-5 +b(ts)72 b(a)e(pseudo)i(co)5 b(de)71 b(for)f(the)h(new)g(algo-)4136 +9419 y(rithm.)120 b(The)71 b(pro)5 b(cedure)70 b(NewAlgorithm)g(\()p +Ft(S)10 b Fy(,)74 b Ft(g)6 b Fy(\))70 b(receiv)-5 b(es)4136 +9618 y(as)58 b(input)f(the)f(set)h(of)f(k)-5 b(eys)57 +b(from)g Ft(S)66 b Fy(and)57 b(pro)5 b(duces)58 b(the)e(p)5 +b(er-)4136 9817 y(fect)49 b(assignmen)-5 b(t)51 b(of)f(v)-5 +b(ertices)49 b(represen)-5 b(ted)51 b(b)-5 b(y)50 b(the)f(function)4136 +10017 y Ft(g)6 b Fy(.)106 b(The)66 b(mapping)h(step)f(generates)f(a)h +(random)h(undirected)4136 10216 y(graph)e Ft(G)f Fy(taking)g +Ft(S)74 b Fy(as)64 b(input.)102 b(The)64 b(ordering)h(step)f(deter-) +4136 10415 y(mines)j(the)e(order)h(in)g(whic)-5 b(h)67 +b(hash)g(v)-9 b(alues)66 b(are)f(assigned)j(to)3906 10913 +y(4)p eop end +%%Page: 5 5 +TeXDict begin 5 4 bop -161 620 a Fy(k)-5 b(eys.)86 b(It)59 +b(partitions)h(the)f(graph)h Ft(G)f Fy(in)-5 b(to)60 +b Ft(G)2654 645 y Fr(cr)t(it)2943 620 y Fy(and)g Ft(G)3401 +645 y Fr(ncr)t(it)3712 620 y Fy(.)-161 819 y(The)52 b(searc)-5 +b(hing)53 b(step)f(pro)5 b(duces)52 b(the)f(p)5 b(erfect)50 +b(assignmen)-5 b(t)54 b(of)-161 1018 y(v)-5 b(ertices)63 +b(in)g Ft(G)p Fy(,)h(whic)-5 b(h)64 b(is)f(represen)-5 +b(ted)64 b(b)-5 b(y)63 b(the)f(function)h Ft(g)6 b Fy(.)-161 +1218 y(It)55 b(starts)h(with)f Ft(G)992 1243 y Fr(cr)t(it)1277 +1218 y Fy(and)h(\014nishes)h(with)e Ft(G)2692 1243 y +Fr(ncr)t(it)3004 1218 y Fy(.)p -169 1623 9 103 v -169 +1529 103 9 v -66 1529 3730 9 v 3664 1529 103 9 v 3759 +1623 9 103 v -169 1780 9 150 v 3758 1780 V -72 1735 a +Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)76 b Fu(NewAlgorithm)82 +b(\()16 b Fk(S)40 b Fu(,)83 b Fk(g)15 b Fu(\))p -169 +1937 V 3758 1937 V 166 1892 a(M)-5 b(a)g(p)g(p)g(i)g(n)g(g)79 +b(\()15 b Fk(S)41 b Fu(,)83 b Fk(G)19 b Fu(\))g(;)p -169 +2094 V 3758 2094 V 175 2049 a(O)t(r)t(d)t(e)t(r)t(i)t(n)t(g)87 +b(\()15 b Fk(G)33 b Fu(,)83 b Fk(G)1361 2066 y Fj(cr)s(it)1610 +2049 y Fu(,)g Fk(G)1856 2066 y Fj(ncr)s(it)2168 2049 +y Fu(\))19 b(;)p -169 2251 V 3758 2251 V 177 2206 a(S)6 +b(e)g(a)g(r)g(c)g(h)g(i)g(n)g(g)93 b(\()15 b Fk(G)33 +b Fu(,)83 b Fk(G)1440 2223 y Fj(cr)s(it)1689 2206 y Fu(,)g +Fk(G)1935 2223 y Fj(ncr)s(it)2261 2206 y Fu(,)g Fk(g)24 +b Fu(\))19 b(;)p -169 2354 9 103 v -168 2354 103 9 v +-66 2354 3730 9 v 3664 2354 103 9 v 3759 2354 9 103 v +230 2776 a Fy(Figure)56 b(3:)74 b(Main)56 b(steps)g(of)f(the)g(new)h +(algorithm.)-161 3481 y Fi(5.1)225 b(Mapping)73 b(Step)-161 +3796 y Fy(The)67 b(pro)5 b(cedure)67 b(Mapping)h(\()p +Ft(S)10 b Fy(,)68 b Ft(G)p Fy(\))e(receiv)-5 b(es)67 +b(as)g(input)h(the)-161 3996 y(set)53 b(of)g(k)-5 b(eys)53 +b(from)g Ft(S)63 b Fy(and)53 b(generates)g(a)g(random)h(undirected)-161 +4195 y(graph)42 b Ft(G)e Fy(without)g(self-lo)5 b(ops)42 +b(and)f(m)-5 b(ultiple)42 b(edges.)69 b(T)-14 b(o)41 +b(gen-)-161 4394 y(erate)79 b(the)g(MPHF,)h(the)f(n)-5 +b(um)g(b)5 b(er)80 b(of)f(critical)g(edges)h(in)g Ft(G)-161 +4593 y Fy(m)-5 b(ust)63 b(b)5 b(e)61 b Fx(j)p Ft(E)658 +4618 y Fr(cr)t(it)888 4593 y Fx(j)56 b(\024)1196 4528 +y Fn(1)p 1196 4555 67 7 v 1196 4651 a(2)1282 4593 y Fx(j)p +Ft(E)10 b Fx(j)p Fy(.)92 b(The)61 b(reason)i(is)f(that)f(the)g(maxi-) +-161 4793 y(mal)44 b(v)-9 b(alue)44 b(of)f Ft(h)p Fy(\()p +Ft(e)p Fy(\))g(assigned)i(to)e(an)h(edge)f Ft(e)k Fx(2)e +Ft(E)53 b Fy(in)44 b(this)g(case)-161 4992 y(is)60 b +Ft(m)38 b Fx(\000)i Fy(1.)83 b(In)59 b(Section)f(5.3.1)h(w)-5 +b(e)59 b(sho)-5 b(w)60 b(that)e(the)g(condition)-161 +5191 y Fx(j)p Ft(E)8 5216 y Fr(cr)t(it)238 5191 y Fx(j)46 +b(\024)526 5126 y Fn(1)p 526 5153 V 526 5248 a(2)612 +5191 y Fx(j)p Ft(E)10 b Fx(j)53 b Fy(is)i(necessary)g(and)g(su\016cien) +-5 b(t)56 b(to)e(generate)f(a)-161 5390 y(MPHF.)5 5594 +y(The)73 b(random)h(graph)g Ft(G)e Fy(is)i(generated)e(using)i(t)-5 +b(w)g(o)73 b(hash)-161 5794 y(functions)66 b Ft(h)661 +5819 y Fn(1)800 5794 y Fy(and)g Ft(h)1229 5819 y Fn(2)1303 +5794 y Fy(.)103 b(The)66 b(functions)f Ft(h)2625 5819 +y Fn(1)2765 5794 y Fy(and)g Ft(h)3193 5819 y Fn(2)3333 +5794 y Fy(trans-)-161 5993 y(form)57 b(the)e(k)-5 b(eys)56 +b(from)g Ft(S)66 b Fy(to)55 b(in)-5 b(tegers)57 b(in)f([0)p +Ft(;)28 b Fx(j)p Ft(V)37 b Fx(j)g(\000)h Fy(1],)56 b(so)h(the)-161 +6192 y(set)50 b(of)g(v)-5 b(ertices)50 b Ft(V)87 b Fy(has)51 +b Fx(j)p Ft(V)37 b Fx(j)50 b Fy(v)-5 b(ertices)50 b(and)h(eac)-5 +b(h)50 b(one)g(of)g(them)-161 6391 y(is)63 b(lab)5 b(elled)62 +b(with)g(a)g(distinct)h(v)-9 b(alue)61 b(from)i([0)p +Ft(;)28 b Fx(j)p Ft(V)36 b Fx(j)42 b(\000)f Fy(1].)95 +b(F)-14 b(or)-161 6591 y(eac)-5 b(h)54 b(k)-5 b(ey)54 +b Ft(x)f Fy(from)h Ft(S)64 b Fy(the)53 b(edge)h Fx(f)p +Ft(h)2055 6616 y Fn(1)2129 6591 y Fy(\()p Ft(x)p Fy(\))p +Ft(;)28 b(h)2524 6616 y Fn(2)2597 6591 y Fy(\()p Ft(x)p +Fy(\))p Fx(g)53 b Fy(is)h(added)h(to)-161 6790 y Ft(E)10 +b Fy(.)5 6994 y(A)74 b(self-lo)5 b(op)75 b(o)5 b(ccurs)74 +b(when)g Ft(h)1959 7019 y Fn(1)2033 6994 y Fy(\()p Ft(x)p +Fy(\))j(=)h Ft(h)2638 7019 y Fn(2)2712 6994 y Fy(\()p +Ft(x)p Fy(\).)129 b(T)-14 b(o)74 b(a)-5 b(v)g(oid)-161 +7193 y(self-lo)5 b(ops)41 b(w)-5 b(e)40 b(mo)5 b(dify)39 +b Ft(h)1412 7218 y Fn(2)1486 7193 y Fy(\()p Ft(x)p Fy(\))g(b)-5 +b(y)39 b(adding)i(a)e(random)i(n)-5 b(um)g(b)5 b(er)-161 +7392 y(in)56 b(the)e(range)i([1)p Ft(;)28 b Fx(j)p Ft(V)36 +b Fx(j)h(\000)f Fy(1].)74 b(When)55 b(a)g(m)-5 b(ultiple)56 +b(edge)f(o)5 b(ccurs)-161 7591 y(w)-5 b(e)56 b(ab)5 b(ort)55 +b(and)h(start)f(again)g(a)h(new)f(iteration.)5 7795 y(W)-14 +b(e)42 b(no)-5 b(w)43 b(sho)-5 b(w)43 b(that)f(the)f(exp)5 +b(ected)41 b(n)-5 b(um)g(b)5 b(er)43 b(of)f(iterations)-161 +7995 y(to)70 b(obtain)h Ft(G)f Fy(is)h(constan)-5 b(t.)120 +b(Let)69 b Ft(p)h Fy(b)5 b(e)70 b(the)g(probabilit)-5 +b(y)72 b(of)-161 8194 y(generating)d(a)g(random)h(graph)g +Ft(G)e Fy(without)h(self-lo)5 b(ops)70 b(and)-161 8393 +y(m)-5 b(ultiple)60 b(edges.)86 b(Let)58 b Ft(X)72 b +Fy(b)5 b(e)59 b(a)g(random)h(v)-9 b(ariable)59 b(coun)-5 +b(ting)-161 8592 y(the)56 b(n)-5 b(um)g(b)5 b(er)58 b(of)e(iterations)g +(to)f(generate)h Ft(G)p Fy(.)76 b(V)-14 b(ariable)56 +b Ft(X)69 b Fy(is)-161 8792 y(said)k(to)f(ha)-5 b(v)g(e)72 +b(the)g(geometric)f(distribution)j(with)d Ft(P)23 b Fy(\()p +Ft(X)86 b Fy(=)-161 8991 y Ft(i)p Fy(\))46 b(=)h Ft(p)p +Fy(\(1)19 b Fx(\000)g Ft(p)p Fy(\))731 8931 y Fr(i)p +Fo(\000)p Fn(1)953 8991 y Fy(.)71 b(So,)48 b(the)e(exp)5 +b(ected)45 b(n)-5 b(um)g(b)5 b(er)47 b(of)f(iterations)-161 +9190 y(to)53 b(generate)f Ft(G)g Fy(is)i Ft(N)1183 9215 +y Fr(i)1238 9190 y Fy(\()p Ft(X)13 b Fy(\))45 b(=)1739 +9066 y Fp(P)1915 9107 y Fo(1)1915 9240 y Fr(j)7 b Fn(=1)2180 +9190 y Ft(j)j(P)23 b Fy(\()p Ft(X)58 b Fy(=)47 b Ft(j)10 +b Fy(\))45 b(=)h(1)p Ft(=p)53 b Fy(and)-161 9414 y(its)j(v)-9 +b(ariance)55 b(is)h Ft(V)36 b Fy(\()p Ft(X)13 b Fy(\))45 +b(=)i(\(1)36 b Fx(\000)h Ft(p)p Fy(\))p Ft(=p)2190 9354 +y Fn(2)2263 9414 y Fy(.)5 9618 y(Let)52 b Ft(\030)59 +b Fy(b)5 b(e)52 b(the)g(space)h(of)f(edges)g(in)h Ft(G)f +Fy(that)f(ma)-5 b(y)53 b(b)5 b(e)52 b(gener-)-161 9817 +y(ated)58 b(b)-5 b(y)58 b Ft(h)540 9842 y Fn(1)673 9817 +y Fy(and)g Ft(h)1094 9842 y Fn(2)1168 9817 y Fy(.)82 +b(The)58 b(graphs)i(generated)d(in)i(this)f(step)-161 +10017 y(are)64 b(undirected)g(and)g(the)f(n)-5 b(um)g(b)5 +b(er)65 b(of)f(p)5 b(ossible)65 b(edges)f(in)g Ft(\030)-161 +10216 y Fy(is)f(giv)-5 b(en)62 b(b)-5 b(y)62 b Fx(j)p +Ft(\030)8 b Fx(j)57 b Fy(=)1106 10082 y Fp(\000)1182 +10142 y Fo(j)p Fr(V)30 b Fo(j)1242 10273 y Fn(2)1368 +10082 y Fp(\001)1444 10216 y Fy(.)94 b(The)62 b(n)-5 +b(um)g(b)5 b(er)63 b(of)f(p)5 b(ossible)63 b(edges)-161 +10415 y(that)54 b(migh)-5 b(t)55 b(b)5 b(ecome)54 b(a)g(m)-5 +b(ultiple)55 b(edge)f(when)h(the)e Ft(j)10 b Fy(th)54 +b(edge)4136 620 y(is)43 b(added)h(to)e Ft(G)g Fy(is)h +Ft(j)21 b Fx(\000)11 b Fy(1,)46 b(and)e(the)e(incremen)-5 +b(tal)43 b(construction)4136 819 y(of)55 b Ft(G)g Fy(implies)i(that)e +Ft(p)p Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))55 b(is:)4331 +1313 y Ft(p)p Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))46 +b(=)5065 1106 y Fr(n)5000 1155 y Fp(Y)4991 1509 y Fr(j)7 +b Fn(=1)5268 1056 y Fp(\000)5344 1117 y Fo(j)p Fr(V)30 +b Fo(j)5404 1248 y Fn(2)5530 1056 y Fp(\001)5643 1190 +y Fx(\000)37 b Fy(\()p Ft(j)47 b Fx(\000)37 b Fy(1\))p +5268 1275 1035 7 v 5616 1321 a Fp(\000)5692 1382 y Fo(j)p +Fr(V)30 b Fo(j)5752 1513 y Fn(2)5878 1321 y Fp(\001)6368 +1313 y Fy(=)6544 1106 y Fr(n)p Fo(\000)p Fn(1)6564 1155 +y Fp(Y)6555 1509 y Fr(j)7 b Fn(=0)6843 1056 y Fp(\000)6919 +1117 y Fo(j)p Fr(V)30 b Fo(j)6979 1248 y Fn(2)7105 1056 +y Fp(\001)7218 1190 y Fx(\000)37 b Ft(j)p 6843 1275 619 +7 v 6984 1321 a Fp(\000)7060 1382 y Fo(j)p Fr(V)29 b +Fo(j)7120 1513 y Fn(2)7246 1321 y Fp(\001)7482 1313 y +Fx(\001)4302 1826 y Fy(As)56 b Fx(j)p Ft(V)37 b Fx(j)46 +b Fy(=)g Ft(cn)55 b Fy(w)-5 b(e)55 b(can)h(rewrite)e(the)h(probabilit) +-5 b(y)56 b Ft(p)p Fy(\()p Ft(n)p Fy(\))e(as:)5019 2321 +y Ft(p)p Fy(\()p Ft(n)p Fy(\))45 b(=)5553 2113 y Fr(n)p +Fo(\000)p Fn(1)5573 2163 y Fp(Y)5564 2516 y Fr(j)7 b +Fn(=0)5833 2321 y Fy(1)37 b Fx(\000)6119 2086 y Fp(\022)6528 +2208 y Fy(2)p Ft(j)p 6261 2282 695 7 v 6261 2434 a(c)6333 +2386 y Fn(2)6407 2434 y Ft(n)6507 2386 y Fn(2)6618 2434 +y Fx(\000)g Ft(cn)6976 2086 y Fp(\023)7126 2321 y Fx(\001)4302 +2834 y Fy(Using)58 b(an)g(asymptotic)f(estimate)g(from)h(P)-5 +b(almer)58 b([15],)g(for)4136 3033 y(t)-5 b(w)g(o)62 +b(functions)h Ft(f)5260 3058 y Fn(1)5391 3033 y Fy(:)57 +b Fx(<)g(!)g(<)k Fy(and)i Ft(f)6486 3058 y Fn(2)6617 +3033 y Fy(:)57 b Fx(<)g(!)g(<)62 b Fy(de\014ned)g(b)-5 +b(y)4136 3232 y Ft(f)4217 3257 y Fn(1)4292 3232 y Fy(\()p +Ft(k)5 b Fy(\))46 b(=)g(1)36 b Fx(\000)g Ft(k)60 b Fy(and)55 +b Ft(f)5567 3257 y Fn(2)5642 3232 y Fy(\()p Ft(k)5 b +Fy(\))46 b(=)g Ft(e)6161 3172 y Fo(\000)p Fr(k)6347 3232 +y Fy(,)55 b(the)g(inequalit)-5 b(y)54 b Ft(f)7584 3257 +y Fn(1)7659 3232 y Fy(\()p Ft(k)5 b Fy(\))46 b Fx(\024)4136 +3432 y Ft(f)4217 3457 y Fn(2)4292 3432 y Fy(\()p Ft(k)5 +b Fy(\))70 b(is)h(true)f Fx(8)47 b Ft(k)76 b Fx(2)71 +b(<)p Fy(.)118 b(Considering)71 b Ft(k)77 b Fy(=)7404 +3357 y Fn(2)p Fr(j)p 7210 3393 517 7 v 7210 3489 a(c)7269 +3456 y Fh(2)7334 3489 y Fr(n)7416 3456 y Fh(2)7481 3489 +y Fo(\000)p Fr(cn)7746 3432 y Fy(,)d(w)-5 b(e)4136 3631 +y(ha)g(v)g(e)4769 4083 y Ft(p)p Fy(\()p Ft(n)p Fy(\))45 +b Fx(\024)5303 3876 y Fr(n)p Fo(\000)p Fn(1)5323 3926 +y Fp(Y)5314 4279 y Fr(j)7 b Fn(=0)5583 4083 y Ft(e)5660 +3993 y Fo(\000)5764 3871 y Fp(\000)6041 3938 y Fh(2)p +Fm(j)p 5860 3967 474 7 v 5860 4052 a(c)5914 4028 y Fh(2)5978 +4052 y Fm(n)6051 4028 y Fh(2)6116 4052 y Fg(\000)p Fm(cn)6353 +3871 y Fp(\001)6484 4083 y Fy(=)46 b Ft(e)6736 3993 y +Fo(\000)6840 3871 y Fp(\000)6994 3940 y Fm(n)p Fg(\000)p +Fh(1)p 6936 3967 336 7 v 6936 4052 a Fm(c)6990 4028 y +Fh(2)7055 4052 y Fm(n)p Fg(\000)p Fm(c)7292 3871 y Fp(\001)7376 +4083 y Ft(:)4136 4587 y Fy(Th)-5 b(us,)5337 4948 y(lim)5278 +5048 y Fr(n)p Fo(!1)5653 4948 y Ft(p)p Fy(\()p Ft(n)p +Fy(\))44 b Fx(')j Ft(e)6264 4871 y Fo(\000)6419 4827 +y Fh(1)p 6388 4846 119 7 v 6388 4930 a Fm(c)6442 4906 +y Fh(2)6535 4948 y Ft(:)1262 b Fy(\(4\))4302 5393 y(As)59 +b Ft(N)4684 5418 y Fr(i)4740 5393 y Fy(\()p Ft(X)13 b +Fy(\))50 b(=)i(1)p Ft(=p)59 b Fy(then)g Ft(N)6076 5418 +y Fr(i)6131 5393 y Fy(\()p Ft(X)13 b Fy(\))51 b Fx(')h +Ft(e)6772 5271 y Fh(1)p 6741 5290 V 6741 5375 a Fm(c)6795 +5351 y Fh(2)6888 5393 y Fy(.)84 b(After)58 b(that,)h(w)-5 +b(e)4136 5592 y(empirically)60 b(determine)g(the)g Ft(c)f +Fy(v)-9 b(alue)60 b(to)f(obtain)h(a)g(random)4136 5791 +y(graph)f Ft(G)g Fy(with)f Fx(j)p Ft(E)5350 5816 y Fr(cr)t(it)5580 +5791 y Fx(j)51 b(\024)5878 5726 y Fn(1)p 5878 5753 67 +7 v 5878 5849 a(2)5964 5791 y Fx(j)p Ft(E)10 b Fx(j)p +Fy(.)83 b(F)-14 b(or)59 b(this)g(w)-5 b(e)59 b(built)g(10,000)4136 +5991 y(graphs)h(for)e(eac)-5 b(h)59 b Ft(c)f Fy(v)-9 +b(alue)58 b(and)h(n)-5 b(um)g(b)5 b(er)60 b(of)e(k)-5 +b(eys)58 b(presen)-5 b(ted)4136 6190 y(in)41 b(T)-14 +b(able)41 b(1.)69 b(The)40 b(t)-5 b(w)g(o)41 b(collections)f(used)h(in) +g(the)f(exp)5 b(erimen)-5 b(ts)4136 6389 y(\(T)-14 b(o)5 +b(doBR)61 b(and)g(TREC-VLC2\))g(are)g(describ)5 b(ed)61 +b(in)h(T)-14 b(able)61 b(4)4136 6588 y(\(see)55 b(Section)g(7)h(for)f +(more)g(details\).)4302 6788 y(W)-14 b(e)89 b(sho)-5 +b(w)90 b(in)f(T)-14 b(able)89 b(1)g(the)g(probabilit)-5 +b(y)90 b Ft(P)7266 6818 y Fo(j)p Fr(E)7402 6835 y Fm(cr)s(it)7614 +6818 y Fo(j)7751 6788 y Fy(that)4136 7003 y Fx(j)p Ft(E)4305 +7028 y Fr(cr)t(it)4535 7003 y Fx(j)83 b(\024)4896 6938 +y Fn(1)p 4896 6965 V 4896 7061 a(2)4983 7003 y Fx(j)p +Ft(E)10 b Fx(j)p Fy(,)82 b Fx(j)p Ft(E)10 b Fx(j)83 b +Fy(=)g Ft(n)p Fy(,)g(tends)78 b(to)f(0)h(when)g Ft(c)83 +b(<)g Fy(1)p Ft(:)p Fy(15)4136 7203 y(and)55 b Ft(n)g +Fy(increases.)74 b(Ho)-5 b(w)g(ev)g(er,)55 b(it)f(tends)h(to)f(1)h +(when)g Ft(c)46 b Fx(\025)g Fy(1)p Ft(:)p Fy(15)4136 +7402 y(and)76 b Ft(n)g Fy(increases.)135 b(Th)-5 b(us,)82 +b Fx(j)p Ft(V)37 b Fx(j)80 b Fy(=)g(1)p Ft(:)p Fy(15)p +Ft(n)75 b Fy(is)i(considered)f(a)4136 7601 y Fs(thr)-8 +b(eshold)78 b(function)e Fy(\(a)f(de\014nition)h(coined)f(b)-5 +b(y)76 b(Erd\177)-83 b(os)76 b(and)4136 7800 y(R)-5 b(\023)-78 +b(en)-5 b(yi)64 b([3,)f(5]\))g(for)g(generating)g(a)h(random)g(graph)g +Ft(G)e Fy(where)4136 8000 y Fx(j)p Ft(E)4305 8025 y Fr(cr)t(it)4535 +8000 y Fx(j)74 b(\024)4878 7934 y Fn(1)p 4878 7961 V +4878 8057 a(2)4964 8000 y Fx(j)p Ft(E)10 b Fx(j)72 b +Fy(with)g(probabilit)-5 b(y)72 b(tending)h(to)e(1)i(when)f(n)4136 +8199 y(increases.)78 b(Therefore,)56 b(w)-5 b(e)57 b(use)g +Ft(c)48 b Fy(=)g(1)p Ft(:)p Fy(15)56 b(in)h(the)f(new)h(algo-)4136 +8398 y(rithm.)4302 8597 y(The)68 b(MPHF)g(generated)g(b)-5 +b(y)68 b(the)g(new)g(algorithm)h(needs)4136 8797 y(1)p +Ft(:)p Fy(15)p Ft(n)52 b Fy(in)-5 b(teger)53 b(n)-5 b(um)g(b)5 +b(ers)54 b(to)e(b)5 b(e)52 b(stored,)h(since)g Fx(j)p +Ft(V)37 b Fx(j)46 b Fy(=)g(1)p Ft(:)p Fy(15)p Ft(n)p +Fy(.)4136 8996 y(Th)-5 b(us,)113 b(the)101 b(generated)f(function)g(is) +h(stored)g(in)g(55\045)g(|)4136 9195 y(1)p Ft(:)p Fy(15)p +Ft(n=)p Fy(2)p Ft(:)p Fy(09)p Ft(n)52 b Fy(|)g(of)g(the)f(space)i +(necessary)f(to)g(store)f(the)h(one)4136 9395 y(generated)j(b)-5 +b(y)56 b(the)f(CHM)g(algorithm.)4302 9594 y(As)h Ft(P)4655 +9624 y Fo(j)p Fr(E)4791 9641 y Fm(cr)s(it)5003 9624 y +Fo(j)5106 9594 y Fy(tends)f(to)g(1)h(when)f Ft(n)g Fy(increases,)h(w)-5 +b(e)55 b(consider)4136 9793 y(that)42 b(the)g(exp)5 b(ected)41 +b(n)-5 b(um)g(b)5 b(er)44 b(of)e(iterations)g(to)g(generate)g +Ft(G)g Fy(is)4136 10017 y Ft(N)4269 10042 y Fr(i)4325 +10017 y Fy(\()p Ft(X)13 b Fy(\))47 b Fx(')h Ft(e)4958 +9895 y Fh(1)p 4927 9914 119 7 v 4927 9999 a Fm(c)4981 +9975 y Fh(2)5074 10017 y Fy(.)77 b(F)-14 b(or)58 b Ft(c)47 +b Fy(=)i(1)p Ft(:)p Fy(15,)57 b Ft(N)6325 10042 y Fr(i)6380 +10017 y Fy(\()p Ft(X)13 b Fy(\))47 b Fx(')h Fy(2)p Ft(:)p +Fy(13)57 b(on)g(a)-5 b(v)g(erage,)4136 10216 y(whic)g(h)72 +b(is)g(constan)-5 b(t.)121 b(So,)75 b(the)c(mapping)h(step)f(tak)-5 +b(es)71 b Ft(O)5 b Fy(\()p Ft(n)p Fy(\))4136 10415 y(time.)3906 +10913 y(5)p eop end +%%Page: 6 6 +TeXDict begin 6 5 bop -90 460 8074 7 v 1902 635 a Fu(VLC2)51 +b(\()p Fk(n)p Fu(\))3155 b(T)-13 b(o)t(doBR)52 b(\()p +Fk(n)p Fu(\))p 383 727 3702 7 v 4283 727 V 139 895 a +Fk(c)277 b Fu(1)p Fk(;)25 b Fu(000)199 b(10)p Fk(;)25 +b Fu(000)198 b(100)p Fk(;)25 b Fu(000)199 b(1)p Fk(;)25 +b Fu(000)p Fk(;)f Fu(000)199 b(3)p Fk(;)25 b Fu(000)p +Fk(;)g Fu(000)398 b(1)p Fk(;)25 b Fu(000)198 b(10)p Fk(;)25 +b Fu(000)199 b(100)p Fk(;)24 b Fu(000)199 b(1)p Fk(;)25 +b Fu(000)p Fk(;)g Fu(000)198 b(3)p Fk(;)26 b Fu(000)p +Fk(;)e Fu(000)p -90 978 8074 7 v 10 1194 a(1.10)249 b(0.01)340 +b(0.00)415 b(0.00)527 b(0.00)600 b(0.00)649 b(0.02)339 +b(0.00)416 b(0.00)527 b(0.00)599 b(0.00)10 1377 y(1.11)249 +b(0.04)340 b(0.00)415 b(0.00)527 b(0.00)600 b(0.00)649 +b(0.05)339 b(0.00)416 b(0.00)527 b(0.00)599 b(0.00)10 +1559 y(1.12)249 b(0.12)340 b(0.00)415 b(0.00)527 b(0.00)600 +b(0.00)649 b(0.13)339 b(0.00)416 b(0.00)527 b(0.00)599 +b(0.00)10 1742 y(1.13)249 b(0.19)340 b(0.03)415 b(0.00)527 +b(0.00)600 b(0.00)649 b(0.20)339 b(0.02)416 b(0.00)527 +b(0.00)599 b(0.00)10 1925 y(1.14)249 b(0.30)340 b(0.09)415 +b(0.00)527 b(0.00)600 b(0.00)649 b(0.31)339 b(0.11)416 +b(0.00)527 b(0.00)599 b(0.00)10 2107 y(1.15)249 b(0.50)340 +b(0.56)415 b(0.65)527 b(0.89)600 b(1.00)649 b(0.51)339 +b(0.57)416 b(0.65)527 b(0.88)599 b(1.00)10 2290 y(1.16)249 +b(0.68)340 b(0.70)415 b(0.88)527 b(0.95)600 b(1.00)649 +b(0.70)339 b(0.83)416 b(0.95)527 b(0.95)599 b(1.00)10 +2473 y(1.17)249 b(0.77)340 b(0.82)415 b(0.90)527 b(1.00)600 +b(1.00)649 b(0.78)339 b(0.99)416 b(0.98)527 b(1.00)599 +b(1.00)10 2655 y(1.18)249 b(0.91)340 b(0.97)415 b(0.98)527 +b(1.00)600 b(1.00)649 b(0.91)339 b(1.00)416 b(1.00)527 +b(1.00)599 b(1.00)10 2838 y(1.19)249 b(0.94)340 b(1.00)415 +b(1.00)527 b(1.00)600 b(1.00)649 b(0.95)339 b(1.00)416 +b(1.00)527 b(1.00)599 b(1.00)10 3021 y(1.20)249 b(0.98)340 +b(1.00)415 b(1.00)527 b(1.00)600 b(1.00)649 b(0.99)339 +b(1.00)416 b(1.00)527 b(1.00)599 b(1.00)p -90 3129 V +-161 3477 a Fy(T)-14 b(able)49 b(1:)70 b(Probabilit)-5 +b(y)49 b Ft(P)1458 3507 y Fo(j)p Fr(E)1594 3524 y Fm(cr)s(it)1807 +3507 y Fo(j)1903 3477 y Fy(that)e Fx(j)p Ft(E)2424 3502 +y Fr(cr)t(it)2654 3477 y Fx(j)f(\024)2942 3411 y Fn(1)p +2942 3438 67 7 v 2942 3534 a(2)3028 3477 y Ft(n)i Fy(for)g(di\013eren) +-5 b(t)48 b Ft(c)g Fy(v)-9 b(alues)49 b(and)g(di\013eren)-5 +b(t)48 b(n)-5 b(um)g(b)5 b(er)50 b(of)e(k)-5 b(eys)48 +b(for)g(the)g(collections)-161 3676 y(VLC2)55 b(and)h(T)-14 +b(o)5 b(doBR.)5 4174 y(The)72 b(new)f(algorithm)i(do)5 +b(es)71 b(not)h(v)-5 b(erify)71 b(if)g Ft(G)g Fy(really)h(has)-161 +4373 y(at)63 b(most)g(0)p Ft(:)p Fy(5)p Ft(n)f Fy(critical)g(edges)h +(in)g(the)g(mapping)g(step.)96 b(The)-161 4572 y(rationale)65 +b(is)g(that)f Ft(P)1193 4602 y Fo(j)p Fr(E)1329 4619 +y Fm(cr)s(it)1541 4602 y Fo(j)1654 4572 y Fy(tends)h(to)f(1)g(when)h +Ft(n)f Fy(increases.)-161 4772 y(Ho)-5 b(w)g(ev)g(er,)43 +b(if)c(some)h(addition)g Ft(g)6 b Fy(\()p Ft(u)p Fy(\))f(+)g +Ft(g)h Fy(\()p Ft(w)t Fy(\))38 b(is)i(greater)f(than)g +Ft(m)-161 4971 y Fy(in)52 b(the)f(searc)-5 b(hing)53 +b(step)e(for)g Fx(f)p Ft(u;)28 b(w)t Fx(g)47 b(2)e Ft(E)61 +b Fy(then)51 b(the)g(mapping)-161 5170 y(step)56 b(is)g(restarted,)f +(as)h(sho)-5 b(wn)56 b(in)g(line)g(17)f(of)g(Figure)h(7.)-161 +5694 y Fi(5.2)225 b(Ordering)74 b(Step)-161 6021 y Fy(The)59 +b(pro)5 b(cedure)58 b(Ordering)i(\()p Ft(G)p Fy(,)e Ft(G)2095 +6046 y Fr(cr)t(it)2325 6021 y Fy(,)h Ft(G)2561 6046 y +Fr(ncr)t(it)2873 6021 y Fy(\))f(receiv)-5 b(es)59 b(as)-161 +6220 y(input)43 b(the)g(graph)g Ft(G)f Fy(and)h(partitions)g +Ft(G)f Fy(in)-5 b(to)43 b(t)-5 b(w)g(o)43 b(subgraphs)-161 +6419 y Ft(G)-30 6444 y Fr(cr)t(it)259 6419 y Fy(and)60 +b Ft(G)717 6444 y Fr(ncr)t(it)1028 6419 y Fy(.)85 b(T)-14 +b(o)59 b(partition)g(the)g(graph)h Ft(G)e Fy(in)-5 b(to)60 +b Ft(G)3529 6444 y Fr(cr)t(it)-161 6618 y Fy(and)68 b +Ft(G)305 6643 y Fr(ncr)t(it)683 6618 y Fy(w)-5 b(e)67 +b(use)h(an)f(optimal)g(time)g(algorithm,)k(as)c(fol-)-161 +6818 y(lo)-5 b(ws.)114 b(Figure)69 b(4)f(presen)-5 b(ts)70 +b(a)e(sample)i(graph)f(with)f(16)g(v)-5 b(er-)-161 7017 +y(tices)83 b(and)g(14)g(edges,)90 b(where)82 b(the)h(degree)f(of)g(a)h +(v)-5 b(ertex)82 b(is)-161 7216 y(sho)-5 b(wn)67 b(b)5 +b(esides)66 b(eac)-5 b(h)65 b(v)-5 b(ertex.)102 b(Initially)-14 +b(,)68 b(all)e(v)-5 b(ertices)64 b(with)-161 7415 y(degree)76 +b(1)h(are)f(added)h(to)e(a)i(queue)f Ft(Q)p Fy(.)137 +b(F)-14 b(or)76 b(the)g(example)-161 7615 y(sho)-5 b(wn)82 +b(in)e(Figure)g(4\(a\),)86 b Ft(Q)h Fy(=)g Fx(f)p Fy(14)p +Ft(;)28 b Fy(15)p Ft(;)g Fy(9)p Ft(;)g Fy(10)p Ft(;)g +Fy(0)p Ft(;)g Fy(1)p Ft(;)g Fy(11)p Ft(;)g Fy(12)p Fx(g)-161 +7814 y Fy(after)72 b(the)g(initialization)h(step.)126 +b(This)73 b(initialization)g(tak)-5 b(es)-161 8013 y +Ft(O)5 b Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))68 b(time,)k(b)5 +b(ecause)68 b(w)-5 b(e)68 b(need)h(to)e(c)-5 b(hec)g(k)69 +b(the)f(degree)g(of)-161 8212 y(eac)-5 b(h)56 b(v)-5 +b(ertex)54 b(from)i Ft(V)36 b Fy(.)5 8423 y(Next,)46 +b(w)-5 b(e)44 b(remo)-5 b(v)g(e)45 b(one)f(v)-5 b(ertex)44 +b Ft(v)50 b Fy(from)45 b(the)f(queue,)i(decre-)-161 8622 +y(men)-5 b(t)56 b(its)e(degree)h(and)g(the)g(degree)f(of)h(v)-5 +b(ertices)54 b(with)h(degree)-161 8821 y(greater)i(than)h(0)f(in)h(the) +f(adjacen)-5 b(t)58 b(list)g(of)f Ft(v)6 b Fy(,)58 b(as)h(depicted)e +(in)-161 9020 y(Figure)j(4\(b\))e(for)h Ft(v)g Fy(=)52 +b(14.)85 b(A)-5 b(t)59 b(this)g(p)5 b(oin)-5 b(t,)61 +b(the)d(adjacencies)-161 9220 y(of)c Ft(v)60 b Fy(with)53 +b(degree)h(1)f(are)h(inserted)g(in)-5 b(to)54 b(the)f(queue,)h(suc)-5 +b(h)55 b(as)-161 9419 y(v)-5 b(ertex)46 b(13)h(in)h(Figure)f(4\(c\).)70 +b(This)48 b(pro)5 b(cess)48 b(is)f(rep)5 b(eated)47 b(un)-5 +b(til)-161 9618 y(the)64 b(queue)g(b)5 b(ecomes)64 b(empt)-5 +b(y)-14 b(.)101 b(All)64 b(v)-5 b(ertices)63 b(with)h(degree)g(0)-161 +9817 y(are)50 b(non)g(critical)f(v)-5 b(ertices)49 b(and)h(the)f +(others)h(are)f(critical)g(v)-5 b(er-)-161 10017 y(tices,)75 +b(as)c(depicted)f(in)h(Figure)g(4\(d\).)119 b(This)71 +b(pro)5 b(cess)71 b(tak)-5 b(es)-161 10216 y Ft(O)5 b +Fy(\()p Fx(j)p Ft(V)179 10241 y Fr(ncr)t(it)490 10216 +y Fx(j)p Fy(\),)46 b(b)5 b(ecause)43 b(eac)-5 b(h)43 +b(non)g(critical)g(v)-5 b(ertex)42 b(is)i(remo)-5 b(v)g(ed)-161 +10415 y(from)56 b(the)f(queue)g(only)g(once.)4302 4174 +y(Finally)-14 b(,)79 b(to)73 b(determine)h(the)f(v)-5 +b(ertices)73 b(in)g Ft(V)7168 4199 y Fr(scr)t(it)7534 +4174 y Fy(w)-5 b(e)74 b(col-)4136 4373 y(lect)f(all)i(v)-5 +b(ertices)73 b Ft(v)84 b Fx(2)77 b Ft(V)5786 4398 y Fr(cr)t(it)6090 +4373 y Fy(with)d(at)f(least)h(one)g(v)-5 b(ertex)73 b +Ft(u)4136 4572 y Fy(that)56 b(is)h(in)g(Adj\()p Ft(v)6 +b Fy(\))56 b(and)h(in)g Ft(V)6016 4597 y Fr(ncr)t(it)6328 +4572 y Fy(,)g(as)g(the)f(v)-5 b(ertex)56 b(5)g(in)h(Fig-)4136 +4772 y(ure)72 b(4\(d\).)123 b(This)73 b(pro)5 b(cess)73 +b(tak)-5 b(es)72 b Ft(O)5 b Fy(\()p Fx(j)p Ft(V)6687 +4797 y Fr(cr)t(it)6915 4772 y Fx(j)p Fy(\).)124 b(Considering)4136 +4971 y(that)80 b Fx(j)p Ft(V)4664 4996 y Fr(cr)t(it)4894 +4971 y Fx(j)87 b(\024)h(j)p Ft(V)37 b Fx(j)p Fy(,)87 +b Fx(j)p Ft(V)5746 4996 y Fr(ncr)t(it)6058 4971 y Fx(j)g(\024)h(j)p +Ft(V)37 b Fx(j)80 b Fy(and)h Fx(j)p Ft(V)37 b Fx(j)88 +b Fy(=)f Ft(n)p Fy(,)g(the)4136 5170 y(ordering)56 b(step)g(tak)-5 +b(es)55 b Ft(O)5 b Fy(\()p Ft(n)p Fy(\))53 b(time.)4136 +5687 y Fi(5.3)225 b(Searc)-6 b(hing)73 b(Step)4136 6011 +y Fy(The)54 b(pro)5 b(cedure)54 b(Searc)-5 b(hing)55 +b(\()p Ft(G)p Fy(,)f Ft(G)6424 6036 y Fr(cr)t(it)6653 +6011 y Fy(,)g Ft(G)6884 6036 y Fr(ncr)t(it)7196 6011 +y Fy(,)h Ft(g)6 b Fy(\))53 b(receiv)-5 b(es)4136 6210 +y(as)69 b(input)f Ft(G)p Fy(,)i Ft(G)5186 6235 y Fr(cr)t(it)5416 +6210 y Fy(,)h Ft(G)5664 6235 y Fr(ncr)t(it)6043 6210 +y Fy(and)d(\014nds)h(a)f(log)7154 6251 y Fn(2)7256 6210 +y Fx(j)p Ft(V)37 b Fx(j)45 b Fy(+)g(1)68 b(bit)4136 6410 +y(v)-9 b(alue)78 b(for)g(eac)-5 b(h)79 b(v)-5 b(ertex)77 +b Ft(v)91 b Fx(2)84 b Ft(V)37 b Fy(,)84 b(stored)79 b(in)f(the)g(arra) +-5 b(y)79 b Ft(g)6 b Fy(.)4136 6609 y(A)70 b(pseudo)i(co)5 +b(de)69 b(for)i(the)f(searc)-5 b(hing)71 b(step)g(is)g(presen)-5 +b(ted)71 b(in)4136 6808 y(Figure)54 b(5.)74 b(The)53 +b(searc)-5 b(hing)55 b(step)f(is)g(\014rst)g(p)5 b(erformed)53 +b(for)h(the)4136 7007 y(v)-5 b(ertices)55 b(in)h Ft(G)5062 +7032 y Fr(cr)t(it)5347 7007 y Fy(and)g(second)g(for)f(the)g(v)-5 +b(ertices)55 b(in)g Ft(G)7671 7032 y Fr(ncr)t(it)7983 +7007 y Fy(.)4136 7491 y Fq(5.3.1)193 b(Assignmen)-5 b(t)103 +b(of)g(V)-16 b(alues)103 b(to)g(Critical)f(V)-16 b(er-)4720 +7690 y(tices)4136 8014 y Fy(The)76 b(pro)5 b(cedure)76 +b(CriticalV)-14 b(erticesAssignmen)-5 b(t)77 b(\()p Ft(G)p +Fy(,)j Ft(G)7779 8039 y Fr(cr)t(it)8009 8014 y Fy(,)4136 +8214 y Ft(g)6 b Fy(,)70 b(AssignedEdges\))e(receiv)-5 +b(es)66 b Ft(G)g Fy(and)h Ft(G)6822 8239 y Fr(cr)t(it)7118 +8214 y Fy(as)h(input)f(and)4136 8413 y(pro)5 b(duces)64 +b(as)g(output)f(a)h Ft(g)69 b Fy(v)-9 b(alue)63 b(for)g(eac)-5 +b(h)64 b(v)-5 b(ertex)62 b(in)i Ft(G)7826 8438 y Fr(cr)t(it)4136 +8612 y Fy(and)41 b(the)f(AssignedEdges)i(arra)-5 b(y)-14 +b(.)69 b(Suc)-5 b(h)41 b(arra)-5 b(y)41 b(has)g Ft(m)f +Fy(en)-5 b(tries)4136 8812 y(and)42 b(indicates)f(the)g(edges)g(for)g +(whic)-5 b(h)42 b(a)f(v)-9 b(alue)41 b Ft(h)p Fy(\()p +Ft(e)p Fy(\))k Fx(2)h Fy([0)p Ft(;)28 b(m)8 b Fx(\000)4136 +9011 y Fy(1],)83 b Ft(e)g Fx(2)f Ft(E)4870 9036 y Fr(cr)t(it)5100 +9011 y Fy(,)h(has)78 b(already)f(b)5 b(een)77 b(assigned.)141 +b(W)-14 b(e)76 b(use)i(a)4136 9210 y(breadth-\014rst)55 +b(searc)-5 b(h)54 b(algorithm)g(to)f(assign)i(v)-9 b(alues)54 +b(to)f(eac)-5 b(h)4136 9409 y(v)g(ertex)50 b(in)i Ft(G)4956 +9434 y Fr(cr)t(it)5185 9409 y Fy(.)73 b(The)51 b(reason)h(w)-5 +b(e)51 b(start)g(the)f(assignmen)-5 b(t)53 b(of)4136 +9609 y(v)-9 b(alues)67 b(to)f(v)-5 b(ertices)67 b(in)g +Ft(G)5805 9634 y Fr(cr)t(it)6101 9609 y Fy(is)h(to)e(resolv)-5 +b(e)67 b(reassignmen)-5 b(ts)4136 9808 y(as)81 b(earlier)e(as)i(p)5 +b(ossible.)148 b(The)80 b(reassignmen)-5 b(t)82 b(problem)e(is)4136 +10007 y(illustrated)56 b(in)g(the)f(next)f(paragraph.)4302 +10216 y(Considering)39 b(the)d(subgraph)j Ft(G)6300 10241 +y Fr(cr)t(it)6567 10216 y Fy(in)e(Figure)h(4\(d\),)i(a)d(step)4136 +10415 y(b)-5 b(y)47 b(step)g(example)g(of)g(the)g(assignmen)-5 +b(t)48 b(of)f(v)-9 b(alues)47 b(to)f(v)-5 b(ertices)3906 +10913 y(6)p eop end +%%Page: 7 7 +TeXDict begin 7 6 bop -140 2644 a + currentpoint currentpoint translate 0.9 0.9 scale neg exch neg exch +translate + -140 2644 a -140 210 +a + 35851059 9604136 0 0 35851059 9604136 startTexFig + -140 210 a +%%BeginDocument: figs/grafordering.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafordering.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Thu Sep 16 10:11:08 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 545 146 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.827 0.827 0.827 srgb} bind def + +end +save +newpath 0 146 moveto 0 0 lineto 545 0 lineto 545 146 lineto closepath clip newpath +-21.7 329.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n 1080.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +540 4545 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1170 4590 m +gs 1 -1 sc (d:1) col0 sh gr +% Arc +n 967.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 3240.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2700 4545 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3330 4590 m +gs 1 -1 sc (d:1) col0 sh gr +% Arc +n 3127.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 3261.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 4257.7 5095.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 4628.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 4406.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 3189.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 3427.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 2865.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 3732.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 3905.2 4770.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 4146.1 4098.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 3804.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +% Arc +n 3983.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3041 5079 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +2679 4173 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3040 3711 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3288 3452 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3595 3393 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3939 3487 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +4379 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +4447 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4377 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4047 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3715 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3402 5214 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3715 4589 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +3721 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +2520 3105 m +gs 1 -1 sc (b\)) col0 sh gr +% Arc +n 5400.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4860 4545 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5490 4590 m +gs 1 -1 sc (d:1) col0 sh gr +% Arc +n 5287.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 5421.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 6417.7 5095.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 6788.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 6566.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 5349.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 5587.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 5025.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 5892.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 6065.2 4770.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 6306.1 4098.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 6143.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 5964.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5201 5079 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +4839 4173 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5200 3711 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5448 3452 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5755 3393 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +6099 3487 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +6539 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +6607 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6537 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6207 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +5875 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +5562 5214 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5875 4589 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +5881 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +4680 3105 m +gs 1 -1 sc (c\)) col0 sh gr +% Arc +n 1101.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 2097.7 5095.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 2468.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 2246.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 1029.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 1267.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 705.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 1572.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 1745.2 4770.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 1986.1 4098.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 1823.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 1644.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +% Arc +n 7581.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 8577.7 5095.8 515.7 -82.9475 -161.3616 arcn +gs col0 s gr + +% Arc +n 8948.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 8726.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 7509.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 7747.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 7185.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 8052.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 8225.2 4770.6 216.0 117.0515 14.8509 arcn +gs col0 s gr + +% Arc +n 8466.1 4098.9 234.3 26.3682 -62.5758 arcn +gs col0 s gr + +% Arc +n 8303.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 8124.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +% Arc +n 7447.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 7560.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +881 5079 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +519 4173 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +880 3711 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1128 3452 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1435 3393 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1779 3487 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +2219 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +2287 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +2217 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +1887 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +1555 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +1242 5214 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1561 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +360 3105 m +gs 1 -1 sc (a\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +1550 4590 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +7361 5079 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +6999 4173 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7360 3711 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7608 3452 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7915 3393 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8259 3487 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8699 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +8767 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +8697 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +8367 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +8035 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +7722 5214 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8035 4589 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +8041 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +6840 3105 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +7020 4545 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7650 4590 m +gs 1 -1 sc (d:0) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 967 3847 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +892 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 1215 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1140 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 1642 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1605 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 1642 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1605 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 2160 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2122 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 2092 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2055 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 1957 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1920 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 1642 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1605 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 1327 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1290 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 1012 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +937 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 832 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +757 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 2092 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2055 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 1867 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1830 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 1530 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1492 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 1217 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1142 4401 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 851 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +776 4551 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +0 slj +0 slc +n 810 2970 m 990 2970 l 990 3150 l 810 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +825 3112 m +gs 1 -1 sc (14) col0 sh gr +% Polyline +n 990 2970 m 1170 2970 l 1170 3150 l 990 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1005 3112 m +gs 1 -1 sc (15) col0 sh gr +% Polyline +n 1170 2970 m 1350 2970 l 1350 3150 l 1170 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1222 3112 m +gs 1 -1 sc (9) col0 sh gr +% Polyline +n 1350 2970 m 1530 2970 l 1530 3150 l 1350 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1365 3112 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 1530 2970 m 1710 2970 l 1710 3150 l 1530 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1582 3112 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 1710 2970 m 1890 2970 l 1890 3150 l 1710 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1762 3112 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1890 2970 m 2070 2970 l 2070 3150 l 1890 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1905 3112 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 2070 2970 m 2250 2970 l 2250 3150 l 2070 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2085 3112 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +585 3105 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 3375 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3300 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 3802 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3765 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 3802 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3765 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 4320 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4282 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 4252 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4215 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 4117 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4080 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 3802 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3765 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3487 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3450 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 3172 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3097 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 2992 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2917 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 4252 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4215 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 4027 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3990 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 3690 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3652 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 3127 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3052 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 3377 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3302 4401 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 3011 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2936 4551 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 3150 2970 m 3330 2970 l 3330 3150 l 3150 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3202 3112 m +gs 1 -1 sc (9) col0 sh gr +% Polyline +n 3510 2970 m 3690 2970 l 3690 3150 l 3510 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3562 3112 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 3690 2970 m 3870 2970 l 3870 3150 l 3690 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3742 3112 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 3330 2970 m 3510 2970 l 3510 3150 l 3330 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3345 3112 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 2967 2970 m 3147 2970 l 3147 3150 l 2967 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2982 3112 m +gs 1 -1 sc (15) col0 sh gr +% Polyline +n 3870 2970 m 4050 2970 l 4050 3150 l 3870 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3885 3112 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 4050 2970 m 4230 2970 l 4230 3150 l 4050 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4065 3112 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +2790 3105 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 5962 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5925 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 5962 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5925 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 6480 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6442 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 6412 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6375 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 6277 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6240 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 5962 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5925 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5647 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5610 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 5332 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5257 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 5152 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5077 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 6412 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6375 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 6187 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6150 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 5850 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5812 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5287 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5212 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 5535 3577 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5460 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 5537 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5462 4401 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 5171 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5096 4551 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 5133 2970 m 5313 2970 l 5313 3150 l 5133 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5185 3112 m +gs 1 -1 sc (9) col0 sh gr +% Polyline +n 5493 2970 m 5673 2970 l 5673 3150 l 5493 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5545 3112 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 5673 2970 m 5853 2970 l 5853 3150 l 5673 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5725 3112 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 5310 2970 m 5490 2970 l 5490 3150 l 5310 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5325 3112 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 6210 2970 m 6390 2970 l 6390 3150 l 6210 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6225 3112 m +gs 1 -1 sc (13) col0 sh gr +% Polyline +n 5850 2970 m 6030 2970 l 6030 3150 l 5850 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5865 3112 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 6030 2970 m 6210 2970 l 6210 3150 l 6030 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6045 3112 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +4950 3105 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 8122 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8085 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 8122 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8085 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 8640 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8602 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 8572 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8535 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 8437 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8400 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 8122 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8085 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 8572 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8535 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 7447 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7372 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 7492 4837 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7417 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 7807 4972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7770 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 8347 3622 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8310 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 7312 4117 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7237 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 8010 3532 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7972 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 7695 3577 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7620 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 7961 3026 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +% Polyline +n 7979 2966 m + 7942 3087 l gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +7734 3072 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 7331 4498 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7256 4551 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 7697 4348 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7622 4401 m +gs 1 -1 sc (12) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + -140 2644 a + currentpoint currentpoint translate 1 0.9 div 1 0.9 div scale neg +exch neg exch translate + -140 2644 a 1536 3033 a Fy(Figure)56 b(4:)74 +b(Ordering)56 b(step)f(for)g(a)h(graph)f(with)h(16)f(v)-5 +b(ertices)55 b(and)h(14)f(edges.)p -169 3437 9 103 v +-169 3343 103 9 v -66 3343 8027 9 v 7961 3343 103 9 v +8056 3437 9 103 v -169 3594 9 150 v 8055 3594 V -72 3549 +a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)82 b Fu(S)6 +b(e)g(a)g(r)g(c)g(h)g(i)g(n)g(g)92 b(\()16 b Fk(G)32 +b Fu(,)83 b Fk(G)1993 3566 y Fj(cr)s(it)2243 3549 y Fu(,)g +Fk(G)2489 3566 y Fj(ncr)s(it)2815 3549 y Fu(,)g Fk(g)15 +b Fu(\))p -169 3751 V 8055 3751 V 180 3706 a(C)8 b(r)g(i)g(t)g(i)g(c)g +(a)g(l)g(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e) +g(n)g(t)99 b(\()16 b Fk(G)32 b Fu(,)83 b Fk(G)2784 3723 +y Fj(cr)s(it)3034 3706 y Fu(,)g Fk(g)38 b Fu(,)85 b(A)s(s)s(s)s(i)s(g)s +(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b(\))i(;)p -169 3908 +V 8055 3908 V 177 3863 a(N)6 b(o)g(n)g(C)g(r)g(i)g(t)g(i)g(c)g(a)g(l)g +(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t) +95 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(G)3022 3880 y Fj(ncr)s(it)3348 +3863 y Fu(,)i(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)20 +b(,)94 b Fk(g)24 b Fu(\))19 b(;)p -169 4011 9 103 v -168 +4011 103 9 v -66 4011 8027 9 v 7961 4011 103 9 v 8056 +4011 9 103 v 2098 4433 a Fy(Figure)56 b(5:)74 b(Pseudo)56 +b(co)5 b(de)55 b(for)g(the)g(searc)-5 b(hing)57 b(algorithm.)1352 +6119 y + currentpoint currentpoint translate 0.9 0.9 scale neg exch neg exch +translate + 1352 6119 a 1352 4503 a + 22760488 6380830 0 0 22760488 6380830 startTexFig + 1352 4503 a +%%BeginDocument: figs/grafsearching.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearching.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Thu Sep 16 08:20:14 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 346 97 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.827 0.827 0.827 srgb} bind def + +end +save +newpath 0 97 moveto 0 0 lineto 346 0 lineto 346 97 lineto closepath clip newpath +-21.7 275.9 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n 194.4 6671.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 1190.7 4333.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 1561.4 1948.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 1339.5 4812.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 665.5 2429.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 838.2 4008.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 1079.1 3336.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 916.4 3866.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 1544.4 6668.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 2540.7 4330.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 2911.4 1945.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 2689.5 4809.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 2015.5 2426.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 2188.2 4005.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 2429.1 3333.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 2266.4 3863.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 2984.4 6668.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 3980.7 4330.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 4351.4 1945.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 4129.5 4809.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 3455.5 2426.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 3628.2 4005.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 3869.1 3333.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 3706.4 3863.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 4424.4 6668.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 5420.7 4330.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 5791.4 1945.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 5569.5 4809.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 4895.5 2426.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 5068.2 4005.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 5309.1 3333.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 5146.4 3863.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +360 3105 m +gs 1 -1 sc (a\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +398 3647 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +2660 3801 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1748 3644 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +2250 3780 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 142.88 scf sf +2250 3555 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 142.88 scf sf +2745 3465 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +1710 3102 m +gs 1 -1 sc (b\)) col0 sh gr +/Times-Roman ff 174.63 scf sf +3150 3102 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +4100 3801 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3188 3644 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 3780 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 3555 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3195 4275 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 142.88 scf sf +3915 4320 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4050 4050 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 4365 m +gs 1 -1 sc (7) col0 sh gr +/Times-Roman ff 142.88 scf sf +3465 4005 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +4185 3465 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +4590 3102 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +5610 3496 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +5540 3801 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +4628 3644 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5130 3780 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5130 3555 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 142.88 scf sf +4635 4275 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 142.88 scf sf +5355 4320 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +5490 4050 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 142.88 scf sf +5130 4365 m +gs 1 -1 sc (7) col0 sh gr +/Times-Roman ff 142.88 scf sf +4905 4005 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +5580 3330 m +gs 1 -1 sc (8) col0 sh gr +/Times-Roman ff 142.88 scf sf +5310 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +4635 3285 m +gs 1 -1 sc (g:7) col0 sh gr +/Times-Roman ff 142.88 scf sf +5085 3105 m +gs 1 -1 sc (13) col0 sh gr +/Times-Roman ff 142.88 scf sf +5265 3330 m +gs 1 -1 sc (9) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 735 3220 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +698 3273 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 735 3580 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +698 3633 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 1253 3445 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1215 3498 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 1185 3760 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1148 3813 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 1050 4120 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1013 4173 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 735 4210 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +698 4263 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 1185 3122 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1148 3175 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 2085 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2048 3270 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 2085 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2048 3630 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 2603 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2565 3495 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 2535 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2498 3810 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 2400 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2363 4170 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 2085 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2048 4260 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 2535 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2498 3172 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 3525 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3488 3270 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 3525 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3488 3630 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 4043 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4005 3495 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 3975 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3938 3810 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 3840 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3803 4170 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 3525 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3488 4260 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3975 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3938 3172 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 4965 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4928 3270 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 4965 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4928 3630 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 5483 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5445 3495 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 5415 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5378 3810 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 5280 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5243 4170 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 4965 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4928 4260 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5415 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5378 3172 m +gs 1 -1 sc (2) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + 1352 6119 a + currentpoint currentpoint translate 1 0.9 div 1 0.9 div scale neg +exch neg exch translate + 1352 6119 a 2001 6509 a Fy(Figure)f(6:)74 +b(Example)56 b(of)f(the)g(critical)g(v)-5 b(ertices)55 +b(assignmen)-5 b(t.)-161 7039 y(in)63 b Ft(G)171 7064 +y Fr(cr)t(it)464 7039 y Fy(is)g(presen)-5 b(ted)63 b(in)g(Figure)h(6.) +96 b(Initially)-14 b(,)65 b(a)d(v)-5 b(ertex)62 b Ft(v)-161 +7238 y Fy(is)52 b(c)-5 b(hosen)52 b(c)-5 b(hosen)52 b(and)f(the)g +(assignmen)-5 b(t)52 b Ft(g)6 b Fy(\()p Ft(v)g Fy(\))46 +b(=)g(0)51 b(is)h(made.)-161 7438 y(F)-14 b(or)69 b(example,)j(supp)5 +b(ose)69 b(that)f(v)-5 b(ertex)67 b(5)h(in)g(Figure)h(6\(a\))f(is)-161 +7637 y(c)-5 b(hosen)64 b(and)e(the)g(assignmen)-5 b(t)64 +b Ft(g)6 b Fy(\(5\))57 b(=)h(0)k(is)h(made.)95 b(In)62 +b(Fig-)-161 7836 y(ure)51 b(6\(b\),)h(follo)-5 b(wing)51 +b(the)g(adjacen)-5 b(t)50 b(list)h(of)g(v)-5 b(ertex)50 +b(5,)h Ft(g)6 b Fy(\(6\))51 b(is)-161 8035 y(set)65 b(to)f(1)h(and)g +Ft(g)6 b Fy(\(4\))64 b(is)i(set)e(to)h(2,)i(implying)e(that)g +(addresses)-161 8235 y(1)70 b(and)g(2)g(m)-5 b(ust)70 +b(b)5 b(e)70 b(assigned)h(to)e(edges)h Fx(f)p Fy(5)p +Ft(;)28 b Fy(6)p Fx(g)69 b Fy(and)h Fx(f)p Fy(5)p Ft(;)28 +b Fy(4)p Fx(g)p Fy(,)-161 8434 y(resp)5 b(ectiv)-5 b(ely)-14 +b(.)85 b(A)-5 b(t)59 b(the)f(same)i(time,)g(addresses)h(1)f(and)f(2)g +(are)-161 8633 y(added)48 b(to)e(the)g(list)h(of)g(AssignedEdges.)72 +b(In)47 b(Figure)h(6\(c\),)f(fol-)-161 8832 y(lo)-5 b(wing)49 +b(the)d(adjacen)-5 b(t)48 b(list)f(of)g(v)-5 b(ertex)47 +b(6,)i Ft(g)6 b Fy(\(7\))46 b(is)i(set)f(to)g(3)h(and)-161 +9032 y Ft(g)6 b Fy(\(8\))41 b(is)g(set)g(to)g(4,)j(implying)e(that)e +(addresses)j(4,)h(5)d(and)g(7)g(m)-5 b(ust)-161 9231 +y(b)5 b(e)66 b(assigned)h(to)e(edges)h Fx(f)p Fy(6)p +Ft(;)28 b Fy(7)p Fx(g)p Fy(,)68 b Fx(f)p Fy(6)p Ft(;)28 +b Fy(8)p Fx(g)65 b Fy(and)h Fx(f)p Fy(7)p Ft(;)28 b Fy(8)p +Fx(g)p Fy(,)68 b(resp)5 b(ec-)-161 9430 y(tiv)-5 b(ely)-14 +b(.)104 b(Finally)-14 b(,)68 b(in)e(Figure)g(6\(d\),)h(follo)-5 +b(wing)66 b(the)f(adjacen)-5 b(t)-161 9629 y(list)64 +b(of)g(v)-5 b(ertex)62 b(4,)k Ft(g)6 b Fy(\(2\))63 b(cannot)g(b)5 +b(e)63 b(assigned)i(to)f(5)f(b)5 b(ecause)-161 9829 y(the)61 +b(sum)h Ft(g)6 b Fy(\(2\))40 b(+)g Ft(g)6 b Fy(\(4\))60 +b(w)-5 b(ould)62 b(cause)f(a)g(reassignmen)-5 b(t)62 +b(with)-161 10028 y(the)70 b(already)g(assigned)h(address)h(7)e(to)f +(edge)h Fx(f)p Fy(7)p Ft(;)28 b Fy(8)p Fx(g)p Fy(,)74 +b(so)d(the)-161 10227 y(next)76 b Ft(g)83 b Fy(v)-9 b(alue)77 +b(6)g(is)g(used)h(instead,)k(and)c(the)e(assignmen)-5 +b(ts)4136 7039 y Ft(g)6 b Fy(\(2\))74 b(=)h(6)d(and)h +Ft(g)6 b Fy(\(3\))74 b(=)h(7)e(are)f(made,)77 b(implying)d(that)e(ad-) +4136 7238 y(dresses)67 b(8,)h(9)d(and)h(13)f(m)-5 b(ust)67 +b(b)5 b(e)65 b(assigned)i(to)d(edges)i Fx(f)p Fy(4)p +Ft(;)28 b Fy(2)p Fx(g)p Fy(,)4136 7438 y Fx(f)p Fy(4)p +Ft(;)g Fy(3)p Fx(g)63 b Fy(and)h Fx(f)p Fy(2)p Ft(;)28 +b Fy(3)p Fx(g)p Fy(,)65 b(resp)5 b(ectiv)-5 b(ely)-14 +b(.)97 b(This)64 b(\014nishes)h(the)e(algo-)4136 7637 +y(rithm)56 b(with)f(AssignedEdges)48 b(=)e Fx(f)p Fy(1)p +Ft(;)28 b Fy(2)p Ft(;)g Fy(4)p Ft(;)g Fy(5)p Ft(;)g Fy(7)p +Ft(;)g Fy(8)p Ft(;)g Fy(9)p Ft(;)g Fy(13)p Fx(g)p Fy(.)4302 +7847 y(A)61 b(pseudo)g(co)5 b(de)61 b(for)f(the)h(assignmen)-5 +b(t)62 b(of)f(v)-9 b(alues)61 b(to)f(crit-)4136 8047 +y(ical)80 b(v)-5 b(ertices)79 b(is)h(presen)-5 b(ted)80 +b(in)g(Figure)g(7.)146 b(F)-14 b(or)80 b(all)g(edges)4136 +8246 y Ft(e)61 b Fy(=)g Fx(f)p Ft(u;)28 b(w)t Fx(g)62 +b(2)e Ft(E)10 b Fy(,)66 b Ft(g)6 b Fy(\()p Ft(u)p Fy(\))42 +b(+)h Ft(g)6 b Fy(\()p Ft(w)t Fy(\))64 b(m)-5 b(ust)65 +b(b)5 b(e)64 b(unique.)101 b(If)64 b(this)4136 8445 y(constrain)-5 +b(t)73 b(is)f(not)g(forced)f(then)h(t)-5 b(w)g(o)72 b(di\013eren)-5 +b(t)72 b(k)-5 b(eys)72 b(from)4136 8644 y Ft(S)94 b Fy(will)84 +b(b)5 b(e)84 b(mapp)5 b(ed)85 b(in)f(the)g(same)g(hash)i(table)d(lo)5 +b(cation.)4136 8844 y(Th)-5 b(us,)80 b(the)73 b(AssignedEdges)i(arra)-5 +b(y)74 b(is)g(used)h(to)e(force)g(that)4136 9043 y Ft(g)6 +b Fy(\()p Ft(u)p Fy(\))17 b(+)g Ft(g)6 b Fy(\()p Ft(w)t +Fy(\))46 b(will)g(b)5 b(e)45 b(distinct)h(for)f(all)h(edges)g(in)g +Ft(E)10 b Fy(,)47 b(as)f(sho)-5 b(wn)4136 9242 y(in)64 +b(line)h(18)f(of)f(Figure)i(7.)99 b(The)64 b(v)-9 b(ariable)64 +b(Nextg)e(represen)-5 b(ts)4136 9441 y Ft(g)6 b Fy(\()p +Ft(u)p Fy(\).)4302 9652 y(No)-5 b(w)91 b(w)-5 b(e)92 +b(de\014ne)g(certain)f(complexit)-5 b(y)91 b(measures)h(used)4136 +9851 y(hereinafter:)4256 10216 y(1.)83 b(Let)62 b Ft(I)13 +b Fy(\()p Ft(u)p Fy(\))63 b(b)5 b(e)62 b(the)h(n)-5 b(um)g(b)5 +b(er)64 b(of)f(iterations)g(o)5 b(ccurred)63 b(in)4468 +10415 y(the)79 b(rep)5 b(eat-un)-5 b(til)78 b(lo)5 b(op)79 +b(from)g(line)g(13)g(un)-5 b(til)79 b(line)g(19,)4468 +10615 y(when)56 b(v)-5 b(ertex)54 b Ft(u)h Fy(is)h(assigned.)3906 +10913 y(7)p eop end +%%Page: 8 8 +TeXDict begin 8 7 bop -169 626 9 103 v -169 532 103 9 +v -66 532 8027 9 v 7961 532 103 9 v 8056 626 9 103 v +-169 783 9 150 v 8055 783 V -72 738 a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g +(r)g(e)84 b Fu(C)8 b(r)g(i)g(t)g(i)g(c)g(a)g(l)g(V)g(e)g(r)g(t)g(i)g(c) +g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t)27 b(\()9 +b Fk(G)33 b Fu(,)83 b Fk(G)3259 755 y Fj(cr)s(it)3508 +738 y Fu(,)g Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d) +s(g)s(e)s(s)8 b(\))p -169 940 V 8055 940 V -56 895 a(1)314 +b Fl(f)5 b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)1003 912 +y Fj(cr)s(it)1290 895 y Fl(d)-9 b(o)69 b Fk(g)5 b Fu(\()p +Fk(v)g Fu(\))72 b(:)10 b(=)73 b Ff(\0001)18 b Fu(;)p +-169 1097 V 8055 1097 V -56 1052 a(2)314 b Fl(f)5 b(o)g(r)104 +b Fu(i)92 b(:)12 b(=)75 b(0)g Fl(to)80 b Fk(m)34 b Ff(\000)h +Fu(1)69 b Fl(d)-9 b(o)73 b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s +(g)s(e)s(s)16 b([)37 b(i)28 b(])71 b(=)82 b Fl(f)9 b(a)g(l)g(s)g(e)29 +b Fu(;)p -169 1246 V 8055 1246 V -56 1201 a(3)314 b Fl(f)5 +b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)1003 1218 y Fj(cr)s(it)1290 +1201 y Fl(d)-9 b(o)p -169 1403 V 8055 1403 V -56 1358 +a Fu(4)564 b Fl(i)18 b(f)98 b Fk(g)5 b Fu(\()p Fk(v)g +Fu(\))59 b(=)g Ff(\0001)73 b Fl(t)-6 b(h)g(e)g(n)84 b +Fu(t)10 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s)91 b(\()15 +b Fk(G)33 b Fu(,)83 b Fk(v)37 b Fu(,)83 b Fk(G)3732 1375 +y Fj(cr)s(it)3981 1358 y Fu(,)g Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s +(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b(\))i(;)p -169 1553 +V 8055 1553 V -169 1710 V 8055 1710 V -72 1665 a Fl(p)-6 +b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)86 b Fu(t)10 b(r)g(a)g(v)g(e)g(r)g(s)g +(e)g(B)g(f)g(s)91 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(v)37 +b Fu(,)83 b Fk(G)2390 1682 y Fj(cr)s(it)2639 1665 y Fu(,)g +Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)8 +b(\))p -169 1859 V 8055 1859 V -56 1814 a(5)387 b(N)o(e)o(x)o(t)o(g)76 +b(:)13 b(=)77 b(0)13 b(;)p -169 2016 V 8055 2016 V -56 +1971 a(6)387 b Fk(g)5 b Fu(\()p Fk(v)g Fu(\))72 b(:)10 +b(=)72 b(N)o(e)o(x)o(t)o(g)18 b(;)p -169 2173 V 8055 +2173 V -56 2128 a(7)380 b(E)-8 b(n)g(Q)g(u)g(e)g(u)g(e)77 +b(\()15 b Fk(v)37 b Fu(,)83 b Fk(Q)19 b Fu(\))g(;)p -169 +2330 V 8055 2330 V -56 2285 a(8)386 b Fl(w)n(h)n(i)n(l)n(e)79 +b Fk(Q)43 b Ff(6)p Fu(=)g Ff(;)69 b Fl(d)-9 b(o)p -169 +2487 V 8055 2487 V -56 2442 a Fu(9)625 b Fk(v)77 b Fu(:)10 +b(=)65 b(D)-7 b(e)g(Q)g(u)g(e)g(u)g(e)76 b(\()15 b Fk(Q)k +Fu(\))g(;)p -169 2644 V 8055 2644 V -58 2599 a(1)8 b(0)547 +b Fl(f)5 b(o)g(r)86 b Fk(u)43 b Ff(2)g Fu(Adj)35 b(\()p +Fk(v)5 b Fu(\))67 b Fl(a)-11 b(n)g(d)68 b Fk(g)5 b Fu(\()p +Fk(u)p Fu(\))59 b(=)g Ff(\0001)70 b Fl(d)-9 b(o)p -169 +2800 V 8055 2800 V -58 2756 a Fu(1)8 b(1)707 b(A)8 b(s)g(s)g(i)g(g)g(n) +g(e)g(d)g(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)72 b(:)10 b(=)73 +b Ff(;)18 b Fu(;)p -169 2957 V 8055 2957 V -58 2913 a(1)8 +b(2)705 b Fl(f)5 b(o)g(r)86 b Fk(w)47 b Ff(2)c Fu(Adj)35 +b(\()p Fk(u)p Fu(\))67 b Fl(a)-11 b(n)g(d)68 b Fk(g)5 +b Fu(\()p Fk(w)t Fu(\))79 b Ff(6)p Fu(=)h Ff(\0001)70 +b Fl(d)-9 b(o)77 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g(t)g +(i)g(c)g(e)g(s)72 b(:)10 b(=)80 b(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g +(e)g(r)g(t)g(i)g(c)g(e)g(s)79 b Ff([)g(f)p Fk(w)t Ff(g)18 +b Fu(;)p -169 3107 V 8055 3107 V -58 3062 a(1)8 b(3)698 +b Fl(r)n(e)n(p)n(e)n(a)n(t)p -169 3256 V 8055 3256 V +-58 3211 a Fu(1)8 b(4)858 b(NoAssignedEdges)76 b(:)10 +b(=)71 b Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 3406 V 8055 +3406 V -58 3361 a(1)8 b(5)857 b(N)o(e)o(x)o(t)o(g)72 +b(:)10 b(=)71 b(N)o(e)o(x)o(t)o(g)e(+)g(1)9 b(;)p -169 +3555 V 8055 3555 V -58 3510 a(1)f(6)864 b Fl(f)5 b(o)g(r)86 +b Fk(w)46 b Ff(2)87 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g +(t)g(i)g(c)g(e)g(s)68 b Fl(a)-11 b(n)g(d)68 b Fu(NoAssignedEdges)62 +b(=)d Fl(t)o(r)o(u)o(e)69 b(d)-9 b(o)p -169 3712 V 8055 +3712 V -58 3667 a Fu(1)8 b(7)1035 b Fl(i)18 b(f)98 b +Fu(\()o(N)o(e)o(x)o(t)o(g)58 b(+)h Fk(g)5 b Fu(\()p Fk(w)t +Fu(\)\))43 b Ff(\025)g Fk(m)73 b Fl(t)-6 b(h)g(e)g(n)74 +b Fu(restart)50 b(mapping)i(step)18 b(;)p -169 3869 V +8055 3869 V -58 3824 a(1)8 b(8)1035 b Fl(i)18 b(f)100 +b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 +b([)g(N)o(e)o(x)o(t)o(g)58 b(+)i Fk(g)5 b Fu(\()p Fk(w)t +Fu(\))10 b(])72 b(=)f Fl(t)o(r)o(u)o(e)i(t)-6 b(h)g(e)g(n)74 +b Fu(NoAssignedEdges)h(:)10 b(=)81 b Fl(f)9 b(a)g(l)g(s)g(e)29 +b Fu(;)p -169 4018 V 8055 4018 V -58 3974 a(1)8 b(9)705 +b Fl(u)5 b(n)g(t)g(i)g(l)87 b Fu(NoAssignedEdges)62 b(=)c +Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 4175 V 8055 4175 V +-58 4130 a(2)8 b(0)700 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))72 +b(:)10 b(=)72 b(N)o(e)o(x)o(t)o(g)21 b(;)95 b Ff(f)14 +b Fe(s)f(e)g(t)101 b(t)9 b(h)g(e)89 b Fk(g)94 b Fe(v)9 +b(a)g(l)g(u)g(e)98 b(t)10 b(o)99 b(v)10 b(e)g(x)g(t)g(e)g(x)88 +b Fk(u)78 b Fe(a)o(n)o(d)i(c)s(h)s(a)s(n)s(g)s(e)h Fk(g)5 +b Fu(\()p Fk(u)p Fu(\))80 b Fe(from)g Ff(\0001)89 b Fe(t)10 +b(o)92 b(N)s(e)s(x)s(t)s(g)s Ff(g)p -169 4332 V 8055 +4332 V -58 4287 a Fu(2)8 b(1)705 b Fl(f)5 b(o)g(r)86 +b Fk(w)47 b Ff(2)87 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g +(t)g(i)g(c)g(e)g(s)70 b Fl(d)-9 b(o)72 b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s +(d)s(E)s(d)s(g)s(e)s(s)17 b([)g(N)o(e)o(x)o(t)o(g)58 +b(+)i Fk(g)5 b Fu(\()p Fk(w)t Fu(\))15 b(])80 b(:)15 +b(=)79 b Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 4489 V 8055 +4489 V -58 4444 a(2)8 b(2)692 b(E)-8 b(n)g(Q)g(u)g(e)g(u)g(e)77 +b(\()16 b Fk(u)32 b Fu(,)83 b Fk(Q)19 b Fu(\))g(;)p -169 +4592 9 103 v -168 4592 103 9 v -66 4592 8027 9 v 7961 +4592 103 9 v 8056 4592 9 103 v 2034 5014 a Fy(Figure)56 +b(7:)74 b(The)55 b(critical)g(v)-5 b(ertices)55 b(assignmen)-5 +b(t)58 b(algorithm.)-41 5544 y(2.)83 b(Let)196 b Ft(N)743 +5569 y Fr(t)999 5544 y Fy(b)5 b(e)196 b(the)g(n)-5 b(um)g(b)5 +b(er)198 b(of)e(times)h(that)171 5743 y(AssignedEdges[)p +Ft(g)6 b Fy(\()p Ft(u)p Fy(\))110 b(+)g Ft(g)6 b Fy(\()p +Ft(w)t Fy(\)])163 b(is)h(true)f(in)h(the)171 5943 y(pro)5 +b(cedure)56 b(CriticalV)-14 b(erticesAssignmen)-5 b(t.)74 +b(Th)-5 b(us,)1045 6511 y Ft(N)1178 6536 y Fr(t)1283 +6511 y Fy(=)1458 6289 y Fo(j)p Fr(V)1575 6306 y Fm(cr)s(it)1788 +6289 y Fo(j)1523 6353 y Fp(X)1519 6705 y Fr(u)p Fn(=1)1827 +6511 y Fy(\()p Ft(I)13 b Fy(\()p Ft(u)p Fy(\))36 b Fx(\000)h +Fy(1\))993 b(\(5\))-161 7141 y Fq(Maximal)64 b(V)-16 +b(alue)63 b(Assigned)i(to)g(An)f(Edge)-161 7473 y Fy(In)56 +b(this)g(section)f(w)-5 b(e)56 b(presen)-5 b(t)55 b(the)g(follo)-5 +b(wing)57 b(conjecture.)-161 7953 y Fq(Conjecture)64 +b(1)83 b Fy(F)-14 b(or)64 b(a)f(random)h(graph)g Ft(G)e +Fy(with)h Fx(j)p Ft(E)3294 7978 y Fr(cr)t(it)3524 7953 +y Fx(j)c Fy(=)-161 8153 y(0)p Ft(:)p Fy(5)p Ft(n)54 b +Fy(and)f Fx(j)p Ft(V)37 b Fx(j)46 b Fy(=)h(1)p Ft(:)p +Fy(15)p Ft(n)p Fy(,)53 b(it)g(is)h(alw)-5 b(a)g(ys)55 +b(p)5 b(ossible)54 b(to)f(generate)-161 8352 y(a)e(MPHF)g(b)5 +b(ecause)50 b(the)h(maximal)g(v)-9 b(alue)50 b Ft(A)2635 +8377 y Fr(max)2959 8352 y Fy(assigned)i(to)-161 8551 +y(an)j(edge)f Ft(e)46 b Fx(2)g Ft(E)849 8576 y Fr(cr)t(it)1132 +8551 y Fy(is)55 b(at)f(most)g Ft(m)34 b Fx(\000)h Fy(1)54 +b(\()p Ft(A)2576 8576 y Fr(max)2902 8551 y Fy(corresp)5 +b(onds)-161 8750 y(to)63 b(the)f(maximal)i(v)-9 b(alue)63 +b(generated)f(b)-5 b(y)63 b(the)g(assignmen)-5 b(t)65 +b(of)-161 8950 y(v)-9 b(alues)56 b(to)f(critical)g(v)-5 +b(ertices)55 b(in)g(Eq.)h(\(3\).\))5 9337 y(Next,)79 +b(w)-5 b(e)75 b(presen)-5 b(t)76 b(t)-5 b(w)g(o)75 b(auxiliary)g +(theorems)h(that)e(will)-161 9536 y(help)56 b(us)g(in)g(the)f +(discussion)j(of)d(Conjecture)f(1.)-161 10017 y Fq(Theorem)63 +b(1)84 b Fy(The)71 b(n)-5 b(um)g(b)5 b(er)72 b(of)f(bac)-5 +b(k)71 b(edges)g Ft(N)3006 10042 y Fr(bedg)t(es)3471 +10017 y Fy(of)f(a)-161 10216 y(random)40 b(graph)g Ft(G)46 +b Fy(=)g Ft(G)1370 10241 y Fr(cr)t(it)1604 10216 y Fx([)t +Ft(G)1850 10241 y Fr(ncr)t(it)2201 10216 y Fy(is)40 b(giv)-5 +b(en)39 b(b)-5 b(y:)66 b Ft(N)3189 10241 y Fr(bedg)t(es)3629 +10216 y Fy(=)-161 10415 y Fx(j)p Ft(E)8 10440 y Fr(cr)t(it)238 +10415 y Fx(j)37 b(\000)g(j)p Ft(V)630 10440 y Fr(cr)t(it)860 +10415 y Fx(j)g Fy(+)g(1.)4136 5544 y Fq(Pro)5 b(of:)86 +b Fy(In)61 b(an)g(undirected)g(graph)h Ft(G)p Fy(,)g(ev)-5 +b(ery)60 b(edge)g(of)h Ft(G)g Fy(is)4136 5743 y(either)77 +b(a)h(tree)f(edge)h(or)f(a)h(bac)-5 b(k)78 b(edge.)140 +b(In)78 b(the)g(subgraph)4136 5943 y Ft(G)4267 5968 y +Fr(ncr)t(it)4634 5943 y Fy(there)54 b(are)h(no)g(bac)-5 +b(k)55 b(edges)g(b)5 b(ecause)55 b(it)f(is)i(an)f(acyclic)4136 +6142 y(graph.)91 b(As)61 b(sho)-5 b(wn)63 b(b)-5 b(y)61 +b(Erd\177)-83 b(os)62 b(and)f(A.)g(R)-5 b(\023)-78 b(en)-5 +b(yi)61 b([4,)g(5],)i(when)4136 6341 y Ft(n)73 b Fy(tends)h(to)f +(in\014nit)-5 b(y)74 b(the)f(random)h(graph)g Ft(G)f +Fy(forms,)78 b(with)4136 6540 y(probabilit)-5 b(y)45 +b(tending)g(to)e(1,)k(a)d(gian)-5 b(t)45 b(comp)5 b(onen)-5 +b(t)44 b(con)-5 b(taining)4136 6740 y(all)52 b(cycles)f(of)f +Ft(G)p Fy(.)73 b(So)51 b(considering)h(that)f Ft(G)6846 +6765 y Fr(cr)t(it)7127 6740 y Fy(is)g(connected,)4136 +6939 y(the)81 b(n)-5 b(um)g(b)5 b(er)83 b(of)e(tree)g(edges)g(is)h +Fx(j)p Ft(V)6458 6964 y Fr(cr)t(it)6688 6939 y Fx(j)55 +b(\000)f Fy(1.)152 b(It)81 b(happ)5 b(ens)4136 7138 y(b)g(ecause)64 +b(w)-5 b(e)64 b(ha)-5 b(v)g(e)65 b(only)f(one)g(tree)f(connecting)h +(all)g(v)-5 b(ertices)4136 7338 y(in)45 b Ft(V)4416 7363 +y Fr(cr)t(it)4646 7338 y Fy(.)71 b(As)45 b(the)f(total)g(n)-5 +b(um)g(b)5 b(er)46 b(of)f(edges)g(in)g Ft(G)7179 7363 +y Fr(cr)t(it)7454 7338 y Fy(is)g Fx(j)p Ft(E)7779 7363 +y Fr(cr)t(it)8009 7338 y Fx(j)4136 7537 y Fy(then)55 +b Ft(N)4647 7562 y Fr(bedg)t(es)5078 7537 y Fy(+)37 b(\()p +Fx(j)p Ft(V)5452 7562 y Fr(cr)t(it)5682 7537 y Fx(j)g(\000)g +Fy(1\))46 b(=)g Fx(j)p Ft(E)6469 7562 y Fr(cr)t(it)6699 +7537 y Fx(j)p Fy(.)74 b(Th)-5 b(us,)4942 7896 y Ft(N)5075 +7921 y Fr(bedg)t(es)5515 7896 y Fy(=)46 b Fx(j)p Ft(E)5859 +7921 y Fr(cr)t(it)6089 7896 y Fx(j)37 b(\000)g(j)p Ft(V)6481 +7921 y Fr(cr)t(it)6711 7896 y Fx(j)g Fy(+)g(1)p Ft(:)g +Fd(2)4136 8292 y Fq(Theorem)63 b(2)84 b Fy(The)54 b(maximal)h(v)-9 +b(alue)53 b Ft(A)6695 8317 y Fr(max)7022 8292 y Fy(assigned)j(to)e(an) +4136 8491 y(edge)67 b Ft(e)f Fx(2)f Ft(E)4968 8516 y +Fr(cr)t(it)5265 8491 y Fy(in)i(the)g(assignmen)-5 b(t)69 +b(of)e(v)-9 b(alues)67 b(to)g(critical)4136 8690 y(v)-5 +b(ertices)55 b(is:)75 b Ft(A)5094 8715 y Fr(max)5413 +8690 y Fx(\024)46 b Fy(2)p Fx(j)p Ft(V)5814 8715 y Fr(cr)t(it)6044 +8690 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)6795 8715 +y Fr(t)6854 8690 y Fy(.)4136 9020 y Fq(Pro)5 b(of:)134 +b Fy(W)-14 b(e)84 b(start)h(the)f(assignmen)-5 b(t)87 +b(of)e(v)-9 b(alues)85 b(to)f(criti-)4136 9220 y(cal)48 +b(v)-5 b(ertices)48 b(using)i(the)e(sequence)g Fx(f)p +Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f Fy(Nextg)q +Fx(g)48 b Fy(so)h(that)4136 9419 y(eac)-5 b(h)38 b(edge)f(receiv)-5 +b(es)37 b(the)g(sum)h(of)f(the)g(v)-9 b(alues)37 b(asso)5 +b(ciated)37 b(with)4136 9618 y(its)54 b(endp)5 b(oin)-5 +b(ts.)75 b(The)54 b Ft(g)60 b Fy(v)-9 b(alue)53 b(for)h(eac)-5 +b(h)54 b(v)-5 b(ertex)53 b Ft(u)h Fy(in)h Ft(V)7660 9643 +y Fr(cr)t(it)7944 9618 y Fy(is)4136 9817 y(assigned)50 +b(only)e(once.)71 b(It)47 b(happ)5 b(ens)49 b(b)5 b(ecause)48 +b(a)g Ft(g)54 b Fy(v)-9 b(alue)48 b(is)g(as-)4136 10017 +y(signed)39 b(to)e(a)h(v)-5 b(ertex)37 b Ft(u)h Fy(if)f(and)i(only)f +(if)f Ft(g)6 b Fy(\()p Ft(u)p Fy(\))46 b(=)g Fx(\0001)p +Fy(.)68 b(Th)-5 b(us,)43 b(af-)4136 10216 y(ter)j Ft(g)6 +b Fy(\()p Ft(u)p Fy(\))46 b(c)-5 b(hange)47 b(from)g +Fx(\0001)g Fy(to)f(the)g(v)-9 b(alue)47 b(stored)f(in)h(Nextg,)4136 +10415 y(the)59 b(condition)h Ft(g)6 b Fy(\()p Ft(u)p +Fy(\))52 b(=)h Fx(\0001)60 b Fy(b)5 b(ecomes)60 b(false)f(and)h +Ft(g)6 b Fy(\()p Ft(u)p Fy(\))59 b(will)3906 10913 y(8)p +eop end +%%Page: 9 9 +TeXDict begin 9 8 bop -161 620 a Fy(not)55 b(b)5 b(e)55 +b(assigned)h(again.)74 b(Consider)56 b(no)-5 b(w)55 b(t)-5 +b(w)g(o)56 b(p)5 b(ossibilities:)-161 819 y(\(i\))55 +b(If)f Ft(N)368 844 y Fr(t)473 819 y Fy(=)46 b(0)55 b(then)g(the)g +Ft(g)61 b Fy(v)-9 b(alues)55 b(will)g(b)5 b(e)54 b(assigned)j(to)d(v)-5 +b(er-)-161 1018 y(tices)58 b(in)g Ft(V)514 1043 y Fr(cr)t(it)802 +1018 y Fy(sequen)-5 b(tially)-14 b(.)81 b(Therefore,)58 +b(the)g(greatest)f(and)-161 1218 y(the)d(second)g(greatest)f(v)-9 +b(alues)54 b(assigned)i(to)d Ft(u)h Fy(and)g Ft(w)d Fx(2)45 +b Ft(V)3528 1243 y Fr(cr)t(it)-161 1417 y Fy(are)67 b +Ft(g)6 b Fy(\()p Ft(u)p Fy(\))65 b(=)h Fx(j)p Ft(V)841 +1442 y Fr(cr)t(it)1071 1417 y Fx(j)44 b(\000)h Fy(1)67 +b(and)h Ft(g)6 b Fy(\()p Ft(w)t Fy(\))65 b(=)h Fx(j)p +Ft(V)2561 1442 y Fr(cr)t(it)2791 1417 y Fx(j)44 b(\000)h +Fy(2,)70 b(resp)5 b(ec-)-161 1616 y(tiv)-5 b(ely)-14 +b(.)68 b(Th)-5 b(us,)45 b Ft(A)921 1641 y Fr(max)1240 +1616 y Fx(\024)h Fy(\()p Fx(j)p Ft(V)1623 1641 y Fr(cr)t(it)1853 +1616 y Fx(j)5 b(\000)g Fy(1\))g(+)g(\()p Fx(j)p Ft(V)2533 +1641 y Fr(cr)t(it)2763 1616 y Fx(j)g(\000)g Fy(2\))41 +b(since)f(the)-161 1815 y(edge)60 b Fx(f)p Ft(u;)28 b(w)t +Fx(g)60 b Fy(ma)-5 b(y)61 b(b)5 b(e)60 b(in)g Ft(E)1657 +1840 y Fr(cr)t(it)1886 1815 y Fy(,)i(in)e(the)g(w)-5 +b(orst)60 b(case.)88 b(\(ii\))60 b(If)-161 2015 y Ft(N)-28 +2040 y Fr(t)77 2015 y Ft(>)47 b Fy(0)e(then)g(Nextg)f(is)i(incremen)-5 +b(ted)46 b(b)-5 b(y)46 b(one)f(for)h(eac)-5 b(h)45 b(time)-161 +2214 y(the)53 b(condition)g(AssignedEdges[Nextg)g(+)32 +b Ft(g)6 b Fy(\()p Ft(w)t Fy(\)])53 b(is)h(true,)f(as)-161 +2413 y(sho)-5 b(wn)57 b(in)f(line)f(15)h(of)f(Figure)h(7.)74 +b(Th)-5 b(us,)57 b(in)e(the)g(w)-5 b(orst)56 b(case,)39 +2781 y Ft(A)164 2806 y Fr(max)603 2781 y Fx(\024)166 +b Fy(\()p Fx(j)p Ft(V)1106 2806 y Fr(cr)t(it)1335 2781 +y Fx(j)38 b(\000)f Fy(1)f(+)i Ft(N)2004 2806 y Fr(t)2062 +2781 y Fy(\))f(+)g(\()p Fx(j)p Ft(V)2538 2806 y Fr(cr)t(it)2767 +2781 y Fx(j)g(\000)h Fy(2)e(+)h Ft(N)3435 2806 y Fr(t)3494 +2781 y Fy(\))39 3031 y Ft(A)164 3056 y Fr(max)603 3031 +y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)1124 3056 y Fr(cr)t(it)1354 +3031 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)2105 3056 +y Fr(t)2164 3031 y Ft(:)g Fd(2)5 3401 y Fy(Let)68 b(us)h(no)-5 +b(w)70 b(resume)f(the)f(discussion)j(of)d(Conjecture)g(1.)-161 +3600 y(Let)h(us)h(consider)h(that)d Ft(N)1546 3625 y +Fr(t)1675 3600 y Fx(\024)i Ft(N)2007 3625 y Fr(bedg)t(es)2470 +3600 y Fy(when)g(the)f(a)-5 b(v)g(erage)-161 3799 y(degree)51 +b(of)g(v)-5 b(ertices)50 b(\()p Ft(d)1284 3824 y Fr(av)t(g)1504 +3799 y Fy(\))h(in)g Ft(G)1940 3824 y Fr(cr)t(it)2221 +3799 y Fy(is)g(a)g(constan)-5 b(t.)73 b(Substi-)-161 +3998 y(tuting)56 b Ft(N)471 4023 y Fr(t)575 3998 y Fx(\024)47 +b Ft(N)884 4023 y Fr(bedg)t(es)1333 3998 y Fy(in)56 b(Theorem)f(2)h +(giv)-5 b(es:)569 4367 y Ft(A)694 4392 y Fr(max)1133 +4367 y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)1654 4392 y Fr(cr)t(it)1884 +4367 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)2635 4392 +y Fr(bedg)t(es)-161 4735 y Fy(Substituting)100 b(the)e(v)-9 +b(alue)99 b(of)f Ft(N)2001 4760 y Fr(bedg)t(es)2494 4735 +y Fy(from)h(Theorem)g(1)-161 4934 y(giv)-5 b(es:)91 5303 +y Ft(A)216 5328 y Fr(max)655 5303 y Fx(\024)166 b Fy(2)p +Fx(j)p Ft(V)1176 5328 y Fr(cr)t(it)1406 5303 y Fx(j)37 +b(\000)g Fy(3)g(+)g(2\()p Fx(j)p Ft(E)2258 5328 y Fr(cr)t(it)2488 +5303 y Fx(j)g(\000)g(j)p Ft(V)2880 5328 y Fr(cr)t(it)3110 +5303 y Fx(j)g Fy(+)g(1\))-161 5671 y(Applying)106 b(De\014nition)g(6)g +(in)g Ft(G)1996 5696 y Fr(cr)t(it)2331 5671 y Fy(w)-5 +b(e)106 b(obtain)g Ft(d)3279 5696 y Fr(av)t(g)3629 5671 +y Fy(=)-161 5900 y(2)p Fx(j)p Ft(E)91 5925 y Fr(cr)t(it)321 +5900 y Fx(j)p Ft(=)p Fx(j)p Ft(V)593 5925 y Fr(cr)t(it)823 +5900 y Fx(j)p Fy(.)84 b(This)59 b(implies)h(that)e Fx(j)p +Ft(E)2480 5925 y Fr(cr)t(it)2709 5900 y Fx(j)52 b Fy(=)3007 +5816 y Fr(d)3076 5833 y Fm(av)s(g)p 3007 5862 266 7 v +3107 5958 a Fn(2)3293 5900 y Fx(j)p Ft(V)3436 5925 y +Fr(cr)t(it)3666 5900 y Fx(j)p Fy(.)-161 6100 y(Th)-5 +b(us,)-154 6559 y Ft(A)-29 6584 y Fr(max)410 6559 y Fx(\024)166 +b Fy(2)p Fx(j)p Ft(V)931 6584 y Fr(cr)t(it)1161 6559 +y Fx(j)37 b(\000)g Fy(3)g(+)g(2)1807 6324 y Fp(\022)1949 +6446 y Ft(d)2035 6471 y Fr(av)t(g)p 1949 6520 307 7 v +2060 6672 a Fy(2)2275 6559 y Fx(j)p Ft(V)2418 6584 y +Fr(cr)t(it)2648 6559 y Fx(j)g(\000)g(j)p Ft(V)3040 6584 +y Fr(cr)t(it)3270 6559 y Fx(j)g Fy(+)g(1)3602 6324 y +Fp(\023)410 6907 y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)931 +6932 y Fr(cr)t(it)1161 6907 y Fx(j)37 b(\000)g Fy(3)g(+)g(\()p +Ft(d)1847 6932 y Fr(av)t(g)2104 6907 y Fx(\000)g Fy(2\))p +Fx(j)p Ft(V)2561 6932 y Fr(cr)t(it)2790 6907 y Fx(j)g +Fy(+)g(2)410 7156 y Fx(\024)166 b Ft(d)791 7181 y Fr(av)t(g)1011 +7156 y Fx(j)p Ft(V)1154 7181 y Fr(cr)t(it)1384 7156 y +Fx(j)37 b(\000)g Fy(1)410 7507 y Fx(\024)725 7395 y Fy(2)p +Fx(j)p Ft(E)977 7420 y Fr(cr)t(it)1207 7395 y Fx(j)p +725 7469 528 7 v 779 7621 a(j)p Ft(V)922 7646 y Fr(cr)t(it)1152 +7621 y Fx(j)1273 7507 y(j)p Ft(V)1416 7532 y Fr(cr)t(it)1646 +7507 y Fx(j)g(\000)g Fy(1)410 7853 y Fx(\024)166 b Fy(2)p +Fx(j)p Ft(E)957 7878 y Fr(cr)t(it)1187 7853 y Fx(j)37 +b(\000)g Fy(1)-161 8222 y(As)69 b Fx(j)p Ft(E)267 8247 +y Fr(cr)t(it)497 8222 y Fx(j)f Fy(=)g(0)p Ft(:)p Fy(5)p +Ft(n)g Fy(and)h Ft(n)f Fy(=)g Ft(m)g Fy(then)h Ft(A)2620 +8247 y Fr(max)2961 8222 y Fx(\024)f Ft(n)45 b Fx(\000)h +Fy(1)68 b Fx(\024)-161 8421 y Ft(m)37 b Fx(\000)g Fy(1.)5 +8622 y(W)-14 b(e)38 b(no)-5 b(w)39 b(sho)-5 b(w)39 b(evidences)g(that)e +Ft(N)2190 8647 y Fr(t)2295 8622 y Fx(\024)46 b Ft(N)2603 +8647 y Fr(bedg)t(es)3036 8622 y Fy(when)38 b Ft(d)3538 +8647 y Fr(av)t(g)-161 8821 y Fy(is)61 b(a)f(constan)-5 +b(t.)88 b(As)60 b(sho)-5 b(wn)62 b(in)e(Section)g(5.1,)i +Fx(j)p Ft(E)2934 8846 y Fr(cr)t(it)3163 8821 y Fx(j)54 +b(\024)g Fy(0)p Ft(:)p Fy(5)p Ft(n)-161 9020 y Fy(with)g(probabilit)-5 +b(y)55 b(tending)f(to)f(1)h(when)h Ft(n)e Fy(increases.)74 +b(So,)55 b(in)-161 9220 y(order)64 b(to)g(obtain)g(the)f(a)-5 +b(v)g(erage)64 b(degree)g Ft(d)2529 9245 y Fr(av)t(g)2813 +9220 y Fy(of)f(v)-5 b(ertices)64 b(in)-161 9419 y Ft(G)-30 +9444 y Fr(cr)t(it)249 9419 y Fy(w)-5 b(e)50 b(empirically)f(determined) +h(that)e Fx(j)p Ft(V)2693 9444 y Fr(cr)t(it)2923 9419 +y Fx(j)f(\024)f Fy(0)p Ft(:)p Fy(35)p Fx(j)p Ft(V)37 +b Fx(j)p Fy(.)-161 9618 y(As)101 b Fx(j)p Ft(V)37 b Fx(j)122 +b Fy(=)g(1)p Ft(:)p Fy(15)p Ft(n)100 b Fy(then)h Fx(j)p +Ft(V)1791 9643 y Fr(cr)t(it)2021 9618 y Fx(j)122 b(\024)f +Fy(0)p Ft(:)p Fy(403)p Ft(n)p Fy(.)210 b(T)-14 b(able)101 +b(2)-161 9817 y(presen)-5 b(ts)66 b(the)e(probabilit)-5 +b(y)65 b Ft(P)1752 9847 y Fo(j)p Fr(V)1869 9864 y Fm(cr)s(it)2082 +9847 y Fo(j)2194 9817 y Fy(that)f Fx(j)p Ft(V)2706 9842 +y Fr(cr)t(it)2936 9817 y Fx(j)e(\024)f Fy(0)p Ft(:)p +Fy(403)p Ft(n)p Fy(.)-161 10017 y(As)70 b Ft(P)206 10047 +y Fo(j)p Fr(V)323 10064 y Fm(cr)s(it)536 10047 y Fo(j)654 +10017 y Fy(tends)g(to)g(1)g(when)g Ft(n)g Fy(increases)h(then,)i +Ft(d)3338 10042 y Fr(av)t(g)3629 10017 y Fy(=)-161 10216 +y(2)42 b Fx(\002)g Fy(0)p Ft(:)p Fy(5)p Ft(n=)p Fy(0)p +Ft(:)p Fy(403)p Ft(n)58 b Fy(=)h(2)p Ft(:)p Fy(48)j(is)i(a)e(constan)-5 +b(t)63 b(v)-9 b(alue.)96 b(W)-14 b(e)62 b(built)-161 +10415 y(10,000)56 b(graphs)g(for)g(eac)-5 b(h)55 b(n)-5 +b(um)g(b)5 b(er)57 b(of)e(k)-5 b(eys.)p 4979 460 2234 +7 v 4976 696 7 236 v 5369 696 a Fk(n)p 5849 696 V 6299 +588 a(P)6397 611 y Fc(j)p Fj(V)6508 632 y Fm(cr)s(it)6720 +611 y Fc(j)p 7209 696 V 5852 702 1361 7 v 4976 878 7 +183 v 5849 878 V 5952 824 a Fu(VLC2)p 6447 878 V 199 +w(T)-13 b(o)t(doBR)p 7209 878 V 4979 885 2234 7 v 4976 +1068 7 183 v 5228 1013 a(1)p Fk(;)25 b Fu(000)p 5849 +1068 V 411 w(0)p Fk(:)p Fu(51)p 6447 1068 V 406 w(0)p +Fk(:)p Fu(52)p 7209 1068 V 4976 1250 V 5189 1196 a(10)p +Fk(;)g Fu(000)p 5849 1250 V 373 w(0)p Fk(:)p Fu(76)p +6447 1250 V 406 w(0)p Fk(:)p Fu(77)p 7209 1250 V 4976 +1433 V 5151 1378 a(100)p Fk(;)g Fu(000)p 5849 1433 V +334 w(0)p Fk(:)p Fu(98)p 6447 1433 V 406 w(0)p Fk(:)p +Fu(98)p 7209 1433 V 4976 1616 V 5078 1561 a(1)p Fk(;)g +Fu(000)p Fk(;)g Fu(000)p 5849 1616 V 262 w(1)p Fk(:)p +Fu(00)p 6447 1616 V 406 w(1)p Fk(:)p Fu(00)p 7209 1616 +V 4979 1622 2234 7 v 4136 1954 a Fy(T)-14 b(able)67 b(2:)97 +b(Probabilit)-5 b(y)67 b Ft(P)5818 1984 y Fo(j)p Fr(V)5935 +2001 y Fm(cr)s(it)6148 1984 y Fo(j)6262 1954 y Fy(that)f +Fx(j)p Ft(V)6776 1979 y Fr(cr)t(it)7006 1954 y Fx(j)f(\024)h +Fy(0)p Ft(:)p Fy(403)p Ft(n)g Fy(for)4136 2153 y(di\013eren)-5 +b(t)56 b(n)-5 b(um)g(b)5 b(er)58 b(of)e(k)-5 b(eys)56 +b(for)g(the)g(collections)g(VLC2)g(and)4136 2352 y(T)-14 +b(o)5 b(doBR.)4302 2852 y(Finally)-14 b(,)64 b(w)-5 b(e)61 +b(sho)-5 b(w)62 b(exp)5 b(erimen)-5 b(tal)61 b(evidences)h(that)e +Ft(N)7811 2877 y Fr(t)7926 2852 y Fx(\024)4136 3051 y +Ft(N)4269 3076 y Fr(bedg)t(es)4663 3051 y Fy(.)73 b(The)51 +b(exp)5 b(ected)50 b(v)-9 b(alues)51 b(for)h Fx(j)p Ft(V)6691 +3076 y Fr(cr)t(it)6921 3051 y Fx(j)f Fy(and)h Fx(j)p +Ft(E)7506 3076 y Fr(cr)t(it)7736 3051 y Fx(j)f Fy(are)4136 +3250 y(0)p Ft(:)p Fy(403)p Ft(n)71 b Fy(and)h(0)p Ft(:)p +Fy(5)p Ft(n)p Fy(,)k(resp)5 b(ectiv)-5 b(ely)-14 b(.)121 +b(Then,)76 b(b)-5 b(y)71 b(Theorem)h(1,)4136 3450 y Ft(N)4269 +3475 y Fr(bedg)t(es)4709 3450 y Fy(=)46 b(0)p Ft(:)p +Fy(5)p Ft(n)10 b Fx(\000)g Fy(0)p Ft(:)p Fy(403)p Ft(n)g +Fy(+)g(1)47 b(=)g(0)p Ft(:)p Fy(097)p Ft(n)10 b Fy(+)g(1.)70 +b(In)42 b(T)-14 b(able)42 b(3)g(w)-5 b(e)4136 3649 y(sho)g(w)58 +b(the)e(maximal)h(v)-9 b(alue)56 b(of)g Ft(N)6268 3674 +y Fr(t)6383 3649 y Fy(obtained)h(during)g(10,000)4136 +3848 y(executions)70 b(of)f(the)g(new)h(algorithm)g(for)f(di\013eren)-5 +b(t)70 b(sizes)g(of)4136 4047 y Ft(S)10 b Fy(.)110 b(As)68 +b(sho)-5 b(wn)69 b(in)f(T)-14 b(able)68 b(3,)j(the)c(maximal)h(v)-9 +b(alue)68 b(of)f Ft(N)7817 4072 y Fr(t)7943 4047 y Fy(is)4136 +4247 y(smaller)52 b(than)e Ft(N)5220 4272 y Fr(bedg)t(es)5660 +4247 y Fy(=)c(0)p Ft(:)p Fy(097)p Ft(n)27 b Fy(+)g(1.)73 +b(So,)51 b(Conjecture)f(1)g(is)4136 4446 y(correct)55 +b(for)g Ft(c)46 b Fy(=)g(1)p Ft(:)p Fy(15.)p 4864 4653 +2463 7 v 4861 4888 7 236 v 5255 4888 a Fk(n)p 5734 4888 +V 5837 4781 a Fu(Maximal)k(v)-9 b(alue)52 b(of)f Fk(N)7172 +4798 y Fj(t)p 7324 4888 V 5738 4895 1590 7 v 4861 5071 +7 183 v 5734 5071 V 5859 5016 a Fu(VLC2)p 6376 5071 V +314 w(T)-13 b(o)t(doBR)p 7324 5071 V 4864 5078 2463 7 +v 4861 5260 7 183 v 5113 5206 a(1)p Fk(;)25 b Fu(000)p +5734 5260 V 348 w(0)p Fk(:)p Fu(085)p Fk(n)p 6376 5260 +V 351 w Fu(0)p Fk(:)p Fu(093)p Fk(n)p 7324 5260 V 4861 +5443 V 5075 5388 a Fu(10)p Fk(;)g Fu(000)p 5734 5443 +V 309 w(0)p Fk(:)p Fu(067)p Fk(n)p 6376 5443 V 351 w +Fu(0)p Fk(:)p Fu(069)p Fk(n)p 7324 5443 V 4861 5626 V +5036 5571 a Fu(100)p Fk(;)g Fu(000)p 5734 5626 V 271 +w(0)p Fk(:)p Fu(061)p Fk(n)p 6376 5626 V 351 w Fu(0)p +Fk(:)p Fu(061)p Fk(n)p 7324 5626 V 4861 5808 V 4964 5754 +a Fu(1)p Fk(;)g Fu(000)p Fk(;)g Fu(000)p 5734 5808 V +198 w(0)p Fk(:)p Fu(059)p Fk(n)p 6376 5808 V 351 w Fu(0)p +Fk(:)p Fu(059)p Fk(n)p 7324 5808 V 4864 5815 2463 7 v +4136 6137 a Fy(T)-14 b(able)51 b(3:)71 b(The)50 b(maximal)h(v)-9 +b(alue)50 b(of)g Ft(N)6538 6162 y Fr(t)6647 6137 y Fy(for)g(di\013eren) +-5 b(t)50 b(sizes)h(of)4136 6336 y Ft(S)65 b Fy(for)55 +b(the)g(collections)h(VLC2)e(and)i(T)-14 b(o)5 b(doBR.)4136 +6972 y Fq(Complexit)-5 b(y)64 b(Analysis)4136 7280 y +Fy(W)-14 b(e)59 b(no)-5 b(w)60 b(sho)-5 b(w)60 b(that)e(the)h(time)g +(complexit)-5 b(y)59 b(of)f(the)h(pseudo)4136 7479 y(co)5 +b(de)44 b(presen)-5 b(ted)45 b(in)g(Figure)g(7)g(is)g +Ft(O)5 b Fy(\()p Fx(j)p Ft(V)6561 7504 y Fr(cr)t(it)6790 +7479 y Fx(j)p Fy(\).)70 b(F)-14 b(or)45 b(eac)-5 b(h)45 +b(unas-)4136 7679 y(signed)40 b(v)-5 b(ertex)37 b Ft(u)p +Fy(,)42 b(Adj\()p Ft(u)p Fy(\))c(m)-5 b(ust)39 b(b)5 +b(e)39 b(scanned)g(with)g(complex-)4136 7878 y(it)-5 +b(y)76 b Fx(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)f Fy(in)h(order)g(to)f +(obtain)h(\(in)g(AssignedV)-14 b(ertices\))4136 8077 +y(the)63 b(adjacencies)g(of)g Ft(u)g Fy(that)f(ha)-5 +b(v)g(e)64 b(already)f(b)5 b(een)63 b(assigned,)4136 +8276 y(as)c(sho)-5 b(wn)60 b(in)f(lines)h(11)f(and)g(12.)84 +b(F)-14 b(or)59 b(eac)-5 b(h)59 b(iteration)f(of)h(the)4136 +8476 y(rep)5 b(eat-un)-5 b(til)67 b(lo)5 b(op,)69 b Fx(j)p +Fy(AssignedV)-14 b(ertices)p Fx(j)66 b Fy(v)-5 b(ertices)66 +b(m)-5 b(ust)67 b(b)5 b(e)4136 8675 y(scanned,)65 b(as)e(sho)-5 +b(wn)64 b(from)e(lines)h(13)g(to)e(19.)95 b(As)63 b(eac)-5 +b(h)62 b(criti-)4136 8874 y(cal)50 b(v)-5 b(ertex)48 +b(is)i(assigned)h(only)f(once)f(and)i Fx(j)p Fy(AssignedV)-14 +b(ertices)p Fx(j)4136 9073 y Fy(v)-5 b(ertices)46 b(m)-5 +b(ust)47 b(b)5 b(e)46 b(scanned)h(to)e(up)5 b(date)46 +b(the)g(AssignedEdges)4136 9273 y(arra)-5 b(y)37 b(\(as)g(sho)-5 +b(wn)39 b(in)e(line)g(21\),)j(the)d(time)g(complexit)-5 +b(y)36 b(is)i(giv)-5 b(en)4136 9472 y(b)g(y)5563 10014 +y Ft(C)12 b Fy(\()p Fx(j)p Ft(V)5902 10039 y Fr(cr)t(it)6131 +10014 y Fx(j)p Fy(\))46 b(=)6463 9792 y Fo(j)p Fr(V)6580 +9809 y Fm(cr)s(it)6793 9792 y Fo(j)6528 9856 y Fp(X)6524 +10208 y Fr(u)p Fn(=1)6832 10014 y Fy([)37 b Fx(j)p Fy(Adj\()p +Ft(u)p Fy(\))p Fx(j)f Fy(+)4157 10415 y(\()p Ft(I)13 +b Fy(\()p Ft(u)p Fy(\))36 b Fx(\002)h(j)p Fy(AssignedV)-14 +b(ertices)p Fx(j)p Fy(\))37 b(+)g Fx(j)p Fy(AssignedV)-14 +b(ertices)p Fx(j)37 b Fy(])3906 10913 y(9)p eop end +%%Page: 10 10 +TeXDict begin 10 9 bop -69 2469 a + currentpoint currentpoint translate 0.87 0.87 scale neg exch neg exch +translate + -69 2469 a -69 153 +a + 36443095 9143664 0 0 36443095 9143664 startTexFig + -69 153 a +%%BeginDocument: figs/grafsearchingncv.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearchingncv.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 20 10:41:58 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 554 139 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.827 0.827 0.827 srgb} bind def + +end +save +newpath 0 139 moveto 0 0 lineto 554 0 lineto 554 139 lineto closepath clip newpath +-21.7 306.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n 7825.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 7687.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 8017.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 8004.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 8472.3 3841.4 304.1 100.8563 5.4037 arcn +gs col0 s gr + +% Arc +n 8407.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8685 4185 m +gs 1 -1 sc (11) col0 sh gr +/Times-Roman ff 142.88 scf sf +7650 4185 m +gs 1 -1 sc (12) col0 sh gr +% Arc +n 715.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 577.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 907.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 894.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 1362.3 3841.4 304.1 100.8565 5.4037 arcn +gs col0 s gr + +% Arc +n 1297.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +% Ellipse +n 8190 4590 71 71 0 360 DrawEllipse gs col0 s gr + +% Polyline +0 slj +n 8258 4522 m + 8122 4658 l gs col0 s gr +% Arc +n 2470.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 2332.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 2662.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 2649.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 3117.3 3841.4 304.1 100.8565 5.4037 arcn +gs col0 s gr + +% Arc +n 3052.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +1935 2835 m +gs 1 -1 sc (b\)) col0 sh gr +% Arc +n 4225.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 4087.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 4417.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 4404.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 4872.3 3841.4 304.1 100.8563 5.4037 arcn +gs col0 s gr + +% Arc +n 4807.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +3690 2835 m +gs 1 -1 sc (c\)) col0 sh gr +% Arc +n 5980.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 5842.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 6172.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 6159.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 6627.3 3841.4 304.1 100.8563 5.4037 arcn +gs col0 s gr + +% Arc +n 6562.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +5445 2835 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 174.63 scf sf +7200 2835 m +gs 1 -1 sc (e\)) col0 sh gr +/Times-Roman ff 174.63 scf sf +360 2835 m +gs 1 -1 sc (a\)) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 8411 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8336 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 8006 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7931 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 7601 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7526 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 8771 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8733 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 7682 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7607 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 7826 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7751 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 8231 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8156 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 8591 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8554 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 8816 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8779 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 8231 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8194 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +8370 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7920 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7290 3510 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7515 3240 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 142.88 scf sf +7740 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +8145 2835 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +7965 3330 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 142.88 scf sf +8505 2970 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8730 3690 m +gs 1 -1 sc (g:10) col0 sh gr +/Times-Roman ff 142.88 scf sf +8595 3375 m +gs 1 -1 sc (10) col0 sh gr +/Times-Roman ff 142.88 scf sf +8910 3915 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8280 4365 m +gs 1 -1 sc (g:11) col0 sh gr +/Times-Roman ff 142.88 scf sf +7920 4365 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7290 3915 m +gs 1 -1 sc (g:12) col0 sh gr +% Ellipse +n 1301 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1226 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 896 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +821 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 491 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +416 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 1661 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1623 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 572 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +497 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 716 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +641 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 1121 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1046 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 1481 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1444 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 1706 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1669 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 1121 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1084 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +1260 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7695 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Polyline +0 slj +0 slc +n 585 4500 m 765 4500 l 765 4680 l 585 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +637 4642 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 765 4500 m 945 4500 l 945 4680 l 765 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +817 4642 m +gs 1 -1 sc (3) col0 sh gr +% Polyline +n 945 4500 m 1125 4500 l 1125 4680 l 945 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +997 4642 m +gs 1 -1 sc (6) col0 sh gr +% Polyline +n 1125 4500 m 1305 4500 l 1305 4680 l 1125 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1140 4642 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 1305 4500 m 1485 4500 l 1485 4680 l 1305 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1320 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 1485 4500 m 1665 4500 l 1665 4680 l 1485 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1500 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +585 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Ellipse +n 3056 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2981 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 2651 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2576 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 2246 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2171 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 3416 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3378 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 2327 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2252 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 2471 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2396 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 2876 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2801 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 3236 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3199 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 3461 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3424 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 2876 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2839 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +3015 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +2565 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +1935 3510 m +gs 1 -1 sc (g:0) col0 sh gr +% Polyline +n 2385 4500 m 2565 4500 l 2565 4680 l 2385 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2437 4642 m +gs 1 -1 sc (3) col0 sh gr +% Polyline +n 2565 4500 m 2745 4500 l 2745 4680 l 2565 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2617 4642 m +gs 1 -1 sc (6) col0 sh gr +% Polyline +n 2745 4500 m 2925 4500 l 2925 4680 l 2745 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2760 4642 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 2925 4500 m 3105 4500 l 3105 4680 l 2925 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2940 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 3105 4500 m 3285 4500 l 3285 4680 l 3105 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3120 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +2295 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Ellipse +n 4811 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4736 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 4406 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4331 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 4001 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3926 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 5171 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5133 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 4082 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4007 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 4226 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4151 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 4631 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4556 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 4991 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4954 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5216 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5179 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 4631 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4594 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +4770 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +4320 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 3510 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3915 3240 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 142.88 scf sf +4140 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +4545 2835 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4365 3330 m +gs 1 -1 sc (3) col0 sh gr +% Polyline +n 4320 4500 m 4500 4500 l 4500 4680 l 4320 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4335 4642 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 4500 4500 m 4680 4500 l 4680 4680 l 4500 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4515 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 4680 4500 m 4860 4500 l 4860 4680 l 4680 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4695 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +4095 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Polyline +n 6165 4500 m 6345 4500 l 6345 4680 l 6165 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6180 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 6345 4500 m 6525 4500 l 6525 4680 l 6345 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6360 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +5850 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Ellipse +n 6566 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6491 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 6161 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6086 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 5756 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5681 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 6926 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6888 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 5837 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5762 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 5981 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5906 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 6386 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6311 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 6746 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6709 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 6971 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6934 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 6386 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6349 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +6525 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +6075 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5445 3510 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5670 3240 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 142.88 scf sf +5895 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +6300 2835 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6120 3330 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6660 2970 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +6885 3690 m +gs 1 -1 sc (g:10) col0 sh gr +/Times-Roman ff 142.88 scf sf +6750 3375 m +gs 1 -1 sc (10) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + -69 2469 a + currentpoint currentpoint translate 1 0.87 div 1 0.87 div scale neg +exch neg exch translate + -69 2469 a 1840 2859 a Fy(Figure)56 b(8:)74 +b(Example)55 b(of)g(the)g(non)h(critical)f(v)-5 b(ertices)55 +b(assignmen)-5 b(t.)p -169 3263 9 103 v -169 3168 103 +9 v -66 3168 8027 9 v 7961 3168 103 9 v 8056 3263 9 103 +v -169 3420 9 150 v 8055 3420 V -72 3375 a Fl(p)f(r)g(o)g(c)g(e)g(d)g +(u)g(r)g(e)82 b Fu(N)6 b(o)g(n)g(C)g(r)g(i)g(t)g(i)g(c)g(a)g(l)g(V)g(e) +g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t)94 +b(\()16 b Fk(G)32 b Fu(,)83 b Fk(G)3575 3392 y Fj(ncr)s(it)3901 +3375 y Fu(,)j(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)20 +b(,)94 b Fk(g)15 b Fu(\))p -169 3569 V 8055 3569 V 256 +3524 a Fl(f)5 b(o)g(r)104 b Fu(i)92 b(:)12 b(=)75 b(0)g +Fl(to)80 b Fk(m)34 b Ff(\000)h Fu(1)69 b Fl(d)-9 b(o)p +-169 3726 V 8055 3726 V 427 3681 a(i)18 b(f)100 b Fu(A)s(s)s(s)s(i)s(g) +s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b([)36 b(i)29 b(])71 +b(=)82 b Fl(f)9 b(a)g(l)g(s)g(e)83 b(t)-6 b(h)g(e)g(n)73 +b Fu(UnAssignedEdges)68 b(:)10 b(=)72 b(UnAssignedEdges)j +Ff([)80 b(f)p Fu(i)p Ff(g)18 b Fu(;)p -169 3883 V 8055 +3883 V 256 3838 a Fl(f)5 b(o)g(r)86 b Fk(v)47 b Ff(2)95 +b Fk(V)976 3855 y Fj(scr)s(it)1320 3838 y Fl(d)-9 b(o)79 +b Fu(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)93 b(\()16 +b Fk(G)32 b Fu(,)83 b Fk(v)38 b Fu(,)83 b Fk(G)3232 3855 +y Fj(ncr)s(it)3558 3838 y Fu(,)g Fk(g)5 b Fu(\()p Fk(v)g +Fu(\))32 b(,)83 b Fk(g)38 b Fu(,)82 b(UnAssignedEdges)15 +b(\))k(;)p -169 4040 V 8055 4040 V 256 3995 a Fl(f)5 +b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)924 4012 y Fj(ncr)s(it)1285 +3995 y Fl(a)-11 b(n)g(d)147 b Fk(g)5 b Fu(\()p Fk(v)g +Fu(\))59 b(=)g Ff(\0001)70 b Fl(d)-9 b(o)79 b Fu(t)9 +b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)94 b(\()15 b +Fk(G)33 b Fu(,)83 b Fk(v)37 b Fu(,)83 b Fk(G)4462 4012 +y Fj(ncr)s(it)4788 3995 y Fu(,)g(0)32 b(,)83 b Fk(g)38 +b Fu(,)82 b(UnAssignedEdges)15 b(\))k(;)p -169 4189 V +8055 4189 V -169 4346 V 8055 4346 V -72 4301 a Fl(p)-6 +b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)85 b Fu(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g +(e)g(D)g(f)g(s)94 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(v)37 +b Fu(,)83 b Fk(G)2390 4318 y Fj(ncr)s(it)2716 4301 y +Fu(,)g Fk(g)5 b Fu(V)-13 b(alue)33 b(,)83 b Fk(g)38 b +Fu(,)84 b(u)r(n)r(A)r(s)r(s)r(i)r(g)r(n)r(e)r(d)r(E)r(d)r(g)r(e)r(s)6 +b(\))p -169 4503 V 8055 4503 V 250 4458 a Fk(g)f Fu(\()p +Fk(v)g Fu(\))72 b(:)10 b(=)73 b Fk(g)5 b Fu(V)-13 b(alue)18 +b(;)p -169 4660 V 8055 4660 V 256 4615 a Fl(f)5 b(o)g(r)86 +b Fk(u)43 b Ff(2)g Fu(Adj)34 b(\()p Fk(v)5 b Fu(\))68 +b Fl(a)-11 b(n)g(d)67 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))60 +b(=)f Ff(\0001)70 b Fl(d)-9 b(o)p -169 4817 V 8055 4817 +V 488 4772 a Fk(g)5 b Fu(V)-13 b(alue)73 b(:)10 b(=)71 +b(N)o(e)o(x)o(t)o(U)o(n)o(u)o(s)o(e)o(d)o(A)o(d)o(d)o(r)o(e)o(s)o(s)13 +b(\()d(UnAssignedEdges)q(\))68 b Ff(\000)c Fk(g)5 b Fu(\()p +Fk(v)g Fu(\))18 b(;)p -169 4974 V 8055 4974 V 497 4929 +a(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)93 b(\()16 +b Fk(G)32 b Fu(,)83 b Fk(u)33 b Fu(,)83 b Fk(G)2161 4946 +y Fj(ncr)s(it)2487 4929 y Fu(,)g Fk(g)5 b Fu(V)-13 b(alue)33 +b(,)83 b Fk(g)38 b Fu(,)83 b(UnAssignedEdges)14 b(\))19 +b(;)p -169 5077 9 103 v -168 5077 103 9 v -66 5077 8027 +9 v 7961 5077 103 9 v 8056 5077 9 103 v 1605 5499 a Fy(Figure)56 +b(9:)74 b(The)55 b(algorithm)h(to)f(assign)i(v)-9 b(alues)55 +b(to)g(non)h(critical)f(v)-5 b(ertices.)5 6029 y(Considering)144 +b(that)e Fx(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)f Fy(=)i +Ft(d)2538 6054 y Fr(av)t(g)2900 6029 y Fy(on)g(a)-5 b(v)g(erage)-161 +6228 y(and)162 b(that)f Fx(j)p Fy(AssignedV)-14 b(ertices)p +Fx(j)223 b(\024)g(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)p +Fy(,)187 b(then)-161 6427 y Fx(j)p Fy(AssignedV)-14 b(ertices)q +Fx(j)46 b(\024)g Ft(d)1455 6452 y Fr(av)t(g)1676 6427 +y Fy(.)73 b(Th)-5 b(us,)-50 6924 y Ft(C)12 b Fy(\()p +Fx(j)p Ft(V)289 6949 y Fr(cr)t(it)518 6924 y Fx(j)p Fy(\))46 +b Fx(\024)850 6702 y Fo(j)p Fr(V)967 6719 y Fm(cr)s(it)1180 +6702 y Fo(j)915 6766 y Fp(X)911 7118 y Fr(u)p Fn(=1)1219 +6924 y Fy(\()p Ft(d)1370 6949 y Fr(av)t(g)1627 6924 y +Fy(+)37 b(\()p Ft(I)13 b Fy(\()p Ft(u)p Fy(\))36 b Fx(\002)h +Ft(d)2457 6949 y Fr(av)t(g)2677 6924 y Fy(\))g(+)g Ft(d)3031 +6949 y Fr(av)t(g)3251 6924 y Fy(\))230 b(\(6\))5 7374 +y(As)75 b(presen)-5 b(ted)76 b(b)5 b(efore,)78 b Ft(d)1688 +7399 y Fr(av)t(g)1983 7374 y Fy(is)e(a)f(constan)-5 b(t)75 +b(and)g Ft(N)3492 7399 y Fr(t)3629 7374 y Fx(\024)-161 +7573 y Ft(N)-28 7598 y Fr(bedg)t(es)366 7573 y Fy(.)88 +b(Therefore,)60 b(applying)h Ft(d)2073 7598 y Fr(av)t(g)2347 +7573 y Fy(=)54 b(2)p Fx(j)p Ft(E)2782 7598 y Fr(cr)t(it)3012 +7573 y Fx(j)p Ft(=)p Fx(j)p Ft(V)3284 7598 y Fr(cr)t(it)3514 +7573 y Fx(j)60 b Fy(in)-161 7772 y(Theorem)c(1)f(giv)-5 +b(es:)636 8078 y Ft(N)769 8103 y Fr(t)994 8078 y Fx(\024)166 +b(j)p Ft(E)1458 8103 y Fr(cr)t(it)1687 8078 y Fx(j)37 +b(\000)h(j)p Ft(V)2080 8103 y Fr(cr)t(it)2309 8078 y +Fx(j)g Fy(+)f(1)994 8414 y Fx(\024)1309 8302 y Ft(d)1395 +8327 y Fr(av)t(g)p 1309 8376 307 7 v 1420 8528 a Fy(2)1635 +8414 y Fx(j)p Ft(V)1778 8439 y Fr(cr)t(it)2008 8414 y +Fx(j)g(\000)g(j)p Ft(V)2400 8439 y Fr(cr)t(it)2630 8414 +y Fx(j)g Fy(+)g(1)994 8835 y Fx(\024)1289 8601 y Fp(\022)1431 +8723 y Ft(d)1517 8748 y Fr(av)t(g)p 1431 8797 V 1543 +8949 a Fy(2)1794 8835 y Fx(\000)g Fy(1)2043 8601 y Fp(\023)2193 +8835 y Fx(j)p Ft(V)2336 8860 y Fr(cr)t(it)2566 8835 y +Fx(j)g Fy(+)g(1)-161 9241 y(Since)78 b Ft(d)381 9266 +y Fr(av)t(g)679 9241 y Fy(is)g(a)f(constan)-5 b(t)78 +b(then)f Ft(N)2253 9266 y Fr(t)2395 9241 y Fy(=)83 b +Ft(O)5 b Fy(\()p Fx(j)p Ft(V)2947 9266 y Fr(cr)t(it)3176 +9241 y Fx(j)p Fy(\).)139 b(The)-161 9440 y(n)-5 b(um)g(b)5 +b(er)58 b(of)e(times)h(that)f(AssignedEdges[Nextg)40 +b(+)e Ft(g)6 b Fy(\()p Ft(w)t Fy(\)])47 b(=)-161 9639 +y Ft(tr)5 b(ue)42 b Fy(is)h(giv)-5 b(en)42 b(b)-5 b(y)42 +b(Eq.)g(\(5\).)68 b(Th)-5 b(us,)46 b Ft(I)13 b Fy(\()p +Ft(u)p Fy(\))41 b(m)-5 b(ust)43 b(b)5 b(e)42 b(a)g(constan)-5 +b(t)-161 9839 y(b)5 b(ecause)571 10066 y Fo(j)p Fr(V)688 +10083 y Fm(cr)s(it)901 10066 y Fo(j)636 10130 y Fp(X)633 +10482 y Fr(u)p Fn(=1)941 10288 y Fy(\()p Ft(I)13 b Fy(\()p +Ft(u)p Fy(\))35 b Fx(\000)i Fy(1\))46 b(=)g Ft(N)2020 +10313 y Fr(t)2125 10288 y Fy(=)h Ft(O)5 b Fy(\()p Fx(j)p +Ft(V)2641 10313 y Fr(cr)t(it)2869 10288 y Fx(j)p Fy(\))p +Ft(:)4136 6029 y Fy(Since)57 b Ft(I)13 b Fy(\()p Ft(u)p +Fy(\))55 b(and)i Ft(d)5347 6054 y Fr(a)5428 6029 y Ft(v)6 +b(g)63 b Fy(in)56 b(Eq.)g(\(6\))g(are)g(constan)-5 b(ts,)57 +b(w)-5 b(e)57 b(ha)-5 b(v)g(e)4136 6228 y(that)48 b Ft(C)12 +b Fy(\()p Fx(j)p Ft(V)4828 6253 y Fr(cr)t(it)5057 6228 +y Fx(j)p Fy(\))46 b(=)g Ft(O)5 b Fy(\()p Fx(j)p Ft(V)5729 +6253 y Fr(cr)t(it)5958 6228 y Fx(j)p Fy(\).)71 b(As)48 +b Fx(j)p Ft(V)6567 6253 y Fr(cr)t(it)6797 6228 y Fx(j)e(\024)g(j)p +Ft(V)37 b Fx(j)48 b Fy(and)h Fx(j)p Ft(V)37 b Fx(j)46 +b Fy(=)4136 6427 y Ft(cn)p Fy(,)53 b(the)f(time)h(complexit)-5 +b(y)52 b(of)h(the)f(assignmen)-5 b(t)54 b(of)f(v)-9 b(alues)53 +b(to)4136 6627 y(critical)i(v)-5 b(ertices)55 b(is)h +Ft(O)5 b Fy(\()p Ft(n)p Fy(\).)4136 7098 y Fq(5.3.2)193 +b(Assignmen)-5 b(t)105 b(of)f(V)-16 b(alues)104 b(to)h(Non)f(Critical) +4720 7298 y(V)-16 b(ertices)4136 7618 y Fy(The)139 b(pro)5 +b(cedure)139 b(NonCriticalV)-14 b(erticesAssignmen)-5 +b(t)139 b(\()p Ft(G)p Fy(,)4136 7817 y Fs(G)4264 7842 +y Fb(ncrit)4571 7817 y Fy(,)73 b(AssignedEdges,)h(g\))69 +b(receiv)-5 b(es)69 b Ft(G)p Fy(,)j Fs(G)7097 7842 y +Fb(ncrit)7473 7817 y Fy(and)e(As-)4136 8017 y(signedEdges)63 +b(as)f(input)f(and)h(pro)5 b(duces)62 b(the)e(assignmen)-5 +b(t)63 b(of)4136 8216 y(v)-9 b(alues)46 b(to)g(v)-5 b(ertices)45 +b(in)i Ft(G)5722 8241 y Fr(ncr)t(it)6033 8216 y Fy(,)h(represen)-5 +b(ted)47 b(b)-5 b(y)46 b(the)g(arra)-5 b(y)46 b Ft(g)6 +b Fy(.)4136 8415 y(This)69 b(\014nishes)g(the)e(p)5 b(erfect)66 +b(assignmen)-5 b(t)70 b(of)d(v)-9 b(alues)68 b(to)f(v)-5 +b(er-)4136 8614 y(tices)71 b(of)f Ft(G)p Fy(.)119 b(W)-14 +b(e)70 b(use)h(a)g(depth-\014rst)g(searc)-5 b(h)71 b(algorithm)h(to) +4136 8814 y(assign)57 b(v)-9 b(alues)55 b(to)g(v)-5 b(ertices)55 +b(in)h Ft(G)6250 8839 y Fr(ncr)t(it)6562 8814 y Fy(.)4302 +9020 y(As)87 b Ft(G)4710 9045 y Fr(ncr)t(it)5108 9020 +y Fy(is)h(acyclic,)94 b(w)-5 b(e)86 b(can)h(imp)5 b(ose)88 +b(the)e(order)h(in)4136 9220 y(whic)-5 b(h)76 b(addresses)h(are)e(asso) +5 b(ciated)76 b(with)f(edges)h(in)f Ft(G)7697 9245 y +Fr(ncr)t(it)8009 9220 y Fy(.)4136 9419 y(Therefore,)k(in)c(the)g +(assignmen)-5 b(t)76 b(of)e(v)-9 b(alues)75 b(to)f(v)-5 +b(ertices)75 b(in)4136 9618 y Ft(G)4267 9643 y Fr(ncr)t(it)4643 +9618 y Fy(w)-5 b(e)65 b(place)f(the)g(un)-5 b(used)66 +b(addresses)g(in)f(the)f(gaps)h(left)4136 9817 y(b)-5 +b(y)69 b(the)f(assignmen)-5 b(t)70 b(of)e(v)-9 b(alues)68 +b(to)g(v)-5 b(ertices)68 b(in)h Ft(G)7424 9842 y Fr(cr)t(it)7654 +9817 y Fy(.)113 b(F)-14 b(or)4136 10017 y(that,)62 b(w)-5 +b(e)62 b(start)e(the)h(deph)-5 b(t-\014rst)63 b(searc)-5 +b(h)61 b(from)h(the)e(v)-5 b(ertices)4136 10216 y(in)80 +b Ft(V)4451 10241 y Fr(scr)t(it)4824 10216 y Fy(b)5 b(ecause)80 +b(these)f(critical)h(v)-5 b(ertices)79 b(w)-5 b(ere)80 +b(already)4136 10415 y(assigned,)57 b(so)f(their)f Ft(g)62 +b Fy(v)-9 b(alues)55 b(can)g(not)h(b)5 b(e)55 b(c)-5 +b(hanged.)3864 10913 y(10)p eop end +%%Page: 11 11 +TeXDict begin 11 10 bop 5 620 a Fy(Considering)75 b(the)d(subgraph)i +Ft(G)2110 645 y Fr(ncr)t(it)2495 620 y Fy(in)f(Figure)h(4\(d\),)i(a) +-161 819 y(step)f(b)-5 b(y)75 b(step)g(example)f(of)h(the)f(assignmen) +-5 b(t)77 b(of)d(v)-9 b(alues)75 b(to)-161 1018 y(v)-5 +b(ertices)52 b(in)h Ft(G)759 1043 y Fr(ncr)t(it)1123 +1018 y Fy(is)g(presen)-5 b(ted)53 b(in)g(Figure)g(8.)73 +b(Figure)53 b(8\(a\))-161 1218 y(presen)-5 b(ts)52 b(the)f(initial)g +(state)f(of)h(the)f(algorithm.)73 b(The)51 b(critical)-161 +1417 y(v)-5 b(ertex)62 b(5)h(is)h(the)f(only)g(one)g(that)g(has)g(non)h +(critical)f(v)-5 b(ertices)-161 1616 y(as)52 b(adjacen)-5 +b(t.)72 b(In)52 b(the)e(example)i(presen)-5 b(ted)51 +b(in)h(Figure)g(6,)g(the)-161 1815 y(addresses)k Fx(f)p +Fy(0)p Ft(;)28 b Fy(3)p Ft(;)g Fy(6)p Ft(;)g Fy(10)p +Ft(;)g Fy(11)p Ft(;)g Fy(12)p Fx(g)54 b Fy(w)-5 b(ere)54 +b(not)g(used.)74 b(So,)55 b(taking)-161 2015 y(the)77 +b(\014rst)g(un)-5 b(used)79 b(address)g(0)e(and)g(the)g(v)-5 +b(ertex)76 b(13,)83 b(whic)-5 b(h)-161 2214 y(is)62 b(reac)-5 +b(hed)62 b(from)f(the)g(v)-5 b(ertex)61 b(5,)i(the)e +Ft(g)67 b Fy(v)-9 b(alue)61 b(of)g(v)-5 b(ertex)60 b(13)-161 +2413 y(is)75 b(set)f(to)g(0)49 b Fx(\000)h Ft(g)6 b Fy(\(5\))77 +b(=)g(0,)i(as)c(sho)-5 b(wn)75 b(in)g(Figure)f(8\(b\).)130 +b(In)-161 2612 y(Figure)54 b(8\(c\),)f(using)h(the)f(un)-5 +b(used)55 b(addresses)g(3)e(and)h(6,)f(the)g Ft(g)-161 +2812 y Fy(v)-9 b(alues)63 b(for)f(v)-5 b(ertices)61 b(15)i(and)f(14)h +(are)f(set)g(to)g(3)41 b Fx(\000)h Ft(g)6 b Fy(\(13\))57 +b(=)g(3)-161 3011 y(and)c(to)g(6)31 b Fx(\000)g Ft(g)6 +b Fy(\(13\))46 b(=)g(6,)53 b(resp)5 b(ectiv)-5 b(ely)-14 +b(.)72 b(V)-14 b(ertices)52 b(0,)i(1,)f(9,)g(10,)-161 +3210 y(11)46 b(and)g(12)f(w)-5 b(ere)46 b(not)f(assigned)i(y)-5 +b(et,)47 b(so)f(w)-5 b(e)45 b(con)-5 b(tin)g(ue)46 b(the)f(as-)-161 +3409 y(signmen)-5 b(t)58 b(of)e(v)-9 b(alues)56 b(to)g(non)h(critical)f +(v)-5 b(ertices)56 b(from)g(v)-5 b(ertex)-161 3609 y(0.)106 +b(In)67 b(Figure)f(8\(d\),)i(w)-5 b(e)67 b(set)e Ft(g)6 +b Fy(\(0\))66 b(to)f(0.)106 b(The)66 b(only)g(v)-5 b(ertex)-161 +3808 y(that)51 b(is)g(reac)-5 b(hed)52 b(from)f(v)-5 +b(ertex)49 b(0)i(is)h(v)-5 b(ertex)50 b(1,)i(so)f(taking)g(the)-161 +4007 y(un)-5 b(used)56 b(address)g(10)f(w)-5 b(e)54 b(set)g +Ft(g)6 b Fy(\(1\))54 b(to)g(10)35 b Fx(\000)g Ft(g)6 +b Fy(\(0\))46 b(=)g(10.)73 b(This)-161 4206 y(pro)5 b(cess)52 +b(is)g(rep)5 b(eated)50 b(un)-5 b(til)52 b(the)e(UnAssignedEdges)j +(list)e(b)5 b(e-)-161 4406 y(comes)54 b(empt)-5 b(y)-14 +b(.)73 b(The)52 b(\014nal)i(result)f(is)g(sho)-5 b(wn)54 +b(in)f(Figure)g(8\(e\).)5 4624 y(A)65 b(pseudo)h(co)5 +b(de)64 b(for)h(the)g(assignmen)-5 b(t)66 b(of)f(v)-9 +b(alues)65 b(to)g(non)-161 4824 y(critical)55 b(v)-5 +b(ertices)55 b(is)h(presen)-5 b(ted)56 b(in)g(Figure)g(9.)-161 +5359 y Fq(Complexit)-5 b(y)64 b(Analysis)-161 5702 y +Fy(The)88 b(assignmen)-5 b(t)90 b(of)e(v)-9 b(alues)88 +b(to)f(v)-5 b(ertices)88 b(in)g Ft(G)3076 5727 y Fr(ncr)t(it)3476 +5702 y Fy(is)g(a)-161 5902 y(depth-\014rst)61 b(searc)-5 +b(h)61 b(algorithm.)90 b(Then,)61 b(its)g(time)f(complex-)-161 +6101 y(it)-5 b(y)54 b(is)h Ft(O)5 b Fy(\()p Fx(j)p Ft(V)593 +6126 y Fr(scr)t(it)885 6101 y Fx(j)35 b Fy(+)f Fx(j)p +Ft(V)1272 6126 y Fr(ncr)t(it)1585 6101 y Fx(j)g Fy(+)h +Fx(j)p Ft(E)1998 6126 y Fr(ncr)t(it)2310 6101 y Fx(j)p +Fy(\).)73 b(Considering)56 b(that)-161 6300 y Fx(j)p +Ft(V)-18 6325 y Fr(ncr)t(it)294 6300 y Fx(j)47 b(\024)f(j)p +Ft(V)37 b Fx(j)p Fy(,)44 b Fx(j)p Ft(V)1021 6325 y Fr(scr)t(it)1313 +6300 y Fx(j)j(\024)f(j)p Ft(V)37 b Fx(j)p Fy(,)44 b Fx(j)p +Ft(V)36 b Fx(j)47 b Fy(=)f Ft(cn)40 b Fy(and)h Fx(j)p +Ft(E)3033 6325 y Fr(ncr)t(it)3345 6300 y Fx(j)46 b(\024)g +Ft(n)p Fy(,)-161 6499 y(the)j(complexit)-5 b(y)49 b(of)g(the)g +(assignmen)-5 b(t)51 b(of)e(v)-9 b(alues)49 b(to)g(non)g(crit-)-161 +6699 y(ical)56 b(v)-5 b(ertices)55 b(is)h Ft(O)5 b Fy(\()p +Ft(n)p Fy(\).)-161 7352 y Fv(6)270 b(MPHF)90 b(Ev)-15 +b(aluation)-161 7752 y Fy(Figure)103 b(10)e(presen)-5 +b(ts)103 b(a)f(pseudo)h(co)5 b(de)101 b(to)g(ev)-9 b(aluate)101 +b(the)-161 7951 y(MPHF)71 b(generated)g(b)-5 b(y)71 b(the)g(new)f +(algorithm.)122 b(The)70 b(pro)5 b(ce-)-161 8150 y(dure)51 +b(h)g(\()p Ft(x)p Fy(,)g Ft(g)6 b Fy(,)52 b Ft(h)892 +8175 y Fn(1)966 8150 y Fy(,)g Ft(h)1160 8175 y Fn(2)1234 +8150 y Fy(\))e(receiv)-5 b(es)51 b(as)g(input)g(a)g(k)-5 +b(ey)50 b Ft(x)c Fx(2)g Ft(S)10 b Fy(,)51 b(the)-161 +8350 y Ft(g)71 b Fy(function,)66 b(the)e(tables)g(used)h(b)-5 +b(y)65 b Ft(h)2204 8375 y Fn(1)2342 8350 y Fy(and)g Ft(h)2770 +8375 y Fn(2)2908 8350 y Fy(and)g(returns)-161 8549 y(the)55 +b(hash)i(table)e(address)h(assigned)h(to)e Ft(x)p Fy(.)p +-169 8992 9 103 v -169 8898 103 9 v -66 8898 3730 9 v +3664 8898 103 9 v 3759 8992 9 103 v -169 9149 9 150 v +3758 9149 V -72 9104 a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)73 +b Fu(h)80 b(\()15 b Fk(x)32 b Fu(,)83 b Fk(g)38 b Fu(,)83 +b Fk(h)1532 9121 y Fa(1)1634 9104 y Fu(,)g Fk(h)1848 +9121 y Fa(2)1927 9104 y Fu(\))p -169 9306 V 3758 9306 +V 171 9261 a Fk(u)72 b Fu(:)10 b(=)73 b Fk(h)664 9278 +y Fa(1)734 9261 y Fu(\()p Fk(x)p Fu(\))18 b(;)p -169 +9463 V 3758 9463 V 171 9418 a Fk(v)77 b Fu(:)10 b(=)73 +b Fk(h)656 9435 y Fa(2)725 9418 y Fu(\()p Fk(x)p Fu(\))18 +b(;)p -169 9620 V 3758 9620 V 171 9575 a Fl(return)83 +b Fu(\()16 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))34 b(+)h Fk(g)5 +b Fu(\()p Fk(v)g Fu(\))19 b(\))g(;)p -169 9723 9 103 +v -168 9723 103 9 v -66 9723 3730 9 v 3664 9723 103 9 +v 3759 9723 9 103 v 560 10144 a Fy(Figure)56 b(10:)74 +b(Ev)-9 b(aluating)55 b(the)g(MPHF.)4136 620 y Fv(7)270 +b(Exp)7 b(erimen)-7 b(tal)88 b(Results)4136 983 y Fy(In)47 +b(this)g(section)g(w)-5 b(e)47 b(presen)-5 b(t)48 b(exp)5 +b(erimen)-5 b(tal)46 b(results)i(to)e(sho)-5 b(w)4136 +1183 y(the)41 b(e\016ciency)g(of)g(the)f(new)i(algorithm.)69 +b(Also,)45 b(a)c(comparison)4136 1382 y(with)62 b(algorithm)g(CHM)g +(\(prop)5 b(osed)62 b(b)-5 b(y)62 b(Czec)-5 b(h,)63 b(Ha)-5 +b(v)c(as)62 b(and)4136 1581 y(Ma)9 b(jewski)56 b([1]\))f(is)h(made.) +4302 1780 y(The)d(t)-5 b(w)g(o)53 b(algorithms)g(w)-5 +b(ere)53 b(implemen)-5 b(ted)54 b(in)f(the)f(C)g(lan-)4136 +1980 y(guage.)70 b(All)41 b(exp)5 b(erimen)-5 b(ts)41 +b(w)-5 b(ere)42 b(carried)f(out)h(on)g(a)f(computer)4136 +2179 y(running)97 b(the)e(Lin)-5 b(ux)96 b(op)5 b(erating)95 +b(system,)106 b(v)-5 b(ersion)96 b(2.6.7,)4136 2378 y(with)63 +b(a)h(2.2)f(gigahertz)g(A)-5 b(thlon)64 b(pro)5 b(cessor)64 +b(and)g(1)f(gigab)-5 b(yte)4136 2577 y(of)55 b(main)h(memory)-14 +b(.)p 4596 2790 3000 7 v 4593 2972 7 183 v 4695 2918 +a Fu(Collection)p 5466 2972 V 502 w Fk(n)p 6365 2972 +V 503 w Fu(Key)52 b(Size)f(\(Avg\))p 7592 2972 V 4596 +2979 3000 7 v 4593 3162 7 183 v 4751 3107 a(T)-13 b(o)t(doBR)p +5466 3162 V 293 w(3,541,615)p 6365 3162 V 652 w(8.3)p +7592 3162 V 4593 3344 V 4750 3290 a(Random)p 5466 3344 +V 254 w(10,000,000)p 6365 3344 V 574 w(20.0)p 7592 3344 +V 4593 3527 V 4833 3472 a(VLC2)p 5466 3527 V 337 w(10,935,900)p +6365 3527 V 613 w(8.6)p 7592 3527 V 4593 3710 V 4840 +3655 a(URLs)p 5466 3710 V 344 w(20,000,000)p 6365 3710 +V 574 w(57.4)p 7592 3710 V 4596 3716 3000 7 v 4452 4039 +a Fy(T)f(able)56 b(4:)74 b(Collections)55 b(used)h(in)g(the)f(exp)5 +b(erimen)-5 b(ts.)4302 4411 y(W)-14 b(e)145 b(used)h(four)f +(collections)h(in)f(the)g(exp)5 b(erimen)-5 b(ts:)4136 +4610 y(\(i\))119 b(the)g(v)-5 b(o)5 b(cabulary)119 b(of)g(the)g(T)-14 +b(o)5 b(doBR)120 b(searc)-5 b(h)120 b(engine)4136 4810 +y(\(h)-5 b(ttp://www.to)5 b(dobr.com.br\);)77 b(\(ii\))69 +b(a)h(collection)g(of)f(k)-5 b(eys)4136 5009 y(generated)38 +b(randomly)h(\(Random\);)44 b(\(iii\))38 b(the)f(v)-5 +b(o)5 b(cabulary)38 b(ex-)4136 5208 y(tracted)55 b(from)h(the)f +(TREC-VLC2)g(\(V)-14 b(ery)54 b(Large)h(Collection)4136 +5407 y(2\))i(collection)f([11];)i(\(iv\))d(a)i(set)f(of)h(URLs)g(cra)-5 +b(wled)57 b(from)g(the)4136 5607 y(W)-14 b(eb.)99 b(T)-14 +b(able)63 b(4)h(presen)-5 b(ts)65 b(some)f(details)g(ab)5 +b(out)63 b(the)g(collec-)4136 5806 y(tions.)4302 6005 +y(T)-14 b(able)55 b(5)g(presen)-5 b(ts)55 b(the)f(main)i(c)-5 +b(haracteristics)54 b(of)h(the)f(t)-5 b(w)g(o)4136 6204 +y(algorithms.)75 b(The)55 b(n)-5 b(um)g(b)5 b(er)57 b(of)e(edges)h(of)f +(graph)h Ft(G)46 b Fy(=)g(\()p Ft(V)9 b(;)28 b(E)10 b +Fy(\))4136 6404 y(is)63 b(equal)g(to)f(the)g(size)h Ft(n)f +Fy(of)h(the)f(set)g Ft(S)72 b Fy(of)63 b(k)-5 b(eys)62 +b(for)h(the)f(t)-5 b(w)g(o)4136 6603 y(algorithms.)121 +b(The)71 b(n)-5 b(um)g(b)5 b(er)72 b(of)e(v)-5 b(ertices)70 +b(of)h Ft(G)f Fy(is)h(equal)g(to)4136 6802 y(1)p Ft(:)p +Fy(15)p Ft(n)61 b Fy(and)h(2)p Ft(:)p Fy(09)p Ft(n)f +Fy(for)g(the)f(new)h(algorithm)h(and)g(the)e(CHM)4136 +7001 y(algorithm,)53 b(resp)5 b(ectiv)-5 b(ely)-14 b(.)72 +b(This)53 b(measure)g(is)f(related)g(to)g(the)4136 7201 +y(amoun)-5 b(t)62 b(of)f(space)g(to)f(store)h(the)g(arra)-5 +b(y)61 b Ft(g)6 b Fy(.)90 b(The)61 b(n)-5 b(um)g(b)5 +b(er)62 b(of)4136 7400 y(critical)74 b(edges)g(is)h(0)p +Ft(:)p Fy(5)p Fx(j)p Ft(E)10 b Fx(j)73 b Fy(and)i(0,)j(for)c(the)g(new) +g(algorithm)4136 7599 y(and)56 b(the)f(CHM)g(algorithm,)h(resp)5 +b(ectiv)-5 b(ely)-14 b(.)p 4509 7811 3174 7 v 4506 8047 +7 236 v 4675 8047 a Fu(Characteristics)p 5838 8047 V +6388 7939 a(Algorithms)p 7679 8047 V 5841 8053 1841 7 +v 4506 8229 7 183 v 5838 8229 V 5941 8175 a(New)52 b(algorithm)p +7032 8229 V 238 w(CHM)p 7679 8229 V 4509 8236 3174 7 +v 4506 8419 7 183 v 5072 8364 a Ff(j)p Fk(E)9 b Ff(j)p +5838 8419 V 1112 w Fk(n)p 7032 8419 V 827 w(n)p 7679 +8419 V 4506 8601 V 5071 8546 a Ff(j)p Fk(V)33 b Ff(j)p +5838 8601 V 1079 w Fk(cn)p 7032 8601 V 761 w(cn)p 7679 +8601 V 4506 8784 V 5142 8729 a(c)p 5838 8784 V 1094 w +Fu(1.15)p 7032 8784 V 646 w(2.09)p 7679 8784 V 4506 8967 +V 5093 8912 a Ff(j)p Fk(g)5 b Ff(j)p 5838 8967 V 998 +w Fu(1)p Fk(:)p Fu(15)p Fk(n)p 7032 8967 V 554 w Fu(2)p +Fk(:)p Fu(09)p Fk(n)p 7679 8967 V 4506 9149 V 4968 9094 +a Ff(j)p Fk(E)5124 9111 y Fj(cr)s(it)5340 9094 y Ff(j)p +5838 9149 V 854 w Fu(0)p Fk(:)p Fu(5)p Ff(j)p Fk(E)k +Ff(j)p 7032 9149 V 678 w Fu(0)p 7679 9149 V 4506 9332 +V 5115 9277 a Fk(G)p 5838 9332 V 1018 w Fu(cyclic)p 7032 +9332 V 511 w(acyclic)p 7679 9332 V 4506 9515 V 4609 9460 +a(Order)52 b(preserving)p 5838 9515 V 616 w(no)p 7032 +9515 V 737 w(y)l(es)p 7679 9515 V 4509 9521 3174 7 v +4364 9843 a Fy(T)-14 b(able)56 b(5:)74 b(Main)55 b(c)-5 +b(haracteristics)56 b(of)f(the)g(algorithms.)4302 10216 +y(T)-14 b(able)132 b(6)g(presen)-5 b(ts)133 b(time)e(results)i(for)e +(constructing)4136 10415 y(MPHFs)72 b(using)h(the)e(t)-5 +b(w)g(o)72 b(algorithms.)124 b(The)71 b(table)h(en)-5 +b(tries)3864 10913 y(11)p eop end +%%Page: 12 12 +TeXDict begin 12 11 bop -121 460 8138 7 v 1753 635 a +Fu(New)51 b(algorithm,)f Fk(c)43 b Fu(=)g(1)p Fk(:)p +Fu(15)2386 b(CHM,)51 b Fk(c)43 b Fu(=)g(2)p Fk(:)p Fu(09)p +803 718 3532 7 v 4534 718 3482 7 v 29 887 a(Collection)248 +b Fk(N)1075 904 y Fj(i)1375 887 y Fu(Mapping)199 b(Ordering)i(Searc)l +(hing)236 b(T)-13 b(otal)483 b Fk(N)4806 904 y Fj(i)5106 +887 y Fu(Mapping)51 b(+)h(Ordering)200 b(Searc)l(hing)g(T)-13 +b(otal)p -121 970 8138 7 v 59 1186 a(T)g(o)t(doBR)281 +b(1.92)320 b(11.33)482 b(1.93)547 b(0.97)422 b(14.23)436 +b(2.63)730 b(19.51)915 b(3.03)386 b(22.54)58 1368 y(Random)280 +b(1.77)320 b(41.90)482 b(7.17)547 b(3.70)422 b(52.77)436 +b(2.96)730 b(59.92)877 b(10.31)347 b(70.23)142 1551 y(VLC2)362 +b(2.24)320 b(44.69)482 b(7.00)547 b(3.59)422 b(55.28)436 +b(2.94)730 b(78.77)877 b(11.09)347 b(89.86)149 1734 y(URLs)369 +b(2.18)281 b(153.23)406 b(14.62)508 b(7.52)384 b(175.37)508 +b(-)991 b(-)1177 b(-)648 b(-)p -121 1842 V 1667 2165 +a Fy(T)-14 b(able)56 b(6:)74 b(Time)55 b(to)g(generate)g(the)g(MPHFs)h +(for)f(the)g(new)g(algorithms.)-161 2695 y(represen)-5 +b(t)55 b(a)-5 b(v)g(erages)55 b(o)-5 b(v)g(er)55 b(50)f(trials.)74 +b(The)54 b(column)h(lab)5 b(elled)-161 2894 y(as)63 b +Ft(N)183 2919 y Fr(i)302 2894 y Fy(represen)-5 b(ts)63 +b(the)f(n)-5 b(um)g(b)5 b(er)64 b(of)e(iterations)h(to)f(generate)-161 +3094 y(the)c(random)h(graph)g Ft(G)e Fy(in)i(the)f(mapping)h(step)f(of) +g(the)g(algo-)-161 3293 y(rithms.)73 b(The)49 b(other)g(columns)i +(represen)-5 b(t)49 b(the)g(run)h(times)f(for)-161 3492 +y(eac)-5 b(h)56 b(step)f(of)h(the)e(algorithms.)75 b(All)56 +b(times)f(are)g(in)h(seconds.)5 3716 y(The)i(CHM)e(algorithm)i(p)5 +b(erforms)58 b(the)e(ordering)i(step)f(to-)-161 3915 +y(gether)65 b(the)f(mapping)i(step.)102 b(In)65 b(the)f(CHM)g +(algorithm)i(the)-161 4115 y(ordering)c(step)g(is)g(just)g(the)f +(assignmen)-5 b(t)63 b(of)f(hash)g(v)-9 b(alues)62 b(to)-161 +4314 y(the)55 b(edges)h(of)f Ft(G)p Fy(.)5 4538 y(The)c(mapping)g(step) +f(of)g(the)g(new)g(algorithm)h(is)f(faster)g(b)5 b(e-)-161 +4737 y(cause)57 b(the)f(n)-5 b(um)g(b)5 b(er)58 b(of)f(iterations)f(to) +g(generate)g Ft(G)g Fy(is)h(lo)-5 b(w)g(er,)-161 4936 +y(since)78 b Ft(G)e Fy(has)i(1)p Ft(:)p Fy(15)p Ft(n)e +Fy(v)-5 b(ertices)77 b(and)g(m)-5 b(ust)78 b(not)e(b)5 +b(e)77 b(acyclic.)-161 5136 y(This)68 b(result)e(fully)g(bac)-5 +b(ks)67 b(the)f(theoretical)g(considerations.)-161 5335 +y(Using)78 b(Eq.)e(\(4\),)82 b(the)76 b(exp)5 b(ected)76 +b(n)-5 b(um)g(b)5 b(er)78 b(of)f(iterations)g(to)-161 +5534 y(generate)h Ft(G)h Fy(for)f(the)h(new)f(algorithm)i(is)f(2)p +Ft(:)p Fy(13)g(and)g(using)-161 5733 y(Eq.)65 b(\(2\),)h(the)e(same)h +(measure)g(is)g(2)p Ft(:)p Fy(92)g(for)f(the)h(CHM)f(algo-)-161 +5933 y(rithm.)73 b(The)49 b(CHM)f(algorithm)i(also)g(needs)g(to)e(v)-5 +b(erify)49 b(if)g Ft(G)g Fy(is)-161 6132 y(acyclic)63 +b(during)i(the)e(mapping)i(step,)h(whic)-5 b(h)65 b(has)f(the)g(same) +-161 6331 y(complexit)-5 b(y)55 b(of)h(the)e(ordering)i(step)g(of)f +(the)g(new)g(algorithm.)5 6555 y(The)47 b(random)h(graph)f +Ft(G)f Fy(generated)g(in)h(the)f(mapping)i(step)-161 +6754 y(of)71 b(the)g(new)g(algorithm)g(has)h(1)p Ft(:)p +Fy(15)p Ft(n)f Fy(v)-5 b(ertices)70 b(and)i(the)e(one)-161 +6954 y(generated)58 b(in)g(the)f(mapping)i(step)f(of)g(the)f(CHM)h +(algorithm)-161 7153 y(has)64 b(2)p Ft(:)p Fy(09)p Ft(n)e +Fy(v)-5 b(ertices.)95 b(That)62 b(is)h(wh)-5 b(y)62 b(the)g(searc)-5 +b(hing)64 b(step)f(of)-161 7352 y(new)68 b(algorithm)g(is)g(faster,)j +(since)d(the)f(time)g(complexit)-5 b(y)68 b(of)-161 7551 +y(the)75 b(searc)-5 b(hing)76 b(step)f(of)f(the)g(algorithms)i(dep)5 +b(ends)76 b(on)f(the)-161 7751 y(n)-5 b(um)g(b)5 b(er)57 +b(of)e(v)-5 b(ertices)55 b(in)h Ft(G)p Fy(.)5 7975 y(W)-14 +b(e)99 b(w)-5 b(ere)99 b(not)g(able)g(to)g(generate)f(a)i(MPHF)f(for)g +(the)-161 8174 y(CHM)66 b(algorithm)h(using)g(the)f(URLs)g(collection.) +106 b(The)66 b(rea-)-161 8373 y(son)77 b(w)-5 b(as)78 +b(that)d(its)i(random)g(graph)g Ft(G)f Fy(has)h(more)g(v)-5 +b(ertices)-161 8572 y(\()p Fx(j)p Ft(V)37 b Fx(j)85 b +Fy(=)h(2)p Ft(:)p Fy(09)p Ft(n)p Fy(\))78 b(and)h(could)h(not)e(b)5 +b(e)79 b(stored)g(in)g(the)g(main)-161 8772 y(memory)56 +b(of)f(the)g(mac)-5 b(hine)56 b(used)g(for)g(the)f(exp)5 +b(erimen)-5 b(ts.)5 8996 y(The)109 b(MPHF)g(generated)g(b)-5 +b(y)109 b(the)f(new)h(algorithm)h(is)-161 9195 y(sligh)-5 +b(tly)55 b(faster)f(than)h(the)f(one)g(generated)g(b)-5 +b(y)55 b(the)f(CHM)g(al-)-161 9394 y(gorithm.)99 b(It)64 +b(happ)5 b(ens)64 b(b)5 b(ecause)64 b(w)-5 b(e)63 b(sa)-5 +b(v)g(e)65 b(a)e(mo)5 b(dule)64 b(op)5 b(er-)-161 9593 +y(ation,)61 b(as)f(sho)-5 b(wn)61 b(in)f(Eq.)f(\(3\).)86 +b(T)-14 b(able)60 b(7)g(presen)-5 b(ts)60 b(the)g(ev)-9 +b(al-)-161 9793 y(uation)63 b(times,)i(whic)-5 b(h)63 +b(are)g(a)-5 b(v)g(erages)63 b(o)-5 b(v)g(er)63 b(50)g(trials.)96 +b(Eac)-5 b(h)-161 9992 y(en)g(try)41 b(in)g(T)-14 b(able)41 +b(7)g(represen)-5 b(ts)42 b(the)f(time)g(to)f(ev)-9 b(aluate)40 +b(all)h(k)-5 b(eys)-161 10191 y(of)55 b(eac)-5 b(h)56 +b(collection.)5 10415 y(Finally)-14 b(,)57 b(Figure)g(11)f(presen)-5 +b(ts)57 b(the)e(time)h(to)f(generate)h(the)p 4779 2536 +2634 7 v 4776 2771 7 236 v 4879 2771 a Fu(Collection)p +5649 2771 V 6158 2664 a(Algorithms)p 7409 2771 V 5652 +2778 1760 7 v 4776 2954 7 183 v 5649 2954 V 5752 2899 +a(New)c(algorithm)p 6843 2954 V 198 w(CHM)p 7409 2954 +V 4779 2960 2634 7 v 4776 3143 7 183 v 4934 3088 a(T)-13 +b(o)t(doBR)p 5649 3143 V 616 w(3)p Fk(:)p Fu(33)p 6843 +3143 V 606 w(3)p Fk(:)p Fu(59)p 7409 3143 V 4776 3326 +V 4933 3271 a(Random)p 5649 3326 V 576 w(12)p Fk(:)p +Fu(29)p 6843 3326 V 529 w(13)p Fk(:)p Fu(70)p 7409 3326 +V 4776 3508 V 5016 3454 a(VLC2)p 5649 3508 V 659 w(12)p +Fk(:)p Fu(41)p 6843 3508 V 529 w(13)p Fk(:)p Fu(81)p +7409 3508 V 4776 3691 V 5023 3636 a(URLs)p 5649 3691 +V 666 w(60)p Fk(:)p Fu(03)p 6843 3691 V 679 w(-)p 7409 +3691 V 4779 3698 2634 7 v 4136 4020 a Fy(T)f(able)64 +b(7:)90 b(Time)64 b(to)f(compute)g(a)h(hash)g(table)f(en)-5 +b(try)63 b(for)h(the)4136 4219 y(algorithms)57 b(considered.)74 +b(All)55 b(times)h(are)f(in)h(seconds.)4136 4777 y(MPHF)69 +b(b)-5 b(y)68 b(the)g(new)g(algorithm)h(for)f(di\013eren)-5 +b(t)68 b(n)-5 b(um)g(b)5 b(er)69 b(of)4136 4976 y(k)-5 +b(eys)69 b(of)g(the)g(TREC-VLC2)g(collection.)115 b(As)69 +b(claimed,)74 b(the)4136 5176 y(time)83 b(to)f(generate)g(a)g(MPHF)h +(using)h(the)e(new)h(algorithm)4136 5375 y(gro)-5 b(ws)56 +b(linearly)g(with)f Ft(n)p Fy(.)4146 8364 y + currentpoint currentpoint translate 0.65 0.65 scale neg exch neg exch +translate + 4146 8364 +a 4146 4164 a + 23681433 16577003 3289088 3289088 26970521 19866091 startTexFig + 4146 4164 a +%%BeginDocument: figs/graftrec.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: graftrec.ps +%%Creator: gnuplot 4.0 patchlevel 0 +%%CreationDate: Thu Sep 16 16:27:26 2004 +%%DocumentFonts: (atend) +%%BoundingBox: 50 50 410 302 +%%Orientation: Portrait +%%EndComments +/gnudict 256 dict def +gnudict begin +/Color false def +/Solid false def +/gnulinewidth 5.000 def +/userlinewidth gnulinewidth def +/vshift -80 def +/dl {10.0 mul} def +/hpt_ 31.5 def +/vpt_ 31.5 def +/hpt hpt_ def +/vpt vpt_ def +/Rounded false def +/reencodeISO { +dup dup findfont dup length dict begin +{ 1 index /FID ne { def }{ pop pop } ifelse } forall +currentdict /CharStrings known { + CharStrings /Idieresis known { + /Encoding ISOLatin1Encoding def } if +} if +currentdict end definefont +} def +/ISOLatin1Encoding [ +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright +/parenleft/parenright/asterisk/plus/comma/minus/period/slash +/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon +/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N +/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright +/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m +/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve +/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut +/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar +/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot +/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown +/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute +/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave +/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex +/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis +/yacute/thorn/ydieresis +] def +/M {moveto} bind def +/L {lineto} bind def +/R {rmoveto} bind def +/V {rlineto} bind def +/N {newpath moveto} bind def +/C {setrgbcolor} bind def +/f {rlineto fill} bind def +/vpt2 vpt 2 mul def +/hpt2 hpt 2 mul def +/Lshow { currentpoint stroke M + 0 vshift R show } def +/Rshow { currentpoint stroke M + dup stringwidth pop neg vshift R show } def +/Cshow { currentpoint stroke M + dup stringwidth pop -2 div vshift R show } def +/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def + /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def +/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } + {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def +/BL { stroke userlinewidth 2 mul setlinewidth + Rounded { 1 setlinejoin 1 setlinecap } if } def +/AL { stroke userlinewidth 2 div setlinewidth + Rounded { 1 setlinejoin 1 setlinecap } if } def +/UL { dup gnulinewidth mul /userlinewidth exch def + dup 1 lt {pop 1} if 10 mul /udl exch def } def +/PL { stroke userlinewidth setlinewidth + Rounded { 1 setlinejoin 1 setlinecap } if } def +/LTw { PL [] 1 setgray } def +/LTb { BL [] 0 0 0 DL } def +/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def +/LT0 { PL [] 1 0 0 DL } def +/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def +/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def +/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def +/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def +/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def +/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def +/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def +/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def +/Pnt { stroke [] 0 setdash + gsave 1 setlinecap M 0 0 V stroke grestore } def +/Dia { stroke [] 0 setdash 2 copy vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke + Pnt } def +/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V + currentpoint stroke M + hpt neg vpt neg R hpt2 0 V stroke + } def +/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke + Pnt } def +/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M + hpt2 vpt2 neg V currentpoint stroke M + hpt2 neg 0 R hpt2 vpt2 V stroke } def +/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke + Pnt } def +/Star { 2 copy Pls Crs } def +/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath fill } def +/TriUF { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath fill } def +/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke + Pnt } def +/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath fill} def +/DiaF { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath fill } def +/Pent { stroke [] 0 setdash 2 copy gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore Pnt } def +/PentF { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath fill grestore } def +/Circle { stroke [] 0 setdash 2 copy + hpt 0 360 arc stroke Pnt } def +/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def +/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def +/C1 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + vpt 0 360 arc closepath } bind def +/C2 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C3 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C4 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C5 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc + 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc } bind def +/C6 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C7 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C8 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C9 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 450 arc closepath fill + vpt 0 360 arc closepath } bind def +/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill + 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C11 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C12 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C13 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C14 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 360 arc closepath fill + vpt 0 360 arc } bind def +/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } bind def +/Square { dup Rec } bind def +/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def +/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def +/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def +/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def +/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill + exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill + 2 copy vpt Square fill + Bsquare } bind def +/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def +/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill + Bsquare } bind def +/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill + Bsquare } bind def +/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def +/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy vpt Square fill Bsquare } bind def +/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def +/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def +/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def +/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def +/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def +/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def +/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def +/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def +/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def +/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def +/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def +/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def +/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def +/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def +/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def +/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def +/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def +/DiaE { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke } def +/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke } def +/TriUE { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke } def +/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke } def +/PentE { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore } def +/CircE { stroke [] 0 setdash + hpt 0 360 arc stroke } def +/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def +/DiaW { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V Opaque stroke } def +/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V Opaque stroke } def +/TriUW { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V Opaque stroke } def +/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V Opaque stroke } def +/PentW { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + Opaque stroke grestore } def +/CircW { stroke [] 0 setdash + hpt 0 360 arc Opaque stroke } def +/BoxFill { gsave Rec 1 setgray fill grestore } def +/BoxColFill { + gsave Rec + /Fillden exch def + currentrgbcolor + /ColB exch def /ColG exch def /ColR exch def + /ColR ColR Fillden mul Fillden sub 1 add def + /ColG ColG Fillden mul Fillden sub 1 add def + /ColB ColB Fillden mul Fillden sub 1 add def + ColR ColG ColB setrgbcolor + fill grestore } def +% +% PostScript Level 1 Pattern Fill routine +% Usage: x y w h s a XX PatternFill +% x,y = lower left corner of box to be filled +% w,h = width and height of box +% a = angle in degrees between lines and x-axis +% XX = 0/1 for no/yes cross-hatch +% +/PatternFill { gsave /PFa [ 9 2 roll ] def + PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate + PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec + gsave 1 setgray fill grestore clip + currentlinewidth 0.5 mul setlinewidth + /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def + 0 0 M PFa 5 get rotate PFs -2 div dup translate + 0 1 PFs PFa 4 get div 1 add floor cvi + { PFa 4 get mul 0 M 0 PFs V } for + 0 PFa 6 get ne { + 0 1 PFs PFa 4 get div 1 add floor cvi + { PFa 4 get mul 0 2 1 roll M PFs 0 V } for + } if + stroke grestore } def +% +/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont +dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall +currentdict end definefont pop +/Times-Roman reencodeISO def +end +%%EndProlog +gnudict begin +gsave +50 50 translate +0.050 0.050 scale +0 setgray +newpath +(Times-Roman) findfont 240 scalefont setfont +1.000 UL +LTb +1080 720 M +63 0 V +5649 0 R +-63 0 V +936 720 M +gsave 0 setgray +( 0) Rshow +grestore +1.000 UL +LTb +1080 1047 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 5) Rshow +grestore +1.000 UL +LTb +1080 1375 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 10) Rshow +grestore +1.000 UL +LTb +1080 1702 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 15) Rshow +grestore +1.000 UL +LTb +1080 2029 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 20) Rshow +grestore +1.000 UL +LTb +1080 2356 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 25) Rshow +grestore +1.000 UL +LTb +1080 2684 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 30) Rshow +grestore +1.000 UL +LTb +1080 3011 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 35) Rshow +grestore +1.000 UL +LTb +1080 3338 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 40) Rshow +grestore +1.000 UL +LTb +1080 3665 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 45) Rshow +grestore +1.000 UL +LTb +1080 3993 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 50) Rshow +grestore +1.000 UL +LTb +1080 4320 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 55) Rshow +grestore +1.000 UL +LTb +1080 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 0) Cshow +grestore +1.000 UL +LTb +1794 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 1000) Cshow +grestore +1.000 UL +LTb +2508 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 2000) Cshow +grestore +1.000 UL +LTb +3222 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 3000) Cshow +grestore +1.000 UL +LTb +3936 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 4000) Cshow +grestore +1.000 UL +LTb +4650 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 5000) Cshow +grestore +1.000 UL +LTb +5364 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 6000) Cshow +grestore +1.000 UL +LTb +6078 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 7000) Cshow +grestore +1.000 UL +LTb +6792 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 8000) Cshow +grestore +1.000 UL +LTb +1.000 UL +LTb +1080 720 M +5712 0 V +0 3600 V +-5712 0 V +0 -3600 V +LTb +240 2520 M +gsave 0 setgray +currentpoint gsave translate 90 rotate 0 0 M +(Time \(s\)) Cshow +grestore +grestore +LTb +3936 120 M +gsave 0 setgray +(n/1000) Cshow +grestore +LTb +3936 4680 M +gsave 0 setgray +(TREC-VLC2) Cshow +grestore +1.000 UP +1.000 UP +1.000 UL +LT0 +LTb +1800 4137 M +gsave 0 setgray +(MPHF) Rshow +grestore +LT0 +1944 4137 M +639 0 V +1258 784 M +179 130 V +357 181 V +714 451 V +1428 849 V +6792 4025 L +1258 784 Pls +1437 914 Pls +1794 1095 Pls +2508 1546 Pls +3936 2395 Pls +6792 4025 Pls +2263 4137 Pls +1.000 UL +LTb +1080 720 M +5712 0 V +0 3600 V +-5712 0 V +0 -3600 V +1.000 UP +stroke +grestore +end +showpage +%%Trailer +%%DocumentFonts: Times-Roman + +%%EndDocument + + endTexFig + 4146 8364 a + currentpoint currentpoint translate 1 0.65 div 1 0.65 div scale neg +exch neg exch translate + 4146 8364 a 4136 8792 a Fy(Figure)f(11:)72 +b(V)-14 b(eri\014cation)53 b(of)f(the)h Ft(O)5 b Fy(\()p +Ft(n)p Fy(\))51 b(complexit)-5 b(y)52 b(to)h(gen-)4136 +8991 y(erate)i(a)g(MPHF)h(b)-5 b(y)55 b(the)g(new)h(algorithm.)4136 +9827 y Fv(8)270 b(Conclusions)4136 10216 y Fy(A)52 b(new)f(algorithm)i +(for)e(generating)h(MPHFs)g(has)h(b)5 b(een)51 b(pro-)4136 +10415 y(p)5 b(osed.)101 b(Its)65 b(exp)5 b(ected)62 b(time)i(complexit) +-5 b(y)64 b(is)h Ft(O)5 b Fy(\()p Ft(n)p Fy(\),)65 b(so)g(that)3864 +10913 y(12)p eop end +%%Page: 13 13 +TeXDict begin 13 12 bop -161 620 a Fy(the)61 b(new)f(algorithm)h(is)g +(time)g(optimal.)90 b(The)60 b(time)g(to)h(ev)-9 b(al-)-161 +819 y(uate)56 b(the)g(generated)g(function)g(is)h(v)-5 +b(ery)56 b(fast)g(and)h(the)f(space)-161 1018 y(needed)i(to)f(store)h +(it)f(is)i Ft(O)5 b Fy(\()p Ft(n)28 b Fy(log)g Ft(n)p +Fy(\))57 b(bits.)81 b(Exp)5 b(erimen)-5 b(tal)58 b(re-)-161 +1218 y(sults)d(sho)-5 b(w)55 b(that)e(the)g(times)h(to)f(b)5 +b(oth)54 b(generate)f(the)g(MPHF)-161 1417 y(and)i(compute)f(a)g(hash)h +(table)e(en)-5 b(try)54 b(b)-5 b(y)54 b(the)g(new)g(algorithm)-161 +1616 y(are)59 b(b)5 b(etter)57 b(than)i(the)f(times)h(obtained)g(b)-5 +b(y)58 b(the)h(CHM)f(algo-)-161 1815 y(rithm,)e(one)g(of)f(the)g +(fastest)g(kno)-5 b(wn)56 b(algorithm.)-161 2425 y Fv(References)-78 +2810 y Fy([1])84 b(Z.J.)e(Czec)-5 b(h,)88 b(G.)81 b(Ha)-5 +b(v)c(as,)88 b(and)81 b(B.S.)h(Ma)9 b(jewski.)150 b(An)181 +3009 y(optimal)56 b(algorithm)g(for)f(generating)h(minimal)h(p)5 +b(erfect)181 3208 y(hash)78 b(functions.)140 b Fs(Information)80 +b(Pr)-8 b(o)g(c)g(essing)78 b(L)-8 b(etters)p Fy(,)181 +3408 y(43\(5\):257{264,)55 b(1992.)-78 3786 y([2])84 +b(Z.J.)49 b(Czec)-5 b(h,)50 b(G.)g(Ha)-5 b(v)c(as,)50 +b(and)f(B.S.)g(Ma)9 b(jewski.)63 b(F)-14 b(unda-)181 +3985 y(men)-5 b(tal)68 b(study)h(p)5 b(erfect)67 b(hashing.)113 +b Fs(The)-8 b(or)g(etic)g(al)71 b(Com-)181 4184 y(puter)60 +b(Scienc)-8 b(e)p Fy(,)57 b(182:1{143,)f(1997.)-78 4562 +y([3])84 b(P)-14 b(.)61 b(Erdos)h(and)g(A.)e(R)-5 b(\023)-78 +b(en)-5 b(yi.)92 b(On)61 b(random)h(graphs.)92 b Fs(Pu-)181 +4761 y(bic)-8 b(ationes)60 b(Mathematic)-8 b(ae)p Fy(,)55 +b(6:290{297,)h(1959.)-78 5139 y([4])84 b(P)-14 b(.)60 +b(Erd\177)-83 b(os)61 b(and)f(A.)f(R)-5 b(\023)-78 b(en)-5 +b(yi.)88 b(On)60 b(the)g(ev)-5 b(olution)60 b(of)g(ran-)181 +5338 y(dom)90 b(graphs.)176 b Fs(Public)-8 b(ations)91 +b(of)f(the)h(Mathematic)-8 b(al)181 5537 y(Institute)71 +b(of)f(the)h(Hungarian)h(A)-8 b(c)g(ademy)69 b(of)i(Scienc)-8 +b(es)p Fy(,)181 5737 y(56:17{61,)55 b(1960.)-78 6114 +y([5])84 b(P)-14 b(.)65 b(Erd\177)-83 b(os)65 b(and)h(A.)e(R)-5 +b(\023)-78 b(en)-5 b(yi.)103 b(On)65 b(the)f(strength)h(of)g(con-)181 +6314 y(nectedness)50 b(of)f(a)h(random)g(graph.)65 b +Fs(A)-8 b(cta)55 b(Mathematic)-8 b(a)181 6513 y(Scientia)60 +b(Hungary)p Fy(,)d(12:261{267,)e(1961.)-78 6891 y([6])84 +b(P)-14 b(.)88 b(Fla)9 b(jolet,)97 b(D.)88 b(E.)g(Kn)-5 +b(uth,)98 b(and)88 b(B.)g(Pittel.)171 b(The)181 7090 +y(\014rst)64 b(cycles)g(in)h(an)f(ev)-5 b(olving)65 b(graph.)101 +b Fs(Discr)-8 b(ete)68 b(Math)p Fy(,)181 7289 y(75:167{215,)55 +b(1989.)-78 7667 y([7])84 b(E.)66 b(A.)g(F)-14 b(o)-5 +b(x,)70 b(Q.)d(F.)g(Chen,)i(A.)d(M.)h(Daoud,)j(and)d(L.)f(S.)181 +7866 y(Heath.)161 b(Order)85 b(preserving)g(minimal)i(p)5 +b(erfect)83 b(hash)181 8066 y(functions)57 b(and)h(information)g +(retriev)-9 b(al.)78 b Fs(A)l(CM)61 b(T)-13 b(r)-8 b(ans.)181 +8265 y(Inform.)59 b(Systems)p Fy(,)d(9\(3\):281{308,)e(July)i(1991.)-78 +8643 y([8])84 b(E.A.)70 b(F)-14 b(o)-5 b(x,)75 b(Q.F.)c(Chen,)k(and)c +(L.S.)g(Heath.)118 b(A)70 b(faster)181 8842 y(algorithm)i(for)g +(constructing)g(minimal)h(p)5 b(erfect)70 b(hash)181 +9041 y(functions.)96 b(In)63 b Fs(Pr)-8 b(o)g(c)g(e)g(e)g(dings)65 +b(of)h(the)h(15th)f(A)l(nnual)h(In-)181 9240 y(ternational)e(A)l(CM)e +(SIGIR)i(Confer)-8 b(enc)g(e)64 b(on)g(R)-8 b(ese)g(ar)g(ch)181 +9440 y(and)58 b(Development)i(in)e(Information)g(R)-8 +b(etrieval)p Fy(,)56 b(pages)181 9639 y(266{273,)f(1992.)-78 +10017 y([9])84 b(E.A.)125 b(F)-14 b(o)-5 b(x,)144 b(L.)126 +b(S.)g(Heath,)142 b(Q.Chen,)i(and)126 b(A.M.)181 10216 +y(Daoud.)86 b(Practical)59 b(minimal)h(p)5 b(erfect)58 +b(hash)j(functions)181 10415 y(for)42 b(large)g(databases.)54 +b Fs(Communic)-8 b(ations)47 b(of)g(the)h(A)l(CM)p Fy(,)181 +10615 y(35\(1\):105{121,)55 b(1992.)4136 620 y([10])84 +b(G.)41 b(Ha)-5 b(v)c(as,)44 b(B.S.)d(Ma)9 b(jewski,)44 +b(N.C.)c(W)-14 b(ormald,)45 b(and)c(Z.J.)4478 819 y(Czec)-5 +b(h.)171 b(Graphs,)98 b(h)-5 b(yp)5 b(ergraphs)89 b(and)g(hashing.)173 +b(In)4478 1018 y Fs(19th)59 b(International)j(Workshop)e(on)g(Gr)-8 +b(aph-The)g(or)g(etic)4478 1218 y(Conc)g(epts)91 b(in)h(Computer)f +(Scienc)-8 b(e)p Fy(,)101 b(pages)91 b(153{165.)4478 +1417 y(Springer)60 b(Lecture)f(Notes)g(in)h(Computer)f(Science)h(v)-5 +b(ol.)4478 1616 y(790,)55 b(1993.)4136 1948 y([11])84 +b(D.)52 b(Ha)-5 b(wking.)70 b(Ov)-5 b(erview)52 b(of)h(trec-7)f(v)-5 +b(ery)52 b(large)h(collec-)4478 2147 y(tion)i(trac)-5 +b(k)55 b(\(draft)f(for)h(noteb)5 b(o)g(ok\),)54 b(1998.)4136 +2479 y([12])84 b(D.)44 b(E.)g(Kn)-5 b(uth.)57 b Fs(The)50 +b(A)l(rt)f(of)g(Computer)h(Pr)-8 b(o)g(gr)g(amming:)4478 +2679 y(Sorting)46 b(and)f(Se)-8 b(ar)g(ching)p Fy(,)44 +b(v)-5 b(olume)40 b(3.)49 b(Addison-W)-14 b(esley)g(,)4478 +2878 y(second)55 b(edition,)h(1973.)4136 3210 y([13])84 +b(B.S.)41 b(Ma)9 b(jewski,)44 b(N.C.)c(W)-14 b(ormald,)45 +b(G.)c(Ha)-5 b(v)c(as,)44 b(and)d(Z.J.)4478 3409 y(Czec)-5 +b(h.)68 b(A)52 b(family)g(of)g(p)5 b(erfect)51 b(hashing)j(metho)5 +b(ds.)69 b Fs(The)4478 3609 y(Computer)59 b(Journal)p +Fy(,)d(39\(6\):547{554,)f(1996.)4136 3941 y([14])84 b(K.)58 +b(Mehlhorn.)83 b Fs(Data)63 b(Structur)-8 b(es)63 b(and)f(A)l +(lgorithms)g(1:)4478 4140 y(Sorting)e(and)f(Se)-8 b(ar)g(ching)p +Fy(.)75 b(Springer-V)-14 b(erlag,)56 b(1984.)4136 4472 +y([15])84 b(E.)51 b(M.)g(P)-5 b(almer.)68 b Fs(Gr)-8 +b(aphic)g(al)56 b(Evolution:)75 b(A)l(n)56 b(Intr)-8 +b(o)g(duc-)4478 4671 y(tion)45 b(to)h(the)g(The)-8 b(ory)44 +b(of)h(R)-8 b(andom)45 b(Gr)-8 b(aphs)p Fy(.)49 b(John)41 +b(Wiley)4478 4871 y(&)55 b(Sons,)i(New)d(Y)-14 b(ork,)55 +b(1985.)3864 10913 y(13)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/papers/bmz_wea2005.ps b/papers/bmz_wea2005.ps new file mode 100755 index 0000000..8153a5b --- /dev/null +++ b/papers/bmz_wea2005.ps @@ -0,0 +1,8159 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software +%%Title: llncs.dvi +%%Pages: 13 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentFonts: CMBX12 CMR10 CMR7 CMR6 CMR9 CMSY9 CMTT9 CMBX9 CMMI9 +%%+ CMMI10 CMTI10 CMSY10 CMMI7 CMEX10 MSBM10 CMBX10 CMSY7 CMMI5 CMR5 +%%+ CMMI6 CMTT10 CMTI9 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips llncs.dvi -o wea2005.ps +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 2005.01.27:1436 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: f7b6d320.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10 +% cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8 +% cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10 +% cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10 +% +/TeXf7b6d320Encoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve +/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash +/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand +/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen +/period /slash /zero /one /two /three /four /five /six /seven /eight +/nine /colon /semicolon /exclamdown /equal /questiondown /question /at +/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X +/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent +/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u +/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef +/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute +/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE +/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: bbad153f.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9 +% +/TeXbbad153fEncoding [ +/minus /periodcentered /multiply /asteriskmath /divide /diamondmath +/plusminus /minusplus /circleplus /circleminus /circlemultiply +/circledivide /circledot /circlecopyrt /openbullet /bullet +/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal +/greaterequal /precedesequal /followsequal /similar /approxequal +/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows +/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast +/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup +/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional +/prime /infinity /element /owner /triangle /triangleinv /negationslash +/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur +/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K +/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection +/unionmulti /logicaland /logicalor /turnstileleft /turnstileright +/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright +/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv +/backslash /wreathproduct /radical /coproduct /nabla /integral +/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section +/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/minus /periodcentered /multiply /asteriskmath /divide /diamondmath +/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef +/circlemultiply /circledivide /circledot /circlecopyrt /openbullet +/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset +/lessequal /greaterequal /precedesequal /followsequal /similar +/approxequal /propersubset /propersuperset /lessmuch /greatermuch +/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: 09fbbfac.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9 +/TeX09fbbfacEncoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi +/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown +/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla +/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam +/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft +/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon /less +/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N +/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright +/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l +/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright +/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi +/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown +/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute +/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE +/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: aae443f0.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmmi10 cmmi12 cmmi5 cmmi6 cmmi7 cmmi8 cmmi9 cmmib10 +% +/TeXaae443f0Encoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa +/lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi +/omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf +/arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft +/arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle +/twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle +/sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash +/greater /star /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N +/O /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbelow +/slurabove /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p +/q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass /vector +/tie /psi /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi +/.notdef /.notdef /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta +/theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon +/phi /chi /psi /tie /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: 74afc74c.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10 +% +/TeX74afc74cEncoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve +/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash +/suppress /exclam /quotedblright /numbersign /sterling /percent +/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma +/hyphen /period /slash /zero /one /two /three /four /five /six /seven +/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question +/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W +/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent +/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u +/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef +/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute +/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE +/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: 0ef0afca.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmr5 +% +/TeX0ef0afcaEncoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi +/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls +/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright +/numbersign /dollar /percent /ampersand /quoteright /parenleft +/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K +/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft +/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h +/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash +/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda +/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup +/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj +/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe +/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: texps.pro +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginProcSet: special.pro +%! +TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N +/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N +/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N +/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ +/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho +X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B +/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ +/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known +{userdict/md get type/dicttype eq{userdict begin md length 10 add md +maxlength ge{/md md dup length 20 add dict copy def}if end md begin +/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S +atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ +itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll +transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll +curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf +pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} +if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 +-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip +yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub +neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ +noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop +90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get +neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr +1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr +2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 +-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S +TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ +Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale +}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState +save N userdict maxlength dict begin/magscale true def normalscale +currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts +/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x +psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx +psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub +TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def +@MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll +newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto +closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N +/@beginspecial{SDict begin/SpecialSave save N gsave normalscale +currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} +N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs +neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate +rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse +scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg +lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx +ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N +/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ +pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave +restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B +/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 +setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY +moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix +matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc +savematrix setmatrix}N end + +%%EndProcSet +%%BeginFont: CMTI9 +%!PS-AdobeFont-1.1: CMTI9 1.0 +%%CreationDate: 1991 Aug 18 21:08:07 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMTI9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-35 -250 1148 750}readonly def +/UniqueID 5000827 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496 +4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D +DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A +F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458 +8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6 +03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9 +211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3 +E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B +D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1 +6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9 +0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC +1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2 +298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D +C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574 +4266FD34C25C8025FD7DD45F44301DCF03F51335198F9EE71CBD72BB906F445D +EE6AFBA2FA06A0A045D56CDE98A6F0DE807D81F26D017B74D1C7A5AE254B7705 +7D96CFB3C342DD38DB5730ED913639C2BF3CEBFA6F3D493DCE5F8218F8BD8035 +9E6CDFB95628F7198CFA2EBDE1905F051BFC4F835C5A787E3B43EAD947EC893D +9D1B04A9A7EE7CF3E02A58BB0867AA7C77F30CFEBCB4B3E6EC68F6B234FB6B26 +7A9D88A3CBF7A2992911727C7CCA3FAF58CE22B8415AB1CC18E36AF58C244DC6 +919CBF1D30FE86392DEFB8090198AF2FD9A6D09CB3EB44F63E0FFC788865E3C4 +2C17538C6E3EAF2E64BFAB4F43F854D36A1C1C4244A7AEB3BCFA0D47454EE5BB +D8728299B08541A91434397FB9C7F38560279992CB4735C8EA89FF668535E018 +97236DDB1E66877886364DE65B594E2AA980D150F95B83A22014AEC85DC7C115 +629ACC128F0D5206DE41356DA0E6A427A14DD1885417D807433BB60CE4AB2C38 +A3B9D83FED4CCF33CC3F6122E91148B3C5753DF5C5E250CA1A3B06C2227C84AC +DFC7F75A81E52312963909C9014BFA81BC243F80280BA2284CD5C4960C65E22E +996D004E4001CD5CD47DD6FEE8D3C7724B9BA322D2BCF4041D3A3615FDDFE98F +EA64DCB0F364EC526A8F684B49F8FE70CCF213451243C88415BE5726AEC092F0 +B15E451B962BF8E6554657B8B4A5827F935C6C904B1BA87C6CD0077C3BA38BD2 +C9683E2014833EC1E44B17088190D0601F58E9FE1AE55F26BD726194146F821C +0736FAC661BE135F6EB80AC4F26EED161B984E1A9F63B1FF84B916B5AD274CEB +54A354CC055FE535A686A8D7F9D8E8B79C6EA92E624CFEDB5660EE4598433A21 +80C619666A2FF206E56138C5B50D1702E30AECF527B32FB02932597C7A4A1D7C +0973FBAC52758041D3A0DD321F82A110EE7C5437139840FADA313267F223BFB7 +1CE6334C0265B87C6ABEBFC3E99E49654A5D759AB87C740ACBAF704338A38559 +6C71FE0DDF9558FA25EF49626CDDAE60EB5B06C9449F3E99E676DC60CB122A87 +484B82C1777ED6F2E4E81E1540F8E054F9ED998142B08F0DCFBF19D40DF8073F +525CC4A13633B4330BE85D475DB607B51D1A411E1EEAC6A357C1B1504C6CC96B +8412F6D1ED6D34FC652259E639646B7C8E00E84BD0947D974F3E9119E1A688D1 +6B6C86F4A72F94B02BE58740B578F3C5F85FC7C79B980A0C33DF5EE57C70642B +4DD704359CCB8CAC26800AFC870CE776FF20C06E15C54DEDE696F2ABEF45CAAE +71A7A3F6293EFA5710382CDD6105938212DCD1CB7AA32A2FF8868E74EEB71D0A +0D98F5F64F34C6491E0874D7D1F2B42946CC33ABB8817A9D3F097EF8FD1619E6 +5C761355B65ABB32D62A2D202C715A44BE3A70BDBF061C34A9919AD7620DD909 +BD87E5596EE0EFA36F9B6590CFD393CC302A367E4F8D87D7BBF1A490778E4A5C +9670D52AE00ED5A64D0183C9DB2F9B0A501F11536641B5B9E510DA713DC37822 +37BA5A3C012F1AA9299E685526040B3513A848A93F88BBD99A4B61C0C25A95F4 +6EE37352C8EF98858896C25172B4BE4399A3AFE5F13A34E758F3108097D2859E +1F56EFD515985C2C69EE658CE0916F152E7837BC3844E8FFE8DE860744DF6CD3 +7289E7EB15087DFC58064B014779C58A3F7DFA0F9C8E6EAA7519D6C0F67C56D5 +A5A1D7BF785AE79547ED658A97E15B090EFF213E81F21F46B13BF2C33DADF7B4 +91467A3E8532AA75BD182034664DF4B6387015F5ED0ED78C4A8AB3DA6A962F4B +E7FFA763BD400086275856FA2A043BF7B445F86AC50316F5BFA185DF591E62EA +6FFF46169879C51AA4CDB182035C065B49D9DF4DF9E98F373C184D9A912044D4 +80D069815F90D0496096799DFF55B59C594DCD376F0787991976ECF4BEE62ADC +33AE747D4B783012E8B04324E97F4088A5470805AE5A2B2DF96019C4630E8E58 +F9489964588DD9E6852D7A6E4BB4FF1A0A8A04896542FDE5984CE71028ACDF91 +9E11196C21010C80983E0973B5CE6C680B0F17C50BDED2840565E1C24AC88B3B +E9E32F12AAFE2C456408E0F8867690D1882688C886D45D8BFA646C48EA7BD5B0 +16E77C7318D8A19AAAE15E9B66AC4DA366F068618F54900956E8632A268515D4 +3167BE687283300BE63F27E23BAA59E5403E4C5EB5D310F0377D590BD0531C14 +3FA6CE8BF2E7F5B7EC06E52C657EBFC89F6D6DC559A721AE2D9E5890A5B7A9B7 +936973CD42FCB72E160416FCF3902EAE90DA05E907CCEC36620D1612DD91744A +CC3129A087BB4BBE809375ED33B0BB7D5FDB24DC20FAD79BE36C2CA46D341798 +F63588A6A0D5AF09C7FDC254A178578B8B12B8F114C5832724CF90431B615C20 +695A70BDEB475CCF7BF84FA0F2238FDF7EF39434BAA390C330A8397518B9A4FB +99870DEE82314AED358530E6425B4FD0877411D0105A2C9DB467D953D09FC81B +70C88E7DDDBDE20FF5D63475E452F94785986ABD72D27FA140A85F112DF2F668 +4EDE46B2CF92782B92E87885AE2F4858612D61CDFFFFA9770538782405372993 +2A7332D05DC16910C05499043D11E9D40A564DA04237A64BA42A117BE7B1C34B +D3E73D4F2820625A0B63C9598D4CB48270F10F1060AA7839C5F052206F0AFFA6 +E716B359CF7797A52199D71D1A1CFB01944EFCBCB0EDC2440BF4F6F4E72C2C35 +A2877A335D8123B6492C3C5CA7F0BF77C3261CD35E277BC5F63BF56EE522085E +7B9E6634BE2D9F2B5B4364A5AFE315AE362BFA7AE7BC4E06E6FD310408096E27 +259930456FD8CF122A44D2629B63F1FDB37ACF5550E070E150F89755A5902498 +1E11E5FC336D729EDD17C961981C4BA1568A09B89681A5CD9DCDBB2422E2C043 +C487A50D6C5103953FB469820187CD66E44BDA480C22B8568B0D3AF2CA51DC15 +39416DFFAAEBA324898D8610385CF88EC2405FC31DFE91D297D3324B55D2E629 +0593679FD696BF09DA5AF139275A01C6D398569ED7D65408A2000591AF39B565 +601EA37E1C4112FE1B1F9085751154A06F5154F86730999372CF866B655D1E35 +B143938170C17990F9495964F2DC4B09CA0F71F9521CDBE73FD2E3D8DA42ADFA +509FCE4BDEC8FA6906359C20D1D32DCD231E19531E19A00C74E9A930C5331AEE +6067AE314E6BD7015ACD432604F7D0D633C953A168FC26707BF11AFE3DCE3CE4 +2ADB46DDB1E3F8755F05E96E4CAD0F48BB044FAED17F18E600A298F788D70835 +7E9AB83850C9A7BFA02BB6A07EFB10C14407D8AB559A09542D2F7831212E7EE1 +8C2A6EE894BB95900A498D2752897022182633C447D29E4CCA623F8016D5F5BE +87D3C8C198E4049FA65C3642A575D4CCA8AA0F58D8A3306C56BD44CB80AD2E68 +D58765B75FC07EAD4697264D44A00687011DC045D86D38F4AB470CA3A4A8049D +F3FD2EE79992A4764AF2CF873A1ABC8C3FCB6D8E7B137DEB0F6E856CA42688AE +8061631B9BA9AA9B87ADA522DA0E35B83FC0977EDD8F17C0BC15AB1292C2CD27 +B1D30252E662CCB82EE240D5DBCC738DD2F9D8B741D35A6ADB08B8E63684E7A8 +BA1886D8C457D8EA031B3F36B2986AB3B12291519ED42B7BF33DD135BE5383AF +0BF37979158307494101C4D073F9C75D45BA2F45FD407CC7FC84C995E158F1ED +B47DCFD478B343618975466511548153A358B7AA04AE814A196DDD22A68766C1 +640C22E53671F2BA7C464046A41DFD73CD499F29D0A9903DE69618C0889CD92B +58ED3E875C8232D5C268B47D8A159A4D9C36615F905206472715B7A749F32ECC +C6A8B0035355F02D41CFB081F1FB0B3879C4AC62B13A1AF69ED747DFEC8DF995 +1ABF074464F258556D71E057B4F28534601EBFED899CB7CE198A2CE70E329B51 +B8F4B48A706E1D31C306DB01A8DC899A7DDA46AD3B521E2321297587B5AF52C0 +54CCB128A005D55C920B1FEC88C480DE717A372EF9FC653C77F637511ABE7F7A +A7A0550B5E5FA423E0BFB07F7A8CA2447FD183BAABA4250ECC80CF717C3FE877 +D8887F195E0F323677640DA0D1B94C10A1942EA3BE2EFE17B12AC4336CE5562A +B8FCC91D181D4669CE63BCB67F090825685C99D298C546873229AFE047D72627 +A90AC47BDC1243CD072CEE8ADEFA0ABEF79554D3468BC6BF536C89BC380FF6D0 +4DBE812BCFA7731D344511BF920C4F4227F640DEC098FED393351959B82B7AA4 +6FE2D05CE5A01022E53BEBE01070D66F6EA7D6103EFC1CCC3F371E7E4798CA7D +2469DFB5109B15BBF577F53F9753FFAC44A98D2DD196D40A3A19054D6E4410E7 +C340515C2F6F64AEC3CBF80C2D9B81C1920D1061A13D4292ECAFFEB3BF980B53 +3BE1BD78F69F277C9F4BBF4E471E740240DB18C98BED973A064095BB0DBFE49E +E4889BE98F7C09F4021A06756EA453C8C55B5B2B27EE64441030019A15E953D2 +EF772765313BD75548142F538EB03A72847B30F12E40A4D7DA343FCD027AF899 +6B210503CC1B0BC9DF0EC64154296C8D291FE2583080744C7D483C3EB7EE5762 +9A73F99213021A648213C54A9BF5EDF9F473D635C9E7ED8C3400ED20D9C4F6C7 +7AB72ADA535CDBA8B0981C9D4C2B61D55A6590100F7C9A5D7EE642815FD4B8AA +4FFBAB11392D70CC2FD4F0465BC6A9F90C250D5F25BA2369AEACD727865F2BF0 +DEE2F9284509000FE8D9D22219D638BC4D1B277105CF6C2B37C381597FF69162 +26DB880B3CD6DCD1D560AD52DF7F3A7ACBDD5BCFFE6D0A9CB8008A72B5F0419A +4ED2415D436F3A317072E36953170C2D91BCB53E4C7C734C17F37021245B8E9B +453F7CCE86107E4ECBF687B5C2C2A10E68885D992599119E50D05EA37698BFFE +1BBDD0479BEA7002EE41FD92992F5C0933AA4242076236A21D92295E8FF636C1 +52F4D829675411D71F82EFB625F6A8A812B5D57D0A51370BBF586E694CB412D5 +2BCFA7F6E12FBAEEE507F8122AADF8A6157AB5D5BE2AD187F0A480F12D92037C +B6DEFBEC68291D84E02B72C2C98AF0A6EB65F5D1FF6F7E6CA33477241125C2B8 +87124A3DB54536EBDF628B751C4474F72FB30E52C2FB061FF9FA49E1DE68D264 +90F0D2AA4BAD8199A702401750B384948705C7F19E8902C6CA1E98E6D7E8AA17 +828FD54ABC0CA1CAA86FE2D56D952A742D89585958E954C631D4A1A4157A9DE6 +89B452CD4739E5D25923028958232E689C286E9BD82BABAEA01464D37F86D6BF +01993AB9DC6A5D94DDB0FAFF83038DD8C28F408C70D3D13DA8473C81314BB0D3 +643033FE7A107635601AB4FDF623491CABAB2BB63C4AB52B54AF849CA52E3F7C +2DC86304E9AAC823320951D084B4C724E49A9444B3DC90428EDE3BCBB8594F9A +5ACFBD97356C96C509C6F8F65C853CC8DF1B9D8B1F934DBABBA4E7431C38C853 +66A3B754F7C24B37E2F5892CCF335EA1A6056005C3AE0C889E867A0DB9FC130A +FA99617AAB0C5FFCE9B3888201C5CF665712E4232AD1B23A3724B25A4643F6EE +87AEA1A408D084B6C642989A4CE37329DB67CC0B0C9B7D5C5505B837E1EAEA19 +8F9386C34CC7DA69EDD1DA81A61CF8DD55AE65C72FED0C937F0E91998F860429 +DCA1335598EE07E926347AFD8FE701C331780901AE73AE9F3B53F6C9FE26519E +B5B3750E293A92DE03658315AB60D91E53DF40E5AB7CB96C57E6CD0A29F5D039 +EE88010206977FF26EF6D3E4D2784E1869608904B411D2704A42E58DEBB13C15 +B5EC1BC78E1CC89633969FC89F9E9F7FEE05971089E466C51BE8F978D5E8ACBB +EE98555EBC9E1065B18A764394F2E7C6A6B883E43B005293FE878A1C21FDE04B +B5CAAD894D429E1899F805A8115498153812F4065CD4285D0E3C015A24E088EB +EA9827365E6720709BEEC612A6A256B4AB26046726023090F9FFC287A5633028 +A193F92632B6B7E971CEB38864830F11B044C2A51ABDDD25E31B4AA8DAAE1D94 +E9D5B79BCFE5FE617A8774FBFF15A3118711D744869CB575C98DF73C5628DC9B +F4C72877483735930A103C58F3592DBF526135EB927E0C0B71846AB4BCE3014E +090B81D3D3ADD395134A55954139E51C39B167641F0FA3675798F4E340553A74 +E08321BD6A783248EC8770AF75BA7971B8F831CE56320BB8105ABBF535D663CC +409D8D66FB0D5843E4006E222442B18B7B2153298A9F80CB97A8FD0F924AA363 +B4DF9A0538DD628A5FC9D9974EAABD1E9BE974C09B008D54BFE0F6E023C58977 +3F96B508FD104BF2055677CEB939782F7911DE3D2C07C137DC07EC2C358FBC37 +159964F91D35B5F8FEF768F40225B803767E9841760678F57CE9FC89E1FFCC3A +4F1F42060843B2E9FA65FABD577BFAED183667727F247AAE9D461432712307B7 +0BB13E46C497BFEB5D4D24AA2580448FF42F7125E06E8C10E390D9E7313CE319 +B0F873A68033DEA81684BD5DEEBC48E7731068B4C59FB5FE020DFB232F425D6A +E0E8BB6DF1056A603E37934E425A9C340733EF5AC8FC57C3E5E90DD567839471 +9869044CA4E7DC277A55DCD8C7EA871C555951A3B61FDDD5E7B1C59A0B1A199A +AA1D7F98721534FE26D90DE5D00F74C5EF107FD2EFE291503932C4FC65CB7B83 +2EAA2FFEB4AC08C46BC10123FDC88F3EDD1C8BC31B7406115C7E806EFE7E1F61 +001E60C6025DAA8E248290FA4D96B33FC12353B630646D677BC579DC54BC4A65 +1C6BE9694C30D3679887E0D5C4800FE2C1B90D40B20AF0879E11610B56D26C6A +4AFCDC5A175CC53C5C4E5A8FF51F8D3ECA0DCB0E049D44A3065E122E7D3371DD +8F2C8AE28369D0E7BCE916870D9FDD8A72F06A91C783B6A2161FEB04C4221796 +3A1384ACA274AB0BEB24EB4EED3E5AFC3DC86BE6AD4AC60653BF5FAF4B0A575B +140A3406695520E56FA4C2BFD6CEC7A2BDDB92F8E0BD3156036F917C4DECABD1 +E61CE3E529894997A52D4DC9E02CED5A53F9D953A47B83718158F314A17C8905 +A8210741B45AF51648947466C1CF8852F2489D960885A800948BD3789DD59DBE +946F8AC3A70AC8AF92E40FE4B95CEBE749F1D01BF72008FD74C2ACA8E2EB8362 +4EA7647A61C02F6EC7EFA9116D9A370DC663BC72226E031D1DBBA4E2A16296F8 +C4E0CA09072A6B86885D06750509126B540840E2DB1613FFC94A33BDFBF96215 +56EFC948975E82B19577F796BECED8BD7F856EEAEFC6D7F2BB5506963801C064 +5D95D26D31CAC82A704936A46D3644FFEB731B1C89674920888C4E6C21BC249F +08CAC84D2C828632F2A32586167AF2D235BDF41B0BC4FE1541B7FAF793B4BB1D +673E6AA735C0AD02C77EBDA2D48462A3539E6B6CC7136D3983123AB0FFD6F245 +BCCF19F1A37C9753AAD93033AAA722EABADA04FD8908C0CC439E434D335EDA23 +359DD9A8386088632DE391418A6821BC6E4513D10503BAAE8543B054A8552852 +AF1281AF701967AD01463AA1D2AC5B9026C7C54A77825FE92260C6B50C874D6B +F80F2345F95D6744C36E7EDBE79F7D80AC975F0820038DB69947327CC2CA1C72 +609A476553D7063BF67B9C733C025B572369605B9FC14EA25EA98F9F206E90A0 +97CE741B8D2A8ADFC68E2623668439990378689715A85606286095C90C98E337 +E218238590E26FE4AC2ECD7D65EB3B4E9A11A1A437E597D2F3C7B15D92F560B7 +964FBA80373D185DA250A0CC2B48AB4404B458A484FCB960E68E54780052A17B +2B6F7BC4A76FFD0F17EA7F91356125C60A5324BEBB5E8E2C2E87D18A0FF5AA79 +0E7D2EA138824EF6383F8A637BCE5F41E5F42064F0C04A6F23DC5DAB94CCB6DF +D1316F075FC67441B0D00794D9FEC668130E2E4504E6E018B8FC05C5CDFCEDF6 +83E50FF8334F38896455D3C8AEB09583F3A40A4422D02A76C91E53A53E351A51 +DFA8BCCF5D712D1E2ED20531E5C4A3C6CEAA6267FC20E24681F33AE7184FC9A4 +21FB7E2069FE79D37CA40A344F88282805B9456FA329A58EDDD2C1BD0B1A8D51 +3BEFE0488063057FDE6ADD8EC86C37422425349BE218F26C39019398E72B6074 +134DA59F37BC293D35AA8C57658AE747FA765301BAB640A73451FFF96A8975FC +F0BCC31A5026C7E1E56D9C313D9E80C24C5D503DF3ED44952D38F4D2184EB079 +6E8654A0E98525D70140A5B607CAE5C54A3E3DFFA594686202D14236A5AE7232 +49BB50214243C1A20822FB7C567C663304E33F7FA344C6A52460DEF1D9EFE581 +0C671B0C7380AA1863557AF29872A2C9579175EC33BD39EC04D93533DB577CBE +50E338F3A6933AD40DA0E84A7840335B931BCD6F54157743C48CD4CD0D568BB2 +CB70B168198C3B1A2D742A37DAD1063682C5DC7C9B30E8D4625EAD1BEE938BE5 +CB34CD787E365ED88D9B3864B43B7A8B3FA873CF7C1B889DA6F7B870C551908C +DCD98A1805F14995A2CF9413C42B48E49EBD26217C3F300FD279460267C96C5F +85F085C52BF7E8F75C240BB14B012A0E3AD81AF500AAAE22691DD2E294CF7EF6 +82F985949BC557F17815341DEF046E0AC7CDCA817A4C109C82CC81DF0A8E501F +B19ED88D8E468A11DB3B78C673644CBDCFE2ABA18422475169E5E574D8A275FF +CD49CE39B29080A7A4903B1B88C0169EFB1790DDA75877D91FAF70BA50BFFD1A +20692CD75BC8BECEBA0612C3FC71566038D505369CB0F51F62B98350FFA8BBFD +1AE2C4A500C91EE5B7536388E529EE9AB4FC6418D37F8322E577A6501B7AFBA0 +923F3C58581DBE12FBF6B0AEE248501F38EF37A96C1E3334FBC60107FAE832E6 +F4BAD26E7AA39E032A302CCF1A87D3E3C6208CCD182A35E5C194929F5837F2DA +F722C9CCFE6B54A6805B5FEA20123BFD69A9406EB5A036391CDBC93A20B0D6B3 +D48D732C817DC468A2AE5F093B3DCD2828FFC9DE8E9466C4F2E8A5DC2BDB8A5F +F86686A7EF9CA4537E4B3D24E35D773B06B79F32C31C446BCACCD11FA3BAFA0D +C7A47C73390C098F4D2E168E122094EDF6299A2A8D1CFB1FC733F1541918D329 +02BFE2233BA898BC2E8F0E342866C08E7D48C4E393CC01A8F498D76010A7C4A7 +7AED770609432BB5B64C66CFAE1AFDFB1EA04349D3AE4A410B3A1025BAC377EF +5193451877876166AEE7315D5A9C0B9AA9AFE4DFC6B471656C39614B955C4717 +866EC07D16E387976B11B0F3043E6A2FEF66316E0FB428CBA5748607E867AE8B +19AD0832106F4A810D99DE3E0D19F678041FDF0719A99558D222EC3042CFE87C +EEAA828430FC4866A9B3550CDA1E6DD62471BC5E148065167ED7E3E081436416 +229656801B5A5431136F963772DB3D3FAAC65DD14B87F83D73220B2F705BDB0D +3DEA16ECDF4F9D0AC4A636C5F79F24E9186FEF2FA5F5E40246FEA2D2BC08DAFC +391003233C89C325A61EA0BD2F10F5C0897BC3A792FDB7C1C002A56C77D1EA2C +D7E2D3E545C8CA4D6A40F960874C233C44C589A3A3FEDF600927993FD12C01DF +BDC8225BF134C451849A437972FDA64249F488D239EE119E4D0C8440A03BED29 +42CE9250B1308313CEB944E65BF502FAA726CB256D452F2E70C5C69E553DBD34 +BA267D1F0A2C1A6A373F3BC047265C7454557AC9FD6FFA67F9FA95FEC1A8F19B +A5157C9067876212A77766D085F46CB145428F8AFA59CB503C8440A70AE46E0A +FA1AB94666CF3F564ECC261F3ADFDB68D3FBC81F68EA4AF6C433B64C93C51FE5 +1F7F7F768BB127F5DE5FC4E366DB1BE11CDF3A23E85D41BB7BFC9C2422CAE91B +921F9DCE34FA8CA5A384BD6BA0C5875313C5086F56B2EF1434926DD32A0CBAC6 +C6A16841F2376E508AD2A78AE0A1610C6E8DDDA361134B7408DE69006A0746A7 +E29093D183D1BF5133E64C936C5332C23AECA55E68D9CD2B297054342636FE6D +133675E36A0461B5DE9BB3E38CA4630ACF1A523A66A4083D1829468DACCDE523 +32EC01C4271E578037E0FCE03D6CC81EA1BA1FA6F7530E8C86F9E3A3B16935A6 +B335A1A84DB1EDEFD240E9E2612F92FEC7B5EFFF5BCE948592CA3A92427405BC +DC8124FB3E4652E175526A702D1DACFADF4AA4D6C955A4622993302386B0F013 +18937559A5D46A8EB69D1AD0E67CB37E07458EAC8E0264081EC9BD88034D4490 +8FACFCF8AD718E44A4978248A2358EF2D314410B082A51D810CF75D9524BC0C3 +535E83720C1C1C917352429ED012E54306FFC8B18E0B111441F3820A85704EDC +7236E6988548A7D3E519901267271E22629ED13AA808317A8D5AD76301061B46 +6F6916EEA211766BCF623EF3F9B954A93ED913C59EBD6B296757642EF14AA1D1 +2FE5F1EC093BEE4DF8F39BFEC44CF3F93E999AFDEF9EB4D833EB4B7C6BD72F85 +B12FDF12B4BC712B743488DED164DA77ADD9E141061E2CB4BCD04379BEC2A168 +BB5D9A7538CDBB4E93A66D0EC4CE19C5CA5AF495B2927083B88C5C4EACC310A6 +3DA837FE9CAEF8287A6C699136F6AEBC21D0E24101B8F03188E308004320990C +ACF225BCA45EDC764EC456377BEFD5707DA30047821A9E85222947595F31338E +0C4109721951CCE8CF3D69B493814EF1835B235F305FFB1C381E4D48A4B62EE1 +5819F320373C509744C0F0C80A7C3FE248333668BA49998FFF690B60CB8263E0 +D29B35DE57433746CFF1419A1D433068DEC12F8944713F9C41388C9DF4FA6EA7 +305A78254A1E9929614A9D005F14EB017A43BF85C8A0D4B45332BEF0C952CBB5 +F243A2FB06C0269F12AA673E4D6AC0286D149DD592B953F42B82333580D5AE74 +EB77939E2E621D842BC200D564F8ED9C08781469BB33C6B92BA28B9B4BDC19C4 +DBDB68DD5F33050424F767773FB8E0765FDCB39203B7DF875A843F9A1497FD9A +041FB08A677F76422B1C45C2DAF5AB07315BF3465847610136DE36C5E6312509 +DD497813BFB58FE95F9BF0135387BFEC0D4AF7A86475E670CF33F87AFDE61BDA +19F7737E82433D3AA22D2A90767B17D79F7DCD0555181C82FC8F45872A165A41 +8370039AB2CEAE46F80F5C36239ED2512199AC612F16BDE22BCF383561D0C2C8 +266DE5F8EA100C6B4583BD88607910D175FC0EAF01E8DB8EA6C2F09865519276 +78F857B3771B96C1280FF69D20519542A1AFC6BEFBFC438971E9851B265B7A57 +5E7F4A5315554C24F7A761C4C93C068D652A11C143EC67BC55EB4AF3FB0B0FAD +735ED54D721CEADA654D65D45A4407D6D8653DF27ABD9FA8EB3B18FE539553EC +C1139AFA9FA57D82776C6AD8F58F5927200FB1629765668024C2268D4719524D +F029F36C1F3BFB6DBBBA871854BDA3D9AF0A2198DF4E552A820C5A246B7C9706 +03993E5CA71A894F84DFC687532EC02F4BD9E94C0917927521768F8E8C2C8E22 +73A84F5E1EBB42C51A28BC0E1D093F765FB8C7F40E229264FE1D25E12C93F51C +24BF872FE994C4A0486306C20CA2EB9DA8CD61BEA019855C7F028E14D5191F24 +B09D799C049D7A30E3A99C32DD93174A9E98DA08716372596ECE1E33608024BF +6C4EFDE0CEC9C0BB632D0CC64EF18543F4E97F4FE1EB3DF7D60C8169B9CCBBBF +74678AEED67E53B921790C9756F08D52E0E29A50BCFD3A5E9335096723ADCECE +B0E57176D02B8E085EC89CB589CAA8D082E4051D1A4B32C6DB0C8FF1FD195886 +F5AADFDB7D067BD999C3C8FFA5F982E166042D6DFC90C0FBE45B3184B4398929 +D3B6083EF9EDCD9B8E36E830FE608D97325B9B37CAB848409FD1359458F43784 +D1E584D1265994D1E4D44E8FA8EFFA8E6681996D87CD75040FA9531828D5EEEF +39763D1687DDCA41D9AB4F1B8B79D929B82B389046A2D114F60D3E96A7E78A87 +556108B7E6A2A828D40F6BF88E3991C1255139B796BAA15F1496710E8995B41C +79679B308685C35389B436AC154518CD95C0DA922B71E29A448042E582F86C1A +E81EF68322CFDDF7202F5FD856159DF2A285CE6466C740625BF9A47DEA1F018D +EBDE2923550DEE0207F1880465E72000F391968F9FD97FC222A1F1FEE7090AC7 +BC6EE7EAD1A8A8AAB7F6C61AAC38E40C766F883DE3DA09D0D9D3CB55CF81A5C5 +15FB317AE6C574D56480ABAB29037F8D86C91DE45794A42535F575CD74CBF264 +265A6710795DBFF60A15E9B3F3ED7B5468462BF4B0CBDBF52BF8B8274D239C2C +E99EA3E38E03C804277B5E94A54CAE43B15E9EAD3815E08A48F9E377CAAD9148 +D9C3C281E920DBC1CD4D870E74494992857909AFCEBBCC78FF9461F364DB1BBA +9DF6976F91BF88313451212E904319EB35C75A5A8D5C8A091AFF41942DD44655 +8B5532727516FC57B78EA5CB254593464AEBB02D68BE2193BA93ECE9B24E8BAA +5B6114D30A450F1CDE69793B9120228E6DEB24B74E84DCC76DE64377B2E0EE36 +4781D9F1E1BE324BA87A3B7460B026B7207A2B04CE39D788197FAC87DEA33F57 +3CBAEB2EA1CA6255B78EA54DAFACC48546354CE4E41B6FAD29973496148BFA1E +23113B3B90EED5429E53835FFF0C02EDF26F5347014D5E580190273620231360 +2EC0AE9155BCC8DC97E68E1DC7988D06CDC85C03221A66FE8C4DE943CA31C5BB +97A0CCB49D3FEC98BEF7ECC358A1F92B79A8BF29383382B8AD07F2641A3459B7 +D4CDDF153EA877EEC1F6D3DE914C9E832E27380742774E3207B7C2C7890DBD7B +560F5C52E7E8D830C7800AA43F4B1BBA5C9A24D5E094CF8BBA01168F19ED28D4 +7835431F71FE315FF8625096961E3B99A8AC9C5956833AB8C6E7B2344305D98A +12289DFE3CB87FB0E34AE19090058006481F53DF2EB45297D9D790E5DDAA2363 +71E93CE60A0187D4229924329D001794DDB698A6128EE8A394535CAC9F3A902E +7477384A550C5A9500A291AC0D44C2809311C3CD91A743ACB89900E8B134F8AC +BB7F2AF4760D379055ED18C257D3621153D77962E6A8A68C08A0F3FDA1FAD441 +6D6279284C7DC6D062827DDE58A322FA10E60FDDE2E72E461047300A17B71B2C +6A70FF5A750B2D66E680C3102C0E956A31FF4E873F67A8419290192A88BE75DF +827A67E0D6CA9C024EA5E0FAF61466748CF190811AC329CCB9ECD496BA95ACA1 +77869C7F0358039DCE0237B2FF8BF5E4DA24A734B8E5B95E6FCA5E67508CFF86 +29478D58CBE297B1BB6ACCCF2B697D58F78EBA7A1067B9236AB8FD516487C25D +5394EE58B933AE6639CA04C94112E6F891635391DDE83CE22BD02F28EC4DED11 +F594E94B7BC4C57A22E2D616A7434342BDB83CE5EA4CCDEDE0FEA01BA640C5F8 +0B40D67A5D413B4D6FA74EE5136C9B7EBCF95F3F4E6A061BB75C2B3B7BD78337 +5BFEC11CF6E5EB79EB30F7A4BEE88FA5EC858A28C65BF5A14155FA4D15763B36 +B911FBD33C1C35F9B4EC14F774591EF4A8C03F60E530786D245DEBB6C90BD7BF +4BA6D364B7FBC4E6A351DBD555B204136C87DA44AA6B585F3B91072147538C37 +C7AF64A3418D61803A994F89ACE132AD4AB1CE1A7235665050260B9EB689B2A3 +65C34F0AC6E144DE0600172EFBE79B5E62F444B54CB456E86A160940DA578FA1 +1960176C16E2CBC1DEAC8D65E488E9597E0A6BC71F6D328B0C431E52E48200B8 +DE8ECFCC15993E459B9797779B98673BC7B5BDA1C78781BEBFB6ACCEAA9DEF67 +CA973CADD5D63DB8FC3F7E9E6F92E10C957F4AFB015F7923C777B21B94191413 +A2ED8D01E9C84368150D21A2093021D53E83F5AE1E07D49C2D4CF556CB6D5E4C +FE6D4CAE2F50A6E0931F402C647040E1DF3AEC1D91D9471E0E3B227F682036B6 +7B5F8719CF0B383B45F19BC24FE33F60D93A544F391A861FC02F01D95C24B4DC +8A8D1A7018A4063C996F1A64AA073C893F2F304C12314EF95DBE8F045C88B690 +FF286A177D22297F6D436690E4348ED8C129C36411DD6ADB81CD2131E9252C3A +5CEE756AD095339DB020E4F69FA65C2FF1CB26B3BFF8AC3F0494E57D919D2969 +6B6BB197C74CBB466E3A7A377AFBE37DF54EF03EAE840C01248C72736EAA809B +AA000B0B905701F5D0CA92F1EF69C07FAE91F981900AB16F64E1833650580460 +5367EC930C0BEA90F2F90D6CC20E1DE52776A24FB203EBB78AED63FD105875C9 +521B35A4D1EBC591E2129DA5D37FA36CC3A4FBF9C719F790D690353C4290CC92 +448FD0BE083B9475177499341D7FDE5E7E9B9E6957539AAD4AB3A47E9BDB2EB7 +7F6271537D8BEDCE20EA5B998B71B3468A11F9A80F0B735BA456020077DA04E6 +10F8EC9434A772E7C2DC73C5CEB422CD58E4FD88D8167920ACAF93A1BB67E957 +558CF70B29BFF01F5BEA677C93A664A6CD72B553D4B6F0B1E22981EA9AA9FA32 +6E031DE7ECDFAAF0D5546326DAA50DC1F1CB3920DE3B309013A508F0BEB91DB7 +CC6513198443419E8F01FAC3C3818AF9C3595443A6CD2250857C5904E88F842D +C04F77DA9EE1908B15E1AE30220FD840270D8168F2588164C186A72284172BCD +77D76A413875F070C062B8150BC405C507DE0F691D13E483AC2063E2E596B46A +4BCB0F57AA892E7561EC2B7C6359A1732ADF9E7815FBBDC2C1DDE15BAA28F401 +9B14E98639CD9ABA350467D219902A549A84C26FC6B75092179AD22229F36020 +B1AAB7C870643D2537D72D3368C2533542DCA53F9AA5BC8EDCA0C01BC82C4896 +3C4B554E3F591A8310E6320220130115F292B70676C9CF67A28D7D3EA4A43116 +2B43C14C5922AC910D9D137DA5DB99BB7767EA3C92DD0B13C2BF46D403478F9F +40BEEE284AD7C303170833A48FD18FAF0D266E072AD80508DEE8F565C39B4F97 +D3CEF046FB9003ED7DF8C5E2D087296CE6B1326A10821CEE7ACAA22BE4012196 +E42321BCAE6CBB86878B9997AC715C96FAC75B7D4EA7009EAE101A05B7A39E9C +0DBDB48525C9DD7346E574F09576492D3DB1A9BE2ABE94E99B33C674C1A119A5 +B6C113E982CDB45DA3C7D349E59C099491A77D506AB28B14BFCDB8F5EFA0AF1E +B8B1EBC5BB92C27A331CD414826CEB91E1515B27B0DFD46282901A676EFC91B2 +FFD85F3BBCF5424BF28E0E6864AA9919 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.1: CMTT10 1.00B +%%CreationDate: 1992 Apr 26 10:42:42 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-4 -235 731 800}readonly def +/UniqueID 5000832 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 +38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF +D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 +EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 +A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 +F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 +4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA +6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E +A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B +E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F +1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 +452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF +8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 +5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA +DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 +BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 +741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 +E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 +E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 +D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE +C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DC +FF798F2ABFC4F3539392985C4CB324B0007229586D1E0321559F67C057FD7902 +194490A4C133DA790FF3BF23A13C2B1B69EEB75950F9106F2BA1E3CA65C90FF5 +931DADF03DA48AFB8561FC2E710087251BFC42B80B297A3DB0DA138A7622A931 +DA293B0C740987ACE9F2A8EC2DB98F85783C01623FD3612C7E4A84FD93446770 +C3DD7431F955A5F3734F6931BD790F0A45B8D17CB74BDAA4BFF6DAB5380CBF61 +72F37CB67A909E2842E0AC5D9D07D01A4BABBDE2AC70FE5753460D7E1A708B7D +0EFB2B5FF55F9E4571C466AF1F91E545585845B09D855C3A01F713C1BF081EB2 +7E2A0E5980B63AC736D73305BE7C76A6D637A543047CB1FEA0D5EA576DC9E9AB +838AFEECEED5B387AD84597B8F1B645C5CFE109AC7A355699319C74C3F859B9D +48E5EA693BC7EFAC5BEB1B6698741148B6DA46240B5C72EE4A00BE80A631FEBE +8FFA5A9BB55B46CB602E0B0062B6B6B0B09378100F6F37AFB159DC12654EF3FA +2D2446A2E1FA7E54D5E2E6CF1037F536EA71D20090E5442E93BE52E14C9EAEE7 +AA8CFE7898B336B201E774592CC4038AFE9CA1B6E1AF4FC42E722573B1CD6230 +6165C05E58057567BC6AF2154FE303195268BE490C9AC4EE2A3B087FE717F12E +0B8A344A6612A504ADF5A4ABFF40C1DDDBFAF9624F3EA0CD030B9556D0CD81AC +DD096252E9B3055B8E9D4D6C22487BACF1FA85AB65FDBC927CEC788CAAD96571 +272E7FCC619B62F343ADEEAFD4CAC2C2878F2BEECAA47CE87D9D4C72AF75C181 +8F6A1EEB1CF455FD9E1D543BF717612F5E0BFFF37B860814F03A858CBDD46BCA +47762C1A267CFB70881408130515A2FF469FADA3632435894604EF91C74E0751 +C852985269CB64CEBD3A82AF5B55C077102EFBE8F2F4FA6EA4BEDF475DF8B7DA +4964DA00D37959BFBB42F91DBFC072A10D254C10D27A6AC5028D66E59BE54C10 +D6402203AD432AE8DA538812D029484B3E657651A6896611A71B3D70820B9D77 +D961D5B5E458E8CDD13D2515D0BB48545D7101881FA8EB59A671F73604B56B9E +4483619D0225FE2FB0207DBD70B182CED1A33B5A6A8DDE2FF56BD497D6AB2767 +A2E4164B94EF19EBE4B205795558D96B6C7D9543AF4F4196E795F879E2C9F1AB +BA7FBEF668CCD05ED502286C77CCFC0E72BAA640C6EFADF5BCDD60963D794778 +2C668D8D273D981F352D7EEAA39D283EBC92E6EF26C7D5EC3C9C7338AD307B4A +73A8FD605AF48E66FE2185EF7FF789474BAB73969099E7A0E23618D9EDBBFB1D +121B58A03C76B9006B9681A1041D54692637DA827C6CD46417D6BEBD91068066 +6464FE5CB3056A5622DFDFED0B627A0FD6E5FF5DDBEBAEBBF3819DF1936390A1 +1B091A46EF914C51CB22C0EDC63F91D701F3EFCE09595A13E19CAE7B05441249 +B5A9320A5FDADDC1B676039C0FE722F86CB07FFFB8A3F5947D613D10044F8A26 +35037EA869423FA3C93D9074958D862A04EAEA4AC8E074094DC99F276803B272 +C208734565064423C89A030B789462B87A4893258F7BC1A1821D206308301835 +75B5F34A9BF3B115CC07A4C11A8DC97B75A7C8D12017EBF4EC2E0C14B01AA2C1 +3122D3FC389CF5CB4A3AEC20820169D33A36DBEB7335EB89963A737EE724085D +EC60F6F1FC4C27592DE09C93B2BACFAAF6ED88BE0F3DF3F7C9259691421E8F8C +6893A53228C5F43EC0C1FA4CFC27F401DB480A9AD5680A9B9D0723753D547102 +8FE445B22346FD199B2ACF11240470BC55E385F2CEAB834D1E4CFF410F6EF698 +BD61D3E8B859BFDF83BE0DE4A9E34810FC668A16608AF72C441B54081C696B25 +FB47B7381767DEF64E938A05F7DEC802E54F4FBB664D0200A70E829D8E54020B +3A6A166A3EFA16B9F75B6760B3B038C2CBE326BFA92D0A440A5B4C33859A418E +AE2C28F86CE586D37A510DB00D9F6B34F1AC1E84047FBC031DB55C1D83A2B14E +E6F9EC275907BDF37DA4FE10C832AA10054CBC0E361AF655D01072CE98531E39 +FC682E6692F9B9BDEBB9D3DF8ABC6F736CEEBC5B605D7AF839F84C62E26BA5EC +16F3755BE630318694757F2603E90420FDC2833DDB77970A68CA4008D65C5AE6 +49C8463B79340679E8D5763A76B08D102E1D2F2D65DCDA4D4B6C79025E0433C6 +FBD79620A7BD67B45FDC3658FEFD5624171253A317FFF5B4C6A881F056BAB784 +A8CCADDA2DDE3E856EBCCE52994A38578931533114F2E73A5D4397B5AF0D9006 +F22E95AD076530BF6F1BC37584B3EDF0218DCF552EA48A5564605F847CDE6555 +1BA5C4D857E437B4B3A9CAC6E40A206B4EA64AE96C803FC3424AA873CBC53129 +E0233BB7F7CECBEF84465FFFFBA0C7C26012198D95455CB0D250C4BFB55FE070 +131794B894EE8C3E7460713BB9DD1122AB2DC11DB395E073D212F3392F0D5F86 +9FAA01DA02651A1FF5CE2EC9FD03C7A5AF58DB34194FD0B11D8A733DBFC25D8E +8C9533FCD66B5C34C68F66821CA57E8B311BFC09C674787E5BA6017B51A68B58 +B1EE871F72DAAD471A29E3BEA3C8E00A6C62BAB5B4A3D1760DE29EC3F4FA6656 +C316680DB82EC6440D64A1375028826D7C469D2FF749622D15FF2D7B412AC115 +67998AF826F70F239F6D2084633A357A5298B0953A9812CFE5DB96FB885E43F0 +D96FFD568D79BCE6D7CD430C92044173D7E9EAD929DBC860912048705BB3D196 +D94B12506B86070FC586681F1934F8E95FF0BDD975205AD1F824FA7368B8743F +DE5958FCF2C078D926446839F35055027271066C49D89ECE5A9C1BF3BE7DBC5A +14FB7AEB42BE571FF41DDE323354001A58BD6392A8C812610CE1602F7A28EBED +178C31C2BBB4185E0A91A6D47C1746E96C7454F13AB5E7C84AB1F1657594EE8F +59CB0E2CC943B794A6AF897B2A39026A1F70AF7769EBB70B4ECD991A053CFB18 +CF9BE99EAA15CCC7F0E3E745574AD1F1BADC199FD814B839DFF3852775E1AF0C +792723AB5E30CE94F238719EB82A596AC2B45819C9B5DCE0E3A15E65925622B4 +7798282B4DE63A27666143FC96222F0B3A81A4841C706F1ED049371069FB70D2 +9E38394D0E536044C3D73C78D8FC0C0DC15BB790E7169D620C949A5A4A33D784 +1F0511BC23129A523C6B6522F4E9C4AB802318FA150B90087DCD7B515DC2791E +684472BC2A3B106E56B5AF96B47DAD225EA9FA3AE70049D0A342CD32744EFBA5 +D68A2DE641556EBCB76631F00990E0E7606CE0D3E59FA79D5854827232EA835E +34ED89C642B449D3E9D3C84E9D73ED3C2ABEFC3AA8DF61A6D2882D6B5B0B6873 +6A5278DC54255CE995E0A6B59CAE17BF099F2605197C5929BF0E5E7A7C17BE56 +9ED4AC830B49C1BCC1C70776DD735703F7267AB67B9B197818D5C9AB9418A3E3 +E7608743D6772B48F465F433BA191B850B6D7CAF6CA04D5CD5C14545232D52D0 +C48A9A1C436528A58E925EDA37E610A2E9D20DFC44F3F74793E76C9D3C24F87E +B0BDF8CD9C7B18FE85F9AE852336B26A4F98A5A37C127EC32CC36172E8DFE871 +D006CFCFEE86B9EE2A5BD64F721DE18E94B2E55E21E6E32F90E2369415BBFBA5 +F18859D4449AF87A8F7ECA45B88CA5554041101ADDFE7037A1DD4DE9E0BAD755 +CB38C3CC1D63368EDFA1F03B27F80482FADDAA9D6325A2F7FC3DDD7F9D748E46 +EB30E2D4E846616B16B3AEB27F899238CF93DFCA244BD9EADA0F5C833582F2C0 +A77D346A2A062D2ECEA939C45F5E6A721411BA94066F24D34D5792B6E86F14F0 +F51E156C70D8ECB8EFD0CACB8DAA7784B94821CFCC2515D6FB408EDB80698F85 +5D3028A6A06A4AEDEBE47DFE21D43C26C93C8CFB3ABD91C6F5C286886E0B4ECE +B606079BB5B4980E60CAA5B46DECA0004CC7B044D8ED1A73D5A66CA67FC2668E +452F4E63088469DF7D7A5FA0ADCC7887BD71D643F6E4ED41E3C7E283362AF622 +096DB300D8EE6B43B5A7690F3BEE30B0C8D178BD99ED61CE61DA463AD08F8817 +37EF2D3913D40F5CF32B0AE17F62FE66EC8D130843C2448FAC16556E2E77DB61 +3ECE99407079823358E6010D89491B242365D3D1B68A837002097EF1B3E4CABA +D6B0D2059FB7CE0B7FF876458CAC4CAE467268E9A8EA52821A9218A21CD27749 +F072B517A8ED63649AA3680178A0B718197AA3E08BBED26B42CB1CF66DB9A832 +7066961B75C300FC846D42E915269E7C565B0326A07E4A1FAED2FBA3AB02E0F7 +2083B95FFEBFA3508980BDCA24E660F6171122D9DB6B738196C8D4CB95F5412F +F9F3024EFA76D53D9A6FEAD1B72B6ED674724D28D2E4A2A9A02FC7B914540B31 +4B938DB4A83BB14CAB4EB7CE37915F58F9CEAF88E099571D7FA87F46E79FA816 +839B98AE55B866B2D1D78AFED64878DF83CFED739E57D95B911FDE0E35E9CC28 +0DDBE1B0C055B551BD46F9949A172B317FB239E069AA46A9208FEE5939250675 +0C5241835D891930D12CC95D921C614AA2EA7949C5BC9E5A70C776DD628F16D8 +8B44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI6 +%!PS-AdobeFont-1.1: CMMI6 1.100 +%%CreationDate: 1996 Jul 23 07:53:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI6) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI6 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{11 -250 1241 750}readonly def +/UniqueID 5087381 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 +5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC +4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583 +6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1 +8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283 +9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9 +387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E +6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7 +A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169 +70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE +EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927 +BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F +3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3 +3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF +9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46 +D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93 +FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5 +79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69 +C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508 +0797B87C774354F518712BED10630585E99E1C29B15CC9903566677AC2C11EFC +B05A1E85DBB81302C8B2522B3F37C43A981F585A2F5C936F177E7EEC5C9BC111 +14B1C1840E434B6CC5D7108077AF385722ECE0EDB6EAFA0F3A9F9AAA7AF8E9AC +FFBA85E594BD3D2063DB703957BF7B54463226A39FE7712527B4BCF871AB9DD1 +479BA2D10E2F18BB1CC30AFEC7D5E797FE4AF06EADAC0F9A0F7209CE8D2290E6 +14DB62B4139FA1F10339E0713FF9EC0A57CA17226831B2AC9A692E0B73B18DDB +60B30C162D2E5150D6D4373CB0D8C650045366E786BB1B893D3FF2B439210940 +919A897A85EF50079A5B1339EBC7B70EBC474B4024B8FD2628BF1A7391C483A6 +441F40200ABDB7FBB7C832C85CDAC232B21798BCCB07DFBF9A132DE2FDFC3E0F +2E7D15FF013768F2AA10E55BA400BE4746ED1DB739DD8323C46E3302E47902C6 +887D34F86CC79696BA1A4608CDDB93DB67C171C6D72D8609D8103F54E7CF71C2 +905E50DA46947B0546A0528CBC9D2D25865FE40659312238224CA5DB942AB9F5 +87439504A1B78D31DF95F433F396AD8BD1726EB76E0FF8FCBFF9A24C922C1FE1 +44EBDAFDFF9FDAAEC3D49A1260AA4A048645E19895A3EE24CEBB1431D7F57832 +3881085D5AEA699C75D2A02501D4326A9D18A623189CB39D0897A9EF7173AACA +EFB555438EC77986DB06DB75CD8B6C8A64A14C04124301089E9C8F340D90904A +80C2EDCA1C0D22AF66597073D49656DE4F3709CC91A39E8BADA180393D0B4333 +AF9887BB3D28F8648326563F0E3F6B66F9142CE64F2E2DBE18902DD22C1629A2 +1795530B2DF626D8864BE932BDDDE493BDEBA2D0B2B6A9A435826D2BF592B5F6 +84AC439F99BA54875FA0AEB39DF6878DC6A7E097D3466A41B882C9612AAD8C77 +539C1EADCDC357234B103FFB14DDF49081EACA5A63C6942AC803F513353E4A40 +19E68985A6095660EF71347719794EC6AEDE40325AAA33C657C9F3CA431DC25F +07C478A4C0D83A1E02D526305E5D62933CBC8AF7050640B46AC403BB1075F495 +E5511DADC464B83C73799B395B7DC9866B677C2E96AD044D913222CAB3931E62 +8CD4B8FBE6BD9D05A714F8531A061A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR5 +%!PS-AdobeFont-1.1: CMR5 1.00B +%%CreationDate: 1992 Feb 19 19:55:02 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR5) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR5 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-341 -250 1304 965}readonly def +/UniqueID 5000788 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA1F9B0FF4CFF25B8E64D0747A3 +7CAD14E0DBA3E3CA95F10F24B7D5D75451845F1FB7221D7794A860756CFBB3E7 +704A52A22448C34812C3DBEDD41892577AABA7D555E9298C1A0F7DA638078167 +F56E29672683C51CF1C003764A8E7AD9D8ADE77B4983F56FE2D12723AAD8BF36 +682CFBB71B1D12210144D39DD841A971F71DB82AC6CD815987CDCF29ABC3CC96 +5EEBD5D661F452C6E0C74F9ED8D0C5B3755551A172E0FE31EA02344176E32666 +14B6853A1C303A5E818C2E455A6CF8FC9A66DC6E279101D61C523BD9DB8EB82F +EAF4D7FDF6372383C0794C4568D079648689A199D4B65BA646CF95B7647E4BEC +83856C27A8EF177B3A686EDA6354FE9573E123C12EC4BA56A7E8BFB8F9B75147 +9DD79A743968F36F7D0D479FA610F0816E6267E5CE327686A5485AB72201525C +FB3B7CA10E1BF26E44C24E1696CB089CB0055BD692C89B237CF269F77A31DC81 +0F4B75C8400ABCFDCEC6443CD0E81871CD71AA3064ABDE882C4C52322C27FA8B +41C689F827FB0F8AAF8022CF3C1F41C0B45601190C1328831857CBF9B1E7D1AA +246117E56D6B7938488055F4E63E2A1C8D57C17D213729C68349FEC2C3466F41 +171E00413D39DF1F67BC15912F30775AFDF7FB3312587E20A68CF77AD3906040 +842D63C45E19278622DD228C18ABDD024DD9613CDC0B109095DB0ADC3A3C0CB5 +AB597D490189EA81239E39202CBC7A829EB9B313A8F962F7879D374ADF529BD0 +5533EF977142F647AD2F5975BA7E340419116099B19ACCCC37C5512091CC7138 +9F339C66B2C9B87906DD509D3C01FE58D1FCFFD900A965E5DE1AD282FDDE85FA +92FF0A3C9AE2D5AF98449E9A315B39D2024575CA40F9A2F3D5339E648D3126C0 +8E8807EA0B7D89271E7B8B288D4A61362CA05ED34687FC601A562EB8767863CF +EA5E8364E134C69AD711B84A8FBDFA17E798BA9EBF776CB15300E78753129E97 +FE41E3EAB189A507611DE0CCD44047139B8DE5EFC51809FD209EEF4DBDF0FE49 +1BAD5967440B83B33CF3CEC522A63DAEE6A4762C51FC06B875AC12CEED8FACF6 +4C3DF66B8B88610E4F65E3BFCDBF85EC246DC435C0175547DE2008B998D35CE9 +A14B892B4D401B37E75B60C1D637786A9C92DEC415BE87DF0925DE83EAEA370F +B9E6424D5DEB2C4DF85BEDE87DA923DD949BA072FE674B15400F528241752E52 +40BAA7A214763602750E37EDD462CC3EC41F6A280F86D08C6E1A3F2FA1D88A03 +38F94E8DA7CB48A4C61CBE327501F01EC7C18822553C5979DB6179655504E1FA +CA594F7B0E30C3F0670DA9CED7D0BD2165141819C4E98860BC925EA6A8438ABE +B53D6ED683F391003C2A020C1344D0EC3C40A6A59570577F4F8CC186067520BB +EF87D573B8519A38B54A162E4B48ACA19E4DBFBFA1599008F140676E677FE204 +D3F0F112D625005CAA745D0494B3F0203F4F1C2F65DA974B7271E74402A5E4A2 +09E3586CA443E56E074B83031CAD5F6F305151E6006B9961FCADD21B114ED14B +F7C6AD7F299722EB731A12AC6C9809AAC897D09327BD4BC03BCEB77B77EE5AD1 +1CA151B2070E0641C8CED49EB796A202559D3582C03082BBEA6E67F64B58F46B +98909D79975EEAEF24A4AB41C8DCA05C32E8547B0259AB5D85CAAEF36CC1942D +00122D76F29EA30FAEB17F91EBF7B1544209FAA74BB6638FE12B94E10583EE2E +AC0CB24998945610BCF401F004CF55288979B7A9E8E7B584CC36BE7683327912 +E388619E2C8280BCD60AA8F5B2D0A06DC88F7B011009DC5EBF40AEFE96EBD536 +3526537702686F575ADA2CCC98D3C393B046BAE30C833A6BFD12251BB3B5DA36 +B63EB502A3693C94C87B26BA40DADDE1162DC60FFF11DE6FF88E1ADE26300B6E +AFA3B4E884CBFD5745951839A3ED75436B022326888EF1546263EDD8FF7CACC4 +D569 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI5 +%!PS-AdobeFont-1.1: CMMI5 1.100 +%%CreationDate: 1996 Aug 02 08:21:10 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI5) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI5 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{37 -250 1349 750}readonly def +/UniqueID 5087380 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 +89DE8BB201D5DB4627484A80A431B6AFDBBBF23D4157D4AFE17E6B1C853DD417 +25F84CD55402AB88AB7EEFDEDBF2C2C731BD25567C53B474CCF739188A930039 +098A197F9C4BE7594D79442B2C8A67447DE44698321145D7689B91EF235EA80E +B600AA8E238064F154284096C4C2554EFE8DDF13AFF8D3CE30E0999375C0FEE6 +F992DEA5FC3897E2CC8B7A90238E61E41622DE80F438DD994C73275CC52249D9 +F6686F87F394FB7BB668138B210BEC9E46415A1B58C990B81E7D7DD301143517 +4C2A259D2A0A1E200F8101469C10D7D537B0D4D39296A9AB3F132DA9A3B459B0 +F850E2B3A03BDCB35AEF82285D19C38F474FB414F8EC971B994D1C7DD753B271 +2B71549DF497C665DF0F266988209D9EB616E4D9BA229FF984E7A886DB01FD21 +48ED2E4859FD6416C2CE52537464EA884C8C9C2D1083E2B83BE4B766474C23B6 +6E8EC5003200AB10514BB44D14CA700416AB6B2683E80862E7D5B49A05526A32 +554BB23AB8B0824BBA198E3825CE82380CC0FECF46651E3E5D77F09465E73164 +20342822F29572BC7F73F2C3BF95ED3BB6FDEADC20C6AC866C4F2C679594D7E8 +8D944704A3C5D771DC39503BECAB89F34D8CDB8FDB91AFE21F3F0260D05E90C5 +73E2C13DFA022C4522E5918EE25038A0498FBB530DA33B0AE238B1C6ED03FC04 +2BFED8236E07820C5BAB411EAE1B31D93A2FA7C374B1725FEC359ABCB88E2C89 +214529A263D795AACB0B95A3AB2F4E08EF350C282CE521716DBB06E5B8291B3F +5D4ACA230FA192F64BC902A4C8842C0F916F92FBD002ADD408BF0401D0284FBB +F05D4C6DB631420747CC902C5E1617E6573612FB26C8378DF41FFB5048D3CF06 +4893DBA48EF4B043D760F60C75712169D16C83EE020C45369E443E853E1809DD +F395B812067D6FDBD26111B34F42C21036AF952D0D767FD17F6959D9FDD46005 +D64FFF54772B50BB9B173AE79702981F58F9F235C591F476A31852174DF0619C +A470359153DC32610E782B204E7945515464DACE9099B81EEECC7EBD4B5126AF +C3FD9DDFB329AF1C95C41FA4A5F6958869509A23BD7210386329771FA46FF926 +0E54AC35106253EE140449425A8670E1F92B178A02A58EB57540F4BD8110E548 +BB584EA6D625C5F5FE0124A98E49915F1A1B95D2125874360EED1C4379FEF3C6 +90E5780C20309F11F2F23FAD635C44BA030B39EFF083A3ECCDD2641DCD35B24D +59A1A8D05205EE919E493B61A71A62AE54025BC2FA041DD31791DC50A6088531 +8A4298B24F0C7824DC95C61D21092BB72A0DC49686D01506FD8459F39B9EB3C3 +9078094DEF5CEDEC660B806755F07BD335F8C46EB490845C09117F269B8D026B +27F8E7EE30E9E4A8BAA238D99D4CDC7F11081AF46CEAC2652D2799A8EE83DB12 +7EE15C3B3FB94A79EE922782E30C67366520B46054DEAF1CAC3473C273526355 +602217963063FE21FD6668AB42FE800B671CA15852C234F3C3EDEE2943E2D2FB +4BF572ED711361114F7F561C369360846BACB94DE283126D03C25BF4DBD4DEE3 +FD1C3C68793F5C45111A1D4257AC2A3D60CA6C311D84ED467D67D786E386D2E3 +28C8946B7C6A6A2D204621A7BBD2A725F6369318C7543266396CF58EBEEFB7BD +6386DE57D69CC461543AAB4916FED65EC5E75724C00562DD4B1822137856BEF1 +1D607E17CB0233FC2DBA916FD3FF9A858AA0DF0B334AAF4C0A10BA981792D8E4 +ECF71B964C177F880320498F9695F946351CBC0FADF24E378954FBE11C736443 +1BD54FFE1EEF7A688B47592A66C3942C406C128A12153999D0E85F3047A41614 +31C745F690D51D386374A187BDAE2F9565DF40CF1159292BEF9E54FB51091029 +DF8037FBF92BAED7961B0961696FB6FA75A588A203D8D30D38E42450FAEE8843 +457B35D3B9BA2FEC5C9401563BED3E4A6CB4CAACAB06EC35745C7960E46546AD +7D79279A6ED963E5D90AFFA820A2F5BCA875BD068F1B06564C826B99C6AD400B + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY7 +%!PS-AdobeFont-1.1: CMSY7 1.0 +%%CreationDate: 1991 Aug 15 07:21:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-15 -951 1252 782}readonly def +/UniqueID 5000817 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 +8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D +F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 +E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 +424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 +E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C +C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 +868AEA25DA3D5413467B76D2F02F8097D2841804B020B210C0470066F33B37E2 +05805CEE76C91696F62E34EA09B7B7D6D5A4009030F0FB377D84497D56557DF4 +9B39A8B5B98BFC07D37F77324AE22B7B9C462D17C175A20B9F5E818796D45700 +1B13FC4967F4CC16F5D3F3DF2BA71BD6A7CCE57468EB1FCFA70BB7CF6C14895B +85983599407B165E91DF43A63851698377CD3960EF0072CD577FB2F55F71DBF2 +D631A6A627BDB80F7ED0A86EEF1D7BA8509CB8E6809CB7D5746CF0779BFEEA58 +FF4796DB9ABCCDB70849348CB10A029249191BAD99384BCB88F30AC35FF916AF +8264A9D8F0159E5EE474F8FF31CBFDD149A7526CDD58B9DB4792FD6852EC0BD5 +C31A9E80C325CC721EB76743DAD0F36A5AFCC5786B8940FD8CF0FACC37F18FBF +DC3EF3C8F6122B56446FDDCEF6DFFB61993726670B06A19274595B1AB448322D +EB9E686190CB0572AB53F2E189D13F0781C39DB4F7EAD7F39FEF4C08338C99B3 +0D2BABE688958EB49410A43E3BAB1803FA276AD49E649EFD52CAB808E599F306 +17CF39FAB736447ABA2BCE7A5DD82554A6A895C6C5DC9A957044B54FE048951B +6FE24C0C6C3F514A23E3C13365A8569B073E5386D65DAF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX10 +%!PS-AdobeFont-1.1: CMBX10 1.00B +%%CreationDate: 1992 Feb 19 19:54:06 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-301 -250 1164 946}readonly def +/UniqueID 5000768 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 +7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 +77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 +2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 +FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F +DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 +7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 +9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 +CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D +6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 +E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E +8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E +3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 +EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 +0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 +4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF +1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 +757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E +0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 +6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED +E067598E1B8B781EB59569E3D0D54D8EFAE0F3EDE26279776ABA15341E42E636 +6E02817082BE6FE0B04249A4840C11F95F8ADEFF72173E9A5F2AB2F62C427E5B +DC010E18641EAC906A5EF0F9BC2108062134A7F10956219C5847C0D82F0E8663 +12D963E012DF0DD899911EC5D8096F80B49CA3444CF1294FBFAB57DFACC9D01C +46F3BA2F3D1C14EC30CBF83E5729F1C074D4F1665405C9AAFADB8BE41EEE43AA +16966E2C0CCC853C4C09F245ABFD4603C4AA55EADC0A59AA6E9F5895FAF3D3FA +83EDC6E2540417530AE7DDA8EF33DEB81444316FB3F93EF944D9FB06745BACE4 +848398BEB747E58310BBA39C64E341185C82CB77E9D4439EC15BEFF1335F22F8 +F036517C436225F4125ED67ACA7A84230D4E2B6CA713FD6B3CA54BEB540D4604 +D58A8335BC20052440C4903786FE3E335E331CCE36A13F05F71126F680077AAD +ECAE10CB7C057C2D55F384723D5C30D20FD1358CBB61AA05EF45403C3B8019EC +6350ECB240F696BCDDD1A9F0465CB43B824457852CEE14CB39164B65A06C6F60 +2FF3A2A62E9567386DA80C4AD7651D44FE76DBF369706318E0C38215CE324932 +7625B5924F5370E9C13F0A66881FC91A4FF6F1AD4CABA49269C8F547DCD6E7B1 +47D53DB0D8DB88F2B7D435B16704B69FB1932CAE7E189DBCE941CC7A968A8CF0 +A5B18680C9C1CF25413ADC7FED11BDA308A61F2B9B688FBE6F35592A7A80E7F8 +36315FEDBD2A86FEAC9A2436E9827F2D291EBE20C9AF3B6EEDE26157BA188623 +EEFD088E3003970F5406023034921BE2CB71FD2FF3A8097881277AD8FB61E2F1 +78234A1900D0E11B18F1FC53B65F62F8F20B22A7C0584A3DEDCE17A045F366A7 +2452F46F213B0EA52186A9693599344A739F6DD15AA4EAE18AC229C7C70E12A2 +475B7821C941EC9B149BE9B6AF9A887A21D59350EAED951E317DD3AF21767FDA +40A19CF746A59B4B32287762B6D2F9850A4A87122E1D509E77B7E20D38903764 +AFCD068B8A76AC6C24DE414BCF255B58E09F4896A0145E57B37C25B3A3B4F806 +6B7213EB4B15F2817F7B535D00FE9C056045D271F2CC490173D436C77A4D1B5C +F3915DBB226CCF227260EEC9FEFF583E0EF338913221F95D86779420A47DC6D0 +A505EC936CC08C50C7134EA025ED7E4BF5CB3929DC1FBE8198FE1253B9CE7463 +6E26F2455E3ED9FCA0037C5AA7B354A4F30488FE344D2174328A2C70F36C94D7 +BC5CD9AF69AA2FC3527FA61243B6485A78107B760CCBBAA33C6B6C58FC8391A0 +29F7CF8E6AD0FFE0BE9FE0B7EAD3952210FA0FFFDAECD21A07D93B8C0D596E10 +998EE096534EFDDE0F14C2FA1749E0ADF8A0CA30DA9357A8702770B82AD521D0 +FB46033DFB7D2B2F19E587308DA70065D910943A34F7D5F2090FB4AA42ED70CE +D9C73192DD9C1EAE1F49708EE0350FB9DDF1C9011C12CBC10853B76A886F331E +4BC14C95C484B176D6D4CE41047A4B1BC0EB04C7D76EF2A99B455CC71AC485C7 +5B8CCD592792059D48A3DA35FD0496D6D68235191F28DBC1BDF12071767C40BC +F05C6E1385F0C09A42C6CF44B3AFAE963C89B348FA0CEE452DBAB4A8AADC47F0 +3B0A4798A24518FBA8777C66F815382539015CB24FB960E8C0022F065DB2A124 +FEF55B69DFC24E093B4E6D8AC8537B93A75CF925796BA8BB95C761C8720E1BBC +F9A52B5E6754A39F61786DCEC8CFB966B04EF14E3BC6A17C4217AF3ECA869E1A +0B71DB080CC86C6E1050684F4E707DBCA2CC21EF8BEE0E5366A1EEC4F83BB82C +A3E6AA5E2632C1D8E47DCC62F4513E2C95E97D643024556E8018F2EF2A19B322 +3D50C962AD7D5169EFA32FE34A42319C137AA1E69CAAA48C0C66BDF5C0CC3702 +F7D3CD98D0CD83A74F808102FC5E55FCA90EA2ADEB12ED6656C370D2A05ABABD +1C394D15612CA6CBA6CD65777449832B7518242032C7CAA693B4A0DA3FD9D7F7 +BC33C3FFD8C31E7344ED06B6724DC2AD2877048A83EA1E710ECEDB5AAA6C9B9B +FD4009573E89AAF88AE0F8C87B7405908BC2352FC91A4FDDB84F6B8128519B72 +2A137FFB5228F90B92D907D18FD21054E9570374DCF22D235DE401FB8354E93E +A9C6153F76FFF89B17B007DD29CEC22DA2F245F329788E5DE6CCE26CB62AB9D5 +1E33CA61DEE88ED42091AC856C05DBE92CE77DCBB280015DBCF1F22A45F94EDE +BE85D30E93A0F0D79B0CF42E5B7013B04F739DDF771C5D3D94349FD99D9A37CA +C2DB864D8777EDAD939B911563D62E177B4A8D57850AA69CACE4D33C3E523DAE +2015A914C0B6ECE0FF52CECDEE842E40D34E00D0F312F80266A9A6CF2D1603A0 +C8C05C989BE54C874666331579A630603F86563BEF52363A47C8AC964E874E01 +54B85E2EACE5381C8283ED0A342D3BA22D35124DCFC2C55369275B4AD7379EE5 +30A148DAAEB28AC63EFF71C7832DB81178F1D9BD3B9188E23268255EFA1E1EA8 +D9535862FE48B69FCFE9D3EA7907F64071B6785D93459B8625BF4315D528732B +42C116CE3E6DB56606B9768C8856F7E66A4A6FDA088BAF64E54B4D58B90EB1A2 +212891B52351C5681DF1C7A6721DA59BC390E7CC26164EE3156A9254FCA4418A +D6EB3EF5C8F5F682F678F5E4FBCB9ECA95682DEB0E8D658A5A822B6C44876F44 +7685B55CBB20BF1E95171AC47EBB67D654C6AA6CB8AE0CCC995734169E557438 +9FF6B6ED4D5D99FBBE15EA2663CECFBEC7B935C4D45F1FBDF84FA05660AFF8A3 +E7453212B2E0D5DE06B967A703ABBD0DA549258759B6F9F51E539E0AB27683E5 +E5C0C5672A8AE3B2C6D384C3FF203DCF2289F5FDD782D469EB5B8A08C94B2255 +129E4D41EFB639E3FC8F2ED20447A07AE629EC35AF255AA4371A3644E022732F +8608020B6FFC6B9347220F113F88065173EC136CAFFA32A7203AC79F1BA848F9 +8E173C318D0561A1EFE854BEE4FB174795F644A97EC2DA2EB0FA5C2CE650168E +918E2B2D163A8DFA316EF602551C64A82632F038F1A2A590C0DB2A25C03E9E7A +8F9E3AD1AEDF165A29CF474E06F241E95E5D5D3BF6946AF64A3EBD2BD7117E91 +F4F39637F2F4CCB69A7679EF69A3E1F5B3B56D37D2F7C8FF21A8428A8B7D3C81 +3508E542F3D699D65357E846A746349473A01F170267DC4D58A043A41E179079 +AB0EE76C2B8AC302E1AA94EFC58ABA22B752D747AC00B702E61CE5DF2C942F79 +DA65DE2128D60014028F5B0E27E26262073F11FD2CDCD392778348CB30939B83 +A91D5B77D31A0F687EFD17E0B01001AD7B2B4415A44B73469FC1A1672CB0236D +D41BE85BAA4C9A229D84D8FC1C48CA295264BAD407A0F6F9229B5370BBBC0FF3 +752343D66988E0CFAF5102C18F418322BD7A5AE815CE7C80732A8E6E9304CACD +2D0D26A7B373DADFC1A1D122FA9BD045F80B7F046501A6175CB550DD08FE1FA7 +2ED432EC37BDDF999D64C0B2D4A91EB0497575BF88D7E706AB126474E0834D81 +6A7E64C9D6B622C48EC2A0263E4615C4E067474984C7895572DA9A452028FE76 +FE30641FE01845BC5957E7DBD34A9A1CC6A0E5588AFA36BF2D5774577BBDAF2B +69700645AD306974597460959A0BC940FF5F9F97CAC04049874E7CACB989412C +06AB8B0E4FB46E32A8F08388592EDB25E6E1FD8F9735D37E36F09F9459FAFF06 +6263D9BD0720C73D698032BD353FC6029DA7F84D12174324D2D085A0EE6FB2BD +F476AF9C467313AAF0CED041400180A984233D0A3661444AB24D940B6229D0E2 +6090646BAFCD916C7914C1E631C7259901313CB7DFC0D6E31B3FC2F18BBCF494 +06267FCA861EDD35B5AA899963D20DBA33D380C30BA8677D9E8AF65A5D1D8593 +ECFE9329A49CC626679DEF50CACAF4AB2BB08E89445CE70D7E7132732259EFAE +DA2109D0938F660888569E7048F4484C76F73B4F6415F7F1AB89D5FFE85CB3CD +197141BAEB704BED6F26F590086CBC6E484F56AA34CFB1420D3982E2DF873C09 +949B8EC98D9E1E6FB07B72D11D3AACB4CC1DAF846F1B55E80C80C9EE41B9CB5E +76B5984826E45D0F5F813F3E57F8F526DE87570EAB2F625E6F795BE4087B056F +9DC65C370FD020C21D87D0EA3361E3F1097B3DA2A323813CF42F533F4E784E3B +AB0378421234F4EB875F9AACDF23EFFBC3F8D2198F15BE7A245B8AFF167EDED9 +F3474D8F900185C7DAE57C09E82B1B4C820CDF74EBF521A93DF0C09A38806F04 +5CD48F923556779B1BB04538E2C00F3CB0D0F9D51BF71074E13881D5EC2B26E2 +4F576AC8F20B2B361EA4625717FE75256F5817DCB433DBC857860D58447A53CE +702E3DAEBE6D0BEF0FA8A3391EE73A1B3E27B95DC7E62B21910108B1DD0BED02 +ACCF61D4EFC3A4CDD0F78FBA08273F5C1CC3C44B0E480C0180BC172C73CE9081 +BBB1AEA8040EE52EE5F9D8FA930CC262FC4BBFB743733A76ED66C5447EF285D5 +C38AAE72439C296BD4E2B34C6697F967622B0823E8F87601D8764475BE597B89 +D55FBEE64419B42E8444ED55608A7C5D3737D76A1AB8550E086EFB6897FD9464 +2E954E13E07564CF0232DB671E9DD49CA62266631BC04E14B7722FD9DBC344BB +B33147C021E2976DC79994D3F7988080FF20D4AEC571538D1B8A690B43A323F4 +77BAB2AF9B62B2670829EAB9A844A3F6F4154996B8DF77BDEE946E92C4838DC2 +05DF6A2611750B2DECF50871598AE66E93EBDAC680D5785D90935F358EAFB2E9 +1A509601B91CBA764AEA990B9196CB813789F57F826C0088B2CF58E1AD5F5FA8 +7F306859F0F9FF75B750420C99FB3B7087282C22CA4DDFF1A3C4CF7A0A822861 +07762AC3C82372F7D1F5B8D0A6BC6C86067BD33143B0290C589F06297A8492B1 +9F22E18671D013E720E49379F9B2F723115FC4E43DD6CEC243756814952ADBAE +3687B7E1AE94FE7D84DFB62560592CD46C7960E7C60556BDAE8509C5F44F3CA5 +1647D8691F8EB8BFB02A78983F33C00A8736EDAD2408800684F19D5AA88680E3 +287B0219E9448CB59DA5593EB876E21CEE2B26FA8F025C833CB12292B5114BDD +B67E6802A026C90F3D58367C5DD91349CE4C958F10F62D113DA6430B6B40B8E7 +5075C65CDAE22E37320457AB6A64976629A0D236EEBCAA925B7C0BD33F129D8A +4C30CEF7851BCA9A87B54F3508DF652C93B3090548900CF5F641AAA4A9973835 +1923B8D0B9C634C42DDBC5C4324AE647E78DCACE5050DE1F7C3491214C3E4B01 +E756A3DD17BFB2A1B246608CF9C44D7B000C53512CC2CBACAD3969D9562B7757 +000C25F5BE8BDE3761DCA3B734010F414A4BB19BB4FBBB9CD48D5B92EEA28344 +3F0D2B426C181DD9461D821FEA82CAB6E1D8EDFE9EEA62D787465776CBB8B861 +76DE00E9BF499F9055B0C0B949AFE2C9DF25D53D9A0E7E82AA96B2C21B63E1E8 +B43C8D12BC5FB938DC01C2301FB6D263E25A788B3C25E3A170CEBEF8B46AF354 +5C5DE01BDAB24C925091E22070EC94F30A455B81CFB77BFBACF3684E61F06F61 +F406AD832A222A6AB99565CF97CED48122DD13AFE2C97355039A14845270DBE3 +BEBC88E3C496F75D84B9D12F1228FEFDA1E0B564A542078BCC91C993336144E9 +493B035DEC81E85CCE073142825B62958C431642853CE997E5AA3650908550F5 +CEFAE56703E6ADBE419B1C25088E6339D94B0178C9CB665BB0803EAF74B26A6D +BD229AACC723EE690A1466B2BDA816F3A3232D842E8FEDAB517DF6E874EBBE89 +FEF64C8F5F83EBD7773047136DC45E2CEF9E2B830B0128567702C60577833CF3 +6FA02C29F9AE822B52FEFF76A4122CA5ABCC1169D05D4F39D060B8E21CD5685C +FB833A0D3BD63BB522E910ADCF566AEA21ADC095C66E17F8A70749FEBAD5A4DC +ED922180944267CD04657BAD6DF1E76CE541CE33AF2382A4FD6809C42E8AC241 +57BE07F7213FD5AACBA8B20EBBEB6052FD996C4AA2DF8F8145DA1513612CF19B +4D5D41EA4DF39BE49AC43B29965DF72FD921DFE8E66D0AF813D51884C68C64B5 +3DD366FE4754ACD855CF6D45F2AFEC3D4ECBC8BA4EDC2CB737E9489544F165D3 +C8C537687831E094EEF4ABFC041D67DEC56E057E8F3493DF83E3CC3C9C6E0276 +4B0E15A1B35457660B4D801407D1C25B0A74B7DA3DDC35588D6F3F8698706F4B +D677B0A95B3DE04CDFD800FD766A49D3CA34A5CB481F7CBFCFD5945BE1B60205 +02C920B7B921679A7F9B03102A060453F5E37B29F5BCEEAA311C6CB814BDF4C2 +353D6A60A64FE510719C8772C0B64EA6F05D9479A0E2EA80DD16B55CB78EBBE5 +BBA4F4D1F4DE3FB4B8163BAFA9E1F58E6584D66D654CD1C5D177AABD53F72C0A +13DBECD06103139081613D28B0F44D9B9728D56BEF9FCE2C59FF30387AABED4A +F58657358736B2E4E8F57E9A64AAADD9292137EAC12EE4AE504A67E8992DE106 +45A90F4375EF885B3E9ECF28A633E34EBEE00977BDEB37138190CB050CA8A46D +E7567F12DE2AE7CBE4D4DF46F1A85D7BC003FDC784379FDC015D1275F10557C9 +A684F99B70966792924B4848AC0BA3D6E26918EC5932A7CAC4203AE378D6F1B6 +DAD4364645CF50731DFFCF8988EA2ADAAFC22BFC7B39DDB629B38B2B1BA96133 +D9AC19D620B8FC9C2BEE43043783BC7DD402A18661BE996E0EF5CA6EE8FEBB14 +B32A0025361FC72C2E71CDCB7E638DF53FA6D7ABA9C8DDD9D215C4DCD234B546 +7B4D77D9D9704A296A634ED4805633CACD34D72BC8958F1BC87B237A2C0D1C07 +D49999297BA5BA190A91FB86CF34C6AE48AA6B3ED190583AEDAFED3434BF67C6 +C87CF20A50BCF59BFE4DBDEA8D1564640C284D9DCDA15130796B757BC08F7F75 +3E0A7C21BB4A231AEE58E6677B2CB7A5BF0FB7E8351EC52869088AFE2C29C1CB +A68FE10EE76B7FE4159A93A8FE5E062FF39716C221C57459143E8CB4B4E11899 +D3C8A90FF5E2B2900789AB5E801FD7A88ECF7066DE9AA220AF555C0BAB934DFE +17C47DC99E85352211F2D5F03C55F6C7E99154A08061CC9424FD175186803546 +CF729670C5A6ADD03C69870BA9FB07B41AAC602FE0425723A45D8E9AEE7951CF +76C8E160D688E75900FCEE6040AE62E6D7E4A69F8D2433374B3215DB8463A525 +37043B54F7E6ED61421F092481883FE50AEB448979E60B7E4EB705CC61C75881 +5544D9A9FE4F8423FA46C1DBFFB1C61C89CE39D68C03A966440C41DC69FAE04C +20ABC514A5697FFEB571A8CABDDC2204127D6EA2B3F7908BE39262FFAED12514 +CBDE582EEED28646AD4D4A5ACC52CEC2B56D580D5FAE598D15BB389F9FCC524E +6F2EF1AD5EFCB7DD9A355DDCCB99EE9CEF784C5A2AEC2212B3F3C0FEE8BE873C +D8B9651FAFAAD61830779ACC9DD16B4B569365CA71FCEDF27FF937C174360460 +1A07EF06CAC3EA28D076D04805D7C18E1B6D527187ED8E4CFAB9C66DCF05E6E7 +19D2FF5229507277DE3B2753235EDAE820AF349C25D4998A2A5A0837103F0256 +4AD59B7C777F6EFA5D4AC8CC87B7FE5C4E876D888E0F44D2F858EAD4DA625126 +34B6339D8F81585DD2630951CAAA31167B3AC0D60C40B90C8F5A4BBCE71251DB +153CC5A830E657DB2AD6CBACFD41A3B9D49ABBF928F7D92E058325348A801BC6 +FFECB6572882B92AF0C0D4412072A36F8BFF6906FE164ED28F4FE2095DB1FA7E +2FBC71ECF2F5675231713E83175862F917A506A295E3D72DEB3BA08614CE9283 +906C4E75C60EAF7AE104F7BF61A441F0B33C9B8B84B40898648F17503C4187F1 +E52C866044F5AA80C1544122F0721EDE7B27AB507407F1A66584222BA7FFFB8E +70AE115F25F2A68D51D7AD57046227808252DCE5C16D657858136EF2AFDF33CD +AA82D43FA786D45C397D6FF62C03718225A77A269B5A54E5B5BA6485154F7489 +7F8C7DE75D2F6CA2D7CBFE3005D41123104C390113070C9C7DB9463F0B688974 +0576196661EF18643D40CED04AF24BF6C497722A256D24757508E560254C831D +4C78932D9E6EFDD6D83D713B1DDDDAF7F6054249AB9ED32B747E77A19E0398E0 +EFF75B0ED8C76B05C5F16214A7FEF9E143661A310D3F4E6E819198419E796C2B +528F84256F86B0A1136154F38B528CBF8B63D7F00925F76EE22721EA27E0D9CE +BFEDBD29A337189C92DE8DB858ADC2A0041C002908EBD002DAE524F172D7C2E5 +B0A16E5F7E5F380612F63D942D4FC2D174FB501CD2B2B98F80FBF348D49F81DB +95F5C283CF7D4025CCD5482B6A679085A384CF6738AAF3080AA5C80C3D8B1DB8 +A945C857852E2D0ED7846F25264682A2B8695C2C2464A31BF3F1D47E7963F9EA +8CAFA1477A0FBF400A3F3E772B471A2DEA720E5709A8433CC5E9EA317D7F5CF0 +EAD516D39B8CD3336D64F46C7EB0FF8CF1489A17791D6C3DD6491DC0512825CD +711802007ADE103B74CF24B54D5B46411F3D7AB68A1110FF7E8456789A35D120 +364F9DC0863CA4E2F2C1A1E3EA285E80E45924FEA1D8F3ADF74BBB986BEFFD6C +40B4C93C35178D91E6488DE53F0A6582D4138614F6B0D5DBF4C9DA3B73F81492 +BC4080A34C5FFAA6F3FF89CDB45C0717E507246FB23063967100D1B7D0D33A5C +7EFBE283904A8BDC81F55CAF9967F15FD26B4A2067BFE077DE75C1F9C218532A +808BEEE852EE6321C5C53930B05326026CDE9983CD35596DA45E0A1C41BFF020 +8AD260493D9E6AF2884C8D431E7877973D0C75A88B5159488CA2DB21753ABB70 +55DD2C5754CE36C46A2F7A9BC90A6B514C1D427E864CA6C12AABD3CBF9729F43 +67E9179D599233118CC7B7985F943C013DA0724533008123E0444C87B5911645 +D9368120AEA0F341DA657D54FA2E3E00ED4101A89757F3EA768832B52F77F7AE +1573825439917061CF86DD78585AF7987BCD2BA930C485F9DB70CD5F2199BE0C +4283DD29C111346D2D52EF03300F7D82819C88426C11EAD54CA60980115FE9CF +AAB3C968F6D7EE5C465322D4377BDAC86623C51F685DC0AD2E379847B33D739D +659A514B4BCD9E18BB7AA643B8793992BFD144266A8836BE450DE2E64D36C4B8 +5EEB39800BD772834D7A6CC887A9940D0EFFA5E2D2F9C2A90E57814D11160718 +6DB783F53C1A8632269FD613D90C207158DCF2D7B4B42136CFA9820AB8055C64 +89CF236059574D4E9427C71CACF877835C8D85ADF68A07D988C833E195D2E4E3 +466C7B2FBE2638BFF8B5E7B0D1B96584C8376EDE8FF80E744D2CDEBE241D8179 +4BAF497177BC50EDBD1742409292B0E9BB526063D036C61EB76950289D509219 +1AA3CC7ECD18750D499103CC926AE7DBC745786B0ED1A66E96C18491AA3176EA +5D04B45824781DE1D0F1B24C468C8FE8FD8BDEEF244C179671FC63EA5ED515F8 +3F608DF242D494FD4AD005A56C7527F06B03E5062A673B64889DBD56FF1BE27E +70C6479FBF70C5BC6CD92C8087CBAEE7278F4EBF0256E476682F357E13CBA011 +1333F560DE8C794A9D51629B7C0BBFB4EB2F2EB8D526C72B9007294CA6172111 +81EB77BC0B1DA002C41CFDF99CF5B14AE14613E522F7324DF6F12317D6C29730 +194DA8E2F2A6D04684F8B1AE003661F4C5BEB31CF5786B122346AC00DB397484 +657B61132ADC3164AB0D1790770D6A974590BBB4AE4036FD648440F925EC7147 +6F76F2DEDB3006EBA5ED407FEFF05B133531C7055E6B83FAF388CF243B68B371 +5D03F8143AB5B815627E81D8B1165BCCADEEDF58F80728CE799569A5882E75A7 +AB69654CE87842FAAB7E675F4E097F8B32C15F3D42ED59682007BD55DA4F07B1 +FC1304078275E4C87646DC525210F7866B6B4494ED403ABB841B8724D7AF553A +5A7C0CF4752805190CF9A28E0427210FF1E34AFE7D6553C09FFD81AA35252D9C +C722FE0E7C2B74D185A6695ADAD14488F2F8F690AAA8BE78B34DE07898D8499C +EBDF1ED1B67E0FA61B6F8AEA72940AC02B21E652C9B7A084F7A151F61F6A22A0 +97A6968499307D2B97C08A7C6E31BD8D200E5CCFC603443A8CE96D90C48AA373 +26CF6AFF62852C8245634B6E9DFAC8BEF8BD5B6A4F234FF84D245A3120D470FE +6601C337E0BBB7137B7FED1BB6DA8B824905F6315C9A21BABB6C5DE40875DA9E +AA29A1508DF7ECD0774C93D30015CED377221362D92DEB871FC9D839EA6F8E60 +A466BED6E3D2CD1C27683E19BA3CD7777E2A1B34C9536935E0F5A34A5DFDE326 +97888761EF268A08332A5CDD1ACFA1ABE3B583167BC833E69E418345A862337B +D9863A0FB4458F8D6C9F70522B8CDA8B3D44CE974BD546576BC0A1EF7B4A9E8F +1BE5FD39102FA256749404297272007ECA644986CCCF8852F2491DADD34D7DB7 +B6C4D46CAFC5941E934A13828D00C6672206A95D06053A94D94F87834E906E90 +80073C543E0251C753F935988A4C1EBF4A67D1C2A1931188F0C0FDEDFA582F93 +417801910B6B4E236C6EF7164C66ABB35F9A516CAB9C30359878A89BAEF04E08 +B2DA81BE9272C2241F95D7554AD6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: MSBM10 +%!PS-AdobeFont-1.1: MSBM10 2.1 +%%CreationDate: 1993 Sep 17 11:10:37 +% Math Symbol fonts were designed by the American Mathematical Society. +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (2.1) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (MSBM10) readonly def +/FamilyName (Euler) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /MSBM10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 90 /Z put +readonly def +/FontBBox{-55 -420 2343 920}readonly def +/UniqueID 5031982 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6A66A4000A13D5F68BFF326D +1D432B0D064B56C598F4338C319309181D78E1629A31ECA5DD8536379B03C383 +D10F04E2C2822D3E73F25B81C424627D3D9A158EAB554233A25D3C6849ABA86F +1F25C1667CB57D2E79B7803083CB7CC0616467F68450D9A3FEAB534EB9721003 +DBFEEFD050F3AC3492F5C74162A9A531ECEC0F47610B4940E946D21CAA771D30 +A6C27ECBA11708CC46C62396BF9D1990D579D0C394899D24FE7A4382EA18E7E1 +160E7283AF5BE17254790628E79FCC206F28B5566075B3A5697D5209062544FF +D85FD89D6F43D6588B242AB2666B5D2861CD38A8CE676503EDFAE84D12A71E77 +8405E468FE391F4F3F50D2C57ED55512036B0DB8E76A7EF413ED08673E56DE2C +16A3B65CD478433C0D2F9FEC4E662D54DAA43CFA6957D2A9AF8979BE06F70B68 +ED4C8C493D6DAC4971A3F1D010A7726D084EC1074FECD7D12D72AE16C26194AF +21AF5774D9B860EEE8608D34F150092F09C19959BAA670022B9A9F263CD391E3 +74DD1D1B4CD4D75273CAA4E37F68C631723E08FA35AD34C0AFB4621AE6689861 +854D16CE1C375FD159A337E221A6FF1CFFB5693A0623E7EBB58C2969F590D081 +AD92DD9E5322E26D6A15023664AC73A355998BCC48ADD0E7A4BC79790519606F +A1FEF6075033BCD422EE8233B83D1E7C20043280D531223D5AD4D5B41669F884 +95CE4D6DDE819B588742B930C579EDF743F2C74C95F717FAA6154FADC3FE2975 +F59CFB1C1A29059487E75C48505BAEAD7145667D4E18E46E610C868A257173ED +0D30EAA4C090854DD8378E92D0A376226EA7DA63798F247BAC770FE26D70E72F +90CCFAADF118304646955B0310C65F6CA51BEEEF87AFFE294D08C4435C7BA92A +C61A14854278FD1DA6A516B7F548F5723C06ED9B2605882EC330DBAC2B1DC25B +BF4D62183F791DCA7486F9BDA94D14606280661A8B29C2E9F3B2C6FF071BB961 +845C6C8CE222FE9265CB970A11001BD5A058C8749D63B505685E2940A75895B1 +A7F64342914194484DC57FCE15451C4C82A545725124706DDF1C44252F79196A +365EF95562D6BC17232202E625A9E9056A62B78476AD0A9F5E67AA9400A884D6 +930902D6D6C402500B379F3361FB95AD380F5FEB987F5908A52C886B852DA265 +995C9C28C46992E0ED09C64BC6D3ED90899BDA8C346743FD32253C51D14D77BD +52250D3676F52CCE7C1B9CA28B5A8BE6FBB0F2121E448169198FFA7D3CD089C2 +F6C025F1E7E973EFF8308A2FCABD144EF513EC81A30AF3A261093A5ABCF1B82D +5975A92162231A68773F8687E37048DFB892B46F19550454D55FED2F1E522EE6 +903A710DD64E07B7255D2D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMEX10 +%!PS-AdobeFont-1.1: CMEX10 1.00 +%%CreationDate: 1992 Jul 23 21:22:48 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMEX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMEX10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /parenleftbig put +dup 1 /parenrightbig put +dup 2 /bracketleftbig put +dup 3 /bracketrightbig put +dup 8 /braceleftbig put +dup 9 /bracerightbig put +dup 16 /parenleftBig put +dup 17 /parenrightBig put +dup 80 /summationtext put +dup 88 /summationdisplay put +dup 112 /radicalbig put +readonly def +/FontBBox{-24 -2960 1454 772}readonly def +/UniqueID 5000774 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF5B8CAC6A7BEB5D02276E511FFAF2AE11910 +DE076F24311D94D07CACC323F360887F1EA11BDDA7927FF3325986FDB0ABDFC8 +8E4B40E7988921D551EC0867EBCA44C05657F0DC913E7B3004A5F3E1337B6987 +FEBC45F989C8DC6DC0AD577E903F05D0D54208A0AE7F28C734F130C133B48422 +BED48639A2B74E4C08F2E710E24A99F347E0F4394CE64EACB549576E89044E52 +EABE595BC964156D9D8C2BAB0F49664E951D7C1A3D1789C47F03C7051A63D5E8 +DF04FAAC47351E82CAE0794AA9692C6452688A74A7A6A7AD09B8A9783C235EC1 +EA2156261B8FB331827145DE315B6EC1B3D8B67B3323F761EAF4C223BB214C4C +6B062D1B281F5041D068319F4911058376D8EFBA59884BA3318C5BC95684F281 +E0591BC0D1B2A4592A137FF301610019B8AC46AE6E48BC091E888E4487688350 +E9AD5074EE4848271CE4ACC38D8CBC8F3DB32813DDD5B341AF9A6601281ABA38 +4A978B98483A63FCC458D0E3BCE6FD830E7E09B0DB987A6B63B74638FC9F21A5 +8C68479E1A85225670D79CDDE5AC0B77F5A994CA700B5F0FF1F97FC63EFDE023 +8135F04A9D20C31998B12AE06676C362141AAAA395CDEF0A49E0141D335965F2 +FB4198499799CECCC8AA5D255264784CD30A3E8295888EFBC2060ADDD7BAC45A +EEEECDFF7A47A88E69D84C9E572616C1AC69A34B5F0D0DE8EE4EDF9F4ADE0387 +680924D8D5B73EF04EAD7F45977CA8AD73D4DD45DE1966A3B8251C0386164C35 +5880DD2609C80E96D1AB861C9259748E98F6711D4E241A269ED51FF328344664 +3AF9F18DCE671611DB2F5D3EA77EE734D2BED623F973E6840B8DAD1E2C3C2666 +DD4DD1C1CBB1ACCDE9DBAEDA5FE0BED42D4517BDB3FA340A29777AA8D4FBA6AD +EF1A2593BE17D2A688023BD4E12768E88E2384C5B5141B8079A12636E1B26138 +083CBDEA78AA36184B5B7650855B6438A501201CCE4C8582678A5A0F842FB4EF +E8480151CFAF845F42FFB0D8B71804A0517E161826A44B37A5E93E1F494EDFD9 +F03F689DA1887C3A03C8AB76AE2DD553F81C433511C4122C0281C24EBC57BDC2 +98E97C3B672131CD33359F7892FAEFAAFBFA949E2B5EEB08B03D19F7C298A1E4 +E0993E0D61260231B45BE22EEC582659AF39C34BBDBA945A85F8983F873AB131 +30EDE0566778E56C8E7D411D88D5DCC5E11FDE47DEC962E1C86744A99198C6B4 +6F1DE5E3D819C35522637A0898F5A04139C7E2A8AEFD04A3F0F4872CB20537A0 +0422FC2FEBC04DF2CD88088B1B5EDB500EF71F4B1D458563377F39732D532338 +8FDFEB66A8143A5D1A33E34C83B6C6BD5E584EF886715D6ACF7372A562C6CEDF +9FD639D92952F34447F2E7BAE044CC4B9E1A4A688B4B28DF59C3848356842A54 +1DBD149A6EDC08C4637CB9C41046F8DE207FF8706AC76AF15FCE7508D6955520 +C222E4AB31FE4A67F29DC7FE9B0D090669DAD1C6570DEFF0EA051AB9640D2E9A +B315A34EB067BF96DF2FB2CF7B52AE8F4A8BA0B4182DF1D4EA185C41E83942F7 +96101E6D10D2066F69CC170A9069AB00FCE0C6D09B72973460262B7BF4E83497 +4D5FC963D2820EFBC724DE414C40F1581FF7836CE48A78F3D5529C2CE5176B21 +6B7FE44131F6C0AB60B4C16F2FFCCDEF9CBF1CB9A9DABF4C91E259114DC5864C +C6B22BF85C533DD21B131D618D290588A9D72BF3FC1C2E3DBA14E2CBD98D540A +152DEDFCAFF62E6C7C4BCFD96B547565C964B6BE0B2A44CFECDC489390FFD751 +527189E1554E1F6E658BAAACD02A570A523361ADDBC8D1DADC17E164F74BFB2D +CD9B989B9DF448337F2518F57FD85C36438C9D9DE5D944C8DF9BFF0F09F768E7 +A7A5DF7AA3DCFC5A59168C98CBC6DDF875441729045B5F37F0702A2108904DC8 +3B7C3E39D043D275F5DA0AEB08DF5DA8141DB0EF577597E54D422059CEE19284 +7701AC80907A83FBED770711BCF07C633C11CC003207D3575BE6E5B4EE275DA8 +5E19B9D2E37D1D1A3C117EA7A0EBC6B895F60E25A4EFD6A10D55B13F6D8717C4 +4DE8DA8A723D525A951AC4CEC024B03E4C1E522D09BB350773F82BADCC8BBD39 +14580CCEE24DBA2717A38FB6F2FF549951DC14178B4FEDCCC619B8678AD2A554 +7BA184C4F24D4CA25FF6A23F0DC2482665881C69CA85864C342A428541509453 +6191918CB50C51502A9276E4F0F8275FA58D3F15E550CBA679EE732BD3E3CDA7 +2A4BA3E749C536D2F8ACC03364AB3C83C4A64570310A3705096708B9735FDD28 +78424457BED3EC1F6E501D9886A1FFE807A3D0D7EBC6A15A5084FE15A77835E0 +D726B1C6A99CCB1182CBB6FE8D3C1B09397C0E659314DD018B7704D8C7B9EE5A +D9C2D4F46637586A8072AC7422DB1BA052DA5F4351FFDBD9C4F099B5709483D6 +7774551B2BCA377B51190112DE7A19BBE27A7EAD663A646949C970697D0B72E8 +89DDF93C65EE2848217493DF4B071AABC0F1A0F335A5EC1E83771110DEB40F03 +FA3E725135E0B0713374665141E37724FD153AAFB1D49F4A6B3D98AF8B2D95D2 +24BBC61C7534BB129086766E104B84F968211820512140EBF90E83E583198342 +32750BF96D18E6F613BF15B317E6F7E69F28535062AE46BD1AFC0825D81B6223 +B1ECE5B8F2018355CE7A7DF91ECAF71F3F86D7AA981491D295D67ED51F58C075 +9FC729F03903470FEE0C47999B5BA3120C9817447DF02FC685B597AE3A8DB7CA +C5B25BEE2270D44AE40792AADEC389F6DD41B95366C4E18169ED118BE50838AE +83D7D4590CA6095C7D4A56144DDAB11909443E04D286587F15401DCD3F792E86 +7B29EEA3DA7A33DDD62BC5EBB80270B98B1B5EB230B56C8148F12959A596F254 +D56F21DD6B8A1EA362D59BFF5847FC4A7F27CFF140A1B6AE549421CA57A90EC8 +EC5A5603F5109B8C3D8307B48E2326749E0E532DEF6E2538ACF1A63B3E299B21 +3A10C2F13D6BAAC8833E4236DC6ADEFBE3E0FA4193F054DCA7AD839EBE376BF4 +CDE36B2F34CD6255C6762C6D5B31CBA953F6BE62DC72CAAE3BE6C2616E587814 +96D8E602E351A56FD0BA1E4AC969EBDABDC6A1A05F02A9831BBFABBFC82C4888 +666A04E71264FE2CBE8BCB52ECBB3369DE4139C0387F78B4A8F98653547C31CB +45AA7B1107D5C3FF1F62C0CAB865E8CB844EF5B39B48E341F15458F279E95611 +6C4F02AF2186BBA5366B76E65A1CDCC63597B4A6FCFEB74A7CE0B41A83E9A86C +C7D144CD32988339CC8ECFBB46CC3DD5FB15071E7CCCA8A6CA5B4388E2D346A2 +FF583E0FAD181E66AEE9D0018F4ACD612BAC372E4E094C740B86A39619028BAD +DB6FDA2B2F174467721E2A95A192F9426B09297D19BFF69084A61F0AC860E323 +8B8EEE67DDC69B420AEF3EB062A40EDCC5090AF7BFFD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI7 +%!PS-AdobeFont-1.1: CMMI7 1.100 +%%CreationDate: 1996 Jul 23 07:53:53 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{0 -250 1171 750}readonly def +/UniqueID 5087382 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F +C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B +B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 +DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 +4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 +FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB +76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 +123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 +012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 +A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 +44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC +4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 +01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 +D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 +914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 +261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 +24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 +A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 +9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C +889787CDC2B7473D4BEE78E00E265ADB7C0CEA8499FFD61EB3664747E10CDCD2 +4C4CD8B6E1BF43E47F2C095B3AEBBF83DA83054E20DD03B85D9240595447BFC3 +C78A3A1B96AD63DC9738603A2A6B44553BFDE018D6538D7D37BB98BAAEBE7287 +336E81AFC2764ED0C485237D6875761D847CF5DC96D302C88830BACF471C4FCA +8784636828BA44630299A45A72EFAC13B6941F43F7E3DABA8B45ED2A4F6DE096 +DED341AF8BC1AF12E79740055EEB64B872243E908CDFB7D3D9E0D89E556F959F +708FA201A68B0D2A1DECFC8CF792C31AF8132F17E6371B24EC9E835A9CB11F0D +27F13B62E3181A6C67763F4195212790189D95F7CF50F05ADCAC0B4E9E859D8B +E7A02844F66B8A3EA384AB5D65D96549CDCE00E7CFF1BDCB0CE3ED0BC2F3A72B +F1D62E3F45A7289BC9434DF8E709FCA8EA66BA661B3632ED15D5E1B9F915F460 +1E82DBA230492566DF9329C8B8CD2DBCFBB6813F14851FCDFFA6279F39B0727C +E60F5177D9EF0AD4A52B2043D14DF18C6DD26532DABD77A57FF371FBE2690E09 +1EDD535D2B2B4681369A0CB716BA61A9A5AD4BF1C629BEB047E1A3E96210F00E +B81CD57EF40C06CCFDB56061E9751705F81D8086F00657D4BA65604239CDE406 +7F6A607261FE7AD2CB9F24A7EAE10920E2EA30902DCD7C8A29DD7D4B7750BBBC +E1F9A1EE82129D4A81B4B1B62C02538D86A98D0E475CDBE884BE7C3F24BE9891 +7BDABD2ED1089FC7AEAEF7AFC8551125FA741EB33CD39A291A66D498D70CD647 +39E5E50F4DCE1292553F92C6BEF96A7209500280BABDE4984D638C6ED413524F +2CB1C5C1A388C9354DC5F7F6038781797384415CE912EE766C01550A6212969F +701F445EAA9444F085C92749D6612CE0E5642CDC1ADA9CB13507A33C59D0A7F6 +AB0FCB8E3AA3590A0B1905C5934B0D2469E4D311B5838ECB0E154D6BDE574C24 +1DFEDC436B6D023D68EF5FDF845347A7EF9E701573D66E219602E2B266FA95A1 +2475EDC3C6D5A7E7E961DF1A8109E977A70540CB6B4B9D9FBB8403B127A8FC57 +15B100F35A9862ADF9A3587078403FB0F2E5C16158CC507C5689BCB217C6E9DB +5BA0524AD8FDECF129B37A4E6853B968247080470AECD9423C6DE89B2787390E +F7054F87D836FFA1815F6892F56334BA6C7E3BB8396C4540CBCF725F63C3BD67 +8CAD749DC3CAAAAC9C23C9370478C8532031E2E4878194DFC9ADD6E9271D100A +5560EBD32D236507B948FFA59DAB8FAF083FDEB01BA19DB1097DA0509F23B903 +B1B394C6DD239F1D61D337555A856B1C9D316EB9A50C61FF297D1500F835CDA4 +7006F3F3F694AAB5935F0827E74D2649CEB948835163A131269DA357910F9186 +DDA9C3C20257D251F74AA50D8F16F744C29923C98D944CD11FCD39551CDE3D7A +82783E1AF83EDE4C658CA8C2DBD10D70233D30D559F7449CADE9339FC5B5B02D +1D9FCB2FE344395A498B6D9A5F5B5BB39FE0C14A67EBD9630F810D08AA2DB838 +BE425BEF89149214346AC2DCA5194B8450B12B8789CDE3438EB2DC2BC4B90077 +C3537778D71803DCB7D6A01340FCAFC9910ED014A35FA43DC0F0512C924ED96D +110F38B587E74CAB89D394F7AEA374D32CC9EE5ADF055102208A9D23A85DE08F +389A4CDED358A3F8ABD5D78005DC4A64170B673A313477B0510604B40C50922E +75DA4FA75D860534E96EC0467A7996C57BA4DEB2FB4A1BABE4250B13224025E2 +9D922BA59D8971F6C77BBD79F087B1251086E05738D7E7634AC2B2EB8D0F996F +75CA0EDA110653DC68F926EFADFC29710ECB41B71409543727B6EE97E6805B70 +50043860E86AD3D4C5091215231A696018FCE311A4D6824E079A0696A390A14F +B57E72B20FD8E4392059036D9E2F1A62F72EF887FB22AD76618BCAA7570CEE12 +9490045BC0AB90A6B15587505FC5C111F4BAF25E6715C177AB483125A3C339AB +3466F81A8EC54E5A9203ACBF6BAE0FCDBAB7AC8FD9E95C9951F0D410BBA0253B +70758E9B90A8592355F091D28E7A0DDF856CD747FB664791B81C682771461503 +19089C771A6CAA0CFEF3DB3A82DC4CFDC3CCF0FE01992CA1024E81CF3C1BDDC3 +0A58CD5BC1EC0D4C6D10888C778F7F5CC57BADA6EAEBFF35BA84E0288481ED98 +7CA98511FA50D68C43D4E66D6199FF99C610638CD409ABAD4E5C3AD166083264 +0A69AD6CEEEE1127106AF08848E49139D0BFF10A2CDACCC4CC2ACFD6595ECACB +106AB8FBD46EA8DEC53648789EA59FAE6F91D54531BCD615165074B33F78FD5F +B1594009A38746BFE9A692B95F4860DC87D6A9BDCE4A51C72B312C112E7DAD5D +7946B9A37B16356B1FA4241755A25BAB484027BBE1ACEE1BF85F412FF2C0BFB0 +E3F35E73B0EF286E5EFB25104139BF0B32CC1464372E0486C6F00E50C856145F +98DD4EBFD7FBB8D4C1CE211522B99879C8779B4A26FAE4AE2033DCFEC809E255 +911876B8B0308FAB5E3AB6546D2094576FA56A8E710369BBE4CF6674259864E6 +61DA77A1DC223A8E495FCC4BCFC7E72F064C08986C607765B5CE7F9BB4E56451 +A721AE5DC7AA084BAC157FF01B9339EA18561E7716F367E4091A92DFCD1535A5 +1B8150E04F700981B8A6B57AB90079B3366ECCFE1FD4599739E387A7DE21131A +F4D6AEF19071B86F801153D2AF33BADEADCFAA00667928EFC01C7381FE5A17A6 +EE85374CA54EE965A94CC2CC5567A7FC309A6C9F5C46E1115BF3A3A9F1E75B25 +D9E0134BAB49C7DD7C1CCAA9470B9BA92E5D5020088397A35FE0DF12C0541AA3 +7BEBC0A47B683B5465B88644DAEA1C41B567D8F0FF216C6800DFA7ADDCE0B381 +42B580FA364B55B50C0208E80D32DF587F21227FA3BAC5B5C5A27B83D6FC46FD +0AE0E336A0BA1974F702785FC4B9DF4EF669BE7EEDD8B1D4068D10D8496940D4 +5BD046B0349879B489B81DF714F42D06DAD62E104E95DF0790198DFDDD886775 +E4BFD75587598A3081910F603C06D641CBB733ED41544BCB8F49436CB86E2FF7 +A992BD1D2177A30DEA721C750DA91999C0EDB016AF96BC093F8F30A1270306AC +E7675A3B2F478EEE65343A11FAAEBFF12CA9939F6776058C23CA5E09D7139D2B +D39F0159DB7FAE91646FEE624F7F87E5450353A50DDD9015ECAA10D21D86FDB5 +21532B88440EC03FF12D6EE5F2C6543F569C9681CB7090143B35707EE517516D +5951A6FA27855CB86499A2F06473152C4F4DEC1B9ADBF25CFEE0B7C4C135EEDC +83EB2147E1592FF50AC12DDB268C5253DE6BDCF7D57BC71845EFC29C8D20F856 +F925E06D7AD1514AC100B268204FE9AF5223EA85CE9F33950258FA2CB7CA0C7F +4A5B449352B32DBB39FDDC41827DCDB2E84513196A17CC8234BCE974DC6ACDE5 +F2E53353B145958868584AD58AF98CD765E2F286FEC1F2FBA4BA09D2F0908E29 +9EA169086F194A068A696DCFD8B53D3036597205FA6DE247530A2209CC210B83 +D7BAC7CF8F5542F80B43FC1FEC6C1E35A4055DF8C156D407520078D307F2100A +F31F94DD69538043A1FC82633F60887890AC80C529B7CAEC670D734E88EF4232 +B361182687F45924A7E9BCFFA6F6C41296A1FBD539E416008D2F35CFB3E0D662 +FADC2243CB8947AEF917E1C02FBA2050BB432840C71F986A7466D3391F0AD1FA +283EE9BAC0F8C2D283D33FC02D96C690D0D4E45A471BE4432935B095B8436A5C +77D6A8E69EE39388D151B833A52EDEFDF3D4475B0F2B14468B543DFB009A760C +1656FC0B9FE61334C8AAD10CC4A3FD4096BDDE932997DB92875BF73A488F01BA +7BE3C50E5C731894B7F1458D88025D9EC7B69B05267A2AF3DCDC57739D6A5B34 +5515080A4E91B20DBA5953537D3005EB2FC84B78839380BC93DFEC1050E1F19D +6FBB416E3E9147C3D7F3C6C1B42ABFB865808154FE03A9F087C5B7AA5355739C +364D3AF430C29E7251CBDAF40F60BDC1D24325FF33DCC6AF829BAAC7F9145587 +AAD8075A151B1F506EAD68134BA7B3F60F711DE62391AC50A8681E114578BB5D +F4A8CFE1106D14E80131C07E25F753A56FE4A84748D9310DE22148D987704AD6 +FC7558C143A75BA9BC0C2B19D76D7F7F604432D3658EB9A521A3ED79CAC7E4ED +4E774A832D92CB6937CEFF69E32076A25FBC4406261B0C8A2C9AFF74D424E520 +8E70DE6BC93CCA560FE3147758B980085239C961547DDF35A6D20FA016E1B37D +F4837A65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +/UniqueID 5000820 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF +5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 +0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 +DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A +71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 +4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C +515DB70A8D4F6146FE068DC1E5DE8BC5703701F77F50FBBE021F4761B08ACA96 +DB5561981607A8BBEAB3F49FD8F059018A95D2C836A793C947AEE5EAB45815FF +7A18A4A453C1E8C10EC5E6020462A92A0AEE570E81752D6F6E82A1A002E55B6D +14234E5F0E23B2A08F5815EB86DDCFC9AD9650B988398BD3EB373A536CEA1452 +C6A865C30F6C348E29A2526DD001E54B4C7317C3DFF498C3BBBF51F8EBD5457E +58A4B0EA67193BB53BDA67F7602FF381B5DFA732D40A0DDFFBCED6134005A9D0 +ADC4BAEB7FB51956B5B6A359D3F2D497ED2E8C0F9660448329AAD5F9A8D4B92C +BF4E49E2D06588171644D0BA6E7FEEB29B075ABE770ED9B7C3744009152FEDCA +3803C6452E8E23724AE2003D20B464FE0E69EE14C6DEE26210D66FA08E997261 +B5A88A3F3BBF889F4F49B7B9D71CAD2F16FD79CBC6CBA8E5330A5457B17D49C0 +493FEB1F00D059041B489FAF99A524F561E40DDD6D090A2FA31E74A5AB5A6ED2 +E175963983374F201846B26F0D77C8AAC841C042B8DD78DC5C47E9C4B464220D +9969B5F3560C5EAE70856DC99533F559DF96BBABD4BA85A775BB15F5A6722B45 +A7623635963C994DD7B58C0B10B05433530EEDEE033093DBCC6FE81397DF6B72 +BBD0E897F9628F3C275750B38586BA7225C1907CE545C3BDB87710CBD305E1A7 +E5D453BFE1F85FE9205EEDFEE6F7EF6872F1442BAD15D918E0EC836BE5924046 +F44F52CF048BB3FBD0573F1EFBF8D34D1C53270B919EFF5FB1F6BFF8BF024F43 +9B0B55D56CBFFF9FE57D356640284199C65C882EF2FCDA54C0E9F111467DA670 +821C3BD88D43E8C66861C4853E8C18566A59DCF4CDE47031714D24B5FF66DDFA +8E675C31EAB63790BE5F34B15B2545D2F4DCCC6A92D65239AE42A54B5CD59885 +E8D5CF346B931F0A89631BFF94FEBCB167DC8999E2407C96D075172865288C70 +0031C522E1392DECD858506CF4F8773331A46C5F6BDB8E0CB39716B91BF3F7BE +D21414259B13228051FD8F56D58F37F0E4AB5B9D1D200320F078D19C755BA127 +2E60F134C204E3EBE66D0029D5FABAC54B00F899F62F6B7164E365D9DFAEC6EC +A4E9F372C2247DEDE433C550BEF87F9C67B4B2B2EB6963BC9A255609E908F19F +1890287623ECFD9C914DA4BED3C7DB8B178A85F42FC9A81AF7EFAC471CF407A9 +C28DCEDD8EE8BB2134C2B911AAA9946941723BEEBF462618EC2B2B16AB4EFC9A +8359373610ADF6E7B98239F90705B8A4441A7BE15A9E6E9AC8DB4ABA1F753C96 +2D9DBBB9AB88FC33E8D6DAE1DCB8BF625DB1E24744B92B5D0F31D508ED41EA50 +7EEE872CC7F2C849282D96F150109FEA36C618285552C0891ACC63EC64A7187F +502AC995F693270400F6202AD3CC4F6B28845CD7C092398137CEFB5410F65D79 +7705890F10002F7E1BE61D1DD1EE3C0C6555417EDFAD16432EF5212C27020E37 +B327FFF75B06BF6CD236B18B7543180F67FD6C6EC6F9E57F517CDBDD263FA29A +4DE7C7666701F5DAA1255FAC000DD7CBF1EA0213565CA7598C8D4492B8FC5656 +9E7934B57E216661FD5769BF80A8E895851868EB88E508998A549AAD99C6A3E6 +45F313B4E9C37C84B90AE99DEF7D92AB383770F891CC3831D5924A069470209F +55506738ADFD757FE3D7D13D60C8BDB8550B951D7AC1A5458197CC992D372709 +603CF9EF5589BF5DFAA67B505C57046DC272B47B4CBD2B0B369C654DD279CA2E +51F325BDA71D4CBACA68AA14BD6E2F4715AF488F30B90A54ECE3A3BCC6FEBB30 +A5490B558BF240748398A237604E194CBA89B82333C39573A3E797D875CA95BE +B35E247E1C0C39F571871957220C15F0F5FCA5FB9D4C39E9C7B0C119B003D283 +8CCCFB48D2A3340F50E275EEBF21611336796D9F9062A0AC07F6B3BFEAD6117E +BD7B72D389506CDF553D42B7DE59514DC2C97A85761AC21F3A6315ADBAEBFAFF +E3272955F459FEBACA7387D697FD12D8C81AFABADB7AF87A65E5F34939D80FE8 +9DB0C001ADD40FD8106E8EE9D79E20DF186BCC42BB34B3F2585312D391D7B272 +D401714CB16C8BBA024DCB86B9460C8FA84C414232FCB4C18CA01CCC7937D989 +B021A75ABCF4D82A2A3BC22806657C84AB0E44482F7074BE7B26B40F79C19E85 +3BA9B79888AF196378F26617DB62DAD7BE9116F9903D9D5278ED39D6C2F139C8 +4EE2C95B2D78A8F4BA24C490EF4387EC10CC4EB9B9417DAEF9789C5AF035EFEF +8AC1042E394C93284634141DD328938D7D6C037F97FA13D639598CD3B6ABDF87 +94FAFE71F7CF9F99A8DBCD538E56200C5E4F494D2D8E87340A076E674347D410 +0C3229970431F71DD924F3BDC1C2AE2307DFBE5D304B7CBB3BBA5B657312CD4F +AEBBF7745BBA9E6AC017C4AE890960E5DCD0E678FB5BED824CF3C07F41A998D0 +D581CFFA20BF65127AEB0B2378B54F1568644C8036508E73E2681DF6C4454B12 +76CBC6DA1D02CF476772398299D758FF9E8DCACD07EA20C22DF96B1F4FA821C1 +13677F05CDC5E1D5BDDD185D2D4D7E4D091CDC37F637708D21065616E589F1C6 +17C3337B5F200068A1DC8A2AEB373434EFCC87242B3B734D8D38194F93D7B685 +6EE745BA14B99A76FFA6E0E3067FA53FB22D1EDE34A0E1AE4B3D96137F82E434 +3A129A621A84E1758D467D7A32FE6CAF8F037462EE3C4CE3890E16E171968BE4 +09CE904EA453E8A216E8BC7855AAD4B47941DEED49A2EF0BA97A9291326AC112 +1A5F7240A4857CB546995110462980BB348F73D06F704A2653AEB83EC7475BA8 +1694291E38DD439ED61681DFE9D2F4FB1525AAF260AF20E300FC2556711264E8 +8387DE8C0398B709820040C0E70ADEE2DA024732F2D49D8CB382E8BCFAA0D14D +2D5B19A083D5C384839DC0870F278E1EACEEE77BE5A9808979DDCA8155250E99 +B0320FFB9A7BF4A90F21434613AE94B25E6BA8883943B0C62C8713EC2B309E53 +66E0D4533D20A119294A99CA4FE3F69CFAC9179352ED4AC2A79446425614C3EA +7EA116AFC6B4AA795F4C33BE7BC1282C5B98D429A3AEE7EF769CBC99AA527772 +5A0BE834AF64B4CED9EA564981401534E70454F2BD4509A66C7BC635CD87C51F +5DB29A2F168E3AAF7CBBA9BEC13B342D6084538FF5375C6156A5FF30602509F4 +432EB830908589E035B4AE309A27B1F5EF20FCBEDA6EBD66AFE110B74001BA54 +F8334C774EF2FF84A48EC4D755E48152D257AA89B6FE9D6C737FDDC2F5E5EDD2 +485F9E68A53DD5AAC417DCC3404257639C181FAA6E90742B036A5B38CDCDB9FA +9AFAF14DAFB64ABF82F38BED26493F771548A63B309DCC0D66460AC9E3403B45 +E337C56B18E5279F84880F450036F12835B8EBA49276C15C5240EFC55E8479BA +1969CD205554C23B4081078FF461D9DA489885AE078F37F6235FD7075FBFD32A +091F077E3FA399722AE0CB3FC8CC33808D5EA4EF78F4873FECC4ECAC923D8276 +7DE9817546A7E4E6DAF4DF0CC479CA18E1B856D960ED462CE9FE1FB8111214FE +4232E498F3D17908E7F305FDFB6848E7E8A61A42BA433778E1B879990B0D43EC +8BE4BF788783128B3AAAD62211391B2118DBDFC3D23599D8A80A12697C3EAB24 +09BEA0F03F0B19E34BEE2BAF81F725D88591E22BAF855DCD46072BEC22D8B396 +2767013A03708D147FB58445B018E4F12DB7E09C656CE0F0B65D0E21B02F2116 +483944E2CCA7A24B29F9181FF3FCFB7BA29251821661FF9B450E93E566E1C5DE +41F4EEF6843D35C6A0A333992111E886DEF5BE1983A2DFD0834A1DE39EC62DD7 +F384CA8A60E65D4B69BF04388C67253762AB94D1A0F6516D3088311B483D1C47 +256A0659726C25C83FB334CA8EE22B7563B853F206831EE1F959A48E234EF9A7 +269EB4A50FC7E255A728662BDE7F411A4C14428FEC5AD573AED827A782A57BB5 +912610DD99869F6252743560467D639F2517E67E8DB161A29826797C08DB5842 +DDD4075935E2869956B46C818C7BE799536C0EA57F4F462BDD9AC91B8C8D3079 +E74BB5A23476AB4884E8D855C09C3E3ECB83FF59AA1395401B13701BBF765F8F +A8F28533DD740D42728C7EFE6EB77DE58B01B112AFFB1CDFF08034117C19646A +9B1491B7C829BF580D35236EE8FC4355E7B5B30FB2B440146D5D868EB2D95D81 +1462A9A6C94AA3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTI10 +%!PS-AdobeFont-1.1: CMTI10 1.00B +%%CreationDate: 1992 Feb 19 19:56:16 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMTI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-163 -250 1146 969}readonly def +/UniqueID 5000828 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F +21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 +06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF +55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 +B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 +0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 +1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 +7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A +7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 +356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B +19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 +C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F +244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B +AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 +5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC +D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D +993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 +2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B +E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 +309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 +F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7 +E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66 +AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9 +17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3 +05965AA02B8A67AEB04D915DADC1B84A531A1D60569ECC2EEFB7B6B0263B8B5C +E6EE63CED9FA74FC7C03610F6394D64BAE1BF3B50FB613A39C300CA5F4F16CAE +F9B9F4DACFC69B69AF30E4FE9E41A6DB0FC987A13A3AF3F99127E5A44E7FE781 +399BF303B773BC0096427B18DFD0DEACAE196EB3927A7EEAE0F6DE8434EF0873 +20F134579D9E18D1E0A10DA116F544FD2B6C6917FD8B2BA682D2B27DA99555ED +7C47B44193C623C871703226039460A62C80D6FF14121F46F03F0062E0E83ECD +C37CBF62603F7C3034C2911FEA79C94AE4FFD25484B3E03601E1B002F074E9CC +928E4D2E0597F02095094686EBDFBDE5F655BE53DB132D2FB9A18A88EE0698A9 +13346A3C39C11C26DB801B781E4E5A8462E533F2F07CB7ACBEABBE37F443AE4B +62B55ECF92720389E9F4EFFBD73F170754D342753F759FDB0B98B977F66CA563 +4CB52D24ADAA91150C56338ED28E91FE4E4356E8ECB425E5044378CFA60EB0D7 +E085204481EB71B3240ADCE0F49EFA5571C3E0DD6EB29CAEB5DA6D4BD05CEDF9 +1F077CF8476BCF08AA0F785CCA36AED2F7AF1E66D3DD5AD178F97C20204B83A1 +897F51AA59DA45DF1F815E3B9A41CA8F16263775C7823902BA39A6ABF6CFA3BF +7A45CA7DA334791E05687BAAC35D893C33860E73C7F5223718DA50EA0C5C5AB9 +AFDA68005F20E5FC2EBC57EE358620B300237218CCB1BF49E36F9D710F3973F7 +79C3B753C044D77656EBB2BEE67F424D2997AF3D61FC8974410D5162E1DCEF41 +FAC3711DDF25DA13192705BC5D915AD55532114CF28FF576AC0CE04E6191EEAD +F46ACA1FB5423D13BF154C04C535A9B02A330AE72DF349613B0BF0EE7ECFAE10 +F70F46C24F29524A8198A08288169E70855E9949A79225597B669D5EAD516A1E +8F617A3EC4CB30D3F24526EB12A60D6FE5BCD3760351834CAC50F94522DDE187 +4C22E49980E29FF4147321C62F52EBB5147AC0C7DA2FCCC7F5064FC10160577E +45C6DD9647398AB5B67E286772D9EFA65DCBD279613F9FFE16A802CD3CC153E0 +860458959D7F39BEA772DB33CEB992FB725FB7B52B1D9551913C445D6A88CA6F +51CAEB58168197F0E9DA1C2F9D9F71AFD8938BD4A88FA4A5A287229DB00F1701 +90EA840772A02CBA94B89631D31F733EC5647A1B74D7DE1A6198FDF07C89AC4A +CCFA0DDBA23E98C1E30AD78B9FC165FEA09B3589C7F68F481018352DBF007250 +4EEB2039CFC22E5613665E6C2299CFE67B31DFE436709FDF7FA4677FC9E198DC +D4DD29CFBCF51575277926D4B1D298002D2360B50479DE2AFC52F6708332CC1C +6755EA8D8BF62872E2185D4D23372F8E5149ED31F17CEF8363DC770CE4555998 +81F12E9B0518AF9C313C32F2E32E2297B08A1C1B2606CA4FFDB8C37BFE0180DD +46A8CBCEA8641170807B24EA729851B1C65C1C0D7A04818741643BAB5BD208CA +D2F8E029F86DEF2571476174892C63A85931D9F993990CD0E581848304A00574 +D550EAC3B92D84367D91E7273912089EC98477409B086923EF409EB45FC8D580 +D7682DB4268F21BAF5FCED6A9F0ADE040585C41E2B38A21DDDA7119B4BEF3CBD +8F35C3F869AB8DA098BAD1B2C8424F9597D97BB36CDD3FCC83F29306993DB137 +226145493E9632294CD7AADB7D6C80091159BA3886EAC62D5A25319BC2F0F224 +321F0D9806F456C2D11559CC2D74B006F2EF11788790061E1443CB35238AA390 +790E90C4C9F2FF9503FD3E9FA8951999AF20CA83A8EBA3143C271AF5B062DBA7 +E02F70C4636CFB2458A12C9152C65616885395C69E67D22A092A159228D1CA5B +562594B595C41001474711252C0B6656B5D3FE1A5CC50F6B4D4E54EA7F37BFF3 +C485AE3AAB776E6A354E904E0AD33B00AEC02CBAC24B0B2B60ADEC353372E13B +D1FD01675BD1BB251D85E73684D5364ABCD9AE0004AEB74661F3185EE2D1F18E +CB48B4F275C6408B35358622E1CA0663E115EF4E1846C3018476B5F9BAC90902 +21DB96A25EA60260245FD9172C2407C28643ECFE0B34DD95AF25164A4A289461 +5B9E8319E9DC25D55F8993FA755C0F154937936DC4B8229720BE9B483DF0C971 +0CC6A7E6034434AF7F7164239D5DEC9EEBA4ABA9EC940ADF4100868DAA6B6921 +23CB847BEAA783A07233A3A35F0568C3360A28D59E172FBF6E06A88BE2C07E75 +121029EE403159C5BDF754DF352FAF353616E10DBE0D78F1DC20F24335DF935E +4FD4B1213EC75163509073513C600B5775712A5F13AE90584102F31E1C51DE6C +8F6638CF724287061D7E17A5ED495A10ED93AC67F0A954AC46B77C73D5529D19 +58B8343D2AD3E18091F70B5537691D103EBFAC583ECCBE2DBCA1AA83EFB8D337 +9FD800EC523172E5F192391B44E02450EEFA3180851F902C01A5AA36D6CC4FEF +E04F2232CFD2E0E3A1FD6E38E18CA7DB2291E64B890F4AE3E9000C67B07D5577 +5DD7628A171E82D233FB4632B18B24DF76B908D403BE1316E184E79CDBF17BFA +E1A0BBD93E8D0D11C8121895896150013F6CC4B36A9F9C08CADD20D9476D3BAB +DBAA38C2EEB1DD1E36A82B3BE4ACFD98035BAE636759EAF54BD250F4EC33189A +839C44F9162C2B3A94FC301B9F946E15316A908E296F74B4914AD3EA47923BAE +C973BADD34D301AF9984587CC0C71A540BD6CFAD16DFC9B36B5B1DD471E1F15F +3572D024261CC9F26ED19C01D6BA89C8A07E56BA94BE3E62323F7E80B6EF1163 +B9A9A6D1FA9CDD29DB236BFD3CE06BEAAE793E8204DE8C49F14B8EE0ECD7275A +1EEA069470F50EF23221FDA44DE1AF0352964422C715D522E3C7602622E02D9D +DE384F837B8C1044C97CB2BC36AE67B5DB26066DF4838F8CCB2AA683472FE4F4 +80CDD85297DFD474B67E303D6FDF483DC43FC1204B91992DE2A56F68634DEDF2 +2A33E123565B0FF98FD81A68C45B6F371511F6F10A8B293C59D1F73871AF4A8A +4D5D18254E351F37B3C8C94E47C90B36224916CEA1F16EA695FD967F79AB4AE2 +B97D088F0730EB1DB3D4B0BCC18B119C0FFDC0BF798DBBB380DBE60B82D58B67 +2F6102D8BE28E2F0415024A593205A98D58725303DDD19C710BC398F47A7FB4C +BBB4DDF035C161B40BDEC40142001D8DC1ADCD17EA6C14ED3A03523E5FCFAD61 +9DC2A389EBECDB600E9AE5984BEEE20E3FA619653783E7C8584C5C4689B43350 +541B1BC7E7DCECDD24910ADA330C68CD4CA31765340C0B0533A703B30EFB5A22 +23819ABB37B7A93CD2C2E69C0B2AA0EE0B5E81797B99F6F34A35E8CA75E956F1 +50AD3F2C3015B1B2E9CC261009B1E9FB2366ACDA3B1DAF39F479800D0F81AF0C +046B6A6B710EA2B41CC3B9C61C2CF56E30D21D28ABB596A1FEE0F8A3FD0B0F7C +82FFF39C6C08B3B9332CB68DB902EBD156A7DAF85A621B853C3F215E74915BD3 +8D9A4D93D40BA7DA82FEC0B2AB071E474F77D30A6F644E1C3454BE32A2F53FBD +00ACC0183D84ADF7E6ACE0D8A5AB0F53AB97C8DE412396E09224D76E00CFF1B2 +F508D856647F2E7F7741D1BFEC7A260DE76650C143AFAE619821D46B18A88F65 +A7B5595DF7FAC0924548C7D505C12F98326999A50EEE29EA52FB5ECE0C112A86 +C2D3CD515B09D16498CDDC47EE104DBFB607F086D3C27F0DA30E198A3772CBD2 +BEC842441F6872431CBBEA31D9B8297224AD3AAF94A17C18203CCC4701EE420B +A478354C700C904F6227FFDC118C5C5BA50F9E5F505327D41D6C0FD91AB4E980 +9C3AF3C3CD107A67E684F2926DA1AA76E46FFFED732E28C463CCE4794900BFFC +18F426D52E07CE060A99A4753236CD237756919B069BDCF0D1593AEE8AB23CA9 +685BA6CC198DDD870468E3907F1AAB93F5E88A45BE84EB54F953916EB3582609 +1C7B1CC352000A494D4CFC627D55DEE37832874FD8F229BF480DA17ECA96C43C +876B3A1595B90B19A52819CBB36C884CC236FD220B3D9E28E0B9C3B6A2189C88 +670919A0CA97BC7691FCD5CCDB205A753EE67896828C92ABE59460C47D7587BB +6B1B68A10825CBC070B03E4E264B963742AA0375AEFCF96F0FC39BE2FC8E636D +59B84BAA5CE57AC2A7A62F87562C05050F6D47376F9C3035F151C81C88100752 +69BC996BAC91A08F2BAC8D48AF876EEA2425387B949C6CDE060EA05A6725712A +FAB2B95914E46E7B029B74226465F56F67A68BBC9FB1207A80E24D91A18BF5C1 +10F193488CF71D56D896CC3C5D4BA6A44E28CAB7F1FD314B08B9E5F747D6AE21 +FF9CE225894501CEB001DE09048CFDA36D983A240F6ECBE12688467DEA0DCDFA +D95014A94A4D7137DED6D0A93E3836B9D66E8EC72D542E428BBDCC71AD3A2199 +0C8B4F9812B2CA59C9252DEEAD366EB024FD5D92311286D8F5F6F78BC2521E82 +08BCE4890873FDAD22A04F1300B69A207A691539BE0B3F3BEA80B37955E91412 +B917D7CB638C037A9FC864F52018EF68452E72DE7D8BA3547EDDD8861E9CDBE8 +82A6CC77A368443133D54F330EC6F38616F6EE171380AC8A113A2D0513133513 +8DE061968872373AB68B3420DDA47BC958B6DB27846A5C9A45DADF9091C39F3B +8C21D9CC0E91035C1B5DC7C32203DBA80151E7F9F8342CCCF896B9D899BDF42C +08FD26A8A1EF3C2474C8F00C01CA5E8CA8B81D99EB3B2EFA5A5D0F8FBB889E3F +B2B98B654B88A10583776607F29889457BD9B7BC896A5AFF37761520E6FDC92C +37A26EAE1398750700064EC3C20C5FBD50407C74283DD8D7CEB4078A9BAAA65F +2214CCF4BEB603A8D71CD314F59B85DB8291A7C04E3054724EEA023BF26AC53E +2BE95B5AD4F47A7FD58F146B2F4F8414921D87E2EEAC7EDDC2954A56687B60B5 +88C279D31CDA09CE2036E99FAF6EE3942A91DFC67E13D0C7D411C47FA269F1D4 +7B8980452BD3F1DD13CA59FD9EE2D4C9B0E6605F50E37736F0DDAAE4042B93BD +AD33E692EBBC3232F2631DC33E793499BEB79861064885C48280553396E9CF9A +C2147B4DB2274EEF735F855D4DFD07051278552D0741EABA6F200AA88956543A +0A0E8102B6AF79820534FBA62E0C0AB44EBE9FBC8E3EA81370FFC49CE72D1EAF +E2EEDD7A2F4A3DE7FAE68B990543E17CFE13480950AC5211C8CDDEE1B4E00E07 +F3FE17424907EDDC18B0B7C7286D6E7E1F6432AEDCFD46DFB434B725A8E417B0 +A09460633F717DA670821C375191CE2F3D5495B7B9F50BA7FF38E976AC9DCB9F +2DF6F34A55EE724E26D576A7ACDA834218CFE64854756E03825ABA5AC3C2C33D +407A726A69A9E1D497E60D8F2687F9718571BF5FC56378F08AB85983DAE2CDDC +E2AC6524D328E27B93331EE180092241679276D24F3AAF65D098AB43A26AD06B +99B8DBB205396055D16D0D43A4B17FE309A5AD3AF1A41ADB31B88C847554A99A +AD34138AA4A95542D22243468D4CE9D258D8304939E2F3EFC2184E8A1CBE6D5B +52C61F45CDFF88ECDAF14BAE3FCD2E0FB9A3D914BA78685EE9E57B2CDEBEB496 +7C0AEF869E1DE32D97F5C481020494A505E14C39B04CF13F30FC440F47800C3E +6424B86610A65E27E5F55C2AACA141B8E5014991DBFBE760033356FB6515CD74 +407899F6DD9512FD5DB8431B24EC6B3BA7A3E3ED1CDC151CEF16331CA60F9766 +23FA945094AE304EBB0321D6F0E6B954BB371E1AE64FA290B737A39EA528FC4D +3DBD0584CDC5DB2975EC16AE8AEDF18401DADC376F3C8A7C0650EED78C27ED84 +99AE1C43A89A8A850CEC768ACFB0F5AF00ED9AA77E9D1B7BE6C50D75CEA06D1E +D171F0FC8A595935BE2897F40165A417C69522623147C4C0314CFB1DAE2D61BE +9F4DAAF0CA69950AEBCB2E2924454772B2B486B8F72A0E54E5AFA140BA2860A4 +79F20AF9947AD5D571E1E5507EFCD26943429E5481128F30044A7A53520934AD +3B814B661CF82442C611FF3D21F698D46B3F8B4F67D7BE6162B3358F2358B0F8 +C11AEC7785ABE92F4DDCFA00B9A6724A4DA91996C7C3C04D597D27A78254A1C3 +002E540D3FD978CFE44AFDF20B83F30B8E388FB0C0551D7620A94F96CB3B9A1B +5A8395C04EA2E3CC46F0930FE758F67969BEC9355CB815A18B9EB1AF56B4D8E5 +2258CA467410941871C6FEDB7FD1680F40BF5B0C9526565DAB344E23B1989DD1 +FE4ACA04C5C6FBD692253DBCF21164BAF4CBFBE65ECA78FED100B4C8D7AF2595 +0AFCE2B1E67E2864860A0637915F9ECD1DBAA6C81D81B14C3BBFF6B499E364EA +B95B3F7773B28A4AA3402DBDAF5946BAB4892150393202A0E6B2F7AB8FD18CC3 +17C6F3D012FEE23A796FD42F78F8A44D9A7DF3FD4565DDC3766CC7AD303DDD71 +1F3853EAC8ED79EE90135E048BED4BD966910BB03BC162A8A64C4765EA4BAAA4 +F1F0161BA6ABDE194560EFEAA5E883CE46E4BE59B26328E104AC7BDECF40F10D +B9A19A7DF4042F70488D231A3502E582E06587A4BC75317C369D04F4077C67A2 +560C4C03B6FCFEC65ED92068E423D65350321B7279D4DCFEA9079649CFF26B07 +94B8D561D57732034C459F5C7F8B0C57D29F73C3F2E098AC6E496A7316B8C5BF +CFC6A8BFF03E44C404F7E910CCA9C519A977587C755E39FC3E4327B7800A6292 +863C6A2DC759D4B539362573B4394A29FC36137D2B4AFAC9B24B4A06527A2CCA +3BA45F10B2DED3165FD215F0A87D30BAA5D5D7C005C6D052360C4A957CE22FE4 +4B8EEC8855752782D8AE10FBAE11A00330F83107A846EDA0B8260AA7212CDFC9 +3BABB3F264237B712FD63FB2F47A57E038626EB0A3106C01772E358B25099966 +6763C6A5A3DBC43D41C9FBEDF36DA8539946BC7BA6F8C9D9508BE7536F92E1C4 +E691D0A8BEBAB1C98C1E8BE4CD734155E96E55658CA8B45C688C835E16621CA6 +123C51C9E076771CAC75AFEDB7EE5066CD8CFA29128B767DE87992B0D9F03D48 +9A5BB623DF241D563E7A74F24BEF1747A1659EC01023BB881B07DCE0E56CDE58 +F33D0A333653680142E0A85982482A59EC34D885471D45F93AC68D75386309AB +71B92E6C425C70B9D7BB47B50AE7746A63B7CA1D97AE22C4767E15F8B7C34C8E +11C737ACDA7DEEE2BC17DDA7F6DE3B780F2F2A935D8A2DC1622A1D899E8ED900 +41A66B43E5B287C105FB19F1B483E148D6533DD40257399678583B55DA40DD88 +9171EBC0C9AEE860C80DE482FECB699D47DE45FC9837716E80A2BC96A1DA86FA +01F0E8C5879F9E183B59DEDB6A02EAD7E9656241368D171784FBBB294933B5A9 +4F443997BEADFAF4825F05061125C30B6FDD07AEFB064451C75401B9D1E4DBDC +650DFAC548B31C16E912BDD3D9154A5AB383CD8684CA1AA9E584F086D2CC4647 +FE26791D74EDC051BB9E832701B0392254FB45C89659D68926F173A9558E30CB +BD5B4FAE4974BB93A294BEB097FD1BA8A717EB778437C11F93F596B48C94CFAE +0054673A090C7BBD12918D4D641D150D47AAB16ED2484C76622DAE9FFE7D02D6 +B5E490269E563055F9103E871286CA89D81E94852EE55064A66DFAD93FEA0191 +CBCB757A0B5A4475D4C13DC02B47215535A9797F2BB4D88A84661E8D30A45733 +299A0C54E987487E1BBBC30A36C559955414FB563C3B80F6C79159412C324E20 +A84CD748F8627DB1DEDDF19CE676D0C4777CEA8AE6129805B8B8BFA4C83B49E2 +F039A5C91261194917AF44C75450AE38D6934973600F5D9BDB3EF027BC43273C +1134CD4B1194775C5FDBC0ECAD7E9CC1B4272C3BF3557C9A3DFD9EFCD137CBF1 +0DDCE077891D15B83A31FC4AF80FB8585D12BC531B78FBCD558F75FF356D301F +0728345E31C4BFEA6AFA8AAC896DBC0082B9C4454387BDD44E16B82654D2BE79 +3E294D4E1E00F47B70ED79A8C5392D4DFD08490A3226639D8840DAE9115CFCCD +D186DDAB2103C9F206729BC0C3A550D50046F4F9B218FDA76C5C1B85559B96A8 +5E07736E24B6615AEFFC9228A74F7C6B3C07BD9CB8C34E475AF485AC0451228B +742919D2804168E11BB20A314278D9902ADFB08486DFBA43608DED1C89D48EDD +E5A3D4C0605CE4D88F0DA1092BD2D5300EDF0054B07865A526014DBBFB8AB6BD +805AB35220C1A5359B46B89C9452ABE52753EEF8DEF34BE06697A8342509D5B8 +C3D0E6F8004E8F36E0EFCDD728808D69ADDEB6992AD627BBD90B39B140EED01C +129863CCC9FDDAE6A73EB50D84F203342A4BEA2447D45737FA88BB5A09442DFF +2EBF4CB9A246A7561ECFD4C222FDFA38C375040D9C364A3B4A2B0D6EF59A851F +6BB2721A3D161CDE03E59AA2B12A5C43A793C5114190B60A331CD390F8D411DD +6F904318A45D4A550208C5D4464A1CDCF5C1330AB4FEC096E3A58E44F57C48E1 +8C20EABBA8CDF112596ADD29E8FF5797A6AABD9AA6B6D3923A547BC340A49091 +69A6146C1432604CB80E9747F89AC7277645468D98231C14B410DC9EBCAEA62D +482EF687083539167CF7B3410753F16D4E295A44BE9AB8CD250AEACECD322C60 +1DC8D43C949B549C5441CA8C8D4E0F8D0BBBEC44904562F15FEF31C3D81F5660 +14211DEC407891985134F98437C850C93870A4F8AC981B96702076AE5AE6C280 +F984160B2228050D31F09EB34AECCEC0AAA045A62054B7431300BA175B0E28BA +07CCEDC4E9ECD0C806ACBF26AB11E8B6FFE1646B82C7AD8A14998470E5F298D4 +073660D39A9D62F6C4CE4B66C8E5A01DDB74244D443DA84853487FD9F5222218 +F8C2178BB91DF2A64E346FA3000AF4E822F44C1D7CE75742B36C291A5DD29636 +49E6696826C562798501CEA5783696F2744D3EC8D84504C953D60CBBF0806B7C +041422BF6255835CF0DFCD4C254AFDE9F80BEE47159F8E6D10C520B9DBAE3CF2 +474B9F8BCAA2EE2FDCD39A428828E2B8D6DDACD3CB893F62D584D7B17172A7E2 +25059C3A3C8AE4F3E0B9AC31B00101DF87C8F427DB76F39372916FFA9EA419B5 +7303F6C70B99D74872FC7F82E50C1DAFAC912134F188B70546C475BE4F7F0263 +ED51173B68A87F2AD23125034AE1EF677F60980002DDB8F1D76E6BB7C79EBE05 +31B1C2AAEA65747E9FDD4E6B98FF08B2AA39F316D1690D264D5F9F5A264ECE45 +B07F22F2BD5B1E59BF032F5130432AB4E3B08C725B26085C8E1AF9B9D8E58937 +A30E3B10F3B98027FEA116850F1931D8B90D39D16FD755BED2B4AD47B0CC5FE0 +9256123CB74A69073AC40BCA00E964ABA2DD3C1D482868AA65C9A5166AD837AC +8B4B75F9D7C2EA9CA9E3231EBEEFBF7C79F1A5F8FF71B7D436F5FA967C11621F +EDEB02A7A922469CA2EC676A321C342262383045EB4E95B54A16B7B3CE83C90F +A339BDBC64B11867AD874EEAB0D81871AE524E5248ADBA781D773E57BED5A76E +1C01507191B836908344664B21E0F0AD9FD81FD01CB9492C0EB839A300B6A536 +EC1236D38D051AB628D76406DD553F62F5738BC086D281FBB29763938E88C5BD +EEBA0AE1007D8F59FA52070C03B9DA7AFBB75F822DE21FD2077529981CE65FD5 +DB0230EF1F2C1F4F1071D3C10F412D6B3587F5133834453F0195D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +/UniqueID 5087385 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 +990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E +6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB +DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 +59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 +D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF +8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 +6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 +1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE +03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 +95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 +74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 +3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 +47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 +AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 +42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 +40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 +B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 +9560176670870D5FCF426198619576A02FC22BED21AD729EA408C566544FD4DC +8EA5AC194456EA208A00303919DF5DE5F85C566B4C290AAB3282FFBE1D6632D7 +EEE66F159E5247C2FC64160A6A5DB990B374081645B0F31E1347764765F0F9A1 +2072550AFDEC88EB3B0DCBEFFB45BF003CB1DCCF94BB71B00FA2848305D5A411 +3871827F770DEFB850214B505808517A62946CD3C0F48EE2A7C4FB5195C28007 +F11F1F094C8AB55A0C035DD958EF78CF094AC323C0B95CFDB3A68A18C03E8A92 +0234124B9B4B17D25D911FF9D62815E104F59A1E5A0E822C72E8B26E4126F914 +DBE303783BCC2CFF60E9B6B289ADB536F7E033E2DCF32EAC5224A140989CE93B +9D0B25E308823EEE72B44D54C5474A2BB9275B2E850DA8090649B86397EDE8F1 +3D7027209686173CC35004679B5381C37ADFA907FB4F95C7BC547EC171290461 +1A5DDF9745966A669829D269CD99E8561218F3A172420D39EFD3904DAC0A1FCF +C033AB9D4683A5688E0D0D08FB5A16F513E9FB4CE1B3B2A87BC94F7610FB5C4E +E53877706F87834F082C79DB30F0F9FAFE134B6EA0785AA65707734021AA5FF4 +A8F454398AB3442888AB5A59484C82FD5BDACBDEED8D5FB79E436C7D18FBF232 +36ADD97518BCEB22A6D435AAA0A3FB9B0270DA43FAD07746ABDA3DE6CB5E1F7A +517BEFEA98C49F4C1CF7FCC6BCF8C997BC62A5B8A292F1201E6C044A404F1BE3 +9F55B98C5EF235C5F51E7C593A21BA174697E131D2FE4F71CE5AD95D2C421903 +D6B2B0F46B098570F009A3AEED82F87A58B4DA7F1338D2273ED1203F2ECCFDE8 +E961E59E7E5281DE21AA3BEC66F1CA88809092B4E8B578D72E5F2C22B5D70805 +6E945D8FBEC6A78E7824339F3E7C23F9A0ECD6F6DEB8E008F3BC00954DD67593 +ECA7227B717D51D5BA2F98CC1BE96321D52EC5B5D605082D039F37B9CD75CCF8 +69BACCF74363B52BE8D75C5700A1D0FECD874B3BE7B86716F8ABB943670266CE +C49DE85DAC325FA19047416F09FEDD18301F3FF69FB5CA4DE934CCC4403C71D0 +D9689DD010EC1E2AC9F98968C14B6594864779D563CBC61575AF09CD1703FA8F +29189F97FD102A1B2132ABD24D68B51FEEE7253DEF27B0FE00A177F3A26009C2 +610C33CFE54CD261651AC6DFC7A2A7266CA1C6F505F52CE9BE1E943FB2AF8208 +3015EFFC66CDF5D797F01FCE0741BBE9D326AE672D1D7C3AC9CD3F5C627D6683 +455AF2F45A2389F40759305D129AE7F4E0DD79B30F793032BB5B4E79CE589FC0 +81EB9A921423F180C630A7FC61EB600F7F34C6E593A9C1FE2ADC12A8BBD18EFC +16980A08C261E50ACDB172B27181750BBD45C443E03C57BA4D1CA7B09CD3B796 +692E94665F3E34008ED857A473C7DCF0DDF82ED2BFE63DF1DC664FFB3AD55D3A +382A2A40157F957AEC91A0EED9BD0C6435A823805820592357C2531C41FA16C1 +8256D02A1D59C39289B7825096B3A1215E012F8228C33B84BAD01CABFE155343 +44EE59D51C73E9A2D9FF53CC2CC781CD26B2DA71BEDF0AC01C8C48A8A8377E3E +EEC7025D4DE6081D7B25E7AFBD04EC24B7CF3948089CC8151BFB4B8C827190B9 +23DA249903C3BA1DBB1FD0BC996943730A3666ABBEBA62770225B3494D8D6A44 +96E4EA042FE91CA222849E86125E86D2DFDE7D8F85589C13EC83AC634C5257DC +0AC9B9E3297A16BE2FCEDCACF721EF3F8852043C0608956DA3900F34026B4943 +398F5E1056B337C0832CB1EC854B69C342BDD9221D2807B15EB23BF86B3E8055 +903777B876AFC82F24967DD5C217B9E53B7FBD17605FB79C79C349242550D693 +6D2416B59AD3EA5E26C727E79C4A5CA9441134D616BCFBA1C225315BF49F534F +1F00D1EA017ACCB8B888D91C24F5167862432039887347F5918FCF54A591CC0C +54433AE1BDA243262F546FE8E4618B2D5B3A32C518F3454EEE1630C39A18A2A1 +2500E60EBAD5BBA62628C7C55E262DEAA705C438C2596ADB8415B8EAA4A8A99A +CF23AA1B40286CD07D8D2C192312D14665E2D0097933694F784D079ADEDF39B6 +0ED6FA879C524C63B6F6574551B95B076E0BC75986BD3D09E06EBC7E41268E7F +4155AD68276D8F56B029B75B5F4D43BD37E5154A6111EA87C8085BA566293BFC +F3CE019D9AFCC8EEA51E337BB39AEBF7A893BC7B0B58F9B37D086180B4F910CE +3E88A95C05D7E8D4A930F55B621E7547865EB245D418579605E7CBC041CC6956 +6B9A9EFBBFBDDA843C9504D73901192BCF51B1EA6784575A538B6B6C52AA728C +3A91008945D8735668C73BDED1C0859047FD840C1EC67C5CC3EDDC595427BDDF +635890EC296CEBA32CB6E8BC15496006AE018592D881CEE722F807353425D7CB +D286B59EC4F54DC62B674A24DC2F874719FA5E3C3C7325B1C442EE6F82EC9E5D +578FB40E4086BB57FAA52E01D98492203DA0E544D453EE80BDC5A96E039B29CD +0C46B2DFEB3A0BA4A6F296C7A93817640D86B3598D7D0F40105328D8CD2A1DC0 +D98BD24FD7A26B1F5256BF38EFFC69714107EC03110CFC0A3F1984210C383E28 +3838526DA360F9499B75FF6DA024F1E8F023CF13E2B2D12A5801B3ADDCA5692D +D5616131FE19AF576EC7EBA77EDBB85CE3B1E93E008E395358A778ABD6BE1C9A +EF3DA2435EE59440860E0C52D5FF197A7AE17112D060C0A5BF97D5E984835AB3 +38220A1C8E3DA6236641EC089AF2C68EBC0316B48E9D5A90566E89EC9FBC6832 +A0B1D1A500DB0A04E6DC99214A945A1E7758F73D795C47EB112AC71A8A7E50CD +C1B94CF0B96EEE0ACB643F769E9511DEB2A2FAA510A11C69155E77B11AD7E4C9 +EF5A940D26994BE432BA0B0E441402BDA42BCB62D5D14F1248A95A10E0920D27 +6F2BCF04A8580D11464AD44698BA1976CD97A10D7614B798559117C9E00B7EEE +A06E5A3500F38DD58D88640127732EADC4123AF5F1354053B1BD1FEBCD156278 +F7ADC502959A84DE73A76E48FB1F78F7271918DBBDA4574433AC2F9828C5CDAA +17F61524CA0DACAEC9009D30B191985F455BF097C043A2424BCD853194BFF699 +989D8CB11027444775FC7F552B0F15F9395298B48C7E1A8C36BB9F73BC898157 +BBC014C5A11B918834C83D4914E4EAECC8F5C05C2078587B876CD8386D13A6EE +8BBFA80A91926B2DFA5DE0B6A23A5F2925374F77D53B7602F8BDB22E161F44A7 +6E8CD27B06BDB5C14670F64E88E6445CCF72A221544321982861310D95A99C6C +EBA6F82FCEDA1A859D4344C94136E6ECB584C2E51E95D533FB29144C2E29A7AC +2B4D648A04FE2FF86DD0511D09348E235DF54507CFDEB8CDAE3476B6D82E9C8D +DEE266D458E862EB522AB3A07AC012915DFB9DB4DA1F51D18C95C69C1AE47108 +B956AE33224286A0FFD98D7DE43960C21963D5F5320C1ADABDC3DE50FE333740 +FFE70DC5F6DDA28F955E410AD0421B791C9CD906F4BEC994FBD3E27A9D45C263 +F530DCD5BC8428D7F3C0600CA4DEE1467F736E76FA1D91F72A04E73E3566281D +CAD7FAE634D6784BB7FC12BF2337921152FC5F9ACDD61125C70659A6132AD029 +7DAD35116FD1769E036C3BAB715F40B12B5ADB244068EA12F1DA74BA929AF45D +650A0D44CEB7E6BC5860B7059119747FAC8E9E980632CF05E9C9B9548B67C0E8 +A7E17D0B16339A5BF1B0C8CA53A6C805143B4549A29D8A4FFA02B05D51A27749 +4DB5827C38CFC270C939617BB54FEBDF6FD134CAF4FF791D5D061875201449D5 +3C9960D674C739C8A0936FEA517511D9F1D35DB7C1497900D309F68203A3EB57 +C075A590CE82044C060494D480D1C1633D3FC98F42B9ADDA927CC5A91B7F9E70 +A06AA41E653A9E3499902EC1D61076D28A0516B2AAEA2CF5CD91DAF43283BC83 +8CBDDCCF454DD917AEA63A92C82F996A71A0FEEFDCDBACD05505D2C5DAE7BBC8 +CC6167E9C392EDF4636239EFDF4104CE2C2CE70DFC3A1165023D31E6CAC53A1C +7815AD801A75E3C9D8F65461AF86C4054009DD55F0007578F4A447D56578C647 +5707A3D621D244B72A1ACC09C55E8675A2AFE45E6D5B2FBB2A0EF21E6BB1F3D6 +FADEF8EE84EB5567E1F4E0FE35AB4996DD8F8189A9A0D4FBE9B1CFAC0932CC13 +ED4D06669142533D1FBC3C2E6AE781EC26BBF69BBDD8EED6939D6EA6C9DAC635 +F883F7461F4A161B2E12D1FF0670550CA117C1C66D9C95C3BA31ED9C077287EA +202A5E2E9C94F6B77B3910E91FF1C6563AA8CCFB8040817D7E02B144283AFE7F +ABF11312857042E5EBFE4417F9640202B837B74B529B8F047845C017EC3B005A +871F7DE808FBAFE2355D365150586EB6D4CF9170D946CD2594DA53E7EC196273 +9DFBA8FA3CC2C08D3AEE25A6D43FABD897150CF72FC06FF7DE1DCFBD35F1AED7 +06D89FC772A1EDD449DB05CEE8A3093A5D8CFE2546ED87547E40101B57A972B1 +F4CC51098ED7B1AAC7E95D752369651145C6F0A77F7329AEA885A21720F46D70 +C48ABFAE74ACF95E6FC9C310644F59E69EBDF818FD9D6BF53CC4A1F36C0106A7 +22B8FAEC934FA0C6C17BC3F0C56E39457D0636CFC1F6E966018B9EEC6B278329 +482BDF7BC65641174457CCDC0EC7FD5F1BE549F80AC51CD55E3437C185BE232E +F9B2B4CEFF5999772946F6567070AB8A996FCF02CE81973C30D793A15DBC8DAA +2B93F019A58931C42A73E686C3F85910D18C5DE49550841388FF38F253AEF5D4 +6B00557409B607532C694E76D74B186D6311BB88BC7C2CF7D77526D176DE0001 +BE55A30187C62977221CE8409C96CE65B9F97F2FE7A4BBF837573611324ADB82 +B90C74D9B7E9D0FC96BDE0D8759EA0ED433349D00FFC8E2A4DAEC56AF48F7240 +036BBE64AFF09F08EC61F339AF3FE06733EC9943B53C39FC0FD73BDD72913211 +B6DE2F2B4D21CD3C47584AE818DB1DCE9F5B56D4227F672E628EFA4BC3A99AD7 +19C5BCD60EF653C8FDE4A53786D2DD0613CE0B754DC2051DEC8AA0484EC4B815 +ECD69ADBB71D30639ECBBFF5E351738CC24B113B3666FDBE220208A8AE012328 +B7F948AAA44706B8B4ACF67EB725B448C53E9201A0F380742A47A6533D70493E +1C39D3C10B4455AB6A221FD7E44C2215EFECD391BD2BED15DE1AE1EF73080825 +8F142DFD2E746547E9182C41F0EA0B84002D4ED3A50B4E5998B6DB54BF03EC14 +6682357F886B72E4DE77E8C73AE18739AA3090ADDA8FC432489855B2E10C50BB +FF1F4272587F2BBC05AFE07EE1717BE0DD064BA1A31DD4CAAAC0243CCF30EA5D +C8786FF45E85FDCEBA455FD05F77739DF1A56635B44195C02506F9FB4829760B +AD5649CF106F54542F112310420846BC1540E3379CD9F6E4B3F20984445450A4 +6DFE6279F4816933B548A40651D77C9384060F50F3949C20BEF0E783B6B355FD +5AC07EF6BDF954D0F765109FB76A356E6BFC9F0195C6C80384AAF9BA076EE3FD +384B5BD939A338E06552B687DB3CB92EF538FBB9B6D6ADF73C03029E47FC501A +69B540E1152F8F125AAB3D30CD44241A363F7701884A59D75B7E9CA73CB1CA99 +B914C2F84CA05780B060EA5FABCF3D6604FDEADD2B2E54A6FC5E412DF0CE0B0C +D5FFBC9A1BFFBB7E8293C0C8219CF690339B813F5A6A69D70D4A8154EE710E6C +12EAEA9BCBECE6F1CA23A67B22C48317B275B2BEE95659F57BAD23DBE705FF00 +1A2962A05B6557779A6996F4F586A0E3534C62E6EFA29291F532CE0A4EFD2C64 +CC27AEA2835FEEBA89FD8C3C475EF325D53A38D1EEF1E6B780E305DBF76B01EE +38A9DCB0FB72CDF0A7CDB32F8A008A47A778CF2A692D5DC539814DEF530B3012 +B6521306163CAC65BED2C3403BBF5B7129CAF0FC04BF9F93442CC1B9EFDC83E0 +3BE687EB157596937225EC82B0A2A786EF1A9BEA791E38B7453F160184041685 +0E0E339AA8A39E3A7E4844BDCD7CF6A9ACE21A42C60698FE9BDEEB2CFE3F60A3 +1FB633976F0ADA40EADDBD356D1F53DC268422AE716BB1A1A9ACFD38D7D00B43 +A796D01828E8B18910D0F63430D8ACBB2DB08EA93553FDA44DF19253E99CD939 +8AD0080A67084B56E87616287811FDBCF8C49928F2FC83E8227DC4B9EC72247B +5E0EE55A10FD15DD09DAA0FC267AB18A89E84CC438FFA035F99A7735B96944D8 +91B2789B132D1D7D9B3DF3ECC9ECA166DC357D943D4978124B4AF82E738ED1F0 +F2AFAC10CBACCA9F7D153022D241EFC7D4F3AAC4F73C1B6027F0A029313F63C5 +8C9399CF051978C25B9969480E5724E45DA2DD3CBADC7505BCBF9138CE3382AF +EE218FAC24BA299144775D838E32F7A7B48D3C26A0EA185522A9963EDBD58D7F +6631EAE420D0FEA6E3B88ED8C6515C730A0D60C57C570357B42EBA1A7D963856 +1B16A8F8286E8BA03051879C4DFC7DE30A0DB451A327750EED6754B0377D9887 +3A63F836C0D22B36D7D3D86EF29C86E6DB602409F425882A0314C061540F85AB +118EBBB2C3AAE4BB746A563E3F4DB66B84837A2C54DC15D5DCDDFC6A00536D3A +DD3A3FEC1536111FC3035ECB4A7A7763FF6EB7BD187F0105D11BF84027228A7B +2C8F38C58B4323917FBE1A07F99FE1B99AE65E0CA1088641B658F61134B900C5 +7114FC43B8EFFDD4AB982D092D7E1AF24235978BD82FF8E2F19A7533BB9268F8 +364847FC2ADACAE7170351F8F5FEF4C2F99D68FE66F1C20DD4FC3124D068FD2A +23DCA0C55719F5251835530575CC4874F65C1EA39CF16064CAD59D6DEEF87CE5 +7F54B34BA025100D098E61CB0F84BCFD2E36321A2F524BB140D61200F448D1CB +D53F813213FF06A990441C5EF5B3477E1D939E47579EBAEEC756922DC715D34E +75C5A7C37272AD901C71686F835D123E16FDFE05BB1951067404D9BCD963D251 +673EDB1C578E980FA72C683B3B5E17138605571912609876A335E82BA8FC8FA3 +8CBD9FCBEA83CDC66E50467918172ADFE8A1A954299D40D5471CC58AB970C213 +26EB7247BCD0923A892346C78127C294EAF1FE87FDE8ADE3998627C7712D6847 +4B31805A2892C3A4260ED7E49328B769411DF50B4C11944F87CD4FDE36A53F05 +48BED51ABC0555CCCC6B252817AB27763ECB6FD7F81B744456988EAB853201C9 +2FEF7CBD74144E7F1E8C8C7414554189CEA2C1A7F6EFF2D84E95CDFB931715BE +0CD88F222754319A90865ECA75A895836528A63C243C0BD279123B14C8C7DADD +75B7EA380299580CC3F0CBD148B46C1B1E93F5F3E534B18B5E3C9DD07CB9AF8B +F1C1C572C285A67A040604F5D2492F83C5D270B824DFDF023566A0724EA3C185 +FBE37707F4591D4489AF6BE57BED1EB2A90C5AE15069EDCC16528A73997F9C1A +4A08EBF62E74BF131227937DC18BD49721C09E375ADE15E72A135211A61B989C +D1B1E33F3FD94D89BC9FD0E86C9CC5039E7CD1E73F11B87A55FF888DDBBF3FE0 +203EDE5BB025484D3C46F8253E3F8258828CF833A23BD0C357C80D13EEDE01A6 +72920A5D06A0051EB0C3D88A06AE504AB26172307B023C22078FC3F9CD2E7D05 +E9BFD653EAA689627F8100C21C1C258AEBB869F7FB7F836881D969FBC4D60C5B +03C045EC61E75BF21089E3E96082D0BC91BD2884EC1929CC61D865362F18AB9A +32F32F2FA2138D0CA2FB6E1E2FC4759C49E3D7E7EAAA586672159EAD988079E5 +B9C6FC79FA9293A512BF2F00A3B73461BFB7EEE22A37920FF52F4D3A7D2AFC58 +5925707E7EF20511633D19E5B852DBA05D9514B482F33CA674113AE7149CAECD +AF110C6F932CA52401E7C0FD918221276161997A1233723DDCE063F04AD65A37 +5F90761E015C476CA6B789D2034F1E9A3358AC4328D834E811B819C6FB512F79 +18CE48BE148F1E745B812AFBBECF4251C462FBBB5632015C931043E6486C9A6C +3336E9CC1FDFF496D7CE24EC848840D8238FDC427FE147AE7EB1CDE81BD7727E +4F638AD9A20C854FD7A1E2483FF159096F3395EA90474B04C1EBC14981E450ED +863985CCBD14C084B9DF32F2E9E9557B6809D3714D9093F39E3F8CEB9E20270F +665D79EE67BE7359FA1261B5F61D0D6F03D522B416F4F406828777954FD66CC4 +0EDAFBC8EA36F61AE4BEF7957B952A5CF0EC7C05ACF780C81843A3B4E8EFE348 +DF1E820CBE42FFF1463F20EE9BE45F6C0E5D4C24C312EFDD006C872E8AA78495 +2FA6F783D0431255BDFE40F620E2B6B8CAA2A315A92699C2413E624BCFEC3658 +16438395A08C0EB899A9557C0E317098B595C8315F0B851FA9ECE4CC7D1D61CE +0F537065924308D5AF0B86BC0066AAB953FF040FDB43E7AF345DBFFFE17082AB +10C651DB7B549B6DF4D5BFC4BDA660848234A0F8D010F20A3322163186A0776F +2586727D451E365C143EB897E9E06E90AEA603252E31F4CE321BE730B831DDD1 +14B1FB06FDFF8E2D6BB96E33B0DA33C030667A2E8D91BE903A40FF468EB7E0F7 +D7BF6A02AF5673175D620A1E09B7C1BE88C83CF54C4A40C0A5E0C4C2DD190847 +A3EE682DF347AF0AF18E4582EAB2003CE1DA3991D2E8CCCD2F0E750FE05D6E6E +73A8630EB4F0FF8FAC4FB281B3C5C3A5E95A75D24F9DCEE57AEB6E1FD90C84D8 +DC1B9822613D17A41DBD6E4C0204F7667878950D406700089F155B5985DA3E6A +54C0D7B8AAF5E3F6C413677903A02D677F621E1E3596B78F4969840D689D6311 +76119B928A56323306F7CC663E685FFC91C2E87A1C1D56ED6C93B7D6A5B5B5A6 +BF706EFCFF2E4FEC4E3C10D67B46D0FA29B822991E9906C802BC9AC2F62924D7 +2499ABF07AF44B7DDABED5B2842499ED004167DBC3D074A804B0D2518E683807 +601E10827CD762CEDADD1EBDE0B63AA25C8109CE4CAA870E4D0DE79D831C098F +6B403D7F5217A1C5061829264B252CE10FFAD477A1DBBC68108961D186CC0503 +3368657728675977685ECE236A436408D29FE2D4B7CF8705013B3E29B41D0B75 +E6F81E7D7B6BF9CBB42B83C4330EA36E0FC611DC728A778277E7577C5797B90B +180782F7A5D410F93482910B7DDB40A09D1CD35184F5BE624F09302F9F84EFA5 +A64AFD03166832C46AD4CD8FF4418C65A2D09F69D35FC96AA2541BA1AC1F2CE9 +1B2F5DA6B5BDB49B2ADBD4248E7BC68DE639495023E9BB6C557D0429B89B8A6D +5895850E7D0A3E2958AA5FD4AA32C9D91C54FCD0F65C11AFD312905B9E6EF9AB +30BD0C4BF8B02AB348251C2B30D017FC63377DCC693A91BB7B96689ED2960DC9 +1E5044AFB81812C8F776E33F89C53A2FF7D05D67CBC9BD266854B6419F47F0D3 +35A66EA5D1678C0B8C66FF203D2D933CCB7141A58B858EC72FE95C0A32FAB86C +1C0E13404FAEBE11C1A3118D9FB50B460AC1B258376819E6C93F6CDDE6D51888 +6B290AF346C85BB7C926D595F824D9F83EFD7D1697097DD26163AFD8BC9DD929 +3C6CA68A62FED73D1EB703CF8176862DB849F5D3693F9E3C6471469B4F005EE6 +BBA24651A0DEAFCD033A8FEBA6FB04100B2429572C7B8EC4FD2A93C59A777BCD +1E7CB2EB86002D6ACF21C023971C11F453A92EB0DA48E1372B3D31C1002DDAEB +E51B3F65ACAEECFDEA264DEE945BE242B67A917307C707A05CB1FF864436B6B8 +65406BCF7A3829D280C04A2BEF9C1F2307AF621ED5176378E50086EA73C78971 +954D773D5638630A3444C71E1312A108CA24CE81D7DF6922C843C78620926221 +CC05DA3CF465B836C52CD1C676E6E2F9BFAEA2A477570A8777A8C0897DB6689C +1AD73F0B8E37A9210258838C1F6CF8EF50A9072D6DFB4E37A1E26C64DB65C16D +AB185551214E099551FFC868BCCD67F73D9B810E53E6D25D838A4A8DA6565FB3 +E8968F72103AB70E9E8C2FAC97F84ED01ADB6767D650AD6A28DDC9E79661BC0F +EFD5E7695C7D9E79DDBEC6F8FE0D1BB5589D07992E6BFE9BB9B3FB470F53195F +8C1F678B9921B68A781C129DBFA686945B6871AFD761202F505AD5C8B3750713 +88B3B5FAE3F1B1FC3CED21CC74B281492BCE3A9B4700A926FB281E3EFE501C6A +7D1A4B8A3038DDBB6C5D6D494FE93CC86616B26D0F7B2C65E54863471EFCFBE3 +4C47C6353CF3D5B0816C6BAD2A1AA86ED4514BC703D45D9FB3794DF5BB8BBA3B +473683E24353B9DF7574BFD1470FBDE026C937FD510DC26DCBA456EAECC38F1D +5A2647BBB67B44DA2488F68E267A3078F8DD532132C4FA926FB88DCED15741C4 +05B292C2BEAD1730B2817F438BB5DEB661FBF417C9286069784203BC5E643A70 +13193BEEC55C960846C1F4C5ED6FB3200A8400C50BFB2A1A8ABDA032C2859549 +F1BE68BEE4C3B79DB8A1D42F05C113ACEB76649D118C3472885492640176748D +401ABAADC64099A05C5663E98598E8BA946BF35D7814CEB2BF1B2F019B13BD81 +A4D02CFF954EE0C7A30C3DA2168AC92E4569EA6E65F9AFD1A289058F3E003AB0 +A853A265C696EDAE8856026C0CA2D5B9CE8A71807C06A5948224AB77C7269638 +6DB18BA9E2618A17911C35CFFC690B1A855F5C2A14FC04F45DCE58F86FED4F30 +4740098F46AED65C6E72B97B9515108E90AC625F023F0D1BF11A244A48CCBEE3 +7FA9822FC6AF38F0CEA95F5A732353476AEDA577342E784130D2F40126A05290 +1B9B2F5F8F4970D2B9750E34F08F520CE8895D2B09CC63F631B42804AF420A6B +10410D8BE9385A929407A5B41BC251A156428601EA3D176F4EE3B88690017EDF +D96156C5355F66363DDD7377938BC4FCDC499FA9427C61960FC1781167339AEF +AF7DFB0614809E3E3A073F788DC53CABC628F6F4A4EA603DD5CF9D8BE06BF10C +5BD7341080785ACE30FEF404BDCF40FC1DEFA2AC9640153DA50AFA84F1CC08F9 +C89FDDEED8D449CB050CE7D48B5B13737B747199C72F21F8D702F0FECE0FBEE2 +C99B54AC3D58168F07D42E7CE87CC92BA1DC73410F19106A7F7D6BFA739C9CF1 +67684B7C400598D0AA0AF79F059804537E0021877A4CDC8C5E7F516F22A855C9 +9B906618B6770FB3DF4F2E5D3D11DE724CF512632B9077B4395888AB297A67CA +A25C72036EFCB0F26ECDF6E31136E3B11F515CC329A156D0D4E73C6355882492 +544F32BBA141EB05EFA30954C540FCE415CD3201BAE222BFDF97F87447910C39 +EB68BE6DB21E40D2E483D792C04CB320A2714FF8AB5ECBAC0A85C6B0552CD3C1 +3E0DD51F17B4B8D81B20AD7BAD3E71AF7F6517A7F43464958E8D1A1E11E75EDA +FCD9826C201320143965D2F4E1EFC7A81730188E9B202AD186864C5E5192DB57 +87B5EAC82224BCDD1CC68338B464C5AAF79D0958987EF747E013F414DB35176D +A51973FE65015DEEF2E90286281DF24BAA3758EBC120C8018A5CC57E638FEB81 +DFA40BF350A558103D05A3B20132A204A0D1D550271938F4E660953069541853 +22908D1A78DE88C9D98D79954B36D926E1CCA222004C3D8BD7968728989C0242 +F1BE705FA2629F707CFF050349A3300F14BD1971B545A895B8ACF06AD3BBF830 +451BC3B0AEF51CFDADB6653DBFEF4D5DBECADD23B8E09672D0AC0A227A545506 +818720F0A95E80649EAEEB9AE5BBBCB0D533A681A694DE690EADA90AD2D0F0E2 +7DF4E733D685368475C7C9D3ECA99F70F129EB889AAE13FFDDA6FEC1F098A9C0 +07FC794E6677061602C96753EE4A02569D3466348D250CF0A01865E2739C930E +CC63224DA7309CC969E6822A532535CB3687A3139D46A626D71854531AE64DE2 +7ECAF6A750864CA17876814569FA5E09DA009EBB1654FAAA45CD2DA73FF981F8 +37FA73C5C4CDD0C78847AE1D5156FCB8BC98A3772D7E37F92379122404632C6F +431525D5B8FDE8B6CBE9EFA7E9A4C0FD75D518AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.1: CMBX12 1.0 +%%CreationDate: 1991 Aug 20 16:34:54 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-53 -251 1139 750}readonly def +/UniqueID 5000769 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 +B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 +AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 +7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF +20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 +B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D +68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 +D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E +26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D +F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 +77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 +BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E +C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 +30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 +148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C +E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D +E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 +337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 +0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 +472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E +A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 +35FF2C50073D99A7C52C5A8AC74994B1E6BAC878037AB76B193331DFA00BFBEC +389AF6C476A3F7FD9597D3FA2DEB506EF50FFD5104737FC9761AE3FE4B291D1F +26A91ED73FD4E65E2CE59EE714DC525F9897CBD1D844C4F6C3A9BA5C19B39D6B +F6CD530706E73855CCC9F6CB39680207FC8B27BF8E361E1DA6BB0FF2E4967F96 +A64F1C3F9B80780560266290A039F680A69D5C21630588F2F8C7CB0C42D0FA12 +77033062CD1D025A2A3E0808BDD6F81195D9C4784342507866487390F315DEEF +E353611A3319D136FD42F44F96DC632003E656A4BDAE4A59824F7C4B1A8075D4 +73736A581BFDEA1E77AB84EC7FAE1968C5872AF5B49B5EC8D5BEB3C88C01CC0B +06FFD726ABC7BEC857362066BEAD0151632E48F3F65CED9A5DD2119621409708 +83CD8913717574690B6AB5A56CEC5F49AA256322591942DE60B867C50B562148 +2CFE5CEE8CF32F48042CC30D219F7F02935755EE80DA985068603B762AC9E6D9 +578C329AF955BC8A588DB755D2E34E1D546855C4650C8AD53452B328A34DAA38 +28237FB20FD724D87509D67724FDA891264810BF7CA0FCBB7573D1B2EB9C5FB9 +0A38E0202BDD21744AC650C8A21D5EAA0EEC49ED5248F4FF8E29A43B7B40B10D +AE133FB0A7A4AC58F3DF59A8CAAA567C444AB7D38F44AA6BE56B2DA2F13A975B +B70DDF5B29099B3C7381D8201A41DE108A5518664028766A9FAD0EA13A0705CB +2102035C225B89C17A216CA90D220E9842E3758F9CBA61505B963E84189E9A5C +DBF890A2A45F39F86F67C369DC6F2E76E8FD2369DAEE8418569281A6E6B79950 +FB8DF17491490DC8BA791712E3E314D2FC71F39335EDAFC880873D7A72650703 +E7694961AAF73FE0CC8522468FAF6BB2D544BD49EF065CEBF26FCE1DD09538E3 +CAB281D5CA9FA9A8B31FD97D22D4F76457CAAFCFA9939B1F786C7645A8E04A47 +DA0DC490BE8CEDD23D4C18823D9F8CF0B103DCBBD3216F8EEED81E84BFBEEC93 +0E7D17784E1066605275E754A701AB4F2B331EB67BEF4685A45D388213D21F0A +F0F84193D4C3E91124437326E8E13284706DC37122EC896E2F18D0E0769245EE +25EEC762EA684109BB0EDAF3FD73527B6329567EA8C324C628BECE6B37F33335 +CEA67A1180BF579EE857438DEB64B438A5DDECA92527733490E47A8A12CDBAD5 +1948D633949C11DA71C6854E1A9920B3FED7EAEE6EFDC2ACA606918E5B9D17AD +2FE6B823FFE68EB884052311E2F59341E987E80DE9144E98B6FE3945A5225721 +4A771F03948945177A5B2ACC01539B013E54FD9A7DB151A8FEACB3457E4284D5 +4CE2AC91C8DA738051E34881F2FDC685C0DDD273BEAF8F4E39829EBEC24DB40A +832FE75F89C93E35B846626F5665C18001EED557E9C66D120A5AAC879E69FEDA +05885A892281F5179561F670C63DE8648FE8E7C04B1CE54D2B05DCD31CC7B54B +4415909E0749A50966FFF18E2017F3639CF3CB3D7C84542A0E0591E33D4D15E5 +C9165AB8F3E0FC5A555B98FC2C6AB580BC1D9975CED3898F774FFAF1BF862109 +0AC19E6880A27EDC56373EE479C8B5FDA88AF59FDF0EF849E79AFCE96F82424E +C9D0B24C7A767C984D7C285B199CB0A56A731383EE6A28CEECB9FA656C84019F +9B445873F032E989D55CE131D724875EB035E082BE404BD7F2F9C00792B273F9 +2E94142A6FFE91C98673F92EAC2FDBAC1CF490482C416B3FCC2EEC79D65530EB +5F874B3A5009383C7699FE928BD710C210F35DA23377434F1AAE333D52480487 +3DE7EBF3C574F3C184B9527D651700EE59EEB36BBEAD90163DB8EF1595C4230F +B5366782EE60215AF2F122E22FE40710FBF799B6AA328A24FD8226F8FF266225 +EC1E2ACD0470B4E98F5AB4A4E208283BAE090207A31B21B595F9BCE1E8E9D0B7 +0D637476F25E69DBC5BD581010E50E26C7EACDCF70030B462E042BAB5D7C0188 +362DBB4D943E50DB72619706B6AAD247470612A3DF403D0A880E92D5108A4976 +FC46C9B7594642B2E62926580F136B23098FFA3C3614418E87D0427928202ABF +5FA3E8E5F387FD6D49F194027FF6C9536BA83627EC5A549DE4D107363FA9D1E9 +920E40885554C0EAD0EB5EDE92844B1FA345CE968FBB0BF335494ED48EE8DBF8 +5D1B31E1D83F4C6D559B873510A2F4E4B4DE8A474C200F555E31287C955139B6 +81E5C932D737D58AE4177D82D9DF8E27E7DB12CA995A43E5270B582CAD2E761B +BD4FF0BCABEF271DF881DB68D86DE567D2F3D03B1978322F53B8E15A39E9BA98 +E0E791EFFAE0AE16562BEAF679030F69EB8F905AB9EF18FA12FB20AA51A2859A +180E2EE6356D8ED5A9FF57A915A7435F66E2B74AA4C67B682BDF0D79AF847824 +33C637453D5927B23FDE130D87713EFAF350144BEC2F71ADA6C2CE42D83C808F +9DCB0870B9AA1406F8ECC954683109846D8AFE21A3A7E202261B41CC721E6A11 +1F3C69EEC70E709DDBE3056939D17AB88BC24E5C39ADAF03620E249434F8765D +C1D35DD072AD102983FDEB76473081FB4F3159B5328DB5E559120DD3F9F2CC52 +FC41A9ACBEB2493C5DB98A4400938CDD862432E45D048B5D49E75656F7E95AB6 +C445D9E89260A6F3FAC610D890B475B211D85AD56BEDC3088723C414B1F2F88E +790A1C45CA9A0153432A55454BCCEC669C3BFF7026D3F5A8E9DA2B6FCA873CBA +14664D0736657586909DD32FAAAE9997DCE88B07CDFBCCC723697A8D4863B953 +30A55C5B4F13B0A8C7F9BA0EC72F3230F24E0E78EE768B410898C31D300ED1E0 +1D984636C66AF73CB089F631DA4A7FC122E4149A39DBFCA3AC57ABA5D6A73494 +4225871F313F73BAC597B5AC9E3FEB8BEAC9BEE448E7DB37E6ABF0DE302F1CBB +1FBF360FD9A4EF1D06118332CDB96998D8D26F96910F6A3EC6393AD09DC4AA8A +782DEC5B9FC50281E4DEACBF5B4F47A8EF827F730C7BAD6F224947DCC71D3D62 +A70ED9FC484FA8358548BCDFF1AFF124B00EE1E30286B6CEDB37A0D30C75E86A +A680683A7487F3554CAD50E45F1CBE89DF309ECB522DDB9FB4F4C3D4437172A6 +03D7D20DC053C71D5C12EDF2CA6A3340F25BF50E7452B42218C9B1CA8FA12D5B +2BADC3341CF15FCE1342078BC7387EB5E326C6148716558E983F080EB27E2C30 +B695CFDE2DB100CBD9AF7CFA02E99A91A400357C3AA29B2FE1633636101C603D +4CFB0E52E16AF001FC6C88A94887C36BE39A5BEFACB417449154D51974F6C1C2 +3BFFFC76661FC9C517592D51FF6CBFC77437606808B993E15634AEF0260F4017 +FCF6273E72ABAC97B0809ADAE44003417FEA16AEA3021A269883E4712F040C9B +29F7A534B0DA2796D62FABA6A58D0D272D49C9ADE6C726A23283ED2B0EF8A4A3 +B859B8CB775CE955C52D3493A1723CFC519FEC1C6DEB7427A42AA2AFFD429303 +BAD265B458B6282609B0B302DEF2CEBDEF7CC4AA2646895A916B620801B7AF1E +711DBD4660DE5EB12CE5550FB040D35C345F1336DE173F97AC8004989916806A +AAE89E4226CEF51836EAD16E84C25D6A94167832F6385555E950C59BE07C4106 +BD61D92A30CBEB49AC390C85F0DF83B78B60B31635AA39EDA6E788C17645C715 +DA2DFBCB09BAD7FEFBF14CC4FB34501FA727BC84BE574A2A41CC87DEFCDBC67F +8EC499896E01845C2EFC5AD6F46085FE6AD723311552FF27233050E044A70269 +ACB3CC6D2D24804DCDB9FEE91EBF08983C05C479AA642F466945037BC361420A +48FB3B335E3B4C6C5790CAFCF6A0AFEB27010AFCE9676DDA871C2C9B5F1A7935 +0D5508B7B36560DF7A4683A4D6BF39A205206EDE0A40F2FD6DB1C7CE9BA7C777 +1620C2F88D2E607623AC150E2500175358B0B52F51101CD2F052EFB6FB61FB80 +981AF8BC99A5A50DFBF3FE7E4FB054E082DAD488AAA3B194DFFAD38842B4B7CC +FA49E430082980182D3B8F70363912EA1C8A742FA7CE38634172D2BF3683E6AB +3224477668D6F8BFFDB765E6AAA73FD52296E1E145E9BD9EF188F952D0C421D7 +BC47FDC6F314F6DABB6747A0478E826931A527EE40FCBA09C5CB475FF25867BD +0CEDD4110E079A823E60C8F66CD9EE1CA449EF7F1DDB24C0253D0376531DEB9D +32D0F4CE9F654FF5ABD881A4280801D1FE53EBEADC5417F9BB493D0E96AC11D9 +AB7679B12C4A8AF81A6708684D0F89A02F1FF17DB818422C2CB9A53AB0D22F47 +AE14C4685DCDA30639CD15F5C3ED70D6282CB970E6D2277ECA67DA8985DB3432 +BF2B5CAB0B43EFD41E7EBC8357EF10E05A8056C3587AF2F1888D330D5F5E2DC1 +7C527E00FA27BC105194F167D204D326565D5F0930ACAB12E684FC5A0B737D80 +4D1483984E1EFC6D4D68C80B29E1DE30CA10F5FFE7C93F85F6E3B81AB9218FEC +8B9A840ADF35505F33C89D300DDA928309D01FA5230F608992434E2DAE06B254 +6B80DFE8155DAC4A8847A135F424CC090FED4BF3E9094C5F983B6E04B02DCB3D +B72BC604DD8B5DCB11615D318FA8E19751AB4A01BDB345A91A80F230EE0BAE07 +1490C4F99E8D39E8A08C7B9E10BCAF8D5901B67A4FDCB8E6A2D446151405361D +921D531C0D9AD889780A0788AF5687BF93D9153508E7DE305D8EAD77A7238B63 +B70298F5E69A3CA3994878D84A41CF598F9607E092C2C666CD3C28C60220CFDC +E84B94DD9C1102C47950F0D921B82C07713834356B4C98272E58A89673AB1DEE +29F5CD9FF4B9EBA06CF42C64F2A2B431A76A54E8846C1D2D6C2E4159E55C44F5 +029B21E816B20DFFDDFA80307E69BBF77283B3DA3B2B5ACDD7256178B060AD34 +DE211EA094466DDC8E21B86EE829922FAA4E381CF79AB127A661D2DADCAC2BF7 +34157BED101C99D4B66E79E7EB7B280E0D09B3CE950D05FD4684F25F671428E6 +EF4FAA6C954F3F3BE6211508D517233ABA7D9F3CD20BFE4997BFA1614BC08203 +A8333A675EECBF2532EDEB0B79F31746BC5BB0C9B66547F1AD81727C6F20D4CC +DB92BB5AC94995875DF130CA62DAA08C818DD6C9300E2D55CCE729810495A2A1 +1180876A77F7761DA8E0F0F55D9312698AC47EA798838A4FCD98BD4A565F5196 +66851C3B993D3B772681161A2FE70A2CBB572BFA2240E8E496D1356FE0C00390 +7FE892B9E5DCD5B95FB51FE1BF4D0023F55D90C3EEE911E57E233BF2BA4F798E +313F32696C4CB661E70352CBD4B249A430AAB49FD72750940B270E253850E3DD +7E3A6243DB8DD50867DBA3FB99138CE0DA178ACDB41628D39D84A5615C720BEB +8FDDD9CCAA15D8A258DC0506B40D4A9BC31A813FE3EDF80E02BED2FD23F2CBD3 +D5A884766AF71F1C694D4441E9C8634A985B6CBD5B27E9C53CEFF0C1CD15FDA8 +2B39BE515ABC1641E1ECEC0CB5D00D520C7BAA339BB385BF67D424118E5F1396 +ED4D402FC4CB89E35821E1A7A1324BB2EA509F64179EDEB65BA1F65BCBA55EE0 +993FFC039F22344FB6DC7440B04A570525F3E3E883BC54AD0E9C573A23F19703 +134E79E70E94E4C3D3E1009E81449640E14B68B88FEE047A2CCDE3D544D692AA +6461DA69C9B9E9647A80496FDDE8478095E3E743CCB6B05DDEF9FA18CE462AA3 +F70C77DF7A02C0D484AD69D2D350F6550BD6DBB6C79B0D72AFD126B11E8E4C41 +43F7AB39E8BA462BE6204374C5BDF2E5C63A5021D4F56D150BADDBEA5AAFB721 +E486833943E1B23CDCFF4C9198CE27528FA3CAAB96A925956ECF6E5699BE4B0B +F2F7F0EF414B6FD35549EBB0EF786F47231977DDE4375E954EE10BE17999460D +82194CBD1F796BE5FB270C966829150D9EF64B05D1B00C73A0E19F02D12784A7 +F3224310A981AC4E58BB63368091377084F921B4BFBAB4D077736F4355DDA20C +9F7153BEA30FFEE629A2247C6DB324C9EAD295466ECAF1D91193B31DE2B0714C +10A2401A94CD38734955C9A6D50680E15395F4846F4FDBE5D9D851441882EB6E +83FBE39C7C3EFAE853C70827BCEAD25050CDA3CA6D5C224C471D9DB73BDFC356 +F3E8341C82F6ED38AE9EFD91A430AAE2603E7C9A2B9EE81047129FDF56B75EF1 +143C7D2CD03E601AC2C8C582CF2277B820F99DF901C9F2698D968BA402CED234 +110E24C7E331B1963834D6028DA7F0E1E64C94829888A3F0E54C6456410931F5 +B059CE09E81047956AB8956CBC83B99F9532326E2A1572BFE9B6856042793DC9 +61645952319DA1971BA4DAFF18FACD684A2B3A15BDD559616843B2D5FB68A7CB +712D2A64C78C58BAA63B8DE6307D46436338C6F19B4DC0304A2D017448C2CED6 +A31E5C41F2B4CFBD66B9DDB71684D68E2CFF268946A0D0E3F791920F2FEA7BB8 +517F0E3E9D6F94C6567545F87EC7B24AE36CE3C047078CF60427277FEFBD9368 +2D42E770E3ADB6F95FE9B65DC66EC68F29A386012E812B0A095C3C83305D1F3A +80878B13276E21F3610088E6A19F6CCC4847A68F09A316AC8E46A925CDC0FFD7 +01173189774AB33680B6E593E7E0166ABED14673A3C2B6ADAEB08A292C7E1295 +9EC140C24E363DCFEF929C45844D7DDA5180C54A3B3C791868426C5F0E5640A3 +CBBF8D6C4C5B38E110171B6ED032266D7EA9E29BCF16355AD7A904E231E6BA49 +44FE08439DB307D1FE5BEFCF4ED9E4E9A03247C0DF547A475DBBC3D3A7D0BED0 +8BE7532BD196AEC7F505C33FCC9DDD67981139FB7998DFAEBA1CE865B11DC996 +2AA56E05A0C6ECA43771E0F671C0D5D6BAFD84404F4D3073E29DCB9974E84B1D +40E74751D300AAF6A5767793A07357FAB1B9B64AF6C5DC83A882FD74B01D9857 +7C970FC4C9F1AC956CE0C84F88B1564A515146E9D5DF766C3CA61879115CD20D +BD18DA8509DD7D7ABAEA297CAD1BF9C1058BC1A87C78ABCB76FEBBAAAC6E77CA +8F0E06DA48CB7FF15F15EAC0D0BE75BC89C40F4F265A164AAE406E1621EFAD63 +922993208857EF1022BA53604AD72EAB4708A492C49CB7D1B6DCC820BB583D78 +C3430090A74BD416D8B4E6A9631247383780947D5A0E73E8AB4D835A432F5180 +C311E7405A1EB0CBAB68DCE930D7379693AED1B392A499AFA935C788323D3D14 +678F3000121CC4216EBD0083AA41960736A7E132DA255735652B61152B4DC0C7 +B8718543A30D0B747D287DAA21373543A2A4B0D337B78760E32B7E81CE904E7D +86BF24B8D41E7E9A6B2353220C38C6264F6391E02E63F20EDC21E16446A1EEA5 +D9E52C1E211F7FCFC6055D5E815F42C20891C6EC3900058B021C05F339EA4ACF +2092C8BB5010C09F8AED1448EE20BC15F5C622AF0FE86DF1735F0839BEBE8871 +3938B6C0AEA647EC38353480F6C22A38517DA13E523D95ED2331445E1C2CB254 +AD9BD7A35497A71FCF67E1156EF5BA19AB96E625F093C11079F29461BD822314 +906CF8ED83277FE0805087BB53CAC8B7C62487599DB36CB5D549A3AF360AE184 +F12B03836B62994CD15D66430FC8B5F29334612117BC2D09AF318DE848DE0D0A +60C3C63ED4C10C54BF7647A71B22F81EBFC9F135C96F7C02796E3BA0A0BD6B80 +B64C8406678BCA64F3970F73FD9DBF35D1BE1FA78988C94DF776653508546818 +10BBD62C4FA91C6F5FFC9B4EA5E49DC77D2F42AB31AACA1C7156E76DCF04DC4E +5E0AF91B80C7A23AEC9ED959A683E1CDB8324AB826EBE250547181FDD0CDC49F +9AD4588FDA53A421259535928B9AE8AE8A64C582AD01D74F58FFEC9F2F29FD60 +062FDAA7234193D4BBE40D9DEBFBBB78A7E2DB68E19352DA9E14C5F6CF5B1CE1 +715EA018D81CCA5F66A518210237485F48DA84A158F238E66EC71579F93E5D50 +6D0E3706FD10E97C41DDB7BDBBD9E71043B6E57F39E3E2428B0156F2BD3ED94C +58C91A4C4732446B303548A10F21304AFBB7BC31B4600E56B0AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI9 +%!PS-AdobeFont-1.1: CMMI9 1.100 +%%CreationDate: 1996 Jul 23 07:53:55 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-29 -250 1075 750}readonly def +/UniqueID 5087384 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 +86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 +DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD +67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF +6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 +FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 +22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD +730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F +449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 +97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A +E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C +AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA +A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 +B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B +9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E +759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3 +5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2 +BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680 +3435E9C9444F7FAB46B1A8E628A53CBDC4D4577404624C551B59B22430F1A4B9 +69CE559354AEAED37503ECB297EEC5A6458604C25A48198CC839F9C0B912A303 +DA01579DED7BE963C911C872F196596C93859533742F94A871FF84D43C744927 +09EA781C5DAB38BC501CE7E003927D194E5B94998B5051FA6548B87CDFFF1486 +D1439EEF09B0FF1B3684944B2B2125F6D15DC04B2A458CE5154C929B8C0BB520 +73448B36F03887606C657698508B15850E2206ED56C37A7F2C50AF78A88D58E2 +8E36100305FAAAEEA028C2BFB6E0118B48435FE609B1F02168BB55753F42BF4D +00A3FCC485D8D3431CBE32610EE2720B1221F30C9B08581288C74E7F89E7F8B6 +2C8B55B29AB652180401651FDB807569F5B1270100783E403CB388750F0846CD +3892E34E83B8599E1D33B1D2E402BEBE57C425996AD5DF64F54E17CF46FFA239 +BC689E34B719AAB350F84CA8CA3FC65C008BB74BCF854CE130348204C0C90D94 +A465AD4C8324F1BA659A8F6C683B3230E6558CC4A3842F2AAB6824588822C055 +08563243CBB0E856321D2CA1657B0298CF07117A68276F6A58AE7C2F49B163CE +051AA200A4AA08078369D71FE14E831F820D4852FD64F15A1027C5F981D69DE1 +0E60B8495AEF627BB79EE377216DC3E6577F5C1ED071668C505330CBFA0EF4E3 +9E0492EDF2A386F17722AADBE16D3BC12AE48990184559998A7130FEA6995B7C +A68E4ABA7EF999492B90735C50E3D3457B87F50FF91A96BF6B6BB0931A716B43 +CFD4A74C4CC5F912AA42A943508C3511F1A010E2973AD0C4B047DA3A70A49A3B +233F460BBE213EA49D416E6F011F9AC64DF41126D77A01C9D16F0D241D0FFD5A +F8DBD2A6B166DD12217A796A412E292407837545F0A6AEF44E4961C1645E51B6 +51C6848D63BAE77CE528CEC8FA3AD3F10FE3B5D4A2A0C823AF2917107A68E126 +DDBFE92399D29445C59A43F56A4EEFC8EC7FE4C8950DC0305AEFE3E8C048A870 +25E887A2F1A315BD2E1475F293730E0D855BD07423DBE627BE93EC20853F4ED9 +48FD2E039C35DB25D553629BA31DAC79A0FDF0FD2237B863E1B4A0C0352BB94A +69A579E87E3B58A15E603031BC34E5E345695B16702B2050C944A2023F2AE7C6 +F61B777160EFF3B6258D96D804465CFF754FBD0D32CB70A02D533CB04CDB63C7 +0AEF7EC825C3B87C8DE3856F4B31F3E15AA1422687EB9503AA7CF456589AEF62 +04C2146F16F51856097CAB1C57766899EFA6E54067DA02A2EB0737BBFC5D6A39 +BF87E6EC752DC419AFF10DE77954AF8CE261ABE380DF2A9F6D60443EC06DC617 +1A1B26469EE8F7AD574D39F0954FB681E986FB4C6DCB2A51661E2DB9957E625F +9DD123026E280DDB4E5A22A2AA79104E102DF60E0B3B6CB82B39CF66F7C6561B +AC4EE4C14238F835313445AC11D270EE586ACAA2AEBA80FB084582DCF44764F9 +CB7779EE8C481F264BE98A3C1A68C5B1D251E801FB9E82279CD73E737A2A996C +29D4305F01207A3B97433C149CE58DD65CAAB7D6FD0021F4568EBE4CC3A41FF7 +C11B28FD9CE69BF1A6DB76E15CEF49E7D1464372666CCB04C76C773630CB64EE +A5FF95EF34E7FBE7A284E5302810A108139DAFD7116E5383111CBBC5E3B07BD1 +B0C4B78242879638A679BD50F0FAC02DF84AF5B38FCFF09988D65FA4663683B5 +000DEE3492E0EDF7EDEE28BBF16919F00A08FB362A08E1B4185CA8D280DB56E2 +E153CB81AA33153AA473EBE895AD1A5DCA7503CA0BB8B54FA9510A4715A50BA1 +89E6CA9D119791564524FCE967B08C505C52A6E6453703D8BC35FA1A20FEB162 +4C3A7D4337BB91F9375E9268B915D627372A78F8A84D5ED535AF70EDE8E07917 +CC75C3BE728ADD09E4176B983A3646B2184BCDA8F7FEE5413ABFA9076B76FD93 +153CCB198C68383E361CCEBB82B7E2489D85D0872C050723410524CDB5D04DD2 +C6A573B82C8B110001CAD21386026646FC5DADDA28A54871373EA393A649D169 +CA1F0D37A5E00155E722721903C1A2F235EB14AE87D6ADC39766764759F3F793 +8A8134D96D106C0F37A7F4FAB9450930301E70A062A7739F9D86156D971F96A6 +A19602C63A7E27FB9209EBD090DC20C1EEAB647BAF67DAE9CF17488870A45171 +A1D26FAD81342832C93C8D4EF9BFA33628E86AEC815604AE171473140AB976E0 +9E33A97CEE262DAA8E2C1FA68A23DFB767FDC0836660734C217BF77AE433B156 +3D33CEEA31683EEFC6F89AA916F902A73836F48745E9D412ACAD33382752B16B +260C14BF958BBEAE486D9FB6231A09161EA3F277A8E0A8CC04BF06DE504B100F +BC6C4EFCD60E1CD3BEBF5C64920F7002D59B964ABFF1AAA47EB94C2B6E0E0900 +48417E803F0BF90EB718B2352C78617B3FB43F8E196C489C938C182B3693B487 +34F4C973A7722BD15DD2BCD5AFF82C42F8F2FD44B597D2FD9E104025D396AD03 +2A258B8F96B1D411FE713276BC275A35C3E0418A65EC2E1C8897950F0AEDF822 +7FC99A27508E19E42715B566D784A1CA324A9ED9E015416F6531EA7B3F388CE5 +BEE4BEBD775E63B9E45C6622661A1E360CA636111D4816BA306C50CFA2F9FE30 +1176FFE860279FA8011009DCE19CD9403350DBB7882CE5EBBF7224B42F54BA5F +933145BF03CB8CA6FEB3F3C9E980AE00C917189ECE129075DA7C0AB73DB571D0 +2265C81E099671E109168056FFDE29AACAF12836DDF0F49B67B93586D3DB4845 +94C68F81481E11F97187BF5069061F6D6FB47A8ADA97A59C6999D0B5624CE935 +5D961EC24603A8AC2835BA442AEAE9DE1597CD5F1E1D49DC5111A1C7478C8C8B +8F4AC17F38E0F01881548736EE5237F3CA6E6C7C4B681E4F920764C1AFE032AB +CF5EC6E21947A7EF8A9FD9171D68FDD16B35BFEF9AC87B657D59368904D336AD +F2906B9402E13817D64E485C93030B64E5ECE2D45B58D8EDE1154AFEFCB1625D +F31A7D595B95410B8DE67F896B3F3539F8C0E7D347C938408B44BFEE6B06F84E +F76B092BE82FD89966FF987D6DDD3F2074BD33403B1CF1825DF0B20C31B2C7CA +95E27E8A7E1ECECD6C1D36E6EA498D0F274816E9502B60E22666643BB248B9F3 +E11E4B17950141044B81B25C088955F03130B05C7BDD69302AEF3345231389CE +7C1AB2CE93750C0A61413B198C8811EBE10EA75AC9851E80B7151D5986D7ACA6 +BA90B1104B18796907751C227F383CC9240E4A73675DAE8B78E985561EBC8EE4 +40E10C1E47821937D710161F2149E5CBF2D566E160B4EB59BF962D82F9099D17 +D36C294668FD37207320B30524284DAF4DA1FF83C398FE52155197050912E92B +4BDF9EB12A3C9CBB284978A30E835E5A1D1528E645C3A39C2A37CD3ADA47F19D +B3FD1B48A04C67A72E5CC6C0D4C8F79B823BAEF2D58238C6102E28951F72E945 +1EFAD61B2A661C6D509E2574635A66BED21623DD608A605F0932944CFE7F5D4F +9850C78E57D4F1884707C53FA0AEE12FA80B24697E7FC678ADA36D730BBC484B +AF5BE1F8B225EE0E14E46D9E188F69EBFD96D4AD3C8998E7E407EC93D3373C8B +9B5BB746133A21E58B6780E78D91DEF0AAD36A004197E11E4B1B6E0E8E57E739 +9183363149A1D88E709294D9C3563F5C4A5085527C2DFCD56866E259C757A90D +2FDB17D586297C08DCFC3D13157830AC9879432E314D11FDCE886C7F3D11497F +6572EC548EBAC1A4EB9871BDEF45C6EF0DD12524CB8BF3C5AC58D1D12C4399AE +0D2DE1F7B09A2769A82246A490831D48C63FC521DAB2609DAB921741A5FE006F +75B32F09AD1D554034C9E050A3BE6478A54D19B9DC685EC8802489482CABEADC +449FF21A98FAEBEAACFD9ABF494B499FEE00034B9986F41A43199DB38367CF55 +EA41C0E3E923B5E86BBFB048CBAF05708ACC1DA188426C20B54D1BE2B0A68B82 +3B2019CAAD6676F9BC845B678404B536C30DDA9627F1C40D3BD3A6B8CDF4553E +3CFC13D25077897959488132E8729A47A47917DFA1186AD54C86A6431A4D0894 +899452839DE07EE0FC73568A3FB4A1A8CDA2F7165535F65ADD78DB9397D6CCF3 +A8F054DE0B499237A6E95EE39B3FC1ACF590037E27B88ED867F1E63BDCFB6CAD +324FAA94F2BD5DEBB7EAE6A1002D4AAAE629795719EFA6EE77B7B12007953C33 +8C1BDAE47A6B8A03208301F75335725E5F81BB0C390CC2C12D3C5B83DE9AE79F +403E0F17FCFCD71BC27AD58AC8944405C0BB14788A58CE4D701DAA3993390BA4 +80DBF35F187FCD4C9E72A0FDDB0832A828BF43CF9CFB8D0E9BD8610EE08AA8B7 +97208890C0E7ABB3E54212879E444C9BEC8A4BDED85C87065AD98A0DE2DA7D9F +EE8C5ADE4FF52901F2FEED90A640CBCBA4A1A3D679F7AD52B0C280C5883E36A1 +5E466787009F10AAB413AEEC82CF212A16904467FE5FB855DE45D754C0A49D1C +A8551E9A2C401F1C428BB9F6550AE46A3BBF4473B478E3E9EF81A95320E8E470 +4BDA3F41AEC46E22CFBE73B60EE1603C6F9F778E3D661A502113DAAF4A9DFA60 +0D4212C592DCF82740FAB1EE7A10760D992C0A44BE4A13D2E29684DFA2B8046E +D93E362D093F0890ACB165F9AE7E2EE93AFD90E3D338E2F7C78BD59F00CC8930 +E5F051DD738A602C325EACB05D9079910C784872A3C5C583C2D99E5D6CCBDE01 +147EACF8DB8FEC7C60EA6DF68CE2D00523D779823A94C032A96FC503E17E3327 +2F953A9D94446946D3B269A8A50B539A55FD4C561B6A15714E3440DAA053EDA7 +8A6E214B35FF41807B11ED193C0F446ADA88863EE789AA3408EE7CD14F5330C6 +F1D40D60391E057AFE4A64DBE865255D4C01FB806BFD2E8E3BC08D40E7CBA2C9 +66B1C673A44B140E13738B93EE64B5B137613B2077D66D762E386D3EF47F014F +E3A1B359A993488558B87C8D6208F78ED3E7B281244CDCF51F114E736171BCC3 +345FAADEE2FDE4462A349BD223B1E6295C46DE93ECEEAB0CE43A614099191FEB +6D942578259666CEA8C61B89143172BA4CCA7261D4FD2096BBB245CBA35D7041 +4B799295330F16E80D21D90D8D844476FCDAA76AB9167136CE0823E71F1F5DBE +AD259E79D77F960AB70098B68750D065CB6743B6C06E0122B2999846F8A8075A +69138C54BE8BB7D314928A65AD626E3A749208BEFA7241AB6B5B2319755BDAC7 +1C8BA6992EB2D4F950AD41E181973AB3E0B70DB56844EF47A43D178166FB3AB4 +CD008CC2825E2F4562841C69A0B1BED9625E195366CF7B31816EBB1BB1D8F711 +C94766AFAF56A8F05C50C07EE5DCCB01E350FEF2D3C73E34F7729F449C0EB030 +8D1C13B82A6013074410C88C0C56C01A97E41CD5DCBDBBBF1AE2B59D4550EF0B +E3933838C2E56F233B4F9DFFACBC96BEDDE884BC58FFC3467D32836F3FB7BA6F +0D2DCC23AEA8F8FACE59DFEE51B89E52E40D8E86D2F11BBD1BEAC094260028B4 +C11470D438AA11204256563698787FF010EFA65F0400A4E506F3C66ECA73F2E4 +11D711C750DEA94F1718E0A1E0C805C9E392582E5EDCD0920C0801034F5A123C +D4B073E4EDC89F2798ADD8F5D94E17B8D3185C34B67274262ACAA6B7CCC86CE5 +A8B28182550C7C5A22095AFFCE4960D055C8F69F3EFB7F9EB05FC78423F91B0E +887AFB11F326E04B1E5FB913A024C38419A15F9EFFD5606FD1E597A46457282F +5D9ED13FD0438382B0B3D81E0678462E710B726136EBDEF6909B653B7B03105D +7E904E49E2B42433425F431FF5F1DC45FD4846FBCDA5106409DA78866F285FA8 +E74B8CE093CAB0B0DB0B565D69434F3602B6B2F8CB6AC3C10A92533B5C701B7C +0130AA4188193FCA0E77344272FB7A5D80035E4855CBBA6EDCC46F49BEFA0366 +E8203B2CFDE9C38C7727236064753848BAE8B3FD7972EB7A97FB210716710CE7 +19196CC1FE352CE4D039361B75655ADE041617FF48805E40F18C1A15CCAAF2C7 +9698AA99BE4AFB752D61F0F266CDD50645314BE5EBA28DBA56D5CEB84E4924FB +4D6665BEE676A62E6EE3F5691FEFB5C868B5BA1337C7BD7A9DC487AE843C055C +68E64C43593E7DE85C98999572B7DC49D26418EF5B7B9B26D1A8A6D44A3BA8EC +9655653FE1CDB02376B43AC1FADBD4CDDB51B28BB6428AC2507C589ECEA19EFA +E3874921068C1D44013ED4559919E97E1B1392607B745A0A86ADF47FBC064511 +CAAF33B08178E52CC8F8B97F10876214D367BD2CA0E5C3539D0D7A7929ABA8F9 +9B678421AC3A826766A8398AF1EC211BBB559308660FFAA0412B311D239D57BC +76C1613052FECC826BDD530583D72B624EDEE03940D9EB8E0C3A4B092153BCDF +0850918ABD2F8778B047A4ABFDA3059C2E7D1EF592BE6CB5BDD5C28B279F4C8D +17E2B95F50D544BBE6219AC6C30C971D86D23B2E6955943C1B752D87097A402A +BD2C3B0DF3B321E1FE2A76A709B64EE206821192398D0002E7C3F4BF4B0C2750 +22F9E421BC8F250FF51E581AC57F2F539DD62DE0D578A8003C13F4C444C9FB65 +3B1148A6FFD15EFD3870B3562BA78301D10045CED79BF869DBCEC553FFB25C30 +DD4571498B5C0ACD192B2682A0E07AEF79559DF8BF06D5CA27E8EAFEB51860BB +9EB7A55CA99A058C9CC108E63353D17588CE47AAA026EE7D81C37FB9E8CEEDFA +24AFD525EED8361BAC209FEFC5433C05000D4DE8272EDB3A3F03345928627980 +95BC6FE7CBA537F0C20D4860EBAB5953AE2B3C6D3EA2FEDFEC406B173BA197AD +F1EE8D2C863AE37DDDBA6BF69D703846BFF588B2D0A7D9C377FC5A22C1C6A31D +6FDF4111AA1DE8FDDBD24471741812B50291EB1C8FD18F54E279B5482F0286AB +BCC97B36742DD1CA84BFAB7E6A06CF1F51AF95AA5E2E3528953519CBDE9F8698 +8F63A4C39151836B17ECC8682F4DB8D57FE5291DA744D1AAF3A1FE0256E5A693 +09F0CCCB0F1182A75903ED1BCE4E32A9F0A912027B4CD4421848FF3B90257841 +E0B0A7489BB3C50C81026896E8AE3C16C8D359881FEA962DB8552D3E81C9D563 +DEDE01C2CC94071CCE974A6F14AB42F9DFCE160741D0A8B36A1ECE3B4E468799 +B7F4D0B5DFDF8A935DC9CBACB40DE0B5D1103BCEA9291CE79A25816A8436734F +A00D18EE0D3D54D541C432D2D072D9B6EB634BBE600F02194457EAA787259266 +94134DD491DFAACB2F3372F81164CC03B477412CF4296B4B2C7C40E6B76A8E04 +A02A1A22224CF95FE63C5FA41A3379B819B2B8716AD3A196B4431305A5672E7F +40D698D4F69662C370D894B39CB2CE9D68172A46818D5A950E2609167D9D79D7 +217633C5F8304D1A9A1D4EBBCEF6B47C1BB9ED75BC0F58932CE7F98E77BBEE87 +74F75960FE693E2D7D588D93D5A620377A8214B270D68D7BF9440379FEC9EA2A +B04CBB65D29FFDAC50426BAD1A30E2909A820179F1D4E37833CD780ECAA9DF0F +B54B0AFF2F588D4DB2285C56765A2E360C7537401F4A0F897185B497E81A4F32 +4562AC243AEF8FC7D15D53E4CA42BBF4711FC20C86194F89398AF99B971A6048 +24EF9C0C58AFEFEC63552322 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX9 +%!PS-AdobeFont-1.1: CMBX9 1.0 +%%CreationDate: 1991 Aug 20 16:36:25 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-58 -250 1195 750}readonly def +/UniqueID 5000767 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 +B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 +AEBE70DAAED49EA45AF94F081934AA47894A370D635D93B1823EC35EB8316AA1 +86031FCC99F57CB21E8400E54AA474B57112F0D4754A16BEC19117E9D3638986 +0777A71B135CC18E20E193AE6C2BCD89F4A27516DBD2BFE69FF9920D547796F9 +89E0825B6BD5F492B36AF136EA91B826501ADB1979A4204B2CB5C0517F2B9494 +9B2077F316D2B3DA256C99F7549E6BC4B04FE12072B09B4F5D482A126AE351F3 +97DB85F3026A793B51E6B28B54661FEB087F011F0BFF67272DD1E8825C180723 +22AE77CD6166D2605D0C0F131537417CB60086F08E7197AA916D590944BD801B +DEE8F29FFC516E11396CCB8395CFEC9262E22521882DC0316B0A129DBFA5FB57 +E656890C2471675E0566FE461028FB05532E274E6DF77E7D320D09B2203BBB5A +8B185B66B2F8A18A49589C4EE27596DD56260D0D759D2A12CEF7FC3010BA1B36 +85A2FD45129DC01A0C7570423305C25D957DFF9215102FFF35F428C823D549E5 +014E7F99ACA6C10B3C92805376D0F3F280D65852CEA54F5CC9DEF9EC1347824B +0733D3341B34937316E77E952AD9366D3B2ED045165565F07CB636385E5A5911 +2620E185B105EF6C93890833054E05B6301137338A3F1D6AB2F80095E57AE60D +6E5EE2764624849978C811EC38E014AE4A5823734C5CEB2BC22DDA46BB408D00 +4F25CA8ED287D35E26A4CACA77D2D4B986ED2ADD3BC0C3405741CAD56DE28C7C +68E8944967C022CC55907B3DFACC1EFAFD38D3EDDA1AADB6E2C006ECBEFAC8D7 +18ED3C46C331623D8FAACC6CF9292B8F1B407806A0D4808F51A5BC97FC6D6169 +B4A86870BCF9F4409991CE05CC4FF7B175EAD86267C03413629B6246AE23728F +3301B0EBF252BC91554E82631A5485CAE85464807571069BD7CF36E4836FB529 +B994EBD830525841FEA57EE40E2B223B906EBBA53854571957EC8B9D4AA2ED97 +C0496796C68A41C9A84683D3E77EF80CC6A56B78F273D2F27FC9C932ACF0CE77 +355E0461E818CA0DCE986C5E5BCA9A4826B51516CAC05C6750099F603BD91452 +E36489BFE2919F4B6935F29160C204E778EB9C23944B27A0F9910AA32958234B +FCCBC2409860B371BE52823D22138D5E3E606F3E177EA0EC6158B01343D44B54 +3F14383E782905777F7493D0602F24AE3DD8B698038E0100F6219C59F51784FE +F79259F92A2B13BF8F1053654980089EE7C199912800B107E1DFC93CBEE05185 +19C87C172A224CF569DB7281577D628A98BBE0894362A030596B49161B1449DF +08CFFCA53B81A5F6219C79900FBC1978DF7218B303B8EE24BA647925F7D669C5 +BE81B4C0250935A17BE02A43FDB64A5DE5E8BB679AC0F2096ABD76C9D56555F0 +82FD4FD26DEA254858465FF0C4D2A9BAF8BFA4DB6F703D8B0A6C0060254E379C +077D577620A41A5C9EE29896AE78429079A0633AD5EE31B2CF4EE01760CE8B92 +FB4973C7E59357898A01F147E0FE6FAB5F7682997CA9A80C7837B056D08FEFCA +55F999EA0939DE8B731F9E0D37C7E1C30F5A0720BE13336A3117E8CFE9CD121C +6EEEF68E5CA5BF50F0054B20A58528702E3593F0493DD012E28E0B8DF0EEBA9A +9928887ACC05AE5FBD840FE28E514629E5CCD4C085EE30DED3E4DCEAFA7C7C6A +D4B28BF45FF39F02199E69ED5595D0F236F4385D28B6FC5DC7AD94AB576C881F +6FD2FDC7C0DEB91B855B11A94BAF1DD00817E3BF710420A06CA55639DE37BECB +9EAA94B9222E155606AFED86674AB806791852F43B22540A6A57B2372958B201 +F39C1EF73D55BF1D0D58CB1307FE581E11F785E80A5390354DE7F25EFBA8A8DF +71B55A8A78F9EC136F83EF05B1C596FE68FDE8972F0D585D978959B5E3DBDA01 +0F795D64BC652BF99867F332915B7A7626C58AF5619F01CB251D17E8F7EF90ED +90BB0304907842E48ED402286A8D6C361520A38F631EE09BF9F0595302CAEB7E +E0627AF48F6A51A5B85286C1FF236BE9A8944D4717E576AD7E004F4E76D900EE +F6CEE804B129A45CDF008A9CCE41E5DB4CE00F94A734D487475F36CF35285946 +68879B0109F91A5A851A6A9CC7822450613D7D1C8C2EBD5FD34A859C20209B7C +F45A5E9449F40403FB1B3E8FEA232C0CD08B7046416F629CDBDF7E168ACB8AFD +96764542ABCF127F73D2F9249DFA9DFF428668E74568941093A750C54982E9DD +026672F7FBB3304A97245F6A5178BC7B970FDB1C8E29080585E96D5E87ECAEBB +6E91A0FB31FF33DAA6A0FB5CA2E06D53FB7BB17ED380379991B0BB99614BAD93 +2B9F876B162716E11D4601CB37DF3CDEFC4EDFB1854D233DD0BDAB71B79FEFAE +B3CB8273ABBAACAA0F182622338AC41B0476579E246B3B242F99153BA087976D +1BE003706CF7C852759F80586C262F31EEAD0BC6A74FEFA45D942A683F22ECF4 +5CC66BC062AC52E13F8EDD55DE5C43669950E5E32F439142476F408293C561C4 +C68433BF5A9C922DBEA834FC851D58C2CF8B032E069EA0D84B30737E69E2757E +B56EE741755927FB7EEEF26AD4130B67E02DCFACC8F7A0185C89876D23645468 +683DC2432CA86C0CB13A046179779F2B9862B10E3CBA75072FF46EAF3CEDF266 +CBE36460993CE826FB794BCB487F64416C2F84569BACAEE4E6819718B2A12869 +3146068A6B53F296DB2E9BAC98067877B240CFAF64454DE24A4673B4B8B641A6 +C47C4D0BC68A814F222543A00E3C604ED2D90B02D579EC6FDF3F30A0DF852B4E +EA7CFAA798E0F923797A836BEE58016228B5B618EB225FE6817CA22A4887F603 +E7AA624CF11B3BDAE88FCF29E9EBF1B1469C89C9A7BB84647CCFDE157605041B +A460D4A33E4B035D1DAA01992A70C6A3AB137687DEC810306B0903A250BA77F6 +48C8F7DE22DD376DB2D220BE434D7ADF8F2B6FFC8D05402829501C2A642FCF39 +325B4540A0C3668FD07CBB7524225A3408565737356BD6310DBE6A87543ED33B +3EC0A11B004ED097FA18DD35F1E951A571D5A0952421D3935A523B9A9F1101EF +AF51D2216691BB8D15A45F80C07A1686C6FFABB1DDB7042DFED82EFB0AA85E36 +57C1E8B4D73B357ECEEA0959D408CE4716C801D0084B9B85FF4E483BD65A45BE +0767EE922185E5CCBF337702F686B797A3E0654513FA554AB58A7119730BCEB0 +EED92A68F5CA12D199766205A95F60050DA8D57CE86D840E6EFBF7863A8CFE73 +15C1D4B06BEB5BFAE76AB76E4E4F58DFA94ED65D4404F085187251E1717E011A +09A2C9ABD854AA408597DCF2F1140E89B570E07D970DA68FA8EDE8B693C974AB +D82BCFD4FFE094C555D8A94F50C9223205A87606383B66143D6BA40BD4AD6DDF +057E8581FDB02610ADFCD943B146DF118AB0B8EF5565252C4DE736FF1ED791C5 +2BE84F9305BE1DE1FE4DBBC42A186BCFEAC8E9520CD7A9C4973E4036673090E6 +DD3AD99C216629EC77BA017168E836EA0477BED73D9929D68F5BA24422DA02B9 +607294139B756061200629ECE30DF461D4188C803A1BA7946FF2760CFE604485 +6814F3B63E8289D37B7A3C5D39BF721CE956E8DD0EB44B959F1D984B19547376 +CC167DE2623DCF6B780B1F4F279C0E04C3D3CCB2976D2D724C2A207FABA486CF +BBEBFA67702D3B34625BCD4A5DF6142760667E25D147FDD876B67828154C3585 +1632932739CACE514375F014595B0DAA5005678C2C68EF0BAC45308858F61B60 +CBF43C842C83112A81F5F1DDFFE2100B3FF03417257446A3A81516A8B1465A8F +194E5B3289ECC2888CE70B7B6B63A5F8588F6E8CDB9C76BB7AD89A8C7F193F19 +8845FF21429622C31665F3EF102FAA92D413060A7DF9E1338F4AA98A5641E9FE +E02176BB8F75F75F90CF85731D84F32426264C4F4C0A58953CA3D817951FE0E8 +76FA5031C8C7D7B81D0957637C5947156240A42A9D8BBAD3B40ADFDC457BD16B +916633276982438C952D16EC1BB02EE6563A1CF852A2068733E0411F17BAA698 +AA7F0C06CB894BE37538D1F39A01F8EFAAF01154BA2378F7D3E70C4CAC11CAF4 +152FCAFE5602B9A85C8F39B5BE65E5549ED18F34310C476452696643C0B3EC07 +52596744098B56C35A53E3F6C9961DEB3B07D2BF14D8B4A4C2865D66322F2D69 +92DD062606919F7EC8FB133915F890C0483259E5188042913F09280340748C74 +9D3A7F46B33107DCCBA0CB8D52775074F22B47C9BEE182487366B94EF271072B +05B4CA7A05D0B1F2D425295A416CEB4C9DF5F558DC7A2FE51FB30F9C412433CC +179609ED14F61830B939710D2A7F1451262911D4793B19EF27A29E754092A7A0 +6B5D4D93DA04201EDD5E70834EB82F2F6029B9D8EF4CDDB612FC7DFDF2A66D7D +8596B22480AD301A41D11F38CFC9BA623D11D73036DBBA43241EBD14C19F74A2 +FF55FAF1408743D86399E6F16E329233BF53FB62EACD61AD019C784DF989D1BE +ACC83AC7C9333B2902951D4450746514893546460795B4A0B01986220C0D27B3 +655D2AFB92FBDDC8EB7EF69660CFF5BDA74DD278D3F8E0A89C0D7E04ECE76B13 +EB1B45011A494358AA47B957F061F8F77C2D4355D11526BB354C7C8D41409688 +29D076BDF1CEFA98C7820ABF4B921584C6580117366F0B4ECFD356C160F9D721 +3289771BC99F1F4E354D2149E31E2086DD0AC3E732F8C29D2722582C9FA5FBFE +82CFBE764EEFF153ECDF6D37875D759732B0C484A064D4FC40E6E39591754FC4 +6567554B7023E79AB4213B531E13AD9A3BF73230E76FF60B9996338D22DEF5B0 +0567E574ECA4274463763485A800EA21D5AEA2F0F5A39F08A1C9C1024D0DFD47 +226BCCC4E0FAB0D63648E218060C59B150A7B9B26C2A693480CFE79B0DB25DB4 +7D6C6AD5EFFD91488E33D71A0F71CA5BD57051F2FF81361A1D7A1E44D175C3B1 +4E69D21146622C0E57B9F3413ECB9C92D178C755DE8A28CDFF7BE669ED736BEA +C87BF7A6253D599E1B212D818C7EBE1572D154ABD99A458F1C9D7ED45189F105 +A1ADFDF7132FE1401A4AF8DB8906F47C35A38EF197D51F4E4761163677203DF1 +9E316FAD336626D7D13ACC366B2F9D012DCD490B34CB61EABC193ED88223A756 +E7A676CE44DAE8B17AED0D450F7C5B6C79BA10A143CEAFEF63FB37CA5A4EB062 +255E45F7E64E354E3EC9CCD1BB134B63DBBF65AE4866C44C01EC95162DC337AB +0DAD38C695A7E2A1151CB538B818D39A49DA36C2FDA737AA939A41186E272C34 +D0097ADDCBEF7883F73A7514CBCB7CD5CFB82A8A0F009ACB5D965228DE78AA73 +0276B568F352B471CFD12B2F95CDAD77897EAB87E2D7A477742D275150EDF7C5 +0B8BAE47646E392230ACF70F496722BCC5D299B87AA61990AD65945D28A5E4B6 +426AF16AD6867799CAE607149642EDF375910BC50F82A4E6828B4C3CB7DCA3B6 +5BBF80F2C026174465B84222CC24F39BB593392DE8FE5F2DD1D914386EF717FA +EC2F4D68F789C18F32D5734D0F4128BA97187EF71A14DDD226C2A7A951615071 +0C55A327F58376B030879AF444BC26452235CF18DA50AB8C1042EE01B5BA47A8 +1958E327C872E92ECE4306108C213C3D2063C323F261AB34EBE5C68D49357505 +E54698152BB44B140FCFAED8358E47F1C945EB228EB444EE5551245C52509647 +96BAD302442946A4A4D767C352BEA7E632186CE5F081E3E4AC0F8853F8D40288 +DF0F41ADB9D8687E7034856DF60FC042EB2E46AB3BB95600871793733D6C2B91 +852BE005026D679E53EBB535793727A01E543AC1AE1B91803318716B0E645ABE +16F0410016FCFBFBF83E14E178D51B2A571D7223616EA38DF7F04E3788CA54D6 +05F38159565EC1F747AEAD79F0905137002AA9AD103EE63324859D44FC30BDD8 +07060752F2DD51038F2D3C163306BB391CBD5647E0C28A8C987586733E581D38 +5CFCE67BB5C50954EEFDE4CE7A04AA4BDFE5E2BF4752E183CD1C621632A6AF2C +FFD75332DA70EB2B4B7BFC40B94BB96AC34CCB047F7F7ED8A27F52992267A47E +18FF3AE1015BDFF8F8C698F1C5C294E901741EEA720BD24F42F5B746D42F2551 +6A1C73C66DEED7CD4D4C4FBD671EDA12956EF0EF8384794FA2F33B09B479EDD9 +E12FD0E206689B9FC7331FFE21507073E8FF039C11AFEF9DF0B7A3FEC4C08C94 +014790E407C2CAF95A36438E18C8550D55B5124470CFEF7F2748BBA5D44332CD +C79C6562DB2D2962856701A74B37C9BA85CD441E9EC6938189E46EC43738F84D +49C114FECF37067503D5100B79BCABB83634B9E46AA2CB7E3CBADA3AB46274BA +04E0086D005AF1C940A599036C85C569CD7E77FAC13D34B293920122 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT9 +%!PS-AdobeFont-1.1: CMTT9 1.0 +%%CreationDate: 1991 Aug 20 16:46:24 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-6 -233 542 698}readonly def +/UniqueID 5000831 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E +2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279 +650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35 +F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A +D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E +F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1 +4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A +438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD +BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B +A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641 +AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74 +D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB +CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A +082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980 +9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0 +4BA1EBFAFDBEC531EA13DFBD6700E53818CE04D23886B8AE75DCC36BCD3189B1 +0D55FAE27D0D126E82AEF31D7B5DF27E58C30BB0867D6D7AC1DA9EFB8A2DF095 +B5B934A68EE122DA0A83B36C952431586B957990206194E89339048AA6EE4C53 +703763505ED57C494DD907D0EEA04F6B1D4C8F3BA778F4E7AA832AAB4D75F024 +61E91C6D25FD6823CB24FC863B57C0471CC9FEB22D97D74D9D68C3137ECA842F +01B3014812BA4A3232713DB44F320E99E558DA25AE9F6EA5CA26CAA5E321903A +689B2C0D84EDE3D7371BAC131B97ADA8FC1E9A8E33AFE737CEB6D9D424C43D83 +F8F89FFCADF713C971D8C16C9F402E8292DCA1AAD6507B55AED64B58C386AE71 +1898A8034AF47031B7B1B493336104D028739003FFA0EB6A74607B8327630B24 +C1121AAA68BCBF128B3E68E16E75892EC80221D2EA3F73D8497180E094DF63E5 +2BB6B13CE94E02AF6A0ABFFE06652E8F757447E50152C300A6660F6963731B26 +D0B154A80F2F0CD49F8259BCDF09ECC92D40A9C8EFCDA68035EA3492314DC20D +7AB384D5DF8C55D33A637E15BE0119E46385019CDA55262A52B17FE7525B14AC +1689997AF651710AAD0153A940C04858D2088A195B2451FF531FDE5CBC8DA689 +FAC1B0A5A6A88815BFEC5A0020ADB28093807E5F77C077F86A963D5C78286C90 +3AC85AE7092E03FF01407126BEF328D3F9912A34AB700D9A8FA0E381D24F1674 +4555D2CDF324D0B2910D092266C359C813F1A59E64EBF5C5DEB2F55662EE3051 +91507EF579D4B106C61A3BF41A69211EAC762864B8C9B5D25084BA07B0D303DF +9C35C116A381D891DFA54764E27C55DD38B83576186725D2DFC7229DF662E48A +627BD93E55DE9A7B0BCCCB04909D84DBA3CBA311B777693A8E677085688EFC8E +920C063FB8711FFE4C7A7F07FB7A00A2D39D79178FF438AEA36135A1E671E6C4 +FB38D7C5C0167FD7CE3DF1A2C34EC8F79E85766CD6E0AAA136700D3ADF43A2A8 +20B70130BD7E9D10A1DE05B1E1801456E4D31B3B9A26C6F2D83688B6D1ECC3DF +E8244A5C6BEC60CCFE1FD473FB7E2B08509673FB2B0828A8AD24B53E475445A9 +601FBBE47444903F41CE4101995AE4D9AC903154D4FE50C41581C46607AF76DB +8107BE0296BEC46349BB5D1BACE47C6D0D447B9D7DCA3EF11325108F1DA47DF4 +54E63928F0C5A0680F46F3A83F0C44C44905503D792E2F28FF622E380B660157 +D740508B5782BD278DE45FA2767E9188626AAF99BA99A20C1F0DB9AA508BA183 +85E5A5313BC28B5E7833DADB584123F67A9FC4B444340C58C3A253ADD1679775 +35C02DA8A7CA03468E3D4DC9E4B22EB012894632F1EF1164E756A2D2976776B5 +495E275DB7B98A7DA733BC2B9DF66F983C3A2DD663AF8CDB4FC577F1222C127D +1347179304799F29509201845F2D4EC9EFDD9D826BA8235DCB22F6E0B91C66EC +469F6CA3DEF47A612EF00522E439DD65396852EB4D2BE378F7CABD6B33A27E94 +504E957DB46A48C2228402333E38D454EA259D757A277309574E9E8A2ABCC75C +B47BC9867C09CB27A42B0AAC87F7E15D4A4F0EFE3095E3818CF493C6A2165787 +948321FFBB257B9FB66F57CBE24D9593326525A526AF178D11BE1A4BF8B3CF7D +BB089D49E4E571A357ACB341D5443D2040BBACDD3ED5AB589FAC38E15B849735 +458172E0238E4B8A6672B8328D1F96625EAF110EC280E31378A3E574532A4FB2 +D05ACADDA1E1E7BA140B4961BE966B7657A02873A8FCDF3109FE302E22007587 +EC499AC2C67A421AD8088E5118680A6B8CE517833425A49C5FDC6B65808A4857 +F1708AE151EAA278E0427A116E161F318B1F647C294558734A8AEC45C4922FB1 +2A4F4CB7E27E5BC2834595D6E94BD0410266876EFFFDD2E166F513CAD3E4CCFD +39A63211BB6BC7558B61567C887016984B0B438AC6FBD20EB1E62F2EABA88501 +6803647BEB836EBE67763D48EB702F88B00A0E6325D19A8A81951AC7B4B1F902 +4D30843B31EC9B4E54B7B03F8B08CE6025D0D648A00AF8F02A55DA7140ECCE3F +8D0862B647758E6DACE4987E7EFE21B1540445C483D01282BFB55328A35B9524 +E8973C067E3CA3188E75508B92691AA4830DA2C198EA3F4B1B262860D6DFDCA1 +0CA0B1A3FA9055C08CD3BC3EDABE170DC551B5FB0D572AF0E70FCACEE8C5DFC2 +899E8C829A47ABF998F455FB51A505AC2065B6471AEC9ECA69262B2661A92C69 +D079790211A7F4F282DAA98FC5204C574A71C23C268B230392710501C18C1E2B +5FB9DEDBF36E8116F378D5FCD99489A6B2FD443A0B2F7DC2CE882263E3E18BB9 +6EB8D58AF98A6675E173A178ADF2369ADB60F5AA821DB0668BAFDF8CBBC243DC +39073721E861714410979DE518E325DFF59D82DACE98505FF15A3B0174F620F9 +48BC344823BC5E22AD39E9C53E41A238A48E06AEA67387B50DE8287EB607205A +8379081519AF6215256BA2C863CB3E75C2F24D34E8C893537F6CEE6EA3E68E23 +59411AE55432CCC74D62E8AAF627262906CC8ADE1CCD2E57140176691B88724E +E9CA95C6B638516118EDF9C055A157447F917517ABDAA93E26287C209E6CB29F +A33703931045F85CE6559255EF992EFCC2E650C986BD0F8A9FD9CCDDF9900EAF +C55A40FC6989D1A3674360BDC396CFF420E15084291241BDE26AC0EC1F9A4C5F +64CF43AFEF81C3FACC5B523322B306CCC173E87E3D9780678820F6F392F808A1 +DC6D29319B630DB469180576BF8E4349EE9586229528A736D2F6A7E3C0168788 +6BE21388723F2FD5FEBC8F835C64B11956EFD5BDE88AB1C2C6359D64DCED8D02 +B0879BB507520EDFD7FA49986483D38DA759D8AF3C49BD1CCAB2B3D15D0C484C +5A55DB3F480D3C4E426C1AF34828D2A615E274E7F90F6032856B0C360FA88EC0 +0EF574487177B5638092261CC72EE47923F7ED93964E2602ECAFC61644C3A0D2 +C9BC3BFF232EE453C5048502E78DD301AAC88CE8C460F51378491E3BDE22BCFF +717A0708D7148BFE16F15D200F5F5E34499F16E75350913F102D9C29E75CBCF8 +CE5393D6D189583927141BDC31720B03E3D2893D0097729093371FD482BE7430 +A671027650CA381DDEE23D03F9D3359C270138EDBDC1965D350504279F08B7E4 +2E3B0EE9B8C571251196979E702B05A23A38AB022FC95041A73A62407E13DD5D +DDA7A0F5D37283D1B4C32E5251244653CB02C425F09AEC201D1D61F76AD5B8D5 +34CB63D3EBE97C6DA6B603FA14255E952354459598EAF65F40602A76EEA1B26D +247749A429CB3644EE33BCDFCF6C6036A2C517F50C92677A538AD4E19F885666 +C9908EDA5561E2E56A8842BFE80EA7917FC27C1D60A68626A6F0194CA7C1E749 +E1EE61D0450341633DB15C545569F893CBFCF1992A0184DFC89CB46E50E8C910 +E12E642949B807A95EA212C763A249194EAB78A37BEEB2DE6CB4EA238C071A42 +375D5CAA12DCF2D9295CF5E0D05D0E7B547367077893B10D9E8957CCAD78151D +FAF08A38C136EC4CB0F1A2924D9FC15192A2C24B6B1E9D508A8A239602C167FC +A2476CB609CF2BAF559140CB9199891D4C5163B9F8C5207D96A78DA7745A09FA +F3D1E55F6FB6A5472157BFF4A9439DAEA98587559E29DB34475A3CAFF79E8814 +3F85735A02208455F01196E6E5F20133CD08C7920FC8741E699143AA7C0E5B94 +12C504D56EE831187CAE53427201A4C2E58E422E5621BCF571FA2AD6458028BF +C1BDED62CE553C6140AB344C72DE39774969E87FF67C05550395F5A2780A09F2 +D3073A68AD8F774C39A503220C091401A2882921E498358E9A53EF58601B469E +FEB9CED8EF20CC17B144B908805D0A94449EBF433D85EF901C1B057B379AF26E +876BC3B30D188DA7C7DBA57F27F26CCC2727B095B601DBCE1283F1E5F9A7E448 +A5782DA29BA339BE01251AEEEAA977C6D037F4BA1B814D3A235FF0E156CEFF95 +F29728B74B63D9F6D4A42E4C86B1C51F66B41DA4EB10D3535BBAC842B3E13463 +7D21ED5371F12F60DCAFFAB7E7BC33E8F414ACE4BCC4E1F11286C1CA7C7C45B6 +A66CA4F330648CAA607815D0E591E4A8D8413F62DF443FC5FBD1AFAACFDD3C64 +2849895138028254C63ED777917DCCDEE9A2861CF201B42C6FDBA23EB58FAEBC +28D7E7F345BEC19711B722F42D94916A2F8390979846D1E2AA1C696DDEAD377F +65C36152436D0BD7480CC2F4C260D4AA5EE5A0913B9CAB88BEDEE30C8C867B36 +F40DA082AE27813721CC1DD529A52A8787C99699FE4FB5040A5C8D125EC010DE +7DCCE118658632B448B73E0C79CC41FBEBA02C6E6E3F7FDE200CD5C94F695A1C +4B43B475A2CEEAF902C22F6E9BFCDB11DB438241BBBBFAEB0EAFCA995C5668AB +E166D344DCAACDE6D2164568019CF39CA33B5BF185B14516DFD11783303A6B39 +AD9A706595F5A506671A15BBFCC0FEF6BA2D0D14A8BF56C2032E7D896A1C917C +86B24C103732B6F5B2BE5E1E03864755544FCBBC7BB8840000505F2FF07A11AF +89A633830544CCF02FAEA5CCC3E5796CC37D3AEFAD3A4B7DA8691DE19C7CC4C6 +7D7D646E6ADDE332F988342E6A312A935648750D78744621CBEF5D20E5151B25 +AA0CDBB5C4C2FDB279651FE7F0E186C77A13FC9B507971484953EF3BFCC92490 +FB4D512D3C90E98934A1A11B2975A44B936C0BADB1711E7FF03FA8B004C73E6B +166F4EC107A3B52BA0E2F56A61BE0C5C1C8CED05F2BCED3F1B213979B90F92FC +EE6D471255075953D20D88619C930F4D60F0A67616091472F28906 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY9 +%!PS-AdobeFont-1.1: CMSY9 1.0 +%%CreationDate: 1991 Aug 15 07:22:27 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-30 -958 1146 777}readonly def +/UniqueID 5000819 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC +65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380 +D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C +77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA +15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F +491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F +1A06C514D91C4C937D4E642503392B1CD1BDEC3ACE767A10DBB8285F5EBC6CC1 +AEDFCF3EE7B10512E068EC1C2647FE0C9CD111FBB93B73EEEBF10FEC098ABDC7 +5D495AFB4A8CC66F9C70BEADB84143DBE7E440326556099D2B25A815FB2043CD +C7FD7D8FF33C3EF38924FD112A2DE79C9676062A36317173DC5187DA094BC8EC +01887AC6E35B2C55101152B8A557AD2D45E3EFFB6CA25D88B9F7F1D4E6A3BA50 +9FD5C07C244F14215ED37A8874A28ACCAFDA6EB011D399B502870285978D1A5F +B8D15AAFA43FA59E679214C87A737B0E5E80B25A6D00760801D0DE56A2978496 +A35CB0AC62CAB1F5D1C322FF78DED4073E49651394F9CBB8E2FE079244654CB5 +FBD472C2E89C3E03C9408754E838E292ACFBC43472010FFE4F3F74E0637F52EA +DE71C95CC934F6C9BFDDFC95C588A929DEA13460A8977F220AB1140B459FAAEB +AF908F073050F759E5DFADB5F8EAB5B0E423475133C790D1A00235DEFED09572 +4C1B2470EA21AB475B89372A9494E7605205319CE52E3C1F9ECFA101076CE4A7 +80C33F1CFF0BE6361B2A4788BC74697A83D8A78970F2B4EE92053C4E39CCC624 +391DD58E253FA9F80B946DD257D0EFCCFCB65D77CA4D13BE44C2BDFD5324CB92 +2E9B6737E5D23122908274A542F46EBA4DF88BF17B10C10FE8BD1C1B2DD95627 +B77AC6EFF0DE0BA54A32895E999E0350678F2D87FE97B8529E30ECE578214CEB +37E258026C62741436850346A29852E91611F9CB9155F18AA1154E54683C07BD +ADA1D34E3294D9F094ED3D042FD7AE57F8ED014B61681D07DA7A673E127DE52D +619815D89AF545D74C9906AF9C55AB152A20A7867C5383D32499F868A888B0E0 +9DAF577180995588B42092AF47F3866AF1DFB9983A97CDEE568C38047F2617E8 +4CDADE44797F87318B398AF42E7AB331078F1926AD192389C1A3F79A578887A6 +BCAC4FCEC309F7B2B8A84B85EB602B83FA42A4564BBB4392718C3CC1C439FBDA +793A247590970419E3F5B2B35FC60BA737774C4AFBBA41C4545F3F609037BA6D +DB40DA3FFB5AF515AD1C9666C382EB11B3685B631800C61AE67AC8380CF10FF8 +0AA111D6D22803B793C25A57634DD94B5EC8DDAB76046674B7185CF8A2AFC39F +E6509B3E6BC73ADBFE67B8C0D1593C8FD87074ABA5F0A23359637A6FF8868F42 +1329698A92A9F47AD10E559546903FCF2C683C4C4D611C3F66765FFD48050368 +72F1C2C3B3141BCECCC860FCED11ADC693B6FDDD1E6FCF84923457F7D3781ADD +76F5BFE9CE7C08FD1D773F2581404A4A86D4642D5410A198F2CA42D2E01607BC +759DCE23A1D05877C0DCF4091D5BC52330295579D6D6EDA63F864048569B8D66 +D194625D58062079C47327A78D3E1FC9DC9D8A44496E3777BEF937326FAC3866 +64ED4D0500D99125E97A0DA3E75FC8CB0587F8AA5FAA1623702579E21E53FD4F +EA3393CD34B07D1714A3A3E1E58E392D17EC685186886C35DA5501118A7241B8 +932185F168E825DC774427D6863DBDC5111455131CDC11CEC517CDC41C0A5304 +D5C18DD6AF3ED443869CC51A340544AB4F205ECE28B4A836714916A960C41D4A +8837A72E2CC6205416675839ED07C70325344E89EC13C8AF666BD63B61511AF4 +5DD3DBD96E02F5D9D4C23DB3BEBC41876387242C33733AF63D65D5D28419A3B7 +49BA903A3A9694190D5DB211292774328DC366CBA490A82F09F3BB6C79E5DF34 +17BDF6885F475F24BEB83213C086F517CB0B04ACEC7E5C7DDBB5693A4CC5EE24 +AB555C0F0A419E996B71A8182C7B087631F6AC798437F238B2C99BDC7E85779E +DEE1BAFB95BBD988C8DBBFD50D3D122F782CFF5A7AE88933F98DB96E8D5335E4 +AB284462546FDAEC91BE55CC605DBF6C862F40E53DB31312E45E9EEEAE204CB6 +9322A67325206BB9BB9AE4316E9E2D634DF2291A33ECDEDF9516BD657138E069 +4F9CB0AC0B2C81AD2A011547063B5F33E815BCBBB1C8E67ED61CE53F5E1140BC +D09FADFEF42CEA0D8505B0E8A33F25D8DDA9C0BD37B25FDFC44303349A413A6E +C7D5602DAB0A59097646B1274CA0F3674E483A060342735CCAE91CCA22CB4139 +C399DE4C6802411F91D4B94567A8254E6D08163B9AA2B718A38E16EB9B7223B6 +67CB41A005F7A957258B203CFB243CA78158C15DD23AF8D44EBD1F8F4A330C74 +407DB88CB26BD874FF439F67246ADA0AC33AC7D191807FC9A38D85C1E362F12A +C6D191188DC62EF358FADDA3DDEC9F2871C385248BF1B128CEC1DFEBF4085415 +D1EADFCAF50F7678B2B39729650FBDA3867D96C9CB0F9A8566EDD84C51F844FD +810287E609D9C7170871788520959801C5315F46501CA543899B889634760D20 +9DD5108448D7587C74BD02EDE88750BE21D6B93D8F1C5375BC1E9BADBBF3D667 +C752968E81991561AC6D3C56B2A7C93A853398C4BBE15B16A19537CBEA0C8CB2 +26FE4CA714E6936512E549B9F6450FFE09627AD5471A9FF0A5F64363DA7A89A0 +D91A59FA098D1D7E60768D256AF0D1F7CE0F07185C04ED1ED6CFA69E4C4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR9 +%!PS-AdobeFont-1.1: CMR9 1.0 +%%CreationDate: 1991 Aug 20 16:39:59 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-39 -250 1036 750}readonly def +/UniqueID 5000792 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 +92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 +3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 +046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E +C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A +A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 +A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D +731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B +09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 +49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B +5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B +54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C +C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F +11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AC46268691C741B2D4 +48A840F1128D9B2F9CF07D0709FE796B23A836417BF7B5B12D67F74453C82F5F +25F7B30701D6F6D4F4DC623C0C27D6A6FBECC7312A3CD10932FC7C10851C3C52 +24B75DEA8A648B7F34F5711DB0E843C914E25663C510185BC37BDB7593C1C259 +21D8DDAD33982C336BF272BAB2F48E68217403FE9F54877B243614A87E64784D +2796EE4179FBF96123D1BEE3EF89D682B427BA4F12A1318A57F18BE5DD903815 +26191C72DEA47514220D23859E20A186A7EE791E60B1671A293C5D5FCE91064E +BCEA9EB0BFF478261EEDD7601309782B9F9C0B84DD78706262721E56FFBF64BB +A1EE5189438A36119055DAA1D509136D5A00DAD8BB0827D6A8F40E264BE338FC +80D39D8DF9060D82E8C8700DFF48B0AAF9BD6C70362164CC0772E390D6EB1B07 +493E17FDF7F64D57ADAED12CA20AF2D803A185898E4709AE584F412451BF72BE +B9821F2124B0BA27E4603EA6110547C3B65C5945EA007FF01723A59E3F9B1468 +2D8DFB922499D39F7CC7C9241BE759176F948D4BEE933ABAC2381D4D721211C9 +CD240E4A102A02B1DDED5BA476E887B9B2BFE4DDCFB5AD83CA65209CD5D30437 +74BFF7EF09E1A95CDD3E414535592B878EB6356A4F3B6298606EED4BBC65CA25 +72F8D897492DE20D27F8A97A6767AC9A373E4E54445C775FED40E6356F00EAE6 +A2B12AC114FF430082B64A540C07B396A7CB4ED5CCBBD32F21E4D8EFDCE1E538 +37D672E6943908715B7E5842EB69412A3009A7EC6977E9D42C2087E37A4829CC +59450164B05AAFF60A47FE5EF9B83E867F7A94203B34E20414525B1C7D3F89FC +A343972928E58B54F3FD4B1118BE7B17A3D5D2D73C47CA6310DD0A183DE475AA +D1A6374AA5951993E7BF723CF6EE70BA049F955E0A24526D491F1DB841A21CE4 +6D72A98E19A782FC5F5FBE178517992A5DACDA8A3CFA1BC59781A91BB48DE2FC +EAFE8C5A4AC55D29CA819477EE772B7E838059522A950A3C1DBCC422ACCF894A +7997C4EEEAFB2C8D0866524244155BB2AE9CA688FF115B8276A931B7318D53B3 +E30E92ACB720CCA8D4E8F6E2AE6F19FF83F5AC939CFE8A8FED28568E167480CA +07C4EDD53791B4EB1B24440AA1BD22C9A9B21BB6AD13FA4B92AC37495C9BEFD2 +87D03DC1E44F03E37438578DFEB856D3712544DB23CB8E3CE1FEDC61BDD727E5 +8D70A8F07B5A105D9532D7A28343C726D8562D4D1DEAC77C5A757070FF8793DD +6CC888089E1640313FF14BE6C9F20FD56037FA69FDF7895CA0AAFDA22F63AD3A +9A6CE7294DCAE2D731A129B185CCC47CBCC30017B9233A2A9D0AAADAB8384806 +749C741AC8C3A6CB7A3098B5E73506637121129502A5CA050DEC43B822A2E5AC +C30DCCDEA765580C1F6FA8CB9AE217BA5700DD16377C9E0E7BE3704BE745F1CB +7F33C8829D56628E4816B2C4CC6C5F603BAF4FB15119CB7D76FE08EB4429D39D +29973BD0E76EC5A3E89A6822201411BA7988729498AF98E948DD0CF06FACF7D9 +BF874D1DB00008490739C9B13B29EABF8F41A3B569AB8EF09A7DEBBA75789C56 +7DAC4E4B63DD0307653A3FBAC8CC1E2CB6E9D9B727B46CFCE57FEDD71AAF4A02 +C700CCA623726B04CAD85414EB22801FBA3A067A6C9F118BD4C5BC72B002ABB2 +1D94D81D0B14402EA15762DAE23B711FAF209666DDDF5971AD03741A027C1C45 +0E45F9CA6C2D651F1D37F11B7E26D9BC11C1784D04D39E642AA9C0977D443E12 +686B44F7D742B708BEF8C79CB58BC5BB6AC0B077AB7B0BF7E43075D90EFFE739 +79A225E6784AA0269112C4081A520E9EA15212E5F5AD59D1390D1EE66C18D43F +47863A575BA4F282B9B7326C3DE15E8002D7584DA921B2CCCC2C1290C473B286 +566AC94BE08AE6A91289141AEE40E76A7244B0AB75EFE18D3D030C5D5987EC19 +7F628208E1B8F32B2B9E2CE699913315FFD5C2979A6DF57DFC25A426D58951C6 +38ABDED04F33CD5647947B06F26DC9A515E73ACF49C78934C264F142295D141B +862EE8D4C88CB9027C3A3440A2621CFB684ACC47AD148D0876787A991B488816 +62877D7C5B0B548A37DDED844FC2865FD25359C03247DE45E10CC5F4B4D43155 +376D6AFC66B1CB1078E809A44AD41CAC363780BEA157C43046612F5E942AD5BA +CDD63689D13B55EDEF8736D68064672F6C4CFBD8447F7D610A50DAEBFC091D18 +2A28547982617FF21F233852BD7FB12D58A37A0FCAB00A770032CE0DCD3F8D3B +2192B5453F75A43D56610F9F35DFC584B53B6797201FDE2D0E3D5510F78425C9 +0DF6E4183CDD211468A7944F1198DA60EB8C12F98F71F270D6825DB4E5FDA532 +F1D1C552B092ACBA970E8764F8B0406D52A21076A2434A4492E9963AA915E08A +45C78D3E3154FBDF38FF4865B401C82C53D523C1BCA0F2DB3531DE12F0E5ADEA +F83690390764F38B9A247752DDE160C412292C2BC0FE7441CA23FAE402005638 +62E3758988C0DA953894ECBA17356E2BF0EA972BB347A6085081A5963F1E830E +8680BADD9478E1B21AD5CFE45D85EC00376D74798875574F1101559A944FF2CA +A91F3EEE1B0A7F92FB6E8819FC4436825B8C202F448305910EE717C63AE24088 +644CEC64A253C526663062A8AF5F08A1F9E7665E426BE1E34936D110FBC23DC0 +FBCE266736774BF018BAE3BFBE5B442C2F31FE1A102023DADF3FD13D611A48CA +426E9822710F3209B71BA79142AD34D263E44953A4AF35EF1AA3AE6FEFA56F75 +C6439CB64E9EE6D0EA4310A3BF50EF866240E2D343B0DCE2CB6EF721744554A2 +0A53980C0AF9E3C99C0C3A160F846CE55335929564C76A58D1622C47FB1C7C27 +4E7167CA1AD66EABB3EE9F44D0B479DC8E4E38C64438C355B727156F3052682B +5BCA9ABA7FC82E46472585CB643095C9797404C8D6FCF64A0FBD1F3C2FBBEC69 +E5975FEF1CEF76040111C2C26EC6E753ECDADA43D73B06DE583D68F991519F03 +9ED0179A6355BE6BE5FAE4BA6389BAE9C83BD71612810C0378D6A5399C9C0D27 +5C88A642E2C2FE6FE665FFDB58633D2D3429ACF75F71DF124CB55084E36017AB +2C26D489587363A71145B99F244435B7B743C0275AE632E2911F27FCD626E8B9 +6E5FE4D12DDA558D4D52CD45C1F3BDF3BC377C7D31D3B0750633AF68D91EDF64 +3B430C246A7DC76967099BB39F0F98DEC0FC4548C7CD8FDBE428982E74916F73 +75F576EA99E922916AF3AC31C9D0F4B329529ECCE01D3B344846DD193954E5F7 +288DAB43F2F6AA85C83C30136C8C85329716279A3F80ABFB9AEF8B3039EAFE25 +973E7F5B785123B7EE7BE69FED69AA0D66A5B97E40026AD913119B673A642DCA +BA6581F9937A1066304894C42C96F6C97662AF85AECCA1D201E6198D65CF9C15 +241C42973CFC7C8D77DED663E08DD3F9A22FD78246FB72ADB07EC2389F8FB65D +A56BEA777021BA389FC9C64BEC0204ADE954412F82BD35F3F619BF39A809E3CD +35C8C875BB9387216FADF19B027AA84B8BFBD453D89BED8747604DBE8B1985C0 +6AA8A47A3372800FA7DD8BFA6C71CBE578B03C604164EEFE875CE7E6AB256112 +FDD6529D2EE61AFACE973EFFD815C97BEDDFCCBA6AFB59DCEB4FEF51A9105F40 +B05671D263A75D8961A3D524EAEF4ADA3C01C8D9ADC20DB979E993EC83936F45 +A48B44C65D6BA2602A09F56CA3B2E539DD8FADEC6056311B6379AAEA362FBEC5 +C1807019450A23DC07C2856616AA58DB290E89B297C3FBFB23A2FE79D28E0BD3 +DC152026DCC0A649BA7E64CEDBA1F73DBC32D2EA018205863D3AE28C566487B9 +B5AFA5E267396B33E46AD3D1485B77E3D989D7A14DA73A38311861ACE06E7962 +57CD879D38E52FB17AB005055A700777459A66E16075B8F8640C93A8457EBE36 +A8B3F03D1760A61C9E6BB72B87D4CE71DBDBC454C358DFE9D634FEDD54B9666D +CAC47106850E5F7F8C145519B039F9C50A9842E480CA7E0372577819CFD28B14 +0E4741775245D2B424EA401652775671729FFED5122137BD7338C455A071648B +EBE3720E87381BC9CD2DE7A218A12D26C6D7DC0C8C979E6E75E0EFA5CE84E7BA +7C8A7ABFC7857BAA5B2325F9F84028A08C9374B1021C02D9BD9903DEC00B19B0 +2B0733B6984699BC5DD7A58345C050DADE4DD3B2929070989373920CD533FAFF +C6C892DAD202E96D238132E26EBABC21D57BD8F8366FFA7B86F4B5A995EAA930 +3B8F709D418012FDC7293B18568BF0A89BAFAD4409AAB94FCCF93B8EC34FD4C9 +F504F4EE952E55015865B1BF79F9788638BC8AA0093356352B2A52911287AE5E +F5ABB8307274C4416109CC8C8C82456E62F9CD401D555D4BD63790884EE1BDCA +492568ACDA35509F9778AEB41D190456344B36BCF4D638A3EDCD0FE4428D767F +161FBD2831EF30E691E75A9CFB1B41818BC4B87B68A069168057423036B1688B +F1985EF708E0ABF1BED910B4357128723722EC56EB40EE529E11FE1A564D0922 +CD9F3894732FD00DA88537BEBBB75B670764BA1F6C858BBA314183C68A8B345D +510DC21293E91EE1FED2E59029FBE1708FADFAED8FA5D254911A600F218B24A8 +594357CA5E36831857B3882FF49C8EB81103A7160530800CCA6F2220B3AA83C9 +BF8E1D406CDCC9D1CC1E3533D420A77A1BEB80CF3636AD44266EA7F5124B049A +283DF23D8C6133CA2B437537138CC26ADB1903410A5367B8C81727F15F2BBAEB +82046768AB05C85F8DCB6189862C075A8158DCD92723ADE9C08C19DEA25E933D +8B9A57FCCD0E3CA9F19E45C3060CEF001C0E9BED798278733E52D7BD773D702C +4FA9EBD1FCA080CB3A13FC35D414CC7E8228F69696F74FE087D0A0E843558265 +35B3466BF825B237A9819C5E77B24931815EFB347348A3ECF37E853E7D059209 +F076382A8D766ECCFE4374B05CD2B20582353BB18BBA42E9B04C4EF6106207C9 +87B56DBC1BE72E0079FA02F151F35A974E260DED4978E208E492DC97AB3E7C62 +19FFDAB9188F5DB40E6DC9013E0DD19C7FFC86F37FD0179ED91BC2A33E496B2D +8B40170A41EBD0AF91FCAB240B3F8C12E68F9F4CFCB90550655B77F312E92872 +D835730145D73C2380B271447627FB90B4D873C9D81857F7674915024A1683DB +D661A1CC56D49F6E5773DBFF963F407B5EFF2A2543697F475AD9146A5D8DF345 +2C4065B563D9FB12BA853D0F93A46E13DDA588454306AB9983549B519ECBD44D +A452204D35C24F5410230A51089F8183884B28064504459B83D7367E59D9B769 +950454BFE898FC8FFA359261F6BA8427D6A3832AF972BDBDA65479477F441BBA +4EBA0E626641F7540336A108231C56129B0268BFA095798AE8C344B08DCA4E4C +5DF6EF71368A9CBD9E81590EA3591D21977355781501F64062D295F0696B4575 +F2FE01C74629B5BB60A588B2A508605D1E9F554E5EA3601BFF2BB81C97E99575 +423FFF977923775980FC2FB2CEB63333C9F60E62636F95A4005172B2F92674A5 +09EA0A773C046717E35DEF00EE7F4DE0BFC2BD1CAD1F00F49E0228268347EFD2 +ED9812D9C2994D92464446C00B80B90E5DEC5F4E9B30665544C5A527F7506082 +6D03B1C4E33DC7B398258AF95F6FEAEFEFDF63AD4769478A72CF8D93039C6BE4 +BF0E83324B758F26939A1381B44DBAB535DB2C51601C7DE4CC33B2A83D8BD5CF +21C9A334400BDAD74EEC4E029CECFF0D5A8EF1FFEE3FD15F7B53DB2195C42AB2 +6A4F6441731BD5FE2F51341AAF4F5CF280CF4C96DD7C97F5472B60CB30F15159 +FAA4A16E941CB45F05D1B45BD15AC7EF9A97E837902EDE1503DD587678E37EA0 +D5345CAFA77DC7E3D437759B8F00D6ED018889CB2109A2CCD2361969C2716146 +B5D5166C849B2B6937DF9DE38F8439462B63EF3893FB1393AED1A25C08B409BA +0FAB0C73D34FDA3310B0839F0635C05D451B89A39895DC9B239921148D5FC149 +CE4F2B23A1D294D3129A87D47A3D2A8BC4CE8C4D27C495568CE52B1DE8EE5B38 +8508A72097034587491A551D562587BC82FE2A864BA42AEA4F66E9459BEB9027 +B47F4D9A6EB20F032037E8992326115BD3DF419D6669FB4EE075BE5DE7AE09AC +0E51FCEF3516499BB2F95403E918AD479473921A46D648C8F7C756DCBA674510 +34AA13E45FA5DEACE407CEF94B01A42C556AB811EFC7D4DEA581A019D2C06C42 +18DB92A5E94A728FE61565FE825DA5F7BB88227D1CF5F577560AE6A4B36A92C6 +23497775896A472272E651773E4E5955EE6BC1EA8CDBE987279EC7EC2A5D633E +73892F2C576637AFC15F0F3E5FDBFF9B68731D3A9FE3107AF3860E3A80D8133F +4851FC996B9AA54D0AFA7D6BDEAFD81206BCE8DEE8F2A0E9EFD5BA4CE01FEA40 +48CAA82B8CD894EAF7DE1CF1E68B9DCB16821489AE44447FE6521662E051E22E +792149E3EE3E75509ADA59EF35AE1DB8A1BB1C04E3C8ECCCA1C0BC5A24CF356C +3079B2FF45C6CFABCFDC6DA0177B3D1B2C96D8A7B5D1681867438BE593592B8A +64AB9899100258DDE80A7F82A7B29E40221AB1F933579A4D9159880176CAB6BF +D1641DDAFC3E512BDEA139E15914ACA2746CC890435FCB98549005BB382A54C3 +66D5EEF83338B0BCC03C3F0C1426B0CB2D180F1349CA79C642264BFB04A9C315 +04EA4DAE1435AD805621AC4EE58AA768CFEDE17F7786C9C43A7A11C16F1F864C +FBB80A2B134609075D4A6676F1CAC147050EC680DD96D156DB4470F4ECFDA645 +F18116BB189AB0942C67A254F8E7BEE0B70CBD43E65A402A30248E2FE5B8FBC1 +95FD81172CCF469BFFD305C6055B8B1A6DB9A6D285797EC58315246BCBD8890D +BF11A926CE92271B782C78103D01867EDA935877972BA80B3B568D0CF5E6421A +A0F1734E01B194ADCE54FBFE2A0C8413C21FFE48E87BB6E218FD727C212A1EF8 +BEFE2D4A4E4E690F85A78B1BBABC88E5028F7FBD119DBBF224E05152FD8BCF6A +C9E06B50EAECE709F88715BFDB9D8B16F70BE07D707C22F096EB43887F0A4A8B +E0DD51FA1CA98409AE66E2582429C9CAF12606318A19AF10023B64D90A7E0304 +3DDD0BB738C6FB39C8987D2F1BBF4CA2A930E838174426A0E33D50779685C670 +717A5701450317DB9A1BFDDE56D032C264EDD55F31401032C272984358F86059 +1F6447A29F2FAB6F44DDC7E14CDDB0CFCBC1F6941CB4403E5E90518D24740496 +20BB4FEBCD7C7DB307FD559B7167C01EB3D2189B079F99DB9073541C69F86934 +93362B66B4E298F475F067B6427D327DDC996E6FC27FD513C4DDA03837794A1E +A9E63101B19B5E0BC5E1D5A0E28A223FECACC2E79C226FB191BBFB5759C14C05 +FC60DD04AA7400D1ADFF88C619D5C7ED4613EE00F5D45D05F83A64232F8AFB04 +DC1F256C18A15415BA04E85321CAB278BBC72FCD36B32BC70B58D865C75C86CF +EE161325492DF6B943C964F7E38CA3E25A4C6CB5FBCC81E2EB759720622CDEFE +1D8A3C16899B334831CF8E1C5190F0BB64C99D0159E38389E477AF11FFCC11A7 +4E1CB0DD0A128F177386DBDCD42295ABD0A4B586B9AEA32BB1C556387378EFBD +363E6C495C86225C6D49E623CD95CDF45174622BAAAF8902B3A5A3259EDC41AA +32A380C3DF08621DE8DB5F322FC0AC6389468C1A257AD45948923498C785407B +7475E2C9444C8A3E00F205DD1B4BAC255CD03D9EC7800CEE524F25A5C7A80508 +42D7C09BEE4350CE4A58205D797352FFD3ED91C8A9945C8AEB8DC75D63648BCE +D3490B25542295AFC850BD692FE04B2D1602A0992E313BEF49B4700615182941 +83C072D69CD4B56B91D49C4F128B2A48AB9F4014478CDFE0AF440D27C293DC80 +596438EF38BC78B88B63E582BDDF1D19B09FC82C1379F519881CB6AAB42E082A +3AC491B05A709A68AE808602B4FBCD385B26C342338A56523DEF3C1C6B624E56 +7824843D037FC221B4FF3F3A8ECD441DBF285EC5EEA94430D1832AA4CA6FE09A +35CEB0F8B9D811CAA57C8A512C45F057683269F7C1A7C4875B945B8C36ED549F +A5E05717E99DFA20FB3F8A9906F32248C34C734C1F2A56DC2DB5807E0F541D8C +103FD9FCDC4EAB3B0F097978F2B678D3D49D4DA91F93248E10002E57854A5DDF +21AE4453B5792C003E083E8AF877D4F0AEDFCC4429C2D8AB632BCBF030C774EE +64AAF785D6BBE8A3E68C62D82518D1C94C8FA272442D22BAB0F26F1A59F81B69 +D823B55F5A1DB4E2122022294CAB3D6C0B154D3F8775F5B9FC455646AFF2292F +D135F55296ABADA9CB8F484A7C0AE8E8F7F58632884728EA4829659EDBC89675 +B5FECFEFFFEFA18E1DAFB0768BE713EF839995A220AEBF2AC92E363D94B7062F +EF931E5AFDE6538591B0C08E5DCB3B6F7C2627042A1A0ECE84EE8F173BEFEBD7 +A9E1A1539A6AAC92D0822CC5C0C547C46BF9B2BB5F7A90D38DCB019B78A6694D +417652EC6B7F974CDA4792A674813E688C70DFB6302F64FA96F4C57970088D05 +4314EA028EF54013FB629B111FC013EDDBB26745E9FD038CBD7A0B0E1FDE3EA2 +0A5409CE172F1352414A6116D880734902B1920BED0D136EC2BC11B89D8C40F5 +0CE96AA878E4789003C7B5EBE0BEAB9351154532C2914F3425A8670625BFB065 +3C3C5616A64FA233F723D46A69E540F9C5CF0AC5AB3136EDFB261ED4C232EAF0 +844208FBFE2439BBCC6FCA8BF4C201288DB5C9C45A5203CE6DE9D411462E8627 +DF3F50FC24C5FFA7FC5103F43DA056366D9ABAC0FB4F8BD6AC508E9AA6C31833 +764EBB0C764C74ED7799EA5D03EA554C69A5F1C55A70E7D0AB2710475F7C56CF +93D22B1CD8623A17056B174752AEE528E55170199092EE774371A2E6E940A08F +BCF99C22CDC3B11DF30CB51E413D8F1519BABF63521FD56605006037CCB4CFD2 +C41ABD12B28D81E62CCA2C52078B8E2688958912BDC0323FDDF02FAA6DC545F8 +762DDEB51FC01064C19FC2E7AEAF3F1CD7C056540346B69A8406F42408A4F634 +98131B9F662D85A52FB4B07925A5E18DF9161271D72E58E4B308AC2A498D8231 +03572CAF2DFFFEBD22BD4B90618F9E0A9EE2C5B0A09DB6A0651BDE3341BC410E +D7748C7FF02E6595DA0A42627CF7D84A89FE584E5279405B64E0480E2CB5866F +4366169779B3D1B65C08B232EF28D291E3536D03E7D33C83F0D959C7D79106BF +726EF9F9E722654D70BF6F547413A2212A2553132135F1F38632277001309ADA +BE024DB6DD26850CB5A3FF2BE3F7D29A0F55E6297CE1A96653F41E9C7B714452 +0AA1A435D7962BF91A2EC00E159B96C4C9E663E83E43227167DFD731BA675320 +497B3450E0CB4EC4A77479A071664A7AB42F58861190EBE1BDF9C2D8F105A7E1 +C8B13A1A84FC597C3815A273F52D16648E921BAB91FEEBAE0E4032EE2291A21C +B8979B58229CD27439A671FB542D347E26BEB0754984BC7AE7DB7B95388DB8D9 +CA3BCF79A5A4574D3551DFA53039D1A791629B36E35CF8806FA4A66884644F60 +EC67AE95F49FD035770D8780BB42DEBDBEA7D0D1FE121060CC42CF88B2456A39 +18884A8400FB0DD52ECDF005EB69A2E08F70236D6F7D6DE316998FE19F866E0C +BD6267ACB77158558D364033258F6E4339346E37932AC5610C3F65DACDA63C35 +21E9D3D173299FC94D91AA24F135A421E1857DE62095C909BAD7FEEC2D5E6DCE +03F91C1D348E39D8AAFBA39D3DD4A0ABF9D1E6DD988FCC0A5E8E8D14F397B5C8 +F736E9697101CC555C57D072BAF424FAF5AD54244F17D2AC3D13FF8575E029DD +4E94543300D3AE6BB5C8B4E912AD75CE396944C5E0AF941C64DB80887FC9370D +52273F11EF3C5D906F5B0EB61C3817E002839C0DB356F314FEDE1FFD7A3C0B43 +60955A74B77838B0DD408ABA153612C59450A7280BDA427EB313CA73223DB772 +5BBC4F3A84377E04DE37ECA2F73190BAAFC9496437B4900A99826B7912B1554D +F8BA46464CDE70BC4BE0BEA72D6676A3EDBFC16448184CD8962A84DE9759B77A +C4B543BBC7974FEE02A819E9E09BE9FD4E6F5EA27C8D35EB4A8D719CCE4462CA +D70FF8B07F7A873BD4F33285E26914B00D23E3A99B393394230EFD836B28D91A +DCA84B361EE4B8F0B0957889DE770AAA1D3CA9AD9DB950B3B4DCDEDB1EC5AA6D +EE2B274DD66449CA89C05EB43CBDE9033C3DB8D0FF9A86D62C7500E1D87CA71E +F0B443237D5DBACAF84A3CE93243E0A85277AE3BD002C010DCBEC3BC676FDB1E +D3E7E249E2045DB50A35C7AA64CC11F6A10EA9AE519FBB3DB9624D5A3F3042C2 +73A8CB48667D2036E8925F46F17F2180C8D4E251F9006795CF4FA5E9C01C66F2 +5C2E48B077685C6AAC676770D8C0FC496077DCD82EBE27A62E842347DD50053D +ABFA8BB0826B7934262E624BFD3C7E4E8E8558E2DBE3485CFF902770CEE40555 +1F4D736B8DE0832401B1994A5A4F366155E700E596C90645803EF1BB796CABAC +570D03219220F960C93F71CE39346B824B3515EBB427F60123D2EACF6E0A2B8E +B727D66BE4AD6A64EFD56A6B99B6D26C153E5F87B7A1132AC03A4AAA9D249166 +9DB8CBF7702FD445465329B11F8DF87FA561ABC487185FCE7B4311EE0CC75DB7 +E12941AFB33138B204E85AE8CB4072C6D12135036D7D309D79AE0BE3C361C9A0 +90CD8BFCECE8DB37033DD8FAC1351A5D631F1FE375DDA96099832FFCD38A0C75 +DB20BADFBB3163AA92F454B57DBA415181ADFF621EF2C03EAD917CBDE320E508 +DD4E20B0C127E7CA2A5D4F1CF3275877A664F82B1FD89E3B3571E421E028E379 +B0D6AA3F371766E1ED3496931CD0BEA570EE0CFA7FCB18CE9280CDC353B6C0C1 +FC1D7B65D3235C1CA6F888A338D344F43BE1C7747107FDDAA221ADB863059419 +D4707996FEEC7FE188C566A1FBF5CB4B76FB9EF6D22DAB55AB0E1AA69CDCEAF1 +BB9C1B4A86CF96F4CD90BDFECAE059D0969452CDF87C00DE2D314296F2237653 +B5E851FBADEA42B68D86768EC2367D2955B64E19CDE30553A05EB5EB62096840 +012DBE282ED6345D0E7185CA9E2172759BBC4D9DDA65A9AE9535335189D93D32 +23BEAA9FBFA16BA3CF75BF09931B1E486DC4E3732C6CDAA7C813F828DAF18C30 +D380E4478A5BBF4C4DF8A40C3176AEAA9544C7A398586AAC5AEA5289D2C40D46 +631B4737BFF4698D9CBB59A3B2E67F95B5D768E86E4CFD1E3B8582069F25AD69 +BA51815E3F4190E10D3A84D14C40DCEC5ADCCE5F1755B878C46A45E8241FEF77 +35D48F11037A7BF7061941CDA977CBB389766B7BC36CD67EFB60A48259936266 +D2DD283BD35634B3BF5AD5BF353CCCA573A1E69DE0E612F0E36111D6B427E357 +8C8C706705DB97324DA947C3427F95CCEC541972F6F8869B6FB2B8745C26BB2A +E64B711FE6F9BBF035C5C0A6BE50AAB944F9DE90D1898999349021C8ED19A711 +6A95A1F1729C08E77944B81710FB206CFD4D1534FD65CA779DB88BB8F024B502 +DF62D0632FEA1B70FDF7810A83126ABC0C6D0D39D451735B1C5BE28140931412 +B2B98DB689CE5FAF8D1F7B99A3FA3CD8CCB064B91F621BA5787FFD2CC466CE41 +5D77B386756C61BCC9933402915A0CD9EC643C75410CC87722B8E0B11BA695F3 +28038D6BAF9BD1AC64ABBEE98F695CBE983FAA1517EEA952367B87FC31C22D66 +E662889E27AE914EF3562AAFB3E3C8FC7D164D016CA022D130F34C64652B5179 +5D7072F49CC3394E01BB6CD54BCDD6B1BBFE685134814F9175F6D62E189971D3 +EF5A3FD5AD0FDC0FE1F36C2D8A40DCCDC32CC6AF4AB4DB25ADDAC72E2E5622E0 +BB907662D125F8D8FCA0DD26B8A5042596373BC069529A51D9D8CD247B03F273 +B7AA525EE3FB79498D81C5BAA40A533480F57E3E4AA3484355ACE9EDD9F670A9 +FF9395FDC0C408566F605D70E799862BFC667B762F4B71CE0067FDBEA88FE304 +63D7192BE68A180CEC0D23CBE7787962C657EDB83098B20A9D87ECD368700410 +63C5455FA4084764C2F36195C7F92805D7DA1B30E6FC8B0BF34FD908650556F8 +9DB301244CF76A222039C6D0F3D22DEDCCA4E53374D0ED5E6539AFB4371D0FC5 +5BAF5EF6880CFCAD6F2CF1CB3109F1513CA14FA8162666677AE9015FAF28D1A4 +B8488C4EA810B16C86E32BBB479B33DE3158613404168970AE16FCB3EA765806 +B14B1CCA48BF9CBE25423E652BCE38C9769117BC0A84D8555D232207C6E5AFCF +79CA67293737780DFE57A472457501A9F082E09A14D60301648618851B247A2D +EACCA353F4BDAF8E1A4C14EC0A7D2B7B82FAC4F6FC68844DDA31E9D833307716 +FDB106CB7969B7487AE836C410AA907C9E16FA4174E4F840436341714D849D95 +7B3F7A5F6BA1184C4785ADCAD4E4A21FC4E99184A961DFD85A9A4A585794F57E +47BE4239FD179C19E28EA4D6F2A8800549DA3C4510B244723A9D760DC417F6B8 +7D0D4A7F6B651B3F23274ABD647638CE853B3F58105FE78D8EC1033E984510BB +7D01C93A9F13C9843654AB267EE1F8EE41B84B83F065062D348F8F83A0F67682 +D189AA9D99A63CD603A2BC5ABDE0B41562FB2DFCAD5B8EF6502CA6468F77FB5F +C1A817C1131661D89F9F54E61CB09E0FAEDAA0593B2D4B67F25FA96759D5A8B9 +E84CFECED0AB400C755CB82D1DC7C4BC368C4228B4037342ECDF209537992B47 +F3383EF86B2ED8C16617F507CDBDB03623C23B2725136EBD00519E7C73289569 +6DE12563D06363FCC7AEEA5B907CEFAA634920F6EB4A36AB7134BFB79C2CB129 +510D6FA6253E30C1D773A1E9150CB41878B928073657D239A868B7AC365D2340 +7FD4818DA3A23EF773CE5AA6BCE4BE5D54099B3CE734033315F8544E1032F687 +AE61BC7FCED72963024C7C21FA9D0F6827E69986E81AB7D53C4B5C0C681B110A +ACACCE8E6246F135AF75903691CCE03535D9B9228ED12BE2FA9F38F50BD46B5D +3FF54BFAEEF262F299D8F8CE935DC1AADE340DFA0EAA186688146EE3BDA24F22 +35BD0D6A9943BB4649DAB153CEA4BE763A7D086E568B434AF847662C63860976 +19A7BE9DBC44C8F4755AF7A0FA8E0955FDDAB76A2E312E4FEA263FDF9639F710 +82AE3BC40F977F700FD0A4CBF14E112C89059384AE61F5D8AE8AAADF8263EE08 +BBE1508D8BE96088746D126311EBE9E53C3D481B2D05C3915B837CD2EB9246A0 +B45CF349E003A1772619F926D21D974F023984FC9F250C2B047D8BDBE3160D95 +C1EDFB590C07055710EBCD36206C14680DFE7B2FDB815F192E174EE1788E404A +EADB20056A38DF76356E25CBBC243E9F3B0047C1DC2DE4420F096CCF430FACAE +68E6E855FE4F5DB453558F6F9A0863C9BACBEEC0D496E64B4737E4223A847FBB +136F40CA1F924595E4DA72E6DC8FD1FED0312FD6BF642B1F4017A95577A742A1 +6FFDEC605A8C01793FA201E89FB92667654DDB2C79439C17C5D2AAA6755AA742 +F5FD6421E3B92672EF03E78049EAEC7218872D7E8B8053A3306F8CE8C5A1F36F +21B73544EFA441920E62B85B282D09E4B7AC9A0F45F3B4D03EA673471F2D2AED +08F107E9194FA669A7CAA31AAD8A849DDA803CA99DDD4669E616992A4DC47321 +E276C2D21A101807C1CCEF4BF6A6277283D6240AC1AF1CBB10781E1E81D2CDE6 +61EE562214B77ECDD2BCB014B97B9C1ACFE52C6844B6129A2F6EAB95FCF33371 +B941A32B869276DC4BB5F5F9CF132DAA3766692268B0C7BEDA0E3430769A4C7D +390E771245DB1462F052ADF0EF6521028B60806112FB000158DCB1A42A654342 +A09E410F18F27B1CC9836B5EF545D4E5282C6C82F05366F8629F115F6DA28AD2 +DA7C16C6E47B2062457A1523E456D0A8B915BEC0D23A086AB0A0E7CC1A086DE2 +1B2D4EC74C2CD70F2F20620D484E5F3F9E841AB0CDAC1829E7205F0948FC6DC0 +03B7A97141399B48DAFEE845B7354CFF8AAC4D78AEA709AFDD49AF6ADDEA800A +8EA8F5EE64F3E635FBA35BB5EA0A5ACDB731A4735FD75DF0BA4750E212CC986F +DD5719D3EA651AE7FE043CCA93CEC9E00DAEBD09DD641564032E49FD4F1E7ECF +7779B2EBDE7C9968C3926995EC8B782D52E2B587FA2252A665D17F25DCF905DC +4C42CC2AD7D61BCA1778E8BC8DF9D98903776DBA03B2521B39A8092FF149C828 +177A12A99CAC8D5CB5AAF3511458F2AA47A62F0B461CEF4A85EC71F265675164 +FC1ED0EC61E2D58E87A7248987B7D834CE16DAEE376C783C7F27ABF6EB80EF55 +2076F29789877E5C1E8662396EDEE6394380E9939B659913B65CA6156A8B24FC +661A399C1E095D3691DC707EB1537525A73524914FED1783BC6907B7D234D6CC +4362BEA4D960E5B71472BE2B60BD4A46B0B99401D22264AAF66E4E6175A311EC +8C6292110EAB741377448733B44B4FF17148C088FE1EDA17454A9E3318838806 +D0B94DC518769598D93231432987A83D8B3D7737EDCD3BD6767A1F576DE4CE2C +4E174875646E5A7F41A8B9FAABFBDC68A20C790EF1ADB783D3B59CBF50D71146 +EA14DCCAAD8FC203B7A1F9A4D94F682022787E13F9DDB0AE28272539F507F481 +9D994B1C168ADD17330A091236E1A84E8C25048EB760A2CC7A259810F5F47788 +FEDC61D519EC215B40B7CBC786C74827CE77CFAE85B44CE2D3A2ECE63F392DAB +D6A7D12B3762316D9A392500F9BE25DB9B261DCE4D7F0795FD1683B06B5B3CF1 +DB9BB5DEAF0FA7C40D940C1A1B3B8B9308E43CA16C4D20E828D645620A227274 +0E31F04673101CDFBF8BDB8E4A59A47F04ED55E3E2B3D84B3120470BF0DD8808 +BA55FFCA47EDE1F1CCA4045EDB7AB8B8A9811E5AC61BF924168B773724C49F31 +928E591294A7049901A74D6DF0637B8553560CB39811FB4D4135DB152F962930 +D3B6154C22F3D1FEA823F819133CE4E1F9E96DAB170D96608C66F7533FF29CEF +30C963D6D251D397022E3E5B7E75488071F38B0A62BAA792A40D5A1084B325D4 +6A45B150EDB3093FB403789F071D55F4DE904C713F58E24BF4910ABFB439C5C5 +A2109AB701E5CDF261C28065C8ACDCF9BD2113C4EB0A63A2C647E316FA4133DE +174624BA54EF9E40C0FB3CB90E1BC79996623F2FAE472E248D979E15EF053828 +6B0B17422B7C24D44A617B15A7BD519D3D39DA1AC9291E6031E40AAC95D81698 +77BAD918C3DEC8718F9A65F87FE15A5E3671C25B421C5BD410C5FDB7A5E9F7AA +E4A9FF3CC852C30531A9A9D118A428E35730C15BB21DC155E5A7C5604D484B5C +CB4DDBFA441AAA99BD1660CBFC5C5D694BA58B0D458363DA2BAD570908827AEF +457D78779D104D8E0FC94AED87F8719F7CE91B2D035398525141B6AB6277150F +121CB363A18639DC42FA78F79F8574D741C8231DC4DBB74E9749B7EFAAA9B837 +F76605DC431C6C97174DFBE4F994372483B83D0139F0A5677D34F6FDAC340705 +F5B7695B41188AEC9570358450B93EE7B0EEE796A14CA7950C2353682DAA8B91 +7B2053A73C95E479E60A57E484CB9CA5EE58E7FCBBA9FD66590A05BCA4E104FA +A14F8A891164B901D4C905B651B2C0AE52F656043DEA5FE29B2654543CA6E3F2 +1954F482F91B2E619595B6FD6F75CD3893A04B1B403BA037F3E5C61D295B4362 +9047752A4F3887A77C5E972A1BCE4E1B1BBAF8A29AFCA3A7CB003CF9EC366976 +4182CD264AA33AA7741E2591F4D6720DC4E549D8DF7D030C95B6BC01F67F7EF9 +BA290F26EB0817BD34E6479A9F3D64C5576E4FEA55E21F0835258AF43DB8733C +D9AD0380D6FDAA7C3A159909D51F8355AFFF3B4966184F6858F9C8DAB0C4B6AF +DB35DCEB259E2A69DDAFCA463AB8D15BD1D44A5C7DD9301ABA8C5C1BCD2199CF +3C71BB0CC646087C43CB361B63AEFD6166650B00889C8574DE207AAADCE273BE +9D1DF3E239D95EC30F96560BF6267B36452FCC593E212FB3B4E0EB61E1B95C43 +5112AFFDAF357AB079242648813BAB19C789AACFDA18259B6A0A830203298245 +53DD17D806762D0660E949DBFE33B70BFD5F11095043A38F6FADC9DFBD9BB904 +AB245C6EBA2EB8249263BE41C9ABA87BAA5F8302EDE09FFCB6F47766A604B2DF +CE5E291FB8B002FCED8FBFF9AACE083812D855A972705B17CE700C9A1AA25D06 +9C1B102BB109E499E8744C382BAE4083B377FFBDD74CC72FB7D8CC74F831065D +232CD579C4190C5E1E36F1D0FF5D659F936874C3FFAE030BF4CD2A114BC2DA93 +0663FB31D30747B66B8E1DC469425882D2505E66E1324042F54B32F2AC31FAAC +29D3805E5C0DAD5EFB7C0C2A7FDB9B6BF6958BBA3E60E562C4B6CCE5D435C754 +ABCD496309310DFF2A82B1E483A84CD3E739B538333F26ACB66C2ACF6CC9342D +D336965EDFE939B8A3DD70D49999C539753F2476FB0DAC527C189CA7079A7AF4 +7D3B48FAF4B6508EFED01797981457B6BB193EFFD9D2C0CFC3E64E2F2EAB4D41 +8922CEC836AB83D345D7BF96E12D8E33C776AC3EFC542994A6A762C238CC00D5 +641DB281092697CD143B7B83B4B0328BD9534256B54FCCEF03D0F94130E7CB06 +B3B87A10A3DA25AE1ED0D1BBEAC7599B429770FBE7EAB5A1E8F6E275C88538C6 +90854DD863565932D546C940423E032A3C58149A82FCA0F78EA63D52CEBB6B50 +3FD8376DBE6CEAD19824DDFA2ED141116BD46EC68EFFC60CB6EEADFBA6AA76B1 +30B2C6F8F8AE128D1642C786FEA9BCE8993BE302C149BA5B617590CE2771B798 +9B56E6159F41E76EFC0C4DCBA47F93BDA0DBDE3D2B31981DFEF2B3579AE42269 +35BD4A2015165F494A24D7EEC7DBD7819DCB7E00F6579C71FB42B428D9D1B789 +5496CF07595B5F68D77ECB6C75990A0E77EEAA91661FF3E25BFE3DCB5487E921 +C19CB362A92E4513C588DD4C07929F42FF1E0C90A6880D0BD462DB37F967CE66 +E490148F6924DFA124E2167F42BA2B0F631A554EBAD62DBFA71F813EDDA89CAC +AAE93DA7206765F0C157AF6D3DEF80260A39DFBE4EC2EBBC491C89A2BE598BFF +E30297CFBCB06BECDBFC8ADCB86ABEE0FE9A9D03D3B6B132E74B5E7B31EE4D93 +42114BE62CF59162E2F734FE657D71F85501ECD61FB3FC43686F984654AF799A +CCCE53300F3B26DF00D2DA5C7A4C50FFC3581157A188F37DDD81660B5E093440 +F13F2553BB494AA6E237369C26BDC401A1DB277D5F9ABDC4934E1F27845648FA +E581FCCE57AC9BBF805A9BF12735BA6A2451905B3F62220B562E14C62605C17A +9155493C9BC368D4D29F546B5DF43B7268C411C6FA83E287AA4482F4C9C11503 +9FCAF5984B704119DDE016289B699298178C7A8474BC494BFEAB05AD1A65A211 +5BB204C5357F1A9200D487DC291215D41D254756DF4F903E202F45ED97003184 +E7019B98A089DC08F45F67C9CC2C6C1E01D15D77ED6B0896F9990B2E5FA56EED +3833B2CE02D250F25D5F4896BD2977E3F846B6EFD6A21A77922746EB62ADD591 +F29B6B248C211AA3E5DF0947C2D47005835949A89826193C51FFE4D02C3567AC +3E1625BE08DEF17F1233B0F48F58EE531BDC3DF88C449FB05B1294E0524B49C0 +AE4A5FCCD838F1338A7C3B8DAFEF0D2B442D0214A58C8B5E4155A9413D058670 +4D888C902C86C1B7D57C007083523470B4090834D0002C23B0486E7BF45A1E0D +7D801C61A85D2B36B720AE37F410B02223D500BEF9C31F3AC2B37C7A5396C038 +EC5022062C101CC4513ACFBF3EEEE9CB45A25FB9692A4B2216A6933B968C7FED +F4C55F6D4E1D30EE75F46E81F2D4594B0B2D0CF79E09E2668FBC79DCA1020CED +8DB44546A1477093B3F6DD45F0DA3A17A0B14AF9A5BD7AAB93E55837CAC87E23 +BA99FB93B9DBEDE250F66342BFA270648582C7CFC37322D9A2004E39FEE1446A +FFAF9A218267D0971380E743A22C5421359CF6A3ABBCB452BDE51B582ED95772 +E03EDC7CAA15A9BFA33540EA7B87B579DA656D53BAD2359F2C2082D0922CD409 +B3447B94D8647086FE0A4F2EEB85C7B57DB2711A2B1BA0AA764EB567126D37CA +C0ACE9F5355E253542D64C2A06DC3E1A21C9593A4391A5D35F06600975F73FBE +9F9685FBBD72C6B32087168F0DF07DF783AA84EC7E8BC7468D301AF7238FCF28 +A6D37344F512CEE962E6701E0406BF3BED4AEC7AC01EC2B90421135CFC14E519 +A51930EC859887EDC7C9C52D65DE128C07DD40B9AAD7841A43469AC33492779D +1C728B62E743BE3E2575B9853D58F8FA2DB17D98DBF94B68D8DFD5C646CA24F3 +40DA3AC4F4CE8A2FBADDDEFB95F9928EABC113F15F8479D3504CF6B9375634B3 +A451D446DCF6005122DAF1CFA827D44A78D79BA70DAA5B6F3E19597ABA4125EE +6E821E036BBE36B9E49214E46FE20C200BD78A8836F89DA5B79443CFBDDA32B2 +4A0F8D27BBF03FBB2A57CF08186E6EE74BAC19A91FCC27D6F457812B58DBFC1A +77ED677C0473636EE092254D2212FD04A2BA77D242218B5F83E5D4EDAE0A2B0B +DBE2673EDB605203090EFA41DFC3C8C4A6E5233A4C183D18CA6215D2D973D4EA +6793381DE634097C4F6B2C93964C1EC5CF6596ED1813FD562D977CD38856047C +A5EF68331ACAF685D5A1C20DEB8D326CCC983F005F6506E286C37E17BF72F0E5 +85EA373250F302C32BA7D99F7317E919DC580CF9A76324087EAA3272AEA4297C +1366888FEF3A8295802F6A327B524FC47100C9EF5AC2FD422F3C79BCC3364BB5 +589785077E9C279AB0FF0D2F3666DA9F8000AABB42925D2C4D91EC69C618CD33 +3335C63DC2EAE080195C6A31DB2774440A0573F9F4064B24223DC4565B344038 +B50D9F822D368EA7BEE7F138C41CBD3272 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR6 +%!PS-AdobeFont-1.1: CMR6 1.0 +%%CreationDate: 1991 Aug 20 16:39:02 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR6) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR6 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-20 -250 1193 750}readonly def +/UniqueID 5000789 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C +68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 +3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C +BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E +CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A +C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 +D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D +23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 +D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B +93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 +6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 +EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 +CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF +D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE +00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 +B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA +99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 +A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB +11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 +50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB65756D833A +1000B06DDE8802EFBEAB4ABB7F9B3134A80C1E3358DE0BB7C7E51DAC55CE34F6 +949446A64FC4974CE66ED1990963E0BA5A0C4860D57D772F6A93145D522455BF +62226735ECFA0FEA888EB4FF20EA2724635CB53DEF64415865DE5B33A5B292E7 +6A89A7DF53B77CD7653F88027C5B49ED3E6417F973F79241CC971AF0381571C7 +65C21C8767AD7EBF8CFD3594D20BEFA8CDFC74A5B1F848667F1FDD78611060DC +687458B74A7A0E602256ABD17B0E42455C9B127DCEEB61D7B9DFD5641265EDF3 +4B6CB4A8E389E2291614443E011E243EB647E03BD82BAFB2EAC335219A2A149C +379EC531F25C6FCE1A268C166FFB5F259A48026AEFACCA5D6CACB176AB573A3B +199DDF3114E686646D06F09C96CAC26E4339D1DF3DEFE24A4DDED7FCEA5EC354 +6D5FA33BF5ED740D1C27B119BC5A61D764F81A74C845E77735E31B9AA0A1AB63 +E68AE86A42E2DA1BE558C2D122D78BF7E9287EF03F2AD83D288C299C6C6751BD +0025908B7B7B772C0E3B190AE8344948DBC923E16067F089225AE05A75F81907 +7D66B6CF238ACB52200E0149AC348558C2A82B9F52DD1E60FAB0FD30D602D74C +EB395A0B583EA75F2800D7F3246120C7DF7239FA23ADD0360EE46ACF252EA416 +1AAE12243FA42DD5EA9D0C06D2FB29F9B232F5C2654B719EA24760E803C4B32C +61520E1436AF86E1D73D4FD050841C0FD679203072BFB62EC0AC34224A7F208A +3789E0B95490E1AF5BE624CDD20AEFCDEE220EABBC681784CB979EF137A6CC54 +C0F25F713C17AF9D7631F2F6E73D837F360E6411E513382BC0C1070C0994AFC9 +827C4E18D1DBE51C478CEE2F4B9325DF2093E2CE1F3DA2F99DCC3105AC6B0B50 +C0C1C720DEE422045F26FBECBDCE20DE21F8CBA18623D3FAF5CE0BD22DF835DA +DD5C3989FB5769C72A4D877270C2C07C23306CC9F13E5B6CAA6755EF3E3C1979 +87EC0FFC7C81A510AEDE2A19A7F4C8984BC4F2590DE33DC173201CF72ACF1678 +C88A1BD4BC3F4E3AEB63410F85BE805F95F31292ACAF5E1CC0BBA55334B1077C +13DB6883390C9D56BCD47FF9D28E98F280AE13D2E3893397CF07AC86ACB9F358 +633ACEFAFF140FC6F51AA27966B1A3A33328AE6075F7DDE94A14671D1E8F0859 +E7EF0C0B087F60C6034CB15C77B986784EEAA747810907F9420649CD0643CFD3 +8F288531D98CC8C71C6CE026158171866BBEE26AB8F7B184BB20D7541B6AFB6D +4D7D1FFE836C0849C2D647D33DF0AF6C58798D26768658A8A77CEF396B77AABC +F263808E363557AE4D69D4703A970AE16A8BF4236E2CB5CB9E238514BDF55B07 +6E7A0BFC8D864E69D346CFAB4756F82A3507C1F7063B78BFC2D84CDCA1188657 +A085EBF2629B535856E6F3A0EAE57E253CA3DB2BE402F94EE15212F5B9527159 +AA463596A062A32B09BB43B4DA9874D0DC6ED691DC32FEBA6E683BA141D5CEAA +CB5BA60C670AE31AFDC926E1834338B9E0E6AA696CAE53128DE335DA8007C49A +379EEC4C21756DF4C0A04C7B351BD02BEBED75B543BAC59C28F053127DA548A8 +17136B4BD2883E2E3CC3737DF62E7BFAEBEE2E87D038593807B4276C5D690341 +4FD9E323A2CC092147351900B02D65B48464CDFC1A69A5748EADD7BAD497447E +47095C35EA732B0A8AEC160E2FEBF2E7B757A17446C3F00F6DE8E635BDA5D4A6 +20DB01E178F99D944FD7D79D1EFE97F949C1C04C7F04055191C0E49B90CDDA7E +62A8F53D1940F8E05B5C7180D3441B42CFFF159840879830EC3560E8773AFD02 +1452A8B65E86FB40F3C5B854956969070ADC5E4F3B505E480E80EC22C2A8915B +9DA580FA78020FCEB328E3EB2F645F3E46F49E34360522B43B9C03A9D0124819 +02CE7DA97D017E3825EAB17DBA957C4C80018468AD7E0F5EF7D3EB19E62A68B7 +27490F0AC832F43C4D41475625B614B21C6729587686506A509D64E7F0778E1B +008E5049D6AC491D892CF1B5B0157AF10971AAA97708F0796C3DFE53C15539F8 +88D89125EF7EA02F7FBC7CA1CC09079EA47FE2935060FCA3F72FB408E7C79320 +D576363E77DC2C8000538C5536F7D95882766D07121A8A3422C6248A892D2D8F +E33D0AEA73738915D300A0D0471C98C471AE0E3EF4E0111BDD8EDAEEF4D5AD7B +59710D95203B81B53E869954CD0E3F0F870C6C626D272B34EB35E9013BDB894A +29E2F2623171267D4D6099A9B1DD65076C5153DA0858219F0082425BAA6CEEE8 +57305C5C87137461A03C67CF8ACD2A50AE663CEDC34E1D51B281839059B85541 +0FA9C31B4252B7E5E1970828D48A4E3B7F001C3A69C3322203AF8A45A15F5FFD +9EE2D4943B1EADC26A0EFD44C64FDC1971D2A1CDB192D0A1F1BF0C1EF78B5D2D +47ACE7B81BD5F046FD1474C2153B4F06F4A3B886B5CE88F55316F9FBA49BDF52 +67A9762BBB46C68416EF86887C4F3532F92759352D7E95D0C876156BAD209283 +A1A276BC10397D8D54DC4914086ACF8A74C5079B43C63105 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR7 +%!PS-AdobeFont-1.1: CMR7 1.0 +%%CreationDate: 1991 Aug 20 16:39:21 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-27 -250 1122 750}readonly def +/UniqueID 5000790 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D +E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 +47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C +8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 +78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 +1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E +01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B +C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 +F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 +8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF +A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 +455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 +9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 +EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B +52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 +563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F +0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB +7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 +0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 +1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A4DF280B37ABC +A1346EEBD0D45ED6FF47288FFB96BE63025656A709BF09B182D8AD3CD8E4CDE6 +825B475CFF0D53651084C45952BBC30175F20866D75F2164BCB4844968F35050 +635AA16A5190F56D09D0CF2EE78C9C9D5BFC9B9972549D51C09213F74722AB5E +1271B144CA8E607210B803466E357CDD5429E52A42A86E1B4D58537E7249983D +992EC29C3E0805FF4872F0A86D615CC413DA7E09FC5019A16F8069CF9C407611 +2D930B0862CFE5E11E7C69A3AC1B6C42A306E58B22D9A19DCFE810511055F295 +9641E8ED2EF901BA42C62CB1D064575BF6DF529277F285114C40E5E2F0B5FAC1 +E419AA0403FD2770E8DB3DA6A3CFF53343E77E47781263979E1AE91789455133 +14C1ED7B50DCF884705B1AA8691FCC1318507DC347074FCBC779BE27BCAF446B +0DAF92EDA7616A69FFE557CC78A42A8B62A39D7CEE3FE7A7548CDD135723BC59 +6930737E53A8539971E3CB959DE44AEA22C90958E70EE1F519279DC062B7FB5F +647538A3AF5EC8030688DBD9592824BBB04682840E27D8ABC8583B1FC23B44D7 +290963D7FDB935CFD6182BD1B896BF0401958D4FD2D667D41CCB247ECA21A289 +A6CBB426C577C25DEC41849A947D78D234C5DE9CAC72CDD8C5A05FE7C81D0155 +81CA471695DDD608AE00B6BE58BF165B29A016126D91944F61D658A1772019C3 +073E366D0187821CAA24F32206C609DDA74347F217B2304588688143F012CBC4 +704B3FB795E6353FEFA63FBCA61CCB0347C0A4820FC888DAE2F8A0230E1F185D +F0E0898FF6405943E615DFDDE82D828931A1B895879C517E21BEAB210B95721A +133E6B7A8C19C93F18CB0C4AA706B406D3EBE34965CD395E194CC4B4A5FA5AEA +B9F9B4B6BE58D47DACB9BE6B61763200E71ED10F44DF35A14E1DBC53E38CBFA2 +2C7293B8457EA0A10DA6172B788A4EF94CF490872326FEECFD94DDB8B064DA64 +6CD5A76FA8937D8D553A8E4A6DC1D4051F53A7EFE7641FD8F5EE5E17F09BF0BB +47F648202D8EFE8090D069F96F92A32ECE5452CFF1F04E73CF5347D9FB201437 +6C4B49ACF3D2B17DD2AC3A2E05A9FAD9611B32784846876B8118485B926406B3 +9C7E1D815622719E60248D7C6ADFE7963AD4391ED465905966C4461EF0711B70 +0ED5B8BC0FC09AB67791967525BABA34711BC395A83A8E8B7C1406503400C7DA +CA074D623E2AF6C3D774D8D6106DA1E3895189C12133226B1FCF89B8D85DCC55 +E9680C3B0DB172B002C3D93BEBFA7E49051E12958809DB86FA6C1E21D6815F27 +75F0FFF85FB29F7680E7E92E3DA4EEA8AFC2BEF096DC560BD55E4BE38D813757 +FA66BB39B4DDC3C266D47AEDD0026E734F11AFEF9DF0F817D3CB591CFAF1E685 +CF1D5C1DC706E93044F09FCC605C0028838C4EEA3DC9DF7E43A890C8A7520CCC +176A4C819542C508B716B1E6C9549C5CB2889E431CB695F998E852EA210492C6 +854FFAA438BF323EF50BA1E1E1AFD76EAF9C1C6185C89E0208DB28E2F8C620FA +DC3D194448A792BED15AD094974C2FCBEB55D475D9D0597661F1420803600A05 +483D4C62B79A0ACDE400212F8FC14CEC42604FBBFC53082AF1A5618A58A35BB6 +5A04BBE58EA1395832FF5F07F5AF7C0340ECA6251A64AC15B5B4DD09CF1810B3 +13CDA6B8424CE3CCF9FF8A707AC94B0C6A3B2A99D0AA662D36E7F28718511184 +EF4F65A1EBEB5E41ECEB4B8D540A0CE74A6A089C99CC8017391466C01E349615 +1D9171A2752DB23673B211DC89444874473ECE4E301DF83757F12E7F9971C52A +85DA98069E6FE751020C0F29ED0D074F36B731B87BB890B3CD205C96C5CB20FC +65E8520309392316AFD815FAA4DEC9BCF8C310F98B917FC7B3E1EF3438F3293B +5DA00C6635B7A3C63A3C114E01FBB3B30AEFC96E9820B6AE47ABF4D6781E67E0 +3A51E4CF5F863FBFB98DFD9A664DCF46DFB79A03180AA7A75C16D5B9DCBFA1E1 +3D956B68E924B692FBE26918D512F55AF48764702159E241D3CFE89EE5E1B4B0 +C4704051915A422B2AD113FFAB8C87ACC9E9A4975301D461A065AB787191B043 +7E1C59D5E06EF46A145E661BADBDBAA562CF3CDE3AC3ECA24CD7273BF3103EEE +FE77F12C77BC2A164A89023193ADB4D1150323F880FB458938551CCD2B503D68 +8503A00FBC1C01F28A5C5B1FB7AE8F5005232BA17DF8B9CD8C31265CB9A4DC55 +BDC946DF10F37F3A0E3F3F4EDD1DBB26FCF7BEDE6C532F421914D605DE0BE1A9 +FA4DF183845AB3C9AB680A378128148EF8C3351BEE01DA3A78A3F3EDB132B8D6 +7E1BA03BAD19DF74F0FC004B39F6975E7B00E4E4D304B6E41C4527222F24829F +143ABF9AE8470B71926C943CF2537B69B5980CF94CB70C5F5B4CA65814727B09 +1498CFC769BFB8899BA7DEF36AE294A2BACA8F19D976FE93A8D88CDBA8FD2757 +44ACC72BA02D78D8B4ACEDD9169F461DEBAFADA2DE66B5686A0952E4A324C04E +1817A5D4DD66272DB75178A7976830048F296296DDA13477B0A15C7DBCF7401B +FB9EB8C2FBF071B6C21B1743850EABAEAD35AF3925A0DCC822EDE9A795F4B2D7 +2AC9A6D369D8E4945DD16C152179BA2557700943EA6DD2578186065E3F106674 +2A5EA5D4BF138FD94A6961BF0DB20F3224EA7DC8AD35B97202AF3FD7C01AC7B1 +0F363772AFD896112BDF2CF73C0E9A3E82034A21550877819BCC7AEF6F7D76F5 +4783D625C168939D53AABA2B013897EEC010580E2A2182AF3C6C16C8CB2A82CB +7DB99A35EA3CCA8F22CB6809986AD920491B3D2E29D79207D90ABFEB31F3498B +6F4D9354D30FB14A62D4E876DD5F53019F61E17BCD7EBFBFC3657D7A34FF60DE +19139A57A103DB356218F50F3DAAE3C0AB266F5C1DFF88A447241FF98FC85A69 +97AEB4D5478065CF4851CB85FEDABB6CA9B82C4594B8D0B6ECD2F99FD529BEB1 +3171A9F3B3BE13B2555B658590F063A23F7DCB1F6C4713E2497FF832D08E07A7 +BC661B538D1B7C56C8AF6C9EE35084DD9BFC0FD6F43793A1C914465E923C5E8A +3A5C65C5B6326AAE9DB3C7C7B0F456F45C707F9CBDD8A2DE9E398333CBD24B17 +18661B279B9B379C298DB6BD99A0E8AA3E815D02ED21A8E6A256D93803E9B896 +ABFD6CD697FDD48121949221ACB5DBD69B36393E3CCED4725C58E4605803C43E +A2D84387B6DE0AEBC42FEDFE5A59475F713A86F4CD974524DD37595F10398C35 +A93253BEA3E823C849D55987EE27D7F06F6F8AFBBEF6F0BCAF90F9042D0B1E0C +678C2A1C23B8A4A0E22F3A9E1A1A5BA8B8919303563B34EE84B7E25B5A491E73 +9D250D3E7D96DB5DD3A04B0AFD30FEE1C68FE53282B0EC7F4D93384693268813 +BA4F68EADE7E8831B1F2C9A5E3FA4A2CF0130E8ED78C5CA4ECDD51BB7B5B1029 +60F68E2757E7AFBF3554419DFE3A745B992BB301AD1FD9F599199FE6C0150CC3 +93EDA1A42488A422B2EF1C9B08DBDD0DC86EA803DB96226C053C92B5A2718F16 +399BE114F43D3F3BA483AA1257D6C69268153F60DAA43FC5F3EDEC24D0428194 +72F1F63669E8DF267A906C116157305208928641625F56082C29635A0228A598 +24DF2016FBE69ACA2F0061A2C982214A6169EC4E7368286C48FBE1F3A8814AFC +E600E66F5B220CEF865C705FBFB8FD4EC4FE233F4F79BFEF379532B5B2FF7DEC +E19CFBF529317434B3F60465513CA2429E995C6D306BBAE8D31C549A92A96F4D +E39753B0FDDDDF2C360C9DF9C6D06EDF592A1120B28DEB2BA9F1B50DDA8BB3FC +DB7C05A2E934129935A493AD65341978D99117D96C687CEEB45F068FB522EB21 +5B4EBF4AC7B60427AD6D1242A3EA568B0708D9C132E691E48E51789B48628E9D +68A877FAA81A7015E32A0472E4C7E720346543E9EC787A32FCBDD6622124888A +94E90B70165CD125C0F760D67AFA0AF889D446126D8748E256B27259D5ABBFE8 +7ED511F7FCEFF0777FE18940E4452EBE3B9693EDA099344C0430BAF0EAF53209 +B2C96CECD28112E185250C9E91ECD9B732D92FA832B48D75EEBEE14B8CA16AD3 +D161DF761C02DAF325EE1EB67AD600C8DE0F353B815EA51E8809FC6F83F6796C +9E3140150CE6A32D5E30D64477AC3EA3D493856439D3078F8796C47C1AD72C43 +DC47F18166A0574FC2DB24FA4E8D7C02AE6C9638EF959DAAC08C89D53D99CE09 +0849FACAE421534F9A5ACFAD14324FA0398F45449CA82A0D30CB043776A11A21 +FBAE3A3A8FCA00CBC0DB95E982F7E447E1CA781DD9589670988929DC88839650 +921CB48C7FF0CB0CD6FE4D94A3C3A0DD031C1B81DF970AE381DC3B26F9284323 +859BE3D71C97AFD615D5A28E1B5B4925EF62EDA3782E7DF2C9D2DE5A360A3B65 +6EDC8CD12EC7CCACB9D92A764C016FC6F5614584D13C7CACC5A518EEA4144BFC +796271F1435158D6D2460A8DCF9F20732FED935EE7CE76979AFE0DC5633AA5A5 +1F4DE934FBCCCA66183E55945811B162F0BA8ABE4CBAE250039DC05CCC1D8D8D +4C3A8511F72B6155A92F7415BCCC0D2C97265D11DD20EB2BBFA35D641DC27ECF +F305D8AA70901987AE12051FAAC4C4B13E93FCA93D0143BD4D013B4055FCEBA0 +4383511AAA6390FA72680638D1B096FF7EDE4A6202F7A910A93430C8DFD39E41 +A758917936CE476F3E47EE3EB9343E122769367571B137B06F36EBC60B6BC495 +2798A6C5F081989C99DF47252B8D9A9D1F46AED045AB7E05 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.1: CMR10 1.00B +%%CreationDate: 1992 Feb 19 19:54:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-251 -250 1009 969}readonly def +/UniqueID 5000793 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 +92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C +295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 +409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C +4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF +2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E +0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E +B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 +24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B +43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF +D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 +5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC +96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 +7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 +0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 +B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D +AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 +97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 +FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 +20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 +0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD +F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 +3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 +A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 +5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A +45A24ADAEC63F61C9FD18376D39E0FDDE3FB4FBCDD6A7B66068A99D31CF54CD7 +DF2262DA91CCC72889CAA62B1D6F2155CC8E940A2C35D8CD3EC75326188E2D30 +1090F31AB50F30AC77D2C445BAF7323389406C44641B3A72C26BCDA442504D03 +6C22A3BA1A69E5F87EA400501A3B3231E46F96AC3A6C0E4A4F6F21E0B2BEEF53 +E016F34D7003351FD12436520926C632218410359AF9FF167750D3CE0DAC3B91 +B310C457402E05C316F400246C8C38B98CC8030F71104BC4FA0505B5EFA4F5C5 +9E4FA27C3E790D698690336254D7E34451E692AE23BF5FFBACBDF33E25359BD2 +B0E7A0686602568BC87422F32486CB50776C7EAAE7F1BF78B228CA3254510653 +3D6368A4985C5FF5A48AEF16E1AB71D7CE2C6649F2CF4B2879D4FA042239B504 +F988D2FBE87C3BC784E55B8EE36F1BB5EF14FD5836CA448E139EF8FE221E827D +0608A6B90E08CBF44A30669AF4E20CD5C0C8051E5F86062204AF362DA690B74C +B952C9F4799FB2535E47AC019175950A1F3A0D0937016148222B545B1E00A91B +39D2121462F51F736802C523BCFBA894EC11C3353F9BCDF0892C00EB583A4D62 +247118996064991B816F9F490FA73861FA614FEC7FC23A5D45310527B6559781 +F1C805F0EC931D0C60E70FD5AC55F22E6379D369303F63A0E7069237118DA0A6 +5BB55FC6EA1797BC51C1D053401ACD4E9B5E724F4AEB149C38DB0E2BFEE811A9 +A94A7405422CDC911CDD97EC4976E27F766A9E3F84387C04C6367509157E4D91 +09A1F6DDB59AB9096FC43A6F9773ED9CE3DA6B56D10AEF99FD277F8666E72028 +807AEC6C26E5A142496CD41A80EC051E875DF9F547BEF060B969B197AF97608B +F7A3740B3153621A680DAEAB0454706C65581255CA9B40078FA6D352737F0165 +D834359ABCFDF5C212F8AE9FD50BEE9683E7D5969D183C058E8BDA78F61B61AC +98746B3A1750093A40C17EBD4AEF36BB2DFA1C9AC2A12834DE4623CCC76BF5A7 +92B2B2E368D1DF3471D83495B19154836569D2A30F9CB05C0EC499EA5D3184CD +BAE8D2A2CF80C6359275B3894B4DAD7F92501BA9A6BD215256CF9F35C2BDD40A +D1D949000633FF0B5FC7674BBED71294AD28FF25710E968E85C3FE71046BF0C1 +71EF48F8024C28959FBE6E896BD1AFE579764616672C724959FD66C8398ABB5D +6C02C5619866453708E3FDCAC2754E9C333C1123A5F746DC5B2CA9D430263645 +A88C743EBEF8C82DA0236FB73D3DCDFF874A1A5928406838A81E40F34816EBEA +0D7A89406A6F492E5E5E6C8C4D85A2B9A83B6A4304B05AB541041AE014C845B4 +283CE3F75DA22CB7CD78C67A1F067C79B209BDBA6705D80FBF08CD0FEB9D3293 +D9955BF6730BD59495A1F81B708292B509537089D8AC34A06DAE5E8BBB9B0A0D +F09BA6723DEA964F06C0E1A6541656470E251F5AFC6677043DE7C6D85B60D3EB +B8A4415DBFDE3F29D5FAA0B5CE4BE9559595265FA8BC24A172FBAF9B1AD0A4E1 +1CADABC2B71A43098146DBFDF7E126069259EB490CAAB07D5C9CE3D50CE6FF88 +DA94E6D53F72FA65B5CE18E2EC13A63E7EEEB698898BE82DB5F39F4A43046A8C +074646406D1AD4C76DCC6E059A0ACA869017993CBEF9AAEBA95A1F9412F08F35 +F46906A33C956E6BD717F6EA4E5D88B820F08641BF7DC21B3D394AC413A9FA79 +5A9E2EEBA446169409B76E1EE5342B4ABB36FC6E55419BE0C3AB28B0B7A174B4 +77D651F56C8E6AFD1D4AC9D861176BB8FF4A20678F203789C95A05B03D46E4FD +60A16CA5794C594D057B349E632BA6C801DAD6F5B5DFC418739AF2382F7ED25D +E1A78DACD981ADD73985F2E1060EB0698BAA46D04FAAD21985F518425D9D1E49 +DACECCF7E675A852DC9AFE2B5CC8CF17FE0EB8380E8708E9123594268AFE39CD +B81E15AE823DBC9FCF91A25F9F6EDA4A24319ED6C4CE9ACA0F700D909737642D +4FCA8A8BA29DE7F86490AE6C0448FD3F5B734135329530CEBCC6C254F1601CFF +563B60A21D848A5F84FC8AC6FEF5DB847E1F93DA5015033187E8AD3D3415D85D +3519F0BA6D2D8865E4B5E3213850F9F2511B065C05E44007B7B17352B08C3E09 +EC46A5D390C529D19146C242115FF53244D8AF61DD7DD2440A9835FE27D0AC57 +3214F0B5568CA5A7479091B999F8ADF1BBFB09352C0A37BCBD17C34090B42CD0 +FA55E5E0AF184B4E391F4E553695C46F49156255B847299F9498C1DCC9CE0554 +B2079535D087565BB5D67B23CD55C216C8324A1D122FD95C56D7DDF9E16521A1 +F3BCE428B6713F40844922EC67039562F71AF50C275C8B98BFAC7A87753A59EA +DA419AD61F1BD4E24DEE2EE7F68B4703A888909B06E91BE0444C7AFAD10887B5 +49A96A7EF6AB3D9F5D8DEE4DC84E31A9BF2331E18DEA4D4CEDB9A5DA03F2DF05 +121733C6E89628EF3327C7F6A364B64F0C3080634CCB19B70C402967D68F35D3 +93D75B9BF37B9B928E4AF68200A07638D27D027C07E9302925D0C55355F5CFA5 +FEE8F412CBFE9CB4A2D71CBF17A669DC4B9BC612AF1798A4BE5F9F14DA5C94A2 +D2133561E50A2980D1733C3BC9FB73DF8817A28F11767537C9F69BBE2BC51B07 +502A31B7E6AB831737C2777E927BCD088766922F626DA287C18132E9320C041D +DCCDD7CD4DE51135F0D8B35E8602BA2720C4B3F8C02D769F728E70528F162946 +925D09073C067F55C317EADEB5CEB7E3426667EF27786EFC71A6BE9B7377021F +35347B323FF8FE756837C17A6F73BF822CEA668A41D1C70CC300AB870937044F +5F6B65C3715C2D0F193859C2AFFCA75ABAC45BC7F4670CF52A9665F3A0C3001B +6E468794562D3384CFE7FDB2A534D9CEF93C59AB33566DF02F22C6875C88EA75 +C39443333034C03F9D9E5C868864623A8F95ADA59D04A7B602A347EE9826082A +B38EFFC3B6BEB21B1A204D1FB8FD40131812350240568E7DA02D94B4879BE921 +B59C88C22699A3ECF5B88AE68304F49FDCA8C972D0940F28A8CAAECF0854B6B6 +A620B55C38F898DAE56DD2492F8D355FB9EBEC5C475067ECE5F073DAF59BA508 +DAF5A1C1350A0097DA2589878A943CB5B17C4DFF782ACE06CF7CE566BC837FC9 +2C0272825DC7064C72716D42755B04ECFA994E93952AAA41D4CFA298DCC82B69 +69845F436E28E5BE16AAA5E09FA9A9A76208F316B92C4BA947CC5EE5B6B3D747 +17CA4DEE5AF91CF5FB8388952A4C455F3726404195001A5A2809779B1D57DFC5 +0989179252B8405D42542E5627C9A9FC23AFE1E3A0DDC45587900A99D547B9F1 +88AFB866F7844A05A70CC4E6F5CECE8D2B0F241378816B73DB6103B1F3C3D513 +478A1403589E91401246A875F2B84C185BDE76B210C7E83F5ABEE6F1B8CC4AAD +0A625654B2BF4ED3780414635013B74C99134428177029BB89B71204A6D8810A +9EE00B4CE4FDAB52007D6871A76CE2AF1E4F85BDA68D362F341E1E8E8E86D158 +F7208A57524EA917CBAB094370B9EC277D421DB65ED946B4995A2A6B7BD3198E +9545A97515482C40AF66157D18AE86E5D5FB0789A87C5DA848FEA40D5EE04D29 +BE9D1019C5D8DEF6D3BF7D0F31EA5EC221EDC80D4903DBE46AA9E8EA730AB8BF +968DD705BA6DDE4EADEF7037CC398724F031334B2B61B8116712BF3BAD010082 +3A6293358965A8ACC57FEAFEAD43359D41955B2C9CE8FA73DD25BB409917C13A +D1A6899E726AD30036BED751921C9CF862F1E6D39F128F7A422A3E53CA979060 +E52911A7B25655A053497188EEFB2AEB72F9D788CD621DE5886AAF7875A7F421 +AF246664F101B56B7C9134AE87D25B2C9D536DB7C470C6774AA16C63E627DAC6 +C274E22B894980DE12717A3591AC7CCAB7FBA9542ABFF4123F7E32C134ADC321 +D1EC84AA5AF2D0F6076FE49882BCFBC6AC361E22AA71AE2F502F7106F72121C7 +9F5BB5574E43FE03DC239E799B31A6311F293A5CCD77A11D1E1C800AC9C87C2C +893EF2379FC05E0BB2DC03529D690D236E07EB183C3A71EF5B7E604DA826C373 +2D9AD0620F415CB5215D42088273CEB5406E8FE75214FA0D16B82CC6B9BB13EB +296CE30CA9B82A4B7DFD2210CA69E58047B13D4D659A64BF9C381FF5C473334D +554D66F1084941A6AE2D9E2B0E681927E397D17C3BD7B15C7AED99F18583996A +C260173C9E681F85286C79A9153741F0411B2DE2AC6FD12E3196B8F113A61251 +3A622C54E4218B53689B910336A1B69034F2603AE8DA781879FAB65A4CD57FA4 +2FAD9F5B45C959832EAE4DA27A0644A6853115172CFC60AFC65B0CE186BC5E85 +51A9257A629DD2CEC7AEB534AA9DB4315BC8290A44E718A5FE77F9D8D2A1EA2C +9C759E494DD27091BCF28EDEA3B2A172EBBF2070A51885F4A9ED6534FAF06572 +3D7146606A262FB45E22BA1824950466EA14892715DD46E501E398A6D52135B2 +542147255BACF39FF1CEA5044309A0658182401AFAB0B6F6CAD481E11351DB64 +CC43A7348273F0026665976DD0E5686EC532D8464073E36B1E3CD0F0D11F791B +7D89D29AA8C39C8C075150D54CD57F3986A731C7A1C8C03621B1C92F2007F3B2 +F1A3C6DE4CF954FF6E496CA55DE1C609AF9E328E38B38C388E18C13CDF27D64E +AAD1071A14F2AFA3231869A6CA3FFBF8497F086728E7D752B216805EF4CD8A3C +554E6C6BD4304AC7B6A915C93AB27B300FB1CB040D763005231D2462471264FC +003FBECB4973626AE7740755DA5ABE4009D2E404AF95F8384BF9C93D60CB0B34 +89A14CEB1F6A7513CCF1B5EC6E2ABE0BBC8A87C6F3A701477D72CEEB31DA7CA6 +E50FD5DF9EBEFA43A8F897D38D73271BC41D1EF2CD03AD5C47CE12640AD3D596 +5731B28C892383BD7EB097EBD5E5F812985B8566732F1F7D43D0433668E42067 +A01AA1001BB0A04FA4D8485292FA940A3878856B0B0DB9271447493B1929EEDA +D8BEF4AC5F75E05A2108AE0E7D635DABFCAD1901F0EBE9F12981F2FFBD474CF6 +C38CA418824C1158751F107AC39E367EF486CE57BEF0BF689FC2D283956D741B +39825C44EF7AE35AD2C9383031DD27DFCD2AE38318E2F4C15512B45222B8A3E4 +D2984E5E201EDE0B4CC8D9BC29E026F631C3584541A248E281B5A9E8F4E6B898 +CD1BA8156343F43E7CB00423F6348BE2D71010A1A32B7023C2D03AA02BB328C0 +9D567E14CB2748E07B426BCA5E69F20D327C0EB7642D7F55F6D1C7520EAB2F04 +5291C728BDC11FEE511D45904AA82945F0D532C11589240AE56361EADDB3773B +D97ABF3F77E3358595D9E8C9887B74A203DFF3C00BA8C200B31904A6667F6B9A +F90A6E5089E957BB69178B560010C8320D01BBC705C88E2F4B8F05FBA478D70C +D562AD71827ABCC77C68F54DAC047599B1ADAA0EFC8EADDA9AC1C0DA1E729281 +0840421F25093D20B4B72B264E87ED42834079987BE2AC7536405CE30BD930BB +391A11044C30197BFB452DE4CC9E5EBDF2A07BE5F388D6E9F394EA48D4209DDD +0774F3CE7D1263842078D54E2D4B69C6B6DC76717383437AFE96B4FD08436F9F +E45D3CC5222D53E6BDECBD5F6E18284A8BAB53840DA641B122AA81B8BD7016DF +1ED17A8B16F6122C5DD9EDEB538459B2C5B3B5D7CECC7AC460F694E4C4870089 +805B19FD2C4B18BF8CEBA59292F09EBDDF54428FF80A629B183ACC64E3AEC3EF +149674251C3280107EE5178CEBD14619D53B402A20489F3B64B0DB24FE5A6B0A +04E1D5472799288CE10F8B2BA741B2410AB082A10A129676FA9AB51AAA270EA3 +23A98958D9CA89E1EF4F79F5783F0AA3797F80841E0AA65E6E2EC1FED836FF95 +987B342A2B2720EC8C62BC1ACD34051C8CC269F46FDB64432326CE0F5F430A2F +A0F7024213380EB4104CB823EF574BFBE7154216407B22D0C133D02BF096192B +EED315DC961125FE73E1C7959A3B587EA380B3C02DF38EC6DDCB77A786E4A736 +F83751B4BC8FA79D9F631E72A23341D112927D6CA93DAF4E4B7AAA74A1575DC8 +C2B38659F2BBE4E37FD404D9C8455A4F823A5C8896DDE0DCBD3BF475B80B00B4 +BAA900E7260F4E08D1BFF308DDCAB302F49B515FD338DCD466BCC358E8D8872F +459DF610D01AF32532EEA6C9BEC8BC63BE6CB223242A7D206E61016CA09400E9 +9E67132FE45B344B3292B81672129EC06BBB56EB663575CEBE222888F40C7C38 +F8C0E0A40DA2E530B6D6280ADBABC497DF508BA5A38EC09A11C609FCDF9C2377 +F8E26C248701CC61B6F09D633A003CF6DD28E1B489C10AD2C2501A9856E2A9C5 +01A6111E5676BD7EEF30057233C01ACF30595EACC055F2052B03171BC69A7CA9 +D4EFF02BB0720A6AE73CF7DB1F80918D54E57BAE1F924FD2607AB5FB6FADC4B1 +79E884FB8DE9EB46A8533E1BCA01A054E324B5EE30E427894417BB4594B246B7 +73FE9B5801AC4DBEA7A77E6BFA46168FF02C8CF2656F78A55639199747A54FD4 +07E33BE3A31155FBBE6045C147D70419B8941CACBB1A552A8BD80F559AA63D7D +409D84F8C6AE7F09A631E3CF53C567E5E5C8379ED4FB393263539F6CE08BEB74 +095DD7F6ABEED5335975DFEDED8C27DF1049E2530AF72F4613880A6D7A1EAE54 +FC694E9324B63ACCD766796163EDCE4E5A9C0D7A1C18FEF3F5279EAFC32B3C3F +1FA999D53BB0FD6F62BC250BD75D8F95B17BF74F823DC61FA3C6D0D0294E1D1F +1EF4A1F472EF5B2B529ED647F279A5BEE26F594AB1A730BA4AB0EC51B4811843 +F299642D190F2C6EEC70AA016BE41091DAFF25036D2D28E9F2B97E652A250423 +9C81F7B77EE03E67BCE170FDD3C99EC7E3AECB3DEF216197FD585C4E73F32BBC +3468FDB24135669FC1D2D7671C1BD8ECD4EA541BF59148106F52A8BAF398EF96 +CDF614AC1D089A652CD5C3C2B78D4E7E6950F9B4885318DE3B18D5F2C295293F +5D47DE26C9DF16FEC283567D8239E3C97CD818C35FDD2D7EC5FB6512D53B0E57 +A086B95839129E7CA2197D95DB913C10A8381AA049801A7653490F502BD04E9A +FA322FCF369FF126837968BE92D9C6917D4D111FD79DA9DCC03710B5EE0C477D +8080679B19D7EF864AB0197B64ED78CFD8981698D92065EC1052799A0CFCAAC4 +963DDF1E7985A2C4ED0CC494FB51C6447A71BA635E7EEFB4BE5167EEDDA6A5E2 +CC60ED7887133CCFCCCEAD0AB7A4CED576CF25E374B24D7F2862E925518B4804 +2D2F72E04BEF42E8139265BF3976E82832A0B1AAF47DF21E5A5270698EB4DA6D +FFAB17C19C65827C949953C1007D294AC8053D7570C6FEBD7B7C6D0C7151C297 +8168677B605292EE83E7F4DA147D0EBA8CC04111F01C5BAD0668C9ED3F6F0C95 +7FDD094EA33E0792C9E7851D1CD4B6B3D3680FA63CC99FFBE81B77E0E7CA6D2A +E6825FA45C816C044AFD06844C7C041E624151ABE210C81A0840862DA7B6A8A8 +2C83F9BAE28E9E074962BFF8FD3B1BE17F6CAF5211E26264359C2B33E3A34F84 +62A46587D0B5DE316921BA22706DD3049A86A2F67BE34AFDD8A33809F53635A6 +853C411FE625503BE4F3192BA22C50F58F687A15E6E9E6A71CB5DDF7C69CA071 +17935B116DFAF79C6EFF26CBB637AF3C29AD9700DE81293E088E3ADF012B26E8 +79D64A84C930D5E52A93E19FB44D98B0F500050E5BBA589E7D47E38F044104A8 +57F06D30D3C1B29042BB57F45238073025EFEB0594E687461474C57B719E30F3 +34B50383F969B81C8FECF983983F639ECE5431C2DCCB62888A339A04A4A2CCCC +2CF26D24530FE48170822176CA267CADB5D5BF5B7496820BDF248BDFFF8699AE +62496B64231B937E6B5CB35D250C0261A4F02DBFE7CCC7F6F6609ACF6DFBFF90 +E59A8B13D610C235866F1A7E822B3ED2A9B3F912BDEDC1078B3A1F890D40A69C +46BEB4405E86196BA2F0C91FAFF52EE55498493309EFF19218E8BFA3210DA263 +B6BBDC1B1B7898B43FF1B3A4C11E30CD67B9C1CAFF606CB8A97F6A989C66F508 +ABF86EE9BAB0DEA4BA22051C77D2AACE1641FE9220B1CC795E99F9D77446B14E +7CF033F753901FA50DD77428E18C8F31A5947EB3EED98F159DFD8AFA98DC9DA7 +31377FD084E5ECE5D4D0A960BE68A31EFBBF1F8AF6092054A6DA276F1BA93AEA +23F4BF45D49A89A0A8CCBD44FEFA37D11F05EB76801091F170B8F2976E502F46 +6AC58EA87D933009C05F688F87B191CEEE874C87E7B3291FAD8D38DC3783F208 +C778472ED87FD648E73A5B1FC37ABC18DC9438CC6D46075EFA22E613741C4DF8 +4BBE1608EAFAAA474CDE375EB5E8F7748EBDBB8C1EC93A9226C66F5C5E503523 +AAED793996B0291CA6A92BA6F704869A3DF97F04038A8AC092D01D7D38FDBB6B +9688656C507A47B6B724312D577FBA080669DA30676E15456F7A9F12F8B6EE0E +FB505CAA25D7C4678AF5F798F14A9CBC3F3CA2C09C7DE86A52653D3AC142094B +6FA27728D6D8B3F085A38A9525F73C43A65DA88451D09E5F1BA0214246975C6E +922DDCE24AA9973F6D368903A9BA08CCA68CE2854146AAAF8CD4852B9ED84C10 +7742C94FC1BB35323A4D5306536D5545A21CD4B0FFD491BBB44BE19BCAE59E2D +E47899D8B71EA8F3CDBB5EA7FB98963F0E1DA36732EBF4B6C325E1898DD2084C +059C8E755FCB211906088A919D08387A21019EB44B909F446F328CEF9689D651 +D19E2FA25D3577556DE54C71B8D27CB5060DA2C146A0252FB6E6C3C0E82317C3 +172D8C23A67E303024271125870E0445DA5A009A6EEF6AD5BB6AF874A0C4F3F0 +34EBA8C268ABA8C159B5A9970D8996545C27149C097BC5B46268E770FD86BA13 +83C8DBBCE8D60C8E0EE9B46B7F835E16B2292DBCC58BDF25F7CB2CB91B84D398 +7615B5CA1B326BD632DF34393523494487DE624B76DD325AF6B4B0BD2875A12C +816E2E81AE7AA21284E068704B8EBA17ABB3EDEC961303602459ACA319F5AD55 +17C76BE63E1A55FD705C6213B0217B352BFC33C6C774EBC45840890AD9AA43DF +2256BD37766E42C1C0CDE1238CF532F46368FE093DFA13B836BB592D782FBD36 +C549343D026EC3DD9B0734CB666890E9E8633DCD29243CB4F28E5998D6E8F8E3 +F18D8DA3F99AE1A8386DD087DF1F16E7D588F491B53B0E45A6E1FE1E887CC293 +BB09E68B74DED8DA9AA00493D0E676ABFCC4DFCC4FF4D9783664CD13AE912975 +EB2B7709C27A62092613CC15C9228472FB8FEF513F1129D9353AEAC3EBAC8469 +849E3443F2DC4332DA38B163E949C31D333A4406FD2E25996503030BCAED1528 +198576D3B977D41B77A3A8550D69B82006ECC6822FB2DAEE326D2038352DD433 +FA6C2D8A86CBBF1219978F6E746F203BFDA12E9C65A03CA6A2BC1FBCF0A617FF +E52D5D841B162562F8D5CD989FDB0D935CB4E153FC6D7E1C318F7E95617BAC3A +19B96B3FAEF20A216D3BD8DE25B1AE598EDBDE46C1A62D3964D3767CF4399076 +DA753CD5C3BAD2AC86E0966BCA2A599F710020E6CFAB777420B31EB306994677 +818B9B1FE6D9AFF1C8DC6B88911EF793A6469524075864C9AE5F91D4579F7D74 +934D1B6E07FE3741FDE0B09BCF1BFFB4F63AD3D22E557B54C8A0EBA9AD236E45 +1EF413E03F3A6082D592ED17D4E19045BA3983BBDFE4BD3DE7A2220EE29A4C0D +6B144DBEAA490C2F8B6403AAD5BB7717AE531E3ADE789E3EDBEE53FB189B196D +F64FB7813BA7472B35742AF3AFD75ED88CF7D105C6E2079E5C071108B8A0F1ED +C68216D2A4B3AA02AFFAC4B45D22755ABC4810AA9053A76D4E89FE0B22336C60 +615584AC94FEDDEF30A59B4718DB5775DE20A3083F39CEABF6D06D94DAC9DC95 +5D5FD40E6388D07D1AE31D5CF580978A56041270D4D86AB3CDF8DC13FF173AD4 +157A73E182B861E8AF9665BF620F5B615EFB2201A3AA477C6D02361498C1F769 +D26A8EA27748CB6C8D91B47733105331E1C0C8061B079BCE8D1E1D795465445C +CA7660C46213AEFF533C5E44D2A8FC3EC147AEFDC280CE997A8A045D7E0CA2CE +85A4ABBBB416F6D8FBCE97AA63C228B02681B17D5D71C40589D1FB71BB7E32B6 +A93FF90C5604FABCDFCFC5996E4C4AA1E2718C7EEFAC9B28D164E0EEC750D2C6 +508DD9292479DFB15B31EEB0F69099CC68EE4FE40722EE00D6F505DA6DB65961 +8B6194524B30DAE671461878322FA6F914947EF5CCA5CC847664FAA4D2D5D59B +629765A3AA4B34A1C42758C4879ED92D2CB917469AE7A6530CB9A1B641F8A09D +A960BBD4AF12506DD0FEF5FF7E38ADC69746A8823030857E359ACBBF2FE785EB +D66471F479DD68BF7DB2892CA1B54084653493A43C8BB66EEC577F8B5D6484D7 +9BFDFD72A382268F4D1917D93C687B97A90E45ED0ED9B7F07A35D4989115A5F4 +3ADFEB695B223E70E24BB6170CA492EA0C9BF5ABC429C2204BF82F69DE92C7C3 +086BE7B49CA6DBED8EB43C7303DAC79C37767F5F0D5E302E3F5E2A271F5BD1D3 +DCD3F2BC370BECC49C60FC2D7EFA6A14AECD34C5DDA32A8DB25D688E2BD2F989 +90011D8600047C6422D550E1B2CC3D6A6F85E8E6FF4A1BAE2F28345662FF3CE3 +E59C19724F51F5B7545D1956C98E13C91A8F76C65E350087D686A04D4BDDFC4F +6480363C00AEE361C6FDF28FA51E572472BB5CF701F61B110D1711A19C2658F4 +F058E5D0B2829BF4828238FDCB835847C053A32C25597FB9822CE575FA21E2A4 +0B4F564FC136DD4E5B4A7F531DF2B3BD5648C8F7027622EC463737BA6E989D4E +6AD6E5474C8ECFE80C53B5003914E1DCF46C1023157819DC25274327A99A7A30 +2E2BA87A3190E5241BC9EB070CBE3CA9BD5CFCBB60A0C2AA50AB314AB1BFC499 +7CB6C8D864164D1EBFDCA99D321C66094E1A61232FC9131CD57A4210C8876DE8 +B3C7447099C6BF2C49E49B57A3E3DAED4B806B3368F3D4B5AFCF5EF81EE5AFBD +5FDB91A3A384D2C8F8490589813D8FEF57265CBDB1C17DBBEFE037AC3C227A56 +ABB9114E63FAC205478BD4BD75A9A9FE85FBDB11C691016EFBC55375ACDD0BC6 +EB7568B1A6697718420A06B8286BC097454009FC86AC7923F92E59575C7E1DB6 +CC53F93E7DB17DAB6859E65C3F303B21034B8C8F0D8DBBB210C4D1C8F4F9B3AD +CFE53352EFE9663D05E72EEF73EE36C93841DF7D318FA82E95A87DEB522CE111 +2EEB46C8A809EF588A77B9E6148D66D81035D3820A6A17776D44F0FE57D40FF8 +F48422CE909FEED7CF390A114DE170515A200A04D585C22CF51268CA8C89C0A0 +7AF1BBB4EE3A1A3658B792A8A1C629C841D05FDBAA2C95BF9B8B70174F1C81F7 +0371EB7C39D83BCAB9C3C8967CB36C9E52F34CC5F0704FE113EAC8725B7A60D4 +51414E73373A4A615DAD5851C518252E2A408E9A7BD0661F7ACEAB9464D9AE33 +AEEFB57E6711F9229C8A5943D68C340BDA682F1D2162F0594294A57C6BC9B2D0 +EB14BD58ED48731AD70E87F438AA5724776C97A89A5D8B38B2487EF0F5291133 +6276FC53AD3D1167DA2CED202B11756A91900C9AB09D6A09BC7BE3F7C39C4B3B +4F9380DE7120A4B001D808F76C54BD229ABF6DA9EAB1F640DE6A1988916A18F7 +DA865798DE1826081F7C8E187B008014D4F20C4E684359C88721EB3887B6B093 +8E68007EBE9D5D44990D5EF3A34D357BF9FE0B6D8F74CC528880E4B051DC3B80 +CD0939B888291EC81CF0174DD62C0CCC78E13133BF8168A51BE287522A8C9BD4 +3ED21691E929276EB7AA14538A5A04267708C03575860159DA9A4A9032716894 +183539193969C1D6698E53657BB57E071BE2EFFCEB47DC3111268CB1E72DF6DD +0A656288F33729FF8F49FB227FF7DBE2485D470644B6C07CF8B0B298564E41E8 +B85174E2ECE84ED00E3554F668BC02AD346F429CAB889BB13298834F18CA2A66 +41011B82F359DC27147B8030E27B9660B788AC19E93A6ACA4DEE7F14CB2B5D17 +12C5162DB9F5976071C7AA2BEACB69ACF2845347DAC20B6230C0D9B108AE4246 +DB13290C506F42957107115EBF80268C71E87EBA5F13E4EB2075CD2527DA2969 +1A8C344358C5F3FA928208B028933F2EB079D77334B1FC97FFF19C73833C7F1D +4C29326707E69DAD317099F6FAEF0448DEC23D6347DA21B42E82F3D78A12AADB +D58089919895704DC74C7F51DC08D2D06F75146098215DD6447A83F5273D1002 +E7FAE0AF95B072DE05EF580430BC0834088116B66DB032A392701970C43E18CA +B6E192D158F75C935512FF4F4D5D5B6F1C9766FF74E9ED9BA2A860FA8D59E41F +39064594748B3F329D8DA81C624C32B5E0F196F5D69AB0052D58B09F9653E15A +FADD0A1310352FA8B5650E90865F18C13A86EC50ED850AF71D2A1D526EAF4497 +5E960ED8D3FF21ED94BFDCE03B97663F5DB8F176207F7FA1E96F1BC1B8A6DF00 +FE2EE8217A304930BCA7DB53733AAB0DF733F5EC4E99AAF654FE2EF583506709 +D3BE4BBB892600018C7A1ADBC6B4EFFC5A81B3E5092F65CA6F7A5268046ADC22 +692FCC6A001841139644CE124F3C98F5EE7CA19F3B9F4EF3FDF5898ED14BB078 +9E53E0FD8D3AA9EDC78389864850AD7C55009B251ACC811309098291147AAA26 +524D48DD1CB00885188021204BF304236D6476864CDAADA0F851634027360EEC +E050532007BB84EEEDF5D6775049E3BDE78DA91F7B108637E1DC68F00B123F94 +AA03C537903B317802264C67267213A796A6FCDB107C2D6810B7766A26CB9F40 +2FDF3B6F80FACFB0F09735616A62649F28B4E5DAC6A1F149ECA2B919D1235800 +A129416943A11346EF947EF6A2B3A30008FEA9F28A929A0F33818C5E397EE1F5 +0326FFB11B2D58C31CBBB0DF5FFDE77E942E975BB80BF3B776F6BE07FBDEFE37 +80B4BB323A292EF123C185D8F7DF773193173A8E5887CBAD8E023BF28C4E24D4 +842050725584C730C7B821E2020287270E160740F6EA1F43F79101FC842E09BA +9DCB931427D84A3703A044257258DC0CB794788D1B14695CBD147DF369141C58 +9BFE9D860763D74A99E7CC02025638A15E115B49534C5E8C7DDD31DADC1CA7F9 +6329FFDEE6B8DA728345D93562596276526EA73A0AE56714AA5FA3BB7E372E2C +9D08CF5E9AAD04B1A42193DC5989FB0045E0F2C3C0CFAEC90DAD5A9566546207 +547E9D4E8AB01CA489D09ED795214CB283C3DF9FEB1587617574AA28968E050D +E45BE07CF0A0F9814AED9C690B90D193A4075F35B1A00A81D030C8DC4594FBE9 +5011FA4FA53D1E7131C5AD7559D5DEE8304DF981963FE932A5C6D83BD1650ED7 +C9EFC793B940E79A78FD92E4EA99FACB5CBA5709CA0C94D6C6E683C95CCECF82 +46AB169ADAF958EE22942EDA5442EED65432AD4D4D0579C7E9D32C4E3C996F81 +851E0A8F9C7BF9C02BAC17D72E200A25A5DBA8178D9512EA39A278395116A0DA +C261E9890CDD3A99464E6F4E6846D5FC3E52356970BCFF45820312754EF2D299 +51909A00A172A9654EFC91A3EA0020DEE1F37630AAE66BF50589D2B6C8D2C259 +75AF0F635572C8149B013EF65949AB764985E10FD9E9BD7115A1C55A7849F767 +C1379BDED08845C31D06ACA10B9076B94427D7F19959763F05840517B7B55352 +A30EA7B73B3C03C334FEF11CF62C8C766B95DACCA03319D4021FC37513D2F8D7 +73DD4604FA8DA2ECAB2CD902275D4AE194FF263A49B038DB1ADDAFE5DFF63C00 +541F314CA0125B0E2856643CEC8C46854DC6B13A03DB240CC986A33EDCD1ED6E +1F22D9C3A152EA006A570C636497189E4A177AAAF2B12D827515786DF14CA580 +D82FAA832CF3631058395549B2A249695498852E17AAC26F900DD29FB42B9B14 +DF9691858254F13A84A49DF184F56265A31960FA9864DF802E970B7C1ECF766E +FC587F2A4D4A9A538AE3B7C207F7596F643AB8504824868137E463ECC97DD238 +7FEA8FDB5F8A2A9FD79A95436232E0A7EB2CE9303305953AD9E8DC24B2FAF6A4 +76B7E8CE895D464FEC344C38346B9AD13FB32E4FADE1BBD44DD5A87BB9302584 +B7DD75DF9874C8513281CF98C740C66EA0BBF67CDDE33CDEC8700B8B00C02A7C +63BF1AD24259094B799ED502F64BFF9A17E043F48AD4C8718ABAE844DE1F74DF +7677A8329ED2A0E6EE5B22A95F9B489939421400ACF6D39BB49B6EC1343A3A72 +2971599E41BB197931D928E2CB2107D5F243DBA0ABD767B9A54D4355DC8B8702 +C8E6B84A2EA762D01B02CFCC6D03600CD187C2B08FC83AF29D1226077874A44C +DA81759E07930DD3E781196CE4570988E280653193DC0F5ADFE4D7D4AF188C26 +51C64E402BEF4CD65EC79E0FEAE901104784E23D4ADCF3A0E93835D87B992D95 +5DF80FB1F1CCA9CDF5457B7008FEBC8641423FAAB7BE59DDC52881B356A7135C +29B95BF6B552C3A8253EFC9E0F61967CE59B0BDFF1BAC8788B1323F5E76DBDE2 +5BA0F7FFDEBF22C7F851377642BCC3FD1285F4FFAB73477106A52C6DDA377D3B +C781D35A45DA3DA67A74954EF118750E3C06FAF33487EFC0CC74DE6BA1C4D973 +DD3148814CB3E430B4007E515CDCC8A1CCA0EC0F6FD2456B581C1AA45C266402 +35C268B343B44FEF8FB822AA8BD2C8E7E96B45C351A1DEB2F8F88D69E19FCED1 +36E3E70F16ADCC351DE474DF5C6F1F18869B707A4A35E2137D44543772597BA5 +0FE86DF1504074BBADCDAF0C4EC5186589B0F10A122B409154A0DC949BB78195 +52A56B59967BE621AC6A9D3F7165E2E3AF8D3FCBEDB88D66A004B96BCE8F24E7 +A5298E4F14746A2AFDD4307762D725E9C48A0ED0C3FD2E2A96BDD849BA270B30 +D8D82843593A3AACC6CAC3584111E6F182180427A07757016B0A15253B77B8B5 +67D8C5B04AC8C48B76EB92BC60AFFB7BB376E29D971CB72FB28720788634285C +9F1478226166D8B953A6A0978B24D0EF5A83F0B7A8A1A7C7CF38694CE6FA43B8 +8AFB2EB93590A366AB756AA8DA37F20AD1CD6DDA90C582C3E8CBEAF468CCC792 +49FEA18351C444976E21C4D99B683CAAF0EB682783DCF6B9262615A753150801 +B14F6451584BA046215D406A669B8F452AE0F45BA1D8CFD57E38D4E68CEB7E1B +4548AD3DE7B41B830FC2C83DC0292D4714830A5E8F47812BE422D33291DDFC8E +CBB773503921FA7A4A14B67C81D1DA6B2DF5F621B223B09BB3CBBD1C79365E03 +89D34BFFA843E343FCBB9B5C85D10CA7EB101E08E6B22538E78F72C8381C318C +ACB366A9C5EB4164ABA5F20691223F87AD1AA8A1D60D4C6990ABC487F3026DAF +CA13A23A670817D5E1DE6217150F9F88A3FE8D1661EE1A23EFCFEE6BC6DCD1AC +5EBB91F9AD25ED81E5B25719F7D3A8D42FDD215141DF82A08228CB9C0D5128F0 +E15C6A3736A79A2E695D914736DB708D9C1638CF395053ACFB7678CA86E1B8EC +3D373054240573A161EA75C11EA41F0C5548B52C58B5A6316DC97355F8D58B8E +2F978BAE2C45C104A6EDC6BD75C18AFA19634F3DB0054675CE470103BE0DABCC +F48B1E3B51318256A412BC542A0D1D1BB39426FE871BF8E0EB9E28872B5AD0F8 +32DA58781A99ED850039F22D774996F57E77C61A4CA661FFAEFBAF75BF5B6544 +3BA814FE153ECC2C561E2E21CD07BF5C1A1D94C11B7894C60741CA684EB4DA67 +B2C413EA903B46715C8EA8D89D552F784FE95D97219B9198659B5914E955631D +9A50778E607D9D9B54ADE0F791BE97C9FA35BE1083CA6AFED04897D49D0910CB +7F5FDD8C52FBDB0F2BBFE5DD0F950C460DCC540095F8B98DA3FD0EB216C6C4D3 +546D518D92BA23977CC78CC8CDFCD6F3BFD179952D414AFC1B5C1EAEBAAB1B9C +BE7D5C3E8B1480318BC04F0880596C18E83E5ACBDF2358400DDD01081AD16BE8 +BECAD72887C1D3B942FDF4AEDFFC874411079D87892FDF15BCE85458CBB6C34A +F4BB7EB60BCAB868F785D0848BA771830634B9366F487087255566198681B647 +42CBFA22F80980B0779A5D634575A767CB4A81D818204BAEA74F6AAAC637A580 +3FC8DD430398D0FCC738423D780F8E72DC6BD9D0D750F642348BD654F303F229 +72C037126C2ACABBBF595ADC89E632AAD17CB9A6A69152E8F7213703B521C22F +3A97C7DCA73EA94E62A3B9DD2DFA9995A7977B8F28F45DAB67E8DC9169F29D55 +679FED8D96E3E7DE2F8CEEADC4D9F005171D02667F6021816F46BB114CFC1F61 +F3EE667CB28BD9457DF9F690AFCFBCBDB8F32DD00FAE3004B9976FEA5A92B599 +BA4F0E1B006F7B235F3060D658086660100E0361CC2084C4395984EE86932328 +07C6D9861AC161B69DD7C8A37621C98BA781F19E08385B5D2949F697474512FE +8AD9FAB1E155C207B9F4A4B3B0971DA7806331AE8C4703BB81FE509D745A124B +110FBC72A6484527BB44C159F7DF19F4A47C3757113CFCDE2A790F09DE8C244F +D42B91782D47CF2A7DC03151E36B20E8CE904E79DA3FF07F4A598EDEBEEADA78 +C8175D7FCB87B0736A483EE1A8D2B9A6C2CFD703CD211585A84D1BA077B71D25 +8D0AED5F7EDA97FD1AD237122ECABE4DFD9B5AB9BAD811C9320727DF3398FA5E +B448111128DCF487E0F6D7C8715D8308FC53A0C8A06F5AA4C97CE2CA244BAF4A +79125D476D3D9B8CFD0E1421AAF47A06097FE0CADC027E631BE022CDF940B9AF +5DAA06D9ABEAA35E01B8905557E5D8E36B5A5D40D165D2257A3FED845DA4E7FC +B15B10BC9B02392D79C53B8F1C25895272F7B55FE0FB0746944C82E718043AAF +E9ADFB4C3A5515AA8E8CCA58FA38061D2A1F491675EAF479A3279344F20A85FD +4E7406068273B5909F9FA26A447FF55D17C2AE063B4B9A4546CDEC42FD1D4642 +9E327322346FFCC65ECD92DE5D802E4EC29FE1D3E2FA26B532A1B6BFB8DE58BF +DBEF574225E93E7836856CB751A9DD974D72D8EF55C3B4BFCA1B74660411EFE8 +F288A92BC83E7EE7CC2A85302A8046FDC70E8DF5B450A61ACA17A6BB7359FE8F +56B7F51CA0F3DC69DBEB79CEB66AA45EC776E98AB4156A67D29F9444ACCF48E5 +DE907C11B481A90D275C0C2493F247D3EA95E21A0821A001CAE7708F6B0176C2 +41F4E7C698A2256696D80FBD8D414C43E4C2AB2D2C927B1A6887772AAA189977 +685FB4537E666DABF6042013B2F5CF5EEB322C806F6265B117C276EC86A7905B +DB522EC46C02E8B72F07327EF9C8C980AC693D336E5800B5FD3E84C7DCF859A4 +5D9212FC2191ADF5F2E2FEB294AC8F014FF60E8FCD9537993488CA77D3AA8DA2 +0B72B157621AE6EE16805DBBFAA07DC73F1E1DC1E51A2644711F272BFB359C1C +5A89CED3AAB1C6FEF124EFE5C7D4006828A72C6B6389734CFEDDD0CC03856056 +EF035883DEC58509C28D5349256DBFB7605D3465C1D9F317F7D8BAE9AA53CFBC +923853EA59D8DAE0BA36E147830271B792C6CB75B41CF903DFAE6B4B5C30C312 +13E85A1DD2512AC76786E76575C3EFA5281652F5A6F06B2DBAD10A0C4B77CF12 +DAC9F1ADBA150D51F1EE6C9A5F17D2B437BF672D59C5515BAEAD714EA519DF4D +05414B78ABB12F8F69A98A9427CEFA691688A0E64309EF3D4417F3DA117178AD +C2C964C301A949E02029CF36A017D02C9EBEEBC550FFF8F41E1C20ACD25E5FA6 +4BAE6CC9F685A41504BDE6BCDDF43066E45B4F786088225FE03EB7973970486F +D96763B797424971C67826D960A8661A93E4EDCB6E544AE6283290C9575E6557 +68C39185A7964FC92181B99552FBE1C199EB12648B791C3CF11349CA0E581534 +9693D6D08922D8A8FB148BB2495B64D7674F40AA6DE6245537E86E40C8B8A625 +DF60F5DDB4A3A3F3D269628BBE87203BE0A746D33AA98689FC52719809B52DD4 +E8CC50553F2DC0F994AB25E9BC228C0771E9943A94A12EFC73343B2979161ED7 +D258BED775D280A871A562B0F7A704A0A94F36F601AFB51C8CCCFB4EA2AA9D40 +4F0DEDE814AE53347E169E1719EF5313BE390A038080D98F2ED8232E2BD759C7 +186A61DC3CC15CCACE167AB1970A0D104EC7DE511F45CB68302E3818B3757ABB +E531684333387A71D8FCBD84910ECC73550D39B11B495F181FF3B226752D55C2 +B3E8669B1D013263B8B6EB4BB6978A80B763628E51424223C10039363A6D64B9 +860266F7280812611015FFBB3D8B5B1CA65634DDD10DE619AA6ED80849297D9C +6AFB6FB5C0CC99FD438E04CFE43C187C76A5110A311DB4BB8B670505ED7DB043 +0B0A554AD69D8392CC1938E6FC27F7447278BFBAD9542A807B219591D7CC9CE1 +20961F5349962B490E0717FAC9C3314BB07CCEB6999505516E9C796B1848EF92 +6FDB2ACE69B16946AC910E6A2B7DD0A7953482676086DBA46E3FB4C0C25FE68F +080CFAFC7780CA9AE369A28BDB9C4EEB1B743B5364A34BC23B61C7434D3F107D +F47A07C8D5768F0B70C5F0144B3F8E4AA9FDA63D50BD871E1DA42FA8034DD0DE +BFD7971C26AB2F6F71C37A83D9E396C6BD14588E85901688463B405FAD35D3A4 +32AE3BA2486C9E8359AF5949B29AF91F8630CD9C6F0496387A7EEDF5D18C1615 +147BD65D33A0DC10AAADE9774375C95062C594AD8BAF93187C5C255C845C1DE8 +F0F9467142979FF5CC5F50AECED0B008D58EFDFE55A6C4D0E1AD91685C78E323 +92D2B0AF92FF0E76CAD58A5745CE9BAE6FC16993F8F3839D22B546951703337E +154B4576FC09CDE7EF75664C810D6400FFB669DA4EA2B9D361F1C07425673589 +4FFE2AA71CE04E1394ED60B1195B717A5AC19DFF305AD4F26C72551ED0FC0814 +4C97E10F078441E50C56AFBE120DA1196841D837F76ED41BBB9115E635AB2567 +0993A7D6AE33A562DF54977C034E4B7E2A4B0068615ACD9B62F694CC9C58A1D1 +F7CDB04714F5A3DD71CBB874EAF88DBB64218357A6294DC9015A0078CDFC93AD +0FCAAAB616748A4BF19C265A3FEB24521E80ECD55FC8983543B098301245CB8B +7718847705707790AC435D3F31E85AD5D3097A84DE311ABB89DA7357CDD82558 +00425C6FC81261C4F4A17C458E8AE6F9B118051549462E62934599E08762B837 +30D0A8E50D54A4AD250773E9A0644FD693E544599166C02566598A89C3F16BAE +1F924A84C1E8A07ED179DACA41F88A5006C193D6BC96567F7A13F3A5359548D2 +A233754622805C32F79CAD4F7DBDF43F9C80D9C34AEE35695B963D53D8E8DDEE +056864F3026294E045C4E3981A1CE89A452EC888C8C0287D55E192F281D96C07 +F894FFAC033B8534A4B1CE780C8628AAE08D9FD4153844F3665CC29416F2591E +5B88585CA5A6A1C3DAB903D9A6A362BADF76CFE8E2C031D479921F0A66A5D1CF +15ECBCFFBACEF3A2FC2C0CB19D4859B2D11F348F238578A2315C079C8850EBC8 +791066DE9B8F39DF2A1078845FC3991CC073A7DCBF6C72FFA90C5D5F4BFC09AB +5F13273289FA80847C8A34A29B8FCA3CD320F64DE759269D1F9A015AE49E59B1 +0797631A6A628AA469F347D79CC9C35543191F11B6FF709B9C84B6C8B729F3CE +EFF6C0491A00A3B119D40FA209059C1534836A504F05C95311C87A6122FE85D2 +D27DAF86288EF8A28B8120915FC90014F35A2A2510DF3FD43EC614F90946D5A1 +76168ED657F2AF4B4701EF58855BF5931093D26A56D2345811FEC50CEB4466C4 +786B0D360FD05DE14964F0229585BAA414DE5DA36195E959F4DFA6C05D5D2C2E +D6935443DE7CAB73DDD4F26ADBE1B7B5E16A3A192493A959F08AA460088B04F0 +18B3789637671242F9BD38987C20BD3236C8E0A888FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +TeXDict begin 39158280 55380996 1000 600 600 (llncs.dvi) +@start /Fa 128[39 4[31 37 35 1[35 41 25 31 32 1[39 39 +43 63 20 35 1[24 39 35 24 35 39 35 35 39 9[77 2[55 43 +56 1[52 1[57 69 48 59 40 30 57 59 1[52 58 55 1[57 7[39 +2[39 39 2[39 39 2[24 27 24 2[31 31 20[39 19[{ + TeX74afc74cEncoding ReEncodeFont }52 74.7198 /CMTI9 +rf /Fb 138[44 44 44 44 1[44 44 44 44 2[44 1[44 44 44 +44 1[44 40[44 10[44 44 46[{ TeX09fbbfacEncoding ReEncodeFont }17 +83.022 /CMTT10 rf /Fc 139[24 10[22 35[45 69[{ + TeXaae443f0Encoding ReEncodeFont }3 49.8132 /CMMI6 rf +/Fd 139[22 1[22 8[17 5[25 48[28 50[{ TeX0ef0afcaEncoding ReEncodeFont } +5 41.511 /CMR5 rf /Fe 139[23 5[37 110[{ + TeXaae443f0Encoding ReEncodeFont }2 41.511 /CMMI5 rf +/Ff 149[20 55[45 49[52{ TeXbbad153fEncoding ReEncodeFont }3 +58.1154 /CMSY7 rf /Fg 134[50 50 2[53 37 38 39 1[53 48 +53 80 27 1[29 27 53 48 29 44 53 42 53 46 10[72 1[66 53 +3[72 75 91 6[60 63 1[69 1[72 9[48 48 48 48 48 48 48 2[27 +32 45[{ TeXf7b6d320Encoding ReEncodeFont }40 83.022 /CMBX10 +rf /Fh 165[55 90[{}1 83.022 /MSBM10 rf /Fi 143[83 23[120 +7[88 62[50 50 6[48 48 4[35 35 38 38{}11 83.022 /CMEX10 +rf /Fj 135[38 1[33 1[25 5[41 3[27 23 1[32 2[35 30 12[39 +1[39 12[52 1[49 7[34 61[{ TeXaae443f0Encoding ReEncodeFont }14 +58.1154 /CMMI7 rf /Fk 138[55 55 9[23 2[42 42 10[55 19[49 +11[42 4[0 3[55 83 9[65 5[83 8[65 2[65 65 1[65 15[65 1[65{ + TeXbbad153fEncoding ReEncodeFont }19 83.022 /CMSY10 +rf /Fl 134[40 39 55 38 45 28 34 35 1[42 42 47 68 21 38 +1[25 42 38 25 38 42 38 38 42 9[83 2[59 3[56 6[32 2[54 +11[25 7[42 3[25 30 25 44[{ TeX74afc74cEncoding ReEncodeFont }33 +83.022 /CMTI10 rf /Fm 134[41 47 1[40 48 30 3[42 40 50 +73 2[34 29 48 40 41 39 43 36 36 44 7[48 2[48 57 49 51 +1[66 53 63 67 81 57 2[36 1[65 1[61 1[59 1[62 2[65 42 +65 23 23 42[34 8[65 6[{ TeXaae443f0Encoding ReEncodeFont }42 +83.022 /CMMI10 rf /Fn 135[59 2[62 44 44 46 1[62 56 62 +93 31 59 1[31 62 56 34 51 62 50 1[54 9[116 2[78 1[84 +8[42 3[74 1[81 1[85 10[56 56 56 56 56 56 49[{ + TeXf7b6d320Encoding ReEncodeFont }32 99.6264 /CMBX12 +rf /Fo 135[44 55 37 44 28 5[46 68 4[44 37 2[40 33 33 +8[45 2[45 1[45 47 1[61 1[58 61 6[60 1[57 3[58 5[21 21 +58[{ TeXaae443f0Encoding ReEncodeFont }24 74.7198 /CMMI9 +rf /Fp 136[64 1[49 34 35 36 1[49 44 49 1[25 2[25 49 44 +27 41 49 39 49 43 12[62 13[56 4[67 12[44 44 44 44 2[25 +46[{ TeXf7b6d320Encoding ReEncodeFont }26 74.7198 /CMBX9 +rf /Fq 134[39 2[39 39 39 39 39 1[39 39 39 39 39 2[39 +39 39 39 39 39 39 39 33[39 17[39 1[39 44[{ + TeX09fbbfacEncoding ReEncodeFont }22 74.7198 /CMTT9 +rf /Fr 149[21 2[38 38 10[51 31[38 4[0 3[51 77 15[77 11[60 +20[60{ TeXbbad153fEncoding ReEncodeFont }11 74.7198 /CMSY9 +rf /Fs 129[38 38 1[38 34 41 41 55 41 43 30 30 30 41 43 +38 43 64 21 41 23 21 43 38 23 34 43 34 43 38 21 2[21 +1[21 47 1[58 79 58 58 55 43 57 60 52 60 58 70 48 60 39 +28 58 60 50 52 59 55 54 58 3[60 1[21 21 38 38 38 38 38 +38 38 38 38 38 1[21 26 21 60 1[30 30 21 1[64 4[21 12[38 +4[64 1[43 45 11[{ TeXf7b6d320Encoding ReEncodeFont }83 +74.7198 /CMR9 rf /Ft 139[24 24 24 3[34 4[18 5[27 33[45 +12[30 30 30 30 49[{ TeXf7b6d320Encoding ReEncodeFont }11 +49.8132 /CMR6 rf /Fu 135[35 3[26 26 26 3[37 55 3[19 1[33 +1[30 37 30 37 33 35[51 8[33 33 33 33 7[26 26 40[{ + TeXf7b6d320Encoding ReEncodeFont }20 58.1154 /CMR7 rf +/Fv 128[42 4[37 44 44 60 44 46 32 33 33 44 46 42 46 69 +23 44 25 23 46 42 25 37 46 37 46 42 3[23 42 23 51 62 +1[85 1[62 60 46 61 1[57 65 62 76 52 65 1[30 62 65 54 +57 63 60 59 62 1[39 1[65 1[23 23 42 42 42 42 42 42 42 +42 42 42 1[23 28 23 65 1[32 32 2[69 2[42 14[42 4[69 46 +46 48 11[{ TeXf7b6d320Encoding ReEncodeFont }79 83.022 +/CMR10 rf /Fw 139[52 53 55 2[67 75 112 37 2[37 75 67 +41 61 75 60 1[65 16[92 2[128 4[105 6[102 65[{ + TeXf7b6d320Encoding ReEncodeFont }19 119.552 /CMBX12 +rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%PaperSize: A4 + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 456 387 a Fw(A)45 b(Practical)h(Minimal)f(P)l +(erfect)h(Hashing)g(Metho)t(d)607 676 y Fv(F)-7 b(abiano)27 +b(C.)h(Botelho,)1337 646 y Fu(1)1401 676 y Fv(Y)-7 b(oshiharu)27 +b(Koha)n(y)n(ak)-5 b(a)n(w)n(a,)2273 646 y Fu(2)2334 +676 y Fv(and)27 b(Nivio)h(Ziviani)2969 646 y Fu(1)393 +818 y Ft(1)466 850 y Fs(Dept.)d(of)h(Computer)g(Science,)g(F)-6 +b(ederal)26 b(Univ.)f(of)i(Minas)g(Gerais,)g(Belo)g(Horizon)n(te,)f +(Brazil)1258 941 y Fr(f)p Fq(fbotelho,nivio)p Fr(g)p +Fq(@dcc.ufmg.br)662 1001 y Ft(2)735 1033 y Fs(Dept.)g(of)g(Computer)g +(Science,)g(Univ.)f(of)i(S~)-38 b(ao)26 b(P)n(aulo,)h(S~)-38 +b(ao)26 b(P)n(aulo,)g(Brazil)1492 1124 y Fq(yoshi@ime.usp.br)602 +1378 y Fp(Abstract.)42 b Fs(W)-6 b(e)31 b(prop)r(ose)i(a)g(no)n(v)n(el) +e(algorithm)j(based)e(on)g(random)g(graphs)h(to)602 1470 +y(construct)27 b(minimal)i(p)r(erfect)f(hash)g(functions)d +Fo(h)p Fs(.)k(F)-6 b(or)28 b(a)g(set)g(of)d Fo(n)j Fs(k)n(eys,)g(our)g +(al-)602 1561 y(gorithm)38 b(outputs)24 b Fo(h)37 b Fs(in)h(exp)r +(ected)f(time)25 b Fo(O)r Fs(\()p Fo(n)p Fs(\).)38 b(The)g(ev)l +(aluation)g(of)25 b Fo(h)p Fs(\()p Fo(x)p Fs(\))37 b(re-)602 +1652 y(quires)23 b(t)n(w)n(o)h(memory)g(accesses)i(for)f(an)n(y)e(k)n +(ey)h Fo(x)f Fs(and)g(the)h(description)g(of)i Fo(h)e +Fs(tak)n(es)602 1744 y(up)g(1)p Fo(:)p Fs(15)p Fo(n)h +Fs(w)n(ords.)g(This)g(impro)n(v)n(es)f(the)f(space)i(requiremen)n(t)e +(to)h(55\045)h(of)f(a)h(previ-)602 1835 y(ous)e(minimal)h(p)r(erfect)g +(hashing)f(sc)n(heme)h(due)e(to)i(Czec)n(h,)g(Ha)n(v)l(as)f(and)f(Ma)t +(jewski.)602 1926 y(A)e(simple)i(heuristic)g(further)f(reduces)g(the)g +(space)h(requiremen)n(t)f(to)k(0)p Fo(:)p Fs(93)p Fo(n)e +Fs(w)n(ords,)602 2018 y(at)f(the)h(exp)r(ense)f(of)h(a)g(sligh)n(tly)g +(w)n(orse)h(constan)n(t)f(in)g(the)f(time)h(complexit)n(y)-6 +b(.)22 b(Large)602 2109 y(scale)30 b(exp)r(erimen)n(tal)e(results)i +(are)f(presen)n(ted.)g(F)-6 b(or)28 b(a)i(collection)g(of)f(100)e +(million)602 2200 y(k)n(eys,)g(eac)n(h)i(k)n(ey)e(63)f(b)n(ytes)h(long) +i(on)f(a)n(v)n(erage,)h(our)g(algorithm)g(\014nds)e(a)i(minimal)602 +2292 y(p)r(erfect)d(hash)f(function)h(in)g(811)g(seconds)g(on)g(a)n(v)n +(erage.)365 2574 y Fn(1)112 b(In)m(tro)s(duction)365 +2771 y Fv(Supp)r(ose)25 b Fm(U)39 b Fv(is)30 b(a)g(univ)n(erse)f(of)h +Fl(keys)p Fv(.)h(Let)f Fm(h)d Fv(:)g Fm(U)36 b Fk(!)27 +b Fm(M)39 b Fv(b)r(e)30 b(a)g Fl(hash)j(function)d Fv(that)h(maps)365 +2871 y(the)23 b(k)n(eys)d(from)25 b Fm(U)31 b Fv(to)21 +b(a)h(giv)n(en)f(in)n(terv)-5 b(al)21 b(of)h(in)n(tegers)e +Fm(M)32 b Fv(=)23 b([0)p Fm(;)14 b(m)7 b Fk(\000)g Fv(1])21 +b(=)i Fk(f)p Fv(0)p Fm(;)14 b Fv(1)p Fm(;)g(:)g(:)g(:)e(;)i(m)7 +b Fk(\000)g Fv(1)p Fk(g)p Fv(.)365 2971 y(Let)25 b Fm(S)35 +b Fk(\022)30 b Fm(U)41 b Fv(b)r(e)33 b(a)e(set)h(of)25 +b Fm(n)32 b Fv(k)n(eys)f(from)25 b Fm(U)9 b Fv(.)32 b(Giv)n(en)g(a)f(k) +n(ey)24 b Fm(x)31 b Fk(2)g Fm(S)5 b Fv(,)32 b(the)g(hash)g(function)25 +b Fm(h)365 3070 y Fv(computes)40 b(an)g(in)n(teger)f(in)i([0)p +Fm(;)14 b(m)26 b Fk(\000)g Fv(1])40 b(for)f(the)i(storage)d(or)h +(retriev)-5 b(al)39 b(of)25 b Fm(x)41 b Fv(in)f(a)g Fl(hash)365 +3170 y(table)p Fv(.)26 b(Hashing)f(metho)r(ds)g(for)g +Fl(non-static)i(sets)e Fv(of)g(k)n(eys)f(can)h(b)r(e)h(used)f(to)g +(construct)g(data)365 3269 y(structures)30 b(storing)g +Fm(S)35 b Fv(and)30 b(supp)r(orting)g(mem)n(b)r(ership)h(queries)f(\\)p +Fm(x)e Fk(2)g Fm(S)5 b Fv(?")30 b(in)h(exp)r(ected)365 +3369 y(time)36 b Fm(O)r Fv(\(1\).)h(Ho)n(w)n(ev)n(er,)d(they)h(in)n(v)n +(olv)n(e)f(a)i(certain)e(amoun)n(t)i(of)f(w)n(asted)g(space)g(o)n(wing) +f(to)365 3469 y(un)n(used)h(lo)r(cations)f(in)h(the)g(table)g(and)f(w)n +(aisted)h(time)g(to)f(resolv)n(e)f(collisions)h(when)h(t)n(w)n(o)365 +3568 y(k)n(eys)27 b(are)g(hashed)g(to)g(the)h(same)f(table)h(lo)r +(cation.)490 3668 y(F)-7 b(or)26 b Fl(static)k(sets)c +Fv(of)h(k)n(eys)f(it)i(is)f(p)r(ossible)f(to)h(compute)g(a)g(function)g +(to)g(\014nd)h(an)n(y)e(k)n(ey)g(in)365 3768 y(a)d(table)g(in)g(one)g +(prob)r(e;)f(suc)n(h)h(hash)f(functions)i(are)e(called)g +Fl(p)l(erfe)l(ct)p Fv(.)i(More)e(precisely)-7 b(,)22 +b(giv)n(en)365 3867 y(a)31 b(set)g(of)f(k)n(eys)24 b +Fm(S)5 b Fv(,)31 b(w)n(e)g(shall)f(sa)n(y)g(that)h(a)f(hash)h(function) +25 b Fm(h)k Fv(:)f Fm(U)37 b Fk(!)29 b Fm(M)39 b Fv(is)31 +b(a)g Fl(p)l(erfe)l(ct)i(hash)365 3967 y(function)40 +b Fv(for)25 b Fm(S)38 b Fv(if)26 b Fm(h)33 b Fv(is)h(an)f(injection)h +(on)25 b Fm(S)5 b Fv(,)33 b(that)h(is,)g(there)g(are)e(no)i +Fl(c)l(ol)t(lisions)42 b Fv(among)365 4066 y(the)e(k)n(eys)e(in)25 +b Fm(S)5 b Fv(:)39 b(if)25 b Fm(x)40 b Fv(and)24 b Fm(y)42 +b Fv(are)c(in)25 b Fm(S)44 b Fv(and)25 b Fm(x)42 b Fk(6)p +Fv(=)g Fm(y)s Fv(,)d(then)25 b Fm(h)p Fv(\()p Fm(x)p +Fv(\))43 b Fk(6)p Fv(=)f Fm(h)p Fv(\()p Fm(y)s Fv(\).)d(Figure)25 +b(1\(a\))365 4166 y(illustrates)36 b(a)g(p)r(erfect)h(hash)e(function.) +i(Since)g(no)f(collisions)f(o)r(ccur,)h(eac)n(h)f(k)n(ey)h(can)g(b)r(e) +365 4266 y(retriev)n(ed)e(from)h(the)g(table)g(with)h(a)e(single)h +(prob)r(e.)g(If)25 b Fm(m)35 b Fv(=)g Fm(n)p Fv(,)g(that)g(is,)g(the)h +(table)f(has)365 4365 y(the)28 b(same)e(size)g(as)f Fm(S)5 +b Fv(,)26 b(then)i(w)n(e)e(sa)n(y)g(that)f Fm(h)i Fv(is)f(a)h +Fl(minimal)j(p)l(erfe)l(ct)g(hash)g(function)j Fv(for)24 +b Fm(S)5 b Fv(.)365 4465 y(Figure)25 b(1\(b\))37 b(illustrates)g(a)24 +b(minimal)37 b(p)r(erfect)h(hash)f(function.)h(Minimal)f(p)r(erfect)h +(hash)365 4565 y(functions)28 b(totally)f(a)n(v)n(oid)g(the)g(problem)h +(of)f(w)n(asted)g(space)g(and)g(time.)490 4664 y(Minimal)g(p)r(erfect)h +(hash)f(functions)g(are)f(widely)i(used)f(for)f(memory)h(e\016cien)n(t) +g(storage)365 4764 y(and)i(fast)h(retriev)-5 b(al)28 +b(of)h(items)h(from)f(static)g(sets,)g(suc)n(h)g(as)f(w)n(ords)g(in)i +(natural)e(languages,)365 4863 y(reserv)n(ed)j(w)n(ords)g(in)h +(programming)e(languages)h(or)g(in)n(teractiv)n(e)g(systems,)h(univ)n +(ersal)f(re-)365 4963 y(source)38 b(lo)r(cations)g(\(URLs\))i(in)g(W)-7 +b(eb)39 b(searc)n(h)f(engines,)g(or)h(item)g(sets)g(in)g(data)g(mining) +365 5063 y(tec)n(hniques.)p eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 1192 1507 a + currentpoint currentpoint translate 0.80 0.80 scale neg exch neg exch +translate + 1192 1507 a @beginspecial +0 @llx 0 @lly 279 @urx 168 @ury 2790 @rwi @setspecial +%%BeginDocument: figs/minimalperfecthash-ph-mph.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + @endspecial 1192 1507 a + currentpoint currentpoint translate 1 0.80 div 1 0.80 div scale neg +exch neg exch translate + 1192 1507 a 962 1682 a Fp(Fig.)14 +b(1.)25 b Fs(\(a\))h(P)n(erfect)h(hash)e(function)77 +b(\(b\))25 b(Minimal)i(p)r(erfect)f(hash)g(function)805 +1842 y Fv(The)19 b(aim)g(of)g(this)g(pap)r(er)g(is)g(to)f(describ)r(e)h +(a)f(new)h(w)n(a)n(y)f(of)h(constructing)f(minimal)h(p)r(erfect)681 +1941 y(hash)j(functions.)h(Our)f(algorithm)g(shares)f(sev)n(eral)g +(features)i(with)g(the)g(one)f(due)h(to)g(Czec)n(h,)681 +2041 y(Ha)n(v)-5 b(as)30 b(and)h(Ma)5 b(jewski)24 b([4)o(].)32 +b(In)f(particular,)f(our)g(algorithm)g(is)h(also)f(based)h(on)g(the)g +(gen-)681 2141 y(eration)d(of)h(random)g(graphs)23 b +Fm(G)j Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\),)30 b(where)24 +b Fm(E)34 b Fv(is)29 b(in)h(one-to-one)e(corresp)r(ondence)681 +2240 y(with)35 b(the)f(k)n(ey)g(set)25 b Fm(S)39 b Fv(for)34 +b(whic)n(h)g(w)n(e)g(wish)g(to)g(generate)g(the)g(hash)g(function.)h +(The)g(t)n(w)n(o)681 2340 y(main)22 b(di\013erences)g(b)r(et)n(w)n(een) +h(our)f(algorithm)f(and)h(theirs)h(are)e(as)h(follo)n(ws:)f(\()p +Fl(i)8 b Fv(\))27 b(w)n(e)22 b(generate)681 2440 y(random)e(graphs)f +Fm(G)k Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))21 b(with)h +Fk(j)p Fm(V)c Fk(j)24 b Fv(=)e Fm(cn)f Fv(and)f Fk(j)p +Fm(E)5 b Fk(j)24 b Fv(=)e Fk(j)p Fm(S)5 b Fk(j)23 b Fv(=)g +Fm(n)p Fv(,)e(where)j Fm(c)f Fk(\025)f Fv(1)p Fm(:)p +Fv(15,)e(and)681 2539 y(hence)25 b Fm(G)j Fv(necessarily)e(con)n(tains) +h(cycles,)h(while)g(they)g(generate)e Fl(acyclic)35 b +Fv(random)27 b(graphs)681 2639 y Fm(G)c Fv(=)g(\()p Fm(V)5 +b(;)14 b(E)5 b Fv(\))28 b(with)g Fk(j)p Fm(V)19 b Fk(j)24 +b Fv(=)e Fm(cn)28 b Fv(and)f Fk(j)p Fm(E)5 b Fk(j)24 +b Fv(=)e Fk(j)p Fm(S)5 b Fk(j)23 b Fv(=)g Fm(n)p Fv(,)28 +b(with)g(a)f(greater)f(n)n(um)n(b)r(er)h(of)h(v)n(ertices:)681 +2738 y Fk(j)p Fm(V)19 b Fk(j)k(\025)g Fv(2)p Fm(:)p Fv(09)p +Fm(n)p Fv(;)j(\()p Fl(ii)8 b Fv(\))27 b(they)h(generate)e(order)g +(preserving)g(minimal)i(p)r(erfect)g(hash)f(functions)681 +2838 y(while)i(our)f(algorithm)g(do)r(es)g(not)h(preserv)n(e)e(order)h +(\(a)h(p)r(erfect)g(hash)g(function)g Fm(h)g Fv(is)g +Fl(or)l(der)681 2938 y(pr)l(eserving)j Fv(if)25 b(the)f(k)n(eys)f(in)i +Fm(S)k Fv(are)22 b(arranged)g(in)i(some)g(giv)n(en)f(order)f(and)j +Fm(h)f Fv(preserv)n(es)d(this)681 3037 y(order)i(in)h(the)h(hash)e +(table\).)i(Th)n(us,)f(our)f(algorithm)g(impro)n(v)n(es)g(the)h(space)g +(requiremen)n(t)f(at)681 3137 y(the)28 b(exp)r(ense)f(of)h(generating)e +(functions)i(that)g(are)e(not)i(order)e(preserving.)805 +3237 y(Our)37 b(algorithm)f(is)i(e\016cien)n(t)f(and)h(ma)n(y)e(b)r(e)i +(tuned)g(to)g(yield)f(a)g(function)26 b Fm(h)37 b Fv(with)h(a)681 +3336 y(v)n(ery)30 b(economical)f(description.)i(As)g(the)g(algorithm)f +(in)25 b([4],)31 b(our)f(algorithm)g(pro)r(duces)24 b +Fm(h)681 3436 y Fv(in)h Fm(O)r Fv(\()p Fm(n)p Fv(\))35 +b(exp)r(ected)g(time)g(for)f(a)g(set)g(of)25 b Fm(n)34 +b Fv(k)n(eys.)g(The)g(description)g(of)24 b Fm(h)35 b +Fv(requires)23 b(1)p Fm(:)p Fv(15)p Fm(n)681 3535 y Fv(computer)k(w)n +(ords,)f(and)h(ev)-5 b(aluating)25 b Fm(h)p Fv(\()p Fm(x)p +Fv(\))j(requires)e(t)n(w)n(o)h(accesses)f(to)h(an)g(arra)n(y)e(of)g(1)p +Fm(:)p Fv(15)p Fm(n)681 3635 y Fv(in)n(tegers.)41 b(W)-7 +b(e)43 b(further)g(deriv)n(e)e(a)i(heuristic)f(that)h(impro)n(v)n(es)e +(the)i(space)f(requiremen)n(t)681 3735 y(from)24 b(1)p +Fm(:)p Fv(15)p Fm(n)c Fv(w)n(ords)g(do)n(wn)g(to)25 b(0)p +Fm(:)p Fv(93)p Fm(n)20 b Fv(w)n(ords.)g(Our)g(sc)n(heme)h(is)g(v)n(ery) +f(practical:)g(to)h(generate)681 3834 y(a)26 b(minimal)h(p)r(erfect)f +(hash)h(function)g(for)f(a)g(collection)g(of)g(100)d(million)k(univ)n +(erse)f(resource)681 3934 y(lo)r(cations)34 b(\(URLs\),)h(eac)n(h)f(63) +g(b)n(ytes)h(long)f(on)g(a)n(v)n(erage,)e(our)i(algorithm)g(running)h +(on)f(a)681 4034 y(commo)r(dit)n(y)27 b(PC)g(tak)n(es)g(811)f(seconds)h +(on)g(a)n(v)n(erage.)681 4214 y Fn(2)112 b(Related)38 +b(W)-9 b(ork)681 4365 y Fv(Czec)n(h,)40 b(Ha)n(v)-5 b(as)41 +b(and)g(Ma)5 b(jewski)24 b([5)o(])41 b(pro)n(vide)f(a)h(comprehensiv)n +(e)f(surv)n(ey)f(of)i(the)h(most)681 4465 y(imp)r(ortan)n(t)d +(theoretical)g(results)g(on)g(p)r(erfect)h(hashing.)e(In)i(the)g(follo) +n(wing,)e(w)n(e)i(review)681 4565 y(some)27 b(of)g(those)h(results.)805 +4664 y(F)-7 b(redman,)27 b(Koml\023)-42 b(os)26 b(and)h(Szemer)n(\023) +-39 b(edi)23 b([10)o(])28 b(sho)n(w)n(ed)e(that)h(it)h(is)f(p)r +(ossible)f(to)h(construct)681 4764 y(space)37 b(e\016cien)n(t)h(p)r +(erfect)h(hash)e(functions)i(that)f(can)g(b)r(e)g(ev)-5 +b(aluated)38 b(in)g(constan)n(t)f(time)681 4863 y(with)k(table)g(sizes) +f(that)h(are)f(linear)g(in)h(the)g(n)n(um)n(b)r(er)f(of)h(k)n(eys:)f +Fm(m)k Fv(=)h Fm(O)r Fv(\()p Fm(n)p Fv(\).)d(In)f(their)681 +4963 y(mo)r(del)25 b(of)h(computation,)f(an)g(elemen)n(t)h(of)f(the)h +(univ)n(erse)e Fm(U)34 b Fv(\014ts)26 b(in)n(to)f(one)g(mac)n(hine)g(w) +n(ord,)681 5063 y(and)39 b(arithmetic)h(op)r(erations)e(and)h(memory)g +(accesses)f(ha)n(v)n(e)h(unit)h(cost.)f(Randomized)p +eop end +%%Page: 3 3 +TeXDict begin 3 2 bop 365 387 a Fv(algorithms)26 b(in)h(the)h(FKS)f(mo) +r(del)g(can)g(construct)f(a)h(p)r(erfect)g(hash)g(function)h(in)f(exp)r +(ected)365 487 y(time)f Fm(O)r Fv(\()p Fm(n)p Fv(\):)i(this)g(is)g(the) +g(case)e(of)i(our)f(algorithm)f(and)i(the)g(w)n(orks)e(in)f([4)o(,)j +(14)o(].)490 590 y(Man)n(y)23 b(metho)r(ds)h(for)g(generating)e +(minimal)i(p)r(erfect)h(hash)e(functions)h(use)g(a)g +Fl(mapping)p Fv(,)365 690 y Fl(or)l(dering)j Fv(and)e +Fl(se)l(ar)l(ching)h Fv(\(MOS\))g(approac)n(h,)e(a)g(description)h +(coined)g(b)n(y)g(F)-7 b(o)n(x,)25 b(Chen)g(and)365 789 +y(Heath)g([9].)38 b(In)f(the)h(MOS)f(approac)n(h,)f(the)i(construction) +f(of)g(a)g(minimal)h(p)r(erfect)g(hash)365 889 y(function)29 +b(is)g(accomplished)e(in)i(three)f(steps.)h(First,)f(the)h(mapping)f +(step)h(transforms)e(the)365 989 y(k)n(ey)i(set)h(from)g(the)g +(original)e(univ)n(erse)h(to)g(a)h(new)f(univ)n(erse.)g(Second,)h(the)g +(ordering)e(step)365 1088 y(places)33 b(the)h(k)n(eys)f(in)h(a)f +(sequen)n(tial)g(order)f(that)i(determines)g(the)g(order)e(in)i(whic)n +(h)g(hash)365 1188 y(v)-5 b(alues)32 b(are)f(assigned)h(to)g(k)n(eys.)f +(Third,)h(the)h(searc)n(hing)d(step)j(attempts)f(to)h(assign)e(hash)365 +1287 y(v)-5 b(alues)37 b(to)g(the)g(k)n(eys.)f(Our)g(algorithm)g(and)h +(the)g(algorithm)f(presen)n(ted)g(in)25 b([4])37 b(use)g(the)365 +1387 y(MOS)28 b(approac)n(h.)490 1490 y(P)n(agh)23 b([14)o(])i(prop)r +(osed)e(a)h(family)g(of)h(randomized)e(algorithms)g(for)h(constructing) +f(mini-)365 1590 y(mal)i(p)r(erfect)g(hash)g(functions.)g(The)g(form)g +(of)g(the)g(resulting)g(function)g(is)g Fm(h)p Fv(\()p +Fm(x)p Fv(\))f(=)f(\()p Fm(f)9 b Fv(\()p Fm(x)p Fv(\))k(+)365 +1689 y Fm(d)408 1704 y Fj(g)r Fu(\()p Fj(x)p Fu(\))537 +1689 y Fv(\))23 b(mo)r(d)g Fm(n)p Fv(,)31 b(where)f Fm(f)39 +b Fv(and)30 b Fm(g)j Fv(are)c(univ)n(ersal)h(hash)g(functions)g(and)h +Fm(d)f Fv(is)h(a)f(set)g(of)h(dis-)365 1789 y(placemen)n(t)i(v)-5 +b(alues)32 b(to)h(resolv)n(e)d(collisions)i(that)h(are)f(caused)g(b)n +(y)g(the)h(function)g Fm(f)9 b Fv(.)33 b(P)n(agh)365 +1889 y(iden)n(ti\014ed)e(a)f(set)g(of)g(conditions)g(concerning)f +Fm(f)39 b Fv(and)30 b Fm(g)j Fv(and)d(sho)n(w)n(ed)f(that)h(if)h(these) +f(con-)365 1988 y(ditions)h(are)e(satis\014ed,)h(then)h(a)f(minimal)h +(p)r(erfect)g(hash)f(function)h(can)f(b)r(e)g(computed)h(in)365 +2088 y(exp)r(ected)f(time)f Fm(O)r Fv(\()p Fm(n)p Fv(\))h(and)f(stored) +f(in)i(\(2)19 b(+)g Fm(\017)p Fv(\))p Fm(n)29 b Fv(computer)f(w)n +(ords.)g(Dietzfelbinger)h(and)365 2187 y(Hagerup)24 b([6])e(impro)n(v)n +(ed)i([14)o(],)f(reducing)e(from)i(\(2)8 b(+)g Fm(\017)p +Fv(\))p Fm(n)22 b Fv(to)g(\(1)8 b(+)g Fm(\017)p Fv(\))p +Fm(n)22 b Fv(the)h(n)n(um)n(b)r(er)f(of)h(com-)365 2287 +y(puter)29 b(w)n(ords)e(required)h(to)h(store)e(the)j(function,)f(but)g +(in)g(their)g(approac)n(h)23 b Fm(f)37 b Fv(and)25 b +Fm(g)31 b Fv(m)n(ust)365 2387 y(b)r(e)25 b(c)n(hosen)f(from)g(a)h +(class)e(of)i(hash)f(functions)h(that)g(meet)g(additional)f(requiremen) +n(ts.)g(Dif-)365 2486 y(feren)n(tly)k(of)g(the)g(w)n(orks)f(in)e([14)o +(,)j(6],)g(our)f(algorithm)g(uses)g(t)n(w)n(o)h(univ)n(ersal)e(hash)i +(functions)365 2586 y Fm(h)413 2598 y Fu(1)474 2586 y +Fv(and)23 b Fm(h)679 2598 y Fu(2)740 2586 y Fv(randomly)f(selected)h +(from)g(a)g(class)g(of)g(univ)n(ersal)f(hash)h(functions)h(that)f(do)g +(not)365 2686 y(need)28 b(to)f(meet)h(an)n(y)f(additional)g(requiremen) +n(ts.)490 2789 y(The)40 b(w)n(ork)f(in)25 b([4])40 b(presen)n(ts)f(an)h +(e\016cien)n(t)h(and)f(practical)f(algorithm)g(for)h(generat-)365 +2888 y(ing)27 b(order)f(preserving)g(minimal)h(p)r(erfect)h(hash)e +(functions.)i(Their)f(metho)r(d)g(in)n(v)n(olv)n(es)f(the)365 +2988 y(generation)34 b(of)h(acyclic)f(random)g(graphs)g +Fm(G)h Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))36 b(with)25 +b Fk(j)p Fm(V)19 b Fk(j)36 b Fv(=)f Fm(cn)g Fv(and)g +Fk(j)p Fm(E)5 b Fk(j)35 b Fv(=)g Fm(n)p Fv(,)365 3088 +y(with)41 b Fm(c)j Fk(\025)g Fv(2)p Fm(:)p Fv(09.)39 +b(They)h(sho)n(w)n(ed)f(that)h(an)g(order)f(preserving)g(minimal)h(p)r +(erfect)h(hash)365 3187 y(function)c(can)f(b)r(e)h(found)g(in)f +(optimal)g(time)h(if)25 b Fm(G)37 b Fv(is)f(acyclic.)g(T)-7 +b(o)36 b(generate)f(an)h(acyclic)365 3287 y(graph,)e(t)n(w)n(o)g(v)n +(ertices)f Fm(h)1150 3299 y Fu(1)1188 3287 y Fv(\()p +Fm(x)p Fv(\))i(and)g Fm(h)1551 3299 y Fu(2)1588 3287 +y Fv(\()p Fm(x)p Fv(\))h(are)d(computed)i(for)f(eac)n(h)g(k)n(ey)g +Fm(x)i Fk(2)f Fm(S)5 b Fv(.)34 b(Th)n(us,)365 3386 y(eac)n(h)d(set)25 +b Fm(S)36 b Fv(has)31 b(a)g(corresp)r(onding)f(graph)23 +b Fm(G)30 b Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\),)32 +b(where)f Fm(V)48 b Fv(=)29 b Fk(f)p Fv(0)p Fm(;)14 b +Fv(1)p Fm(;)g(:)g(:)g(:)e(;)i(t)p Fk(g)31 b Fv(and)365 +3486 y Fm(E)d Fv(=)542 3419 y Fi(\010)590 3486 y Fk(f)p +Fm(h)680 3498 y Fu(1)717 3486 y Fv(\()p Fm(x)p Fv(\))p +Fm(;)14 b(h)913 3498 y Fu(2)951 3486 y Fv(\()p Fm(x)p +Fv(\))p Fk(g)24 b Fv(:)f Fm(x)g Fk(2)h Fm(S)1379 3419 +y Fi(\011)1427 3486 y Fv(.)c(In)g(order)e(to)i(guaran)n(tee)e(the)j +(acyclicit)n(y)e(of)24 b Fm(G)p Fv(,)d(the)f(algo-)365 +3586 y(rithm)h(rep)r(eatedly)g(selects)f Fm(h)1289 3598 +y Fu(1)1348 3586 y Fv(and)g Fm(h)1550 3598 y Fu(2)1608 +3586 y Fv(from)h(a)g(family)g(of)f(univ)n(ersal)g(hash)h(functions)g +(un)n(til)365 3685 y(the)30 b(corresp)r(onding)d(graph)g(is)i(acyclic.) +f(Ha)n(v)-5 b(as)28 b(et)i(al.)24 b([11)o(])29 b(pro)n(v)n(ed)f(that)h +(if)g Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)27 +b Fv(=)d Fm(cn)365 3785 y Fv(and)37 b Fm(c)h(>)f Fv(2,)g(then)g(the)g +(probabilit)n(y)e(that)25 b Fm(G)37 b Fv(is)g(acyclic)f(is)g +Fm(p)i Fv(=)g Fm(e)2562 3755 y Fu(1)p Fj(=c)2662 3714 +y Fi(p)p 2745 3714 321 4 v 71 x Fv(\()p Fm(c)19 b Fk(\000)f +Fv(2\))p Fm(=c)o Fv(.)37 b(F)-7 b(or)365 3885 y Fm(c)23 +b Fv(=)g(2)p Fm(:)p Fv(09,)i(this)h(probabilit)n(y)f(is)h +Fm(p)d Fk(')g Fv(0)p Fm(:)p Fv(342,)h(and)i(the)h(exp)r(ected)f(n)n(um) +n(b)r(er)g(of)g(iterations)f(to)365 3984 y(obtain)j(an)f(acyclic)g +(graph)f(is)f(1)p Fm(=p)d Fk(')g Fv(2)p Fm(:)p Fv(92.)365 +4187 y Fn(3)112 b(The)38 b(Algorithm)365 4362 y Fv(Let)33 +b(us)f(sho)n(w)f(ho)n(w)h(the)h(minimal)f(p)r(erfect)h(hash)f(function) +25 b Fm(h)33 b Fv(will)f(b)r(e)h(constructed.)f(W)-7 +b(e)365 4462 y(mak)n(e)35 b(use)h(of)g(t)n(w)n(o)f(auxiliary)f(random)h +(functions)25 b Fm(h)2080 4474 y Fu(1)2153 4462 y Fv(and)g +Fm(h)2360 4474 y Fu(2)2434 4462 y Fv(:)37 b Fm(U)45 b +Fk(!)37 b Fm(V)19 b Fv(,)36 b(where)24 b Fm(V)56 b Fv(=)365 +4561 y([0)p Fm(;)14 b(t)23 b Fk(\000)h Fv(1])35 b(for)g(some)f +(suitably)i(c)n(hosen)e(in)n(teger)24 b Fm(t)36 b Fv(=)g +Fm(cn)p Fv(,)f(where)g Fm(n)h Fv(=)g Fk(j)p Fm(S)5 b +Fk(j)p Fv(.)35 b(W)-7 b(e)36 b(build)g(a)365 4661 y(random)28 +b(graph)c Fm(G)i Fv(=)e Fm(G)p Fv(\()p Fm(h)1229 4673 +y Fu(1)1267 4661 y Fm(;)14 b(h)1352 4673 y Fu(2)1389 +4661 y Fv(\))29 b(on)c Fm(V)19 b Fv(,)29 b(whose)f(edge)h(set)g(is)2330 +4594 y Fi(\010)2379 4661 y Fk(f)p Fm(h)2469 4673 y Fu(1)2505 +4661 y Fv(\()p Fm(x)p Fv(\))p Fm(;)14 b(h)2701 4673 y +Fu(2)2739 4661 y Fv(\()p Fm(x)p Fv(\))p Fk(g)26 b Fv(:)g +Fm(x)f Fk(2)h Fm(S)3176 4594 y Fi(\011)3224 4661 y Fv(.)365 +4760 y(There)h(is)h(an)f(edge)g(in)e Fm(G)j Fv(for)f(eac)n(h)g(k)n(ey)g +(in)h(the)g(set)g(of)f(k)n(eys)d Fm(S)5 b Fv(.)490 4863 +y(In)26 b(what)h(follo)n(ws,)e(w)n(e)i(shall)f(b)r(e)g(in)n(terested)h +(in)f(the)h Fl(2-c)l(or)l(e)33 b Fv(of)27 b(the)g(random)e(graph)f +Fm(G)p Fv(,)365 4963 y(that)36 b(is,)g(the)g(maximal)g(subgraph)e(of)25 +b Fm(G)36 b Fv(with)h(minimal)f(degree)e(at)i(least)24 +b(2)36 b(\(see,)g(e.g.,)365 5063 y([1,)e(12)o(]\).)h(Because)d(of)i +(its)h(imp)r(ortance)e(in)h(our)g(con)n(text,)f(w)n(e)h(call)f(the)i +(2-core)d(the)i Fl(crit-)365 5162 y(ic)l(al)44 b Fv(subgraph)33 +b(of)24 b Fm(G)35 b Fv(and)e(denote)h(it)h(b)n(y)24 b +Fm(G)1797 5174 y Fu(crit)1902 5162 y Fv(.)34 b(The)g(v)n(ertices)f(and) +g(edges)h(in)25 b Fm(G)2998 5174 y Fu(crit)3136 5162 +y Fv(are)p eop end +%%Page: 4 4 +TeXDict begin 4 3 bop 681 387 a Fv(said)32 b(to)h(b)r(e)g +Fl(critic)l(al)p Fv(.)h(W)-7 b(e)33 b(let)25 b Fm(V)1700 +399 y Fu(crit)1837 387 y Fv(=)31 b Fm(V)19 b Fv(\()p +Fm(G)2097 399 y Fu(crit)2202 387 y Fv(\))33 b(and)24 +b Fm(E)2486 399 y Fu(crit)2623 387 y Fv(=)31 b Fm(E)5 +b Fv(\()p Fm(G)2882 399 y Fu(crit)2987 387 y Fv(\).)33 +b(Moreo)n(v)n(er,)d(w)n(e)681 487 y(let)25 b Fm(V)846 +499 y Fu(ncrit)1010 487 y Fv(=)e Fm(V)36 b Fk(\000)16 +b Fm(V)1311 499 y Fu(crit)1443 487 y Fv(b)r(e)27 b(the)g(set)g(of)g +Fl(non-critic)l(al)h Fv(v)n(ertices)e(in)f Fm(G)p Fv(.)i(W)-7 +b(e)27 b(also)f(let)f Fm(V)3344 499 y Fu(scrit)3498 487 +y Fk(\022)681 587 y Fm(V)729 599 y Fu(crit)865 587 y +Fv(b)r(e)31 b(the)g(set)g(of)g(all)g(critical)f(v)n(ertices)g(that)h +(ha)n(v)n(e)f(at)h(least)f(one)h(non-critical)f(v)n(ertex)681 +686 y(as)e(a)h(neigh)n(b)r(our.)f(Let)h Fm(E)1478 698 +y Fu(ncrit)1644 686 y Fv(=)c Fm(E)5 b Fv(\()p Fm(G)p +Fv(\))20 b Fk(\000)f Fm(E)2094 698 y Fu(crit)2228 686 +y Fv(b)r(e)29 b(the)g(set)g(of)g Fl(non-critic)l(al)h +Fv(edges)e(in)d Fm(G)p Fv(.)681 786 y(Finally)-7 b(,)27 +b(w)n(e)g(let)e Fm(G)1283 798 y Fu(ncrit)1447 786 y Fv(=)e(\()p +Fm(V)1615 798 y Fu(ncrit)1774 786 y Fk([)18 b Fm(V)1895 +798 y Fu(scrit)2026 786 y Fm(;)c(E)2124 798 y Fu(ncrit)2266 +786 y Fv(\))27 b(b)r(e)h(the)f Fl(non-critic)l(al)h Fv(subgraph)f(of)d +Fm(G)p Fv(.)681 886 y(The)d(non-critical)f(subgraph)g +Fm(G)1696 898 y Fu(ncrit)1859 886 y Fv(corresp)r(onds)g(to)h(the)g +(\\acyclic)f(part")h(of)k Fm(G)p Fv(.)c(W)-7 b(e)22 b(ha)n(v)n(e)681 +985 y Fm(G)h Fv(=)g Fm(G)922 997 y Fu(crit)1045 985 y +Fk([)c Fm(G)1184 997 y Fu(ncrit)1325 985 y Fv(.)805 1085 +y(W)-7 b(e)35 b(then)g(construct)e(a)h(suitable)g(lab)r(elling)g +Fm(g)i Fv(:)f Fm(V)52 b Fk(!)34 b Fh(Z)h Fv(of)f(the)h(v)n(ertices)e +(of)25 b Fm(G)p Fv(:)34 b(w)n(e)681 1185 y(c)n(ho)r(ose)23 +b Fm(g)s Fv(\()p Fm(v)s Fv(\))34 b(for)f(eac)n(h)24 b +Fm(v)35 b Fk(2)e Fm(V)19 b Fv(\()p Fm(G)p Fv(\))34 b(in)f(suc)n(h)g(a)g +(w)n(a)n(y)f(that)25 b Fm(h)p Fv(\()p Fm(x)p Fv(\))33 +b(=)f Fm(g)s Fv(\()p Fm(h)2968 1197 y Fu(1)3005 1185 +y Fv(\()p Fm(x)p Fv(\)\))24 b(+)d Fm(g)s Fv(\()p Fm(h)3381 +1197 y Fu(2)3418 1185 y Fv(\()p Fm(x)p Fv(\)\))681 1285 +y(\()p Fm(x)26 b Fk(2)g Fm(S)5 b Fv(\))29 b(is)g(a)f(minimal)i(p)r +(erfect)f(hash)g(function)g(for)c Fm(S)5 b Fv(.)29 b(W)-7 +b(e)29 b(will)g(see)g(later)f(on)h(that)g(this)681 1384 +y(lab)r(elling)24 b Fm(g)29 b Fv(can)c(b)r(e)i(found)f(in)g(linear)f +(time)i(if)f(the)g(n)n(um)n(b)r(er)g(of)g(edges)f(in)h +Fm(G)3075 1396 y Fu(crit)3205 1384 y Fv(is)g(at)g(most)691 +1451 y Fu(1)p 691 1465 34 4 v 691 1512 a(2)734 1484 y +Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)805 +1584 y(Figure)25 b(2)36 b(presen)n(ts)h(a)g(pseudo)f(co)r(de)h(for)g +(the)h(algorithm.)e(The)h(pro)r(cedure)f(Gener-)681 1684 +y(ateMPHF)23 b(\()p Fm(S)5 b Fv(,)23 b Fm(g)s Fv(\))g(receiv)n(es)f(as) +h(input)h(the)g(set)f(of)g(k)n(eys)h Fm(S)k Fv(and)23 +b(pro)r(duces)g(the)g(lab)r(elling)i Fm(g)s Fv(.)681 +1783 y(The)f(metho)r(d)g(uses)f(a)g(mapping,)h(ordering)e(and)h(searc)n +(hing)f(approac)n(h.)g(W)-7 b(e)24 b(no)n(w)f(describ)r(e)681 +1883 y(eac)n(h)k(step.)p 677 2066 5 52 v 677 2019 52 +5 v 728 2019 2788 5 v 3516 2019 52 5 v 3564 2066 5 52 +v 677 2145 5 75 v 3563 2145 V 725 2122 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m +(r)m(e)39 b Fs(GenerateMPHF)45 b(\()5 b Fo(S)13 b Fs(,)49 +b Fo(g)8 b Fs(\))p 677 2223 V 3563 2223 V 844 2201 a(M)n(a)n(p)n(p)n(i) +n(n)n(g)40 b(\()5 b Fo(S)13 b Fs(,)49 b Fo(G)9 b Fs(\))g(;)p +677 2302 V 3563 2302 V 849 2279 a(O)r(r)r(d)r(e)r(r)r(i)r(n)r(g)45 +b(\()5 b Fo(G)k Fs(,)49 b Fo(G)1441 2287 y Ft(crit)1547 +2279 y Fs(,)g Fo(G)1677 2287 y Ft(ncrit)1817 2279 y Fs(\))9 +b(;)p 677 2380 V 3563 2380 V 850 2358 a(S)s(e)s(a)s(r)s(c)s(h)s(i)s(n)s +(g)49 b(\()5 b Fo(G)k Fs(,)49 b Fo(G)1481 2366 y Ft(crit)1587 +2358 y Fs(,)g Fo(G)1717 2366 y Ft(ncrit)1857 2358 y Fs(,)g +Fo(g)12 b Fs(\))d(;)p 677 2431 5 52 v 678 2431 52 5 v +728 2431 2788 5 v 3516 2431 52 5 v 3564 2431 5 52 v 697 +2598 a Fp(Fig.)k(2.)26 b Fs(Main)g(steps)g(of)g(the)g(algorithm)h(for)f +(constructing)g(a)g(minimal)h(p)r(erfect)f(hash)g(function)681 +2789 y Fg(3.1)94 b(Mapping)32 b(Step)681 2958 y Fv(The)24 +b(pro)r(cedure)f(Mapping)h(\()p Fm(S)5 b Fv(,)24 b Fm(G)p +Fv(\))h(receiv)n(es)e(as)g(input)i(the)g(set)f(of)g(k)n(eys)g +Fm(S)29 b Fv(and)24 b(generates)681 3058 y(the)41 b(random)e(graph)h +Fm(G)45 b Fv(=)f Fm(G)p Fv(\()p Fm(h)1767 3070 y Fu(1)1805 +3058 y Fm(;)14 b(h)1890 3070 y Fu(2)1927 3058 y Fv(\),)41 +b(b)n(y)f(generating)f(t)n(w)n(o)h(auxiliary)f(functions)26 +b Fm(h)3503 3070 y Fu(1)3540 3058 y Fv(,)681 3158 y Fm(h)729 +3170 y Fu(2)789 3158 y Fv(:)d Fm(U)32 b Fk(!)23 b Fv([0)p +Fm(;)14 b(t)k Fk(\000)g Fv(1].)805 3258 y(The)30 b(functions)25 +b Fm(h)1381 3270 y Fu(1)1448 3258 y Fv(and)g Fm(h)1655 +3270 y Fu(2)1722 3258 y Fv(are)k(constructed)g(as)g(follo)n(ws.)g(W)-7 +b(e)31 b(imp)r(ose)e(some)h(upp)r(er)681 3357 y(b)r(ound)25 +b Fm(L)34 b Fv(on)h(the)g(lengths)g(of)g(the)g(k)n(eys)f(in)25 +b Fm(S)5 b Fv(.)35 b(T)-7 b(o)34 b(de\014ne)25 b Fm(h)2656 +3369 y Fj(j)2726 3357 y Fv(\()p Fm(j)40 b Fv(=)35 b(1,2\),)g(w)n(e)f +(generate)681 3457 y(an)24 b Fm(L)g Fk(\002)f Fm(\006)40 +b Fv(table)35 b(of)h(random)e(in)n(tegers)24 b(table)2182 +3469 y Fj(j)2217 3457 y Fv(.)35 b(F)-7 b(or)35 b(a)g(k)n(ey)24 +b Fm(x)37 b Fk(2)f Fm(S)k Fv(of)c(length)25 b Fk(j)p +Fm(x)p Fk(j)36 b(\024)g Fm(L)681 3557 y Fv(and)24 b Fm(j)k +Fk(2)c(f)p Fv(1)p Fm(;)14 b Fv(2)p Fk(g)p Fv(,)26 b(w)n(e)h(let)1492 +3823 y Fm(h)1540 3835 y Fj(j)1575 3823 y Fv(\()p Fm(x)p +Fv(\))d(=)1798 3731 y Fi(\020)1882 3712 y Ff(j)p Fj(x)p +Ff(j)1861 3744 y Fi(X)1867 3921 y Fj(i)p Fu(=1)1995 3823 +y Fv(table)2175 3835 y Fj(j)2210 3823 y Fv([)p Fm(i;)14 +b(x)p Fv([)p Fm(i)p Fv(]])2444 3731 y Fi(\021)2516 3823 +y Fv(mo)r(d)23 b Fm(t:)681 4074 y Fv(The)37 b(random)f(graph)24 +b Fm(G)39 b Fv(=)f Fm(G)p Fv(\()p Fm(h)1760 4086 y Fu(1)1798 +4074 y Fm(;)14 b(h)1883 4086 y Fu(2)1920 4074 y Fv(\))37 +b(has)g(v)n(ertex)f(set)25 b Fm(V)58 b Fv(=)38 b([0)p +Fm(;)14 b(t)24 b Fk(\000)h Fv(1])36 b(and)h(edge)g(set)681 +4107 y Fi(\010)729 4174 y Fk(f)p Fm(h)819 4186 y Fu(1)856 +4174 y Fv(\()p Fm(x)p Fv(\))p Fm(;)14 b(h)1052 4186 y +Fu(2)1090 4174 y Fv(\()p Fm(x)p Fv(\))p Fk(g)31 b Fv(:)f +Fm(x)h Fk(2)f Fm(S)1546 4107 y Fi(\011)1594 4174 y Fv(.)i(W)-7 +b(e)33 b(need)25 b Fm(G)32 b Fv(to)g(b)r(e)g(simple,)g(i.e.,)g +Fm(G)25 b Fv(should)32 b(ha)n(v)n(e)f(neither)681 4274 +y(lo)r(ops)24 b(nor)g(m)n(ultiple)h(edges.)f(A)h(lo)r(op)f(o)r(ccurs)g +(when)h Fm(h)2384 4286 y Fu(1)2421 4274 y Fv(\()p Fm(x)p +Fv(\))f(=)f Fm(h)2692 4286 y Fu(2)2729 4274 y Fv(\()p +Fm(x)p Fv(\))j(for)e(some)g Fm(x)f Fk(2)h Fm(S)5 b Fv(.)24 +b(W)-7 b(e)681 4373 y(solv)n(e)23 b(this)j(in)f(an)f(ad)h(ho)r(c)f +(manner:)h(w)n(e)f(simply)h(let)g Fm(h)2379 4385 y Fu(2)2416 +4373 y Fv(\()p Fm(x)p Fv(\))f(=)f(\(2)p Fm(h)2761 4385 +y Fu(1)2798 4373 y Fv(\()p Fm(x)p Fv(\))13 b(+)g(1\))23 +b(mo)r(d)g Fm(t)i Fv(in)g(this)681 4473 y(case.)g(If)i(w)n(e)f(still)h +(\014nd)g(a)e(lo)r(op)h(after)g(this,)h(w)n(e)f(generate)f(another)h +(pair)f(\()p Fm(h)3039 4485 y Fu(1)3077 4473 y Fm(;)14 +b(h)3162 4485 y Fu(2)3198 4473 y Fv(\).)27 b(When)g(a)681 +4572 y(m)n(ultiple)h(edge)f(o)r(ccurs)g(w)n(e)g(ab)r(ort)g(and)g +(generate)g(a)g(new)g(pair)e(\()p Fm(h)2780 4584 y Fu(1)2817 +4572 y Fm(;)14 b(h)2902 4584 y Fu(2)2939 4572 y Fv(\).)681 +4741 y Fg(Analysis)33 b(of)g(the)h(Mapping)f(Step.)77 +b Fv(W)-7 b(e)29 b(start)g(b)n(y)g(discussing)f(some)h(facts)g(on)g +(ran-)681 4841 y(dom)k(graphs.)e(Let)25 b Fm(G)32 b Fv(=)g(\()p +Fm(V)5 b(;)14 b(E)5 b Fv(\))34 b(with)f Fk(j)p Fm(V)19 +b Fk(j)32 b Fv(=)g Fm(t)h Fv(and)f Fk(j)p Fm(E)5 b Fk(j)32 +b Fv(=)g Fm(n)h Fv(b)r(e)g(a)g(random)f(graph)f(in)681 +4963 y(the)e(uniform)f(mo)r(del)d Fk(G)5 b Fv(\()p Fm(t;)14 +b(n)p Fv(\),)29 b(the)g(mo)r(del)g(in)f(whic)n(h)h(all)f(the)2652 +4896 y Fi(\000)2690 4932 y Fv(\()2725 4899 y Fe(t)2722 +4946 y Fd(2)2751 4932 y Fv(\))2716 4992 y Fj(n)2783 4896 +y Fi(\001)2850 4963 y Fv(graphs)f(on)d Fm(V)47 b Fv(with)26 +b Fm(n)681 5063 y Fv(edges)k(are)g(equiprobable.)g(The)i(study)f(of)25 +b Fk(G)5 b Fv(\()p Fm(t;)14 b(n)p Fv(\))31 b(go)r(es)g(bac)n(k)f(to)h +(the)g(classical)f(w)n(ork)g(of)p eop end +%%Page: 5 5 +TeXDict begin 5 4 bop 365 387 a Fv(Erd\177)-42 b(os)31 +b(and)h(R)n(\023)-39 b(en)n(yi)23 b([7,)32 b(8,)g(13)o(])g(\(for)g(a)f +(mo)r(dern)h(treatmen)n(t,)g(see)24 b([1,)32 b(12)o(]\).)h(Let)f +Fm(d)e Fv(=)g(2)p Fm(n=t)365 487 y Fv(b)r(e)38 b(the)g(a)n(v)n(erage)c +(degree)i(of)h Fm(G)p Fv(.)h(It)g(is)f(w)n(ell)g(kno)n(wn)f(that,)i(if) +25 b Fm(d)39 b(>)g Fv(1,)e(or,)f(equiv)-5 b(alen)n(tly)e(,)365 +587 y(if)26 b Fm(c)h(<)g Fv(2)j(\(recall)g(that)h(w)n(e)f(ha)n(v)n(e)f +Fm(t)f Fv(=)f Fm(cn)p Fv(\),)j(then,)h(almost)f(ev)n(ery)24 +b Fm(G)30 b Fv(con)n(tains)2843 557 y Fu(3)2910 587 y +Fv(a)g(\\gian)n(t")365 686 y(comp)r(onen)n(t)24 b(of)f(order)h(\(1)10 +b(+)g Fm(o)p Fv(\(1\)\))p Fm(bt)p Fv(,)23 b(where)i Fm(b)d +Fv(=)h(1)10 b Fk(\000)g Fm(T)f(=d)p Fv(,)23 b(and)i(0)d +Fm(<)h(T)34 b(<)23 b Fv(1)g(is)g(the)h(unique)365 786 +y(solution)g(to)h(the)g(equation)f Fm(T)12 b(e)1351 756 +y Ff(\000)p Fj(T)1477 786 y Fv(=)23 b Fm(de)1647 756 +y Ff(\000)p Fj(d)1737 786 y Fv(.)i(Moreo)n(v)n(er,)d(all)i(the)h(other) +f(comp)r(onen)n(ts)g(of)h Fm(G)365 886 y Fv(ha)n(v)n(e)f +Fm(O)r Fv(\(log)15 b Fm(t)p Fv(\))26 b(v)n(ertices.)g(Also,)g(the)g(n)n +(um)n(b)r(er)g(of)g(v)n(ertices)f(in)i(the)f(2-core)f(of)g +Fm(G)h Fv(\(the)h(max-)365 985 y(imal)32 b(subgraph)f(of)h +Fm(G)g Fv(with)g(minimal)g(degree)f(at)h(least)24 b(2\))32 +b(that)g(do)g(not)g(b)r(elong)f(to)h(the)365 1085 y(gian)n(t)27 +b(comp)r(onen)n(t)g(is)e Fm(o)p Fv(\()p Fm(t)p Fv(\))k(almost)e(surely) +-7 b(.)490 1185 y(Pittel)32 b(and)g(W)-7 b(ormald)24 +b([15)o(])32 b(presen)n(t)g(detailed)g(results)f(for)h(the)g(2-core)f +(of)h(the)g(gian)n(t)365 1284 y(comp)r(onen)n(t)g(of)f(the)h(random)f +(graph)23 b Fm(G)p Fv(.)32 b(Since)25 b(table)2094 1296 +y Fj(j)2161 1284 y Fv(\()p Fm(j)35 b Fk(2)30 b(f)p Fv(1)p +Fm(;)14 b Fv(2)p Fk(g)p Fv(\))29 b(are)i(random,)g Fm(G)f +Fv(=)365 1384 y Fm(G)p Fv(\()p Fm(h)510 1396 y Fu(1)548 +1384 y Fm(;)14 b(h)633 1396 y Fu(2)670 1384 y Fv(\))25 +b(is)h(a)g(random)g(graph.)f(Exp)r(erimen)n(ts)h(sho)n(w)g(that)g(this) +h(random)e(graph,)h(condi-)365 1484 y(tioned)j(on)f(b)r(eing)g(simple,) +h(strongly)d(resem)n(bles)i(the)g(random)g(graph)f(from)h(the)g +(uniform)365 1583 y(mo)r(del)d Fk(G)5 b Fv(\()p Fm(t;)14 +b(n)p Fv(\).)22 b(In)f(what)g(follo)n(ws,)g(w)n(e)f(w)n(ork)g(under)h +(the)h(h)n(yp)r(othesis)e(that)25 b Fm(G)f Fv(=)e Fm(G)p +Fv(\()p Fm(h)3055 1595 y Fu(1)3093 1583 y Fm(;)14 b(h)3178 +1595 y Fu(2)3215 1583 y Fv(\))365 1683 y(is)28 b(dra)n(wn)e(from)f +Fk(G)5 b Fv(\()p Fm(t;)14 b(n)p Fv(\).)28 b(Th)n(us,)g(follo)n(wing)23 +b([15)o(],)28 b(the)g(n)n(um)n(b)r(er)g(of)f(v)n(ertices)g(of)d +Fm(G)2938 1695 y Fu(crit)3071 1683 y Fv(is)1210 1856 +y Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1397 1868 y Fu(crit)1502 +1856 y Fv(\))p Fk(j)24 b Fv(=)e(\(1)d(+)f Fm(o)p Fv(\(1\)\)\(1)h +Fk(\000)f Fm(T)12 b Fv(\))p Fm(bt)784 b Fv(\(1\))365 +2030 y(almost)27 b(surely)-7 b(.)27 b(Moreo)n(v)n(er,)e(the)j(n)n(um)n +(b)r(er)f(of)h(edges)f(in)h(this)g(2-core)d(is)845 2223 +y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1031 2235 y Fu(crit)1136 +2223 y Fv(\))p Fk(j)24 b Fv(=)e(\(1)c(+)g Fm(o)p Fv(\(1\)\))1655 +2131 y Fi(\020)1706 2223 y Fv(\(1)g Fk(\000)g Fm(T)12 +b Fv(\))p Fm(b)17 b Fv(+)h Fm(b)p Fv(\()p Fm(d)h Fv(+)f +Fm(T)29 b Fk(\000)18 b Fv(2\))p Fm(=)p Fv(2)2642 2131 +y Fi(\021)2691 2223 y Fm(t)420 b Fv(\(2\))365 2427 y(almost)32 +b(surely)-7 b(.)32 b(Let)25 b Fm(d)1091 2439 y Fu(crit)1226 +2427 y Fv(=)31 b(2)p Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1550 +2439 y Fu(crit)1655 2427 y Fv(\))p Fk(j)p Fm(=)p Fk(j)p +Fm(V)18 b Fv(\()p Fm(G)1938 2439 y Fu(crit)2043 2427 +y Fv(\))p Fk(j)33 b Fv(b)r(e)g(the)g(a)n(v)n(erage)c(degree)j(of)24 +b Fm(G)3119 2439 y Fu(crit)3224 2427 y Fv(.)365 2526 +y(W)-7 b(e)28 b(are)f(in)n(terested)g(in)h(the)g(case)f(in)h(whic)n(h)c +Fm(d)1818 2538 y Fu(crit)1951 2526 y Fv(is)j(a)g(constan)n(t.)490 +2626 y(As)32 b(men)n(tioned)g(b)r(efore,)f(for)g(us)h(to)g(\014nd)g +(the)g(lab)r(elling)g Fm(g)h Fv(:)d Fm(V)49 b Fk(!)30 +b Fh(Z)i Fv(of)g(the)g(v)n(ertices)365 2726 y(of)25 b +Fm(G)h Fv(=)f Fm(G)p Fv(\()p Fm(h)783 2738 y Fu(1)821 +2726 y Fm(;)14 b(h)906 2738 y Fu(2)942 2726 y Fv(\))30 +b(in)f(linear)f(time,)i(w)n(e)f(require)f(that)d Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)2316 2738 y Fu(crit)2421 2726 y +Fv(\))p Fk(j)26 b(\024)2602 2693 y Fu(1)p 2602 2707 34 +4 v 2602 2755 a(2)2645 2726 y Fk(j)p Fm(E)5 b Fv(\()p +Fm(G)p Fv(\))p Fk(j)26 b Fv(=)3012 2693 y Fu(1)p 3012 +2707 V 3012 2755 a(2)3055 2726 y Fk(j)p Fm(S)5 b Fk(j)26 +b Fv(=)365 2826 y Fm(n=)p Fv(2.)h(The)i(crucial)e(step)h(no)n(w)f(is)h +(to)g(determine)g(the)h(v)-5 b(alue)28 b(of)d Fm(c)j +Fv(\(in)g Fm(t)c Fv(=)g Fm(cn)p Fv(\))k(to)g(obtain)g(a)365 +2925 y(random)f(graph)f Fm(G)e Fv(=)e Fm(G)1146 2937 +y Fu(crit)1269 2925 y Fk([)d Fm(G)1408 2937 y Fu(ncrit)1577 +2925 y Fv(with)28 b Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1952 +2937 y Fu(crit)2057 2925 y Fv(\))p Fk(j)24 b(\024)2233 +2893 y Fu(1)p 2233 2907 V 2233 2954 a(2)2276 2925 y Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)490 3025 +y(T)-7 b(able)24 b(1)g(giv)n(es)g(some)g(v)-5 b(alues)24 +b(for)g Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1742 3037 y Fu(crit)1847 +3025 y Fv(\))p Fk(j)25 b Fv(and)g Fk(j)p Fm(E)5 b Fv(\()p +Fm(G)2272 3037 y Fu(crit)2377 3025 y Fv(\))p Fk(j)25 +b Fv(using)f(Eqs)g(\(1\))g(and)h(\(2\).)365 3125 y(The)39 +b(theoretical)f(v)-5 b(alue)39 b(for)25 b Fm(c)39 b Fv(is)g(around)23 +b(1)p Fm(:)p Fv(152,)38 b(whic)n(h)h(is)f(remark)-5 b(ably)38 +b(close)g(to)h(the)365 3225 y(empirical)32 b(results)g(presen)n(ted)g +(in)h(T)-7 b(able)24 b(2.)33 b(In)f(this)h(table,)g(generated)e(from)h +(real)g(data,)365 3324 y(the)i(probabilit)n(y)e Fm(P)997 +3339 y Ff(j)p Fj(E)s Fu(\()p Fj(G)1147 3347 y Fd(crit)1238 +3339 y Fu(\))p Ff(j)1321 3324 y Fv(that)i Fk(j)p Fm(E)5 +b Fv(\()p Fm(G)1693 3336 y Fu(crit)1798 3324 y Fv(\))p +Fk(j)32 b(\024)1992 3292 y Fu(1)p 1992 3306 V 1992 3353 +a(2)2035 3324 y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p +Fk(j)35 b Fv(tends)e(to)25 b(0)33 b(when)g Fm(c)g(<)f +Fv(1)p Fm(:)p Fv(15)365 3424 y(and)d(it)f(tends)h(to)g(1)f(when)g +Fm(c)d Fk(\025)f Fv(1)p Fm(:)p Fv(15)j(and)h Fm(n)h Fv(increases.)e(W) +-7 b(e)28 b(found)h(this)g(matc)n(h)f(b)r(et)n(w)n(een)365 +3524 y(the)g(empirical)f(and)h(the)g(theoretical)e(results)h(most)h +(pleasan)n(t.)p 1066 3650 1481 4 v 1064 3741 4 92 v 1145 +3714 a Fo(d)p 1262 3741 V 150 w(T)p 1461 3741 V 165 w(b)p +1659 3741 V 94 w Fr(j)p Fo(V)17 b Fs(\()p Fo(G)1845 3722 +y Ft(crit)1942 3714 y Fs(\))p Fr(j)p 2003 3741 V 24 w(j)p +Fo(E)t Fs(\()p Fo(G)2189 3722 y Ft(crit)2286 3714 y Fs(\))p +Fr(j)p 2347 3741 V 94 w Fo(c)p 2545 3741 V 1066 3745 +1481 4 v 1064 3836 4 92 v 1078 3809 a Fs(1.734)p 1261 +3836 V 25 w(0.510)p 1459 3836 V 25 w(0.706)p 1657 3836 +V 75 w(0.399)p Fo(n)p 2003 3836 V 125 w Fs(0.498)p Fo(n)p +2347 3836 V 75 w Fs(1.153)p 2543 3836 V 1064 3927 V 1078 +3900 a(1.736)p 1261 3927 V 25 w(0.509)p 1459 3927 V 25 +w(0.707)p 1657 3927 V 75 w(0.400)p Fo(n)p 2003 3927 V +125 w Fs(0.500)p Fo(n)p 2347 3927 V 75 w Fs(1.152)p 2543 +3927 V 1064 4019 V 1078 3991 a(1.738)p 1261 4019 V 25 +w(0.508)p 1459 4019 V 25 w(0.708)p 1657 4019 V 75 w(0.401)p +Fo(n)p 2003 4019 V 125 w Fs(0.501)p Fo(n)p 2347 4019 +V 75 w Fs(1.151)p 2543 4019 V 1064 4110 V 1078 4082 a(1.739)p +1261 4110 V 25 w(0.508)p 1459 4110 V 25 w(0.708)p 1657 +4110 V 75 w(0.401)p Fo(n)p 2003 4110 V 125 w Fs(0.501)p +Fo(n)p 2347 4110 V 75 w Fs(1.150)p 2543 4110 V 1064 4201 +V 1078 4174 a(1.740)p 1261 4201 V 25 w(0.507)p 1459 4201 +V 25 w(0.709)p 1657 4201 V 75 w(0.401)p Fo(n)p 2003 4201 +V 125 w Fs(0.502)p Fo(n)p 2347 4201 V 75 w Fs(1.149)p +2543 4201 V 1066 4205 1481 4 v 1014 4348 a Fp(T)-7 b(able)28 +b(1.)e Fs(Determining)f(the)h Fo(c)g Fs(v)l(alue)f(theoretically)490 +4511 y Fv(W)-7 b(e)23 b(no)n(w)g(brie\015y)g(argue)e(that)j(the)f(exp)r +(ected)h(n)n(um)n(b)r(er)f(of)g(iterations)f(to)h(obtain)g(a)g(sim-)365 +4611 y(ple)i(graph)e Fm(G)h Fv(=)e Fm(G)p Fv(\()p Fm(h)1049 +4623 y Fu(1)1087 4611 y Fm(;)14 b(h)1172 4623 y Fu(2)1209 +4611 y Fv(\))24 b(is)g(constan)n(t)g(for)f Fm(t)h Fv(=)e +Fm(cn)i Fv(and)g Fm(c)f Fv(=)g(1)p Fm(:)p Fv(15.)g(Let)i +Fm(p)f Fv(b)r(e)g(the)h(proba-)365 4710 y(bilit)n(y)d(of)f(generating)e +(a)i(random)f(graph)k Fm(G)d Fv(without)h(lo)r(ops)e(and)h(without)g(m) +n(ultiple)h(edges.)365 4810 y(If)k Fm(p)c Fv(is)h(b)r(ounded)g(from)g +(b)r(elo)n(w)f(b)n(y)h(some)f(p)r(ositiv)n(e)h(constan)n(t,)f(then)i(w) +n(e)e(are)g(done,)h(b)r(ecause)365 4910 y(the)33 b(exp)r(ected)h(n)n +(um)n(b)r(er)e(of)h(iterations)f(to)g(obtain)h(suc)n(h)f(a)h(graph)f +(is)g(then)26 b(1)p Fm(=p)k Fv(=)h Fm(O)r Fv(\(1\).)p +365 4985 473 4 v 382 5039 a Ft(3)442 5071 y Fs(As)h(is)h(usual)g(in)g +(the)f(theory)g(of)h(random)g(graphs,)g(w)n(e)g(use)f(the)h(terms)f +(`almost)i(ev)n(ery')e(and)442 5162 y(`almost)27 b(surely')f(to)g(mean) +g(`with)g(probabilit)n(y)g(tending)f(to)g(1)h(as)g Fo(t)21 +b Fr(!)g(1)p Fs('.)p eop end +%%Page: 6 6 +TeXDict begin 6 5 bop 936 391 2371 4 v 934 508 4 118 +v 1000 508 a Fo(c)p 1094 508 V 2040 478 a Fs(URLs)25 +b(\()p Fo(n)p Fs(\))p 3306 508 V 1096 512 2212 4 v 934 +610 4 103 v 1094 610 V 1131 596 a(1)p Fo(;)q Fs(000)47 +b(10)p Fo(;)q Fs(000)h(100)p Fo(;)r Fs(000)f(1)p Fo(;)q +Fs(000)p Fo(;)r Fs(000)g(2)p Fo(;)q Fs(000)p Fo(;)r Fs(000)g(3)p +Fo(;)q Fs(000)p Fo(;)q Fs(000)h(4)p Fo(;)q Fs(000)p Fo(;)q +Fs(000)p 3306 610 V 936 614 2371 4 v 934 705 4 92 v 948 +678 a(1.13)p 1093 705 V 67 w(0.22)106 b(0.02)144 b(0.00)193 +b(0.00)223 b(0.00)g(0.00)g(0.00)p 3306 705 V 934 796 +V 948 769 a(1.14)p 1093 796 V 67 w(0.35)106 b(0.15)144 +b(0.00)193 b(0.00)223 b(0.00)g(0.00)g(0.00)p 3306 796 +V 934 888 V 948 860 a(1.15)p 1093 888 V 67 w(0.46)106 +b(0.55)144 b(0.65)193 b(0.87)223 b(0.95)g(0.97)g(1.00)p +3306 888 V 934 979 V 948 952 a(1.16)p 1093 979 V 67 w(0.67)106 +b(0.90)144 b(1.00)193 b(1.00)223 b(1.00)g(1.00)g(1.00)p +3306 979 V 934 1070 V 948 1043 a(1.17)p 1093 1070 V 67 +w(0.82)106 b(0.99)144 b(1.00)193 b(1.00)223 b(1.00)g(1.00)g(1.00)p +3306 1070 V 936 1074 2371 4 v 681 1227 a Fg(T)-8 b(able)42 +b(2.)36 b Fv(Probabilit)n(y)g Fm(P)1560 1242 y Ff(j)p +Fj(E)1629 1250 y Fd(crit)1720 1242 y Ff(j)1780 1227 y +Fv(that)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2155 1239 y Fu(crit)2260 +1227 y Fv(\))p Fk(j)39 b(\024)f Fm(n=)p Fv(2)e(for)g(di\013eren)n(t)h +Fm(c)g Fv(v)-5 b(alues)36 b(and)681 1327 y(di\013eren)n(t)27 +b(n)n(um)n(b)r(er)h(of)f(k)n(eys)g(for)g(a)g(collections)g(of)h(URLs) +681 1488 y(T)-7 b(o)27 b(estimate)e Fm(p)p Fv(,)i(w)n(e)h(estimate)f +(the)h(probabilit)n(y)f(of)h(obtaining)c Fm(n)j Fl(distinct)36 +b Fv(ob)5 b(jects)28 b(when)681 1588 y(w)n(e)35 b(indep)r(enden)n(tly)i +(dra)n(w)e Fm(n)24 b Fv(ob)5 b(jects)36 b(from)f(a)h(univ)n(erse)f(of)g +(cardinalit)n(y)3067 1521 y Fi(\000)3109 1551 y Fj(t)3105 +1617 y Fu(2)3138 1521 y Fi(\001)3213 1588 y Fv(=)3314 +1521 y Fi(\000)3352 1551 y Fj(cn)3371 1617 y Fu(2)3423 +1521 y Fi(\001)3498 1588 y Fk(\030)681 1717 y Fm(c)717 +1687 y Fu(2)754 1717 y Fm(n)804 1687 y Fu(2)841 1717 +y Fm(=)p Fv(2,)27 b(with)h(replacemen)n(t.)g(This)f(latter)h +(probabilit)n(y)f(is)h(ab)r(out)c Fm(e)2850 1681 y Ff(\000)2902 +1687 y Fv(\()2934 1654 y Fe(n)2938 1701 y Fd(2)2971 1687 +y Fv(\))3003 1681 y Fj(=)3037 1687 y Fv(\()3072 1654 +y Fe(t)3069 1701 y Fd(2)3098 1687 y Fv(\))3162 1717 y(for)j(large)d +Fm(n)p Fv(.)681 1838 y(As)h Fm(e)840 1802 y Ff(\000)892 +1808 y Fv(\()924 1775 y Fe(n)928 1822 y Fd(2)960 1808 +y Fv(\))992 1802 y Fj(=)1026 1808 y Fv(\()1061 1775 y +Fe(t)1059 1822 y Fd(2)1087 1808 y Fv(\))1174 1838 y Fk(!)51 +b Fm(e)1347 1808 y Ff(\000)p Fu(1)p Fj(=c)1496 1783 y +Fd(2)1583 1838 y Fm(>)f Fv(0)44 b(as)24 b Fm(n)51 b Fk(!)g(1)p +Fv(,)44 b(the)h(exp)r(ected)f(n)n(um)n(b)r(er)g(of)h(iterations)681 +1938 y(is)24 b Fm(e)800 1908 y Fu(1)p Fj(=c)897 1883 +y Fd(2)964 1938 y Fv(=)31 b(2)p Fm(:)p Fv(13)g(\(recall)h +Fm(c)e Fv(=)h(1)p Fm(:)p Fv(15\).)g(As)i(the)f(exp)r(ected)h(n)n(um)n +(b)r(er)f(of)g(iterations)g(is)g Fm(O)r Fv(\(1\))681 +2038 y(then,)c(the)g(mapping)f(step)h(tak)n(es)f Fm(O)r +Fv(\()p Fm(n)p Fv(\))h(time.)681 2226 y Fg(3.2)94 b(Ordering)32 +b(Step)681 2390 y Fv(The)37 b(pro)r(cedure)g(Ordering)f(\()p +Fm(G)p Fv(,)i Fm(G)1841 2402 y Fu(crit)1946 2390 y Fv(,)f +Fm(G)2071 2402 y Fu(ncrit)2212 2390 y Fv(\))h(receiv)n(es)e(as)h(input) +h(the)g(graph)24 b Fm(G)38 b Fv(and)681 2490 y(partitions)24 +b Fm(G)j Fv(in)n(to)g(the)g(t)n(w)n(o)f(subgraphs)f Fm(G)2072 +2502 y Fu(crit)2204 2490 y Fv(and)h Fm(G)2429 2502 y +Fu(ncrit)2571 2490 y Fv(,)g(so)h(that)e Fm(G)e Fv(=)g +Fm(G)3140 2502 y Fu(crit)3261 2490 y Fk([)17 b Fm(G)3398 +2502 y Fu(ncrit)3540 2490 y Fv(.)805 2589 y(Figure)25 +b(3)38 b(presen)n(ts)g(a)h(sample)f(graph)g(with)h(9)g(v)n(ertices)f +(and)g(8)h(edges,)f(where)g(the)681 2689 y(degree)23 +b(of)i(a)f(v)n(ertex)g(is)g(sho)n(wn)g(b)r(esides)h(eac)n(h)e(v)n +(ertex.)h(Initially)-7 b(,)25 b(all)f(v)n(ertices)g(with)h(degree)681 +2789 y(1)h(are)f(added)i(to)f(a)g(queue)h Fm(Q)p Fv(.)f(F)-7 +b(or)26 b(the)h(example)f(sho)n(wn)f(in)i(Figure)d(3\(a\),)j +Fm(Q)22 b Fv(=)h Fk(f)p Fv(2)p Fk(g)i Fv(after)681 2888 +y(the)j(initialization)f(step.)804 3619 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 804 3619 a +@beginspecial 0 @llx 0 @lly 372 @urx 92 @ury 3720 @rwi +@setspecial +%%BeginDocument: figs/grafordering.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafordering2.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Mon Jan 10 18:31:19 2005 +%%For: fbotelho@tigre (Fabiano Cupertino Botelho) +%%BoundingBox: 0 0 372 92 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.824 0.824 0.824 srgb} bind def + +end +save +newpath 0 92 moveto 0 0 lineto 372 0 lineto 372 92 lineto closepath clip newpath +-17.0 416.7 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +7.500 slw +n 1800 5310 m 1980 5310 l 1980 5490 l 1800 5490 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +1860 5437 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +1665 5445 m +gs 1 -1 sc (Q) col0 sh gr +% Arc +n 1080.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 967.5 5962.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 1080.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 1080 5940 m + 1305 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 1080 5940 m + 855 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 1080 5940 m + 1305 6480 l gs col0 s gr +% Polyline +n 1080 5940 m + 855 6480 l gs col0 s gr +% Polyline +n 1080 5940 m + 1620 5715 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +630 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +810 5985 m +gs 1 -1 sc (d:5) col0 sh gr +/Times-Roman ff 120.00 scf sf +1395 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +1755 5670 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +1755 6255 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +1440 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +585 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +270 5715 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +270 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +270 5355 m +gs 1 -1 sc (a\)) col0 sh gr +% Arc +n 5220.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 5107.5 5962.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 5220.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 5220 5940 m + 5445 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 5220 5940 m + 4995 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 5220 5940 m + 5445 6480 l gs col0 s gr +% Polyline +n 5220 5940 m + 4995 6480 l gs col0 s gr +% Polyline +n 5220 5940 m + 5760 5715 l gs col0 s gr +% Polyline +n 5221 5943 m + 5761 5718 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +4770 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +4950 5985 m +gs 1 -1 sc (d:4) col0 sh gr +/Times-Roman ff 120.00 scf sf +5535 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +5895 5670 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5895 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5580 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +4725 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +4410 5715 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +4410 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +4410 5355 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 120.00 scf sf +5850 5445 m +gs 1 -1 sc (Q) col0 sh gr +% Polyline +n 3870 5310 m 4050 5310 l 4050 5490 l 3870 5490 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +3930 5437 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +3735 5445 m +gs 1 -1 sc (Q) col0 sh gr +% Arc +n 3150.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 3037.5 5962.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 3150.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 3150 5940 m + 3375 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 3150 5940 m + 2925 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 3150 5940 m + 3375 6480 l gs col0 s gr +% Polyline +n 3150 5940 m + 2925 6480 l gs col0 s gr +% Polyline +n 3150 5940 m + 3690 5715 l gs col0 s gr +% Polyline +n 3151 5943 m + 3691 5718 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +2700 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +2880 5985 m +gs 1 -1 sc (d:5) col0 sh gr +/Times-Roman ff 120.00 scf sf +3465 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +3825 5670 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +3825 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +3510 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +2655 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +2340 5715 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +2340 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +2340 5355 m +gs 1 -1 sc (b\)) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 540 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +510 5752 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 855 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +825 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 1305 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1275 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 1620 5715 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1590 5752 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 1620 6165 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1590 6202 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 1305 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1275 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 855 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +825 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 540 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +510 6202 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 1080 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1050 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 4680 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 5752 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 4995 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4965 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 5445 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5415 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5445 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5415 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 4995 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4965 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 4680 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 6202 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 5220 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5190 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5760 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 6202 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 5760 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 5752 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 6052 5397 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +% Polyline +n 6070 5337 m + 6033 5458 l gs col32 1.00 tnt ef gr gs col0 s gr +% Ellipse +n 2610 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2580 5752 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 2925 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2895 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 3375 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3345 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 3375 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3345 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 2925 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2895 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 2610 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2580 6202 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 3150 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3120 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3690 5715 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3660 5752 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 3690 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3660 6202 m +gs 1 -1 sc (2) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage + +%%EndDocument + @endspecial 804 3619 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 804 3619 a 1011 3802 a Fg(Fig.)15 +b(3.)27 b Fv(Ordering)f(step)i(for)f(a)g(graph)g(with)h(9)f(v)n +(ertices)f(and)i(8)f(edges)805 3965 y(Next,)h(w)n(e)g(remo)n(v)n(e)e +(one)h(v)n(ertex)f Fm(v)31 b Fv(from)d(the)g(queue,)f(decremen)n(t)h +(its)f(degree)g(and)g(the)681 4065 y(degree)34 b(of)i(the)g(v)n +(ertices)e(with)i(degree)f(greater)f(than)h(0)g(in)h(the)g(adjacen)n(t) +f(list)h(of)f Fm(v)s Fv(,)h(as)681 4164 y(depicted)25 +b(in)f(Figure)h(3\(b\))f(for)g Fm(v)j Fv(=)22 b(2.)i(A)n(t)h(this)g(p)r +(oin)n(t,)f(the)h(adjacencies)f(of)g Fm(v)k Fv(with)d(degree)681 +4264 y(1)e(are)g(inserted)g(in)n(to)h(the)g(queue,)g(suc)n(h)f(as)g(v)n +(ertex)g(1.)g(This)h(pro)r(cess)e(is)i(rep)r(eated)f(un)n(til)h(the)681 +4363 y(queue)35 b(b)r(ecomes)f(empt)n(y)-7 b(.)35 b(All)g(v)n(ertices)f +(with)h(degree)f(0)h(are)f(non-critical)f(v)n(ertices)h(and)681 +4463 y(the)28 b(others)g(are)f(critical)g(v)n(ertices,)g(as)h(depicted) +h(in)f(Figure)c(3\(c\).)k(Finally)-7 b(,)29 b(to)f(determine)681 +4563 y(the)g(v)n(ertices)f(in)h Fm(V)1270 4575 y Fu(scrit)1429 +4563 y Fv(w)n(e)f(collect)h(all)f(v)n(ertices)g Fm(v)g +Fk(2)d Fm(V)19 b Fv(\()p Fm(G)2536 4575 y Fu(crit)2641 +4563 y Fv(\))28 b(with)g(at)g(least)f(one)h(v)n(ertex)681 +4662 y Fm(u)f Fv(that)h(is)f(in)h(Adj\()p Fm(v)s Fv(\))h(and)f(in)g +Fm(V)19 b Fv(\()p Fm(G)1808 4674 y Fu(ncrit)1949 4662 +y Fv(\),)28 b(as)f(the)h(v)n(ertex)f(8)g(in)h(Figure)c(3\(c\).)681 +4826 y Fg(Analysis)39 b(of)h(the)g(Ordering)g(Step.)90 +b Fv(The)35 b(initialization)f(tak)n(es)g Fm(O)r Fv(\()p +Fk(j)p Fm(V)20 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(\))36 +b(time,)681 4926 y(b)r(ecause)29 b(w)n(e)g(need)g(to)h(c)n(hec)n(k)e +(the)i(degree)e(of)h(eac)n(h)g(v)n(ertex)f(from)h Fm(V)19 +b Fv(\()p Fm(G)p Fv(\).)31 b(Next,)e(the)h(non-)681 5025 +y(critical)35 b(v)n(ertices)h(are)f(obtained.)h(This)h(pro)r(cess)e +(tak)n(es)g Fm(O)r Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)2799 +5037 y Fu(ncrit)2941 5025 y Fv(\))p Fk(j)p Fv(\),)37 +b(b)r(ecause)f(eac)n(h)681 5125 y(non-critical)30 b(v)n(ertex)h(is)h +(remo)n(v)n(ed)e(from)i(the)g(queue)g(only)g(once.)f(Finally)-7 +b(,)32 b(to)g(determine)681 5225 y(the)f(v)n(ertices)e(in)i +Fm(V)1278 5237 y Fu(scrit)1440 5225 y Fv(tak)n(es)e Fm(O)r +Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)1940 5237 y Fu(crit)2045 +5225 y Fv(\))p Fk(j)p Fv(\).)31 b(Considering)e(that)i +Fk(j)p Fm(V)19 b Fv(\()p Fm(G)3016 5237 y Fu(crit)3121 +5225 y Fv(\))p Fk(j)28 b(\024)g(j)p Fm(V)19 b Fv(\()p +Fm(G)p Fv(\))p Fk(j)p Fv(,)681 5324 y Fk(j)p Fm(V)g Fv(\()p +Fm(G)868 5336 y Fu(ncrit)1009 5324 y Fv(\))p Fk(j)24 +b(\024)e(j)p Fm(V)d Fv(\()p Fm(G)p Fv(\))p Fk(j)29 b +Fv(and)e Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)24 +b Fv(=)f Fm(t)g Fv(=)g Fm(cn)p Fv(,)k(the)h(ordering)e(step)i(tak)n(es) +e Fm(O)r Fv(\()p Fm(n)p Fv(\))j(time.)p eop end +%%Page: 7 7 +TeXDict begin 7 6 bop 365 387 a Fg(3.3)95 b(Searc)m(hing)32 +b(Step)365 548 y Fv(In)i(the)h(searc)n(hing)d(step,)i(the)g(k)n(ey)f +(part)g(is)h(the)g Fl(p)l(erfe)l(ct)i(assignment)g(pr)l(oblem)p +Fv(:)f(\014nd)f Fm(g)i Fv(:)365 647 y Fm(V)19 b Fv(\()p +Fm(G)p Fv(\))24 b Fk(!)f Fh(Z)28 b Fv(suc)n(h)f(that)h(the)g(function)g +Fm(h)23 b Fv(:)h Fm(E)5 b Fv(\()p Fm(G)p Fv(\))23 b Fk(!)h +Fh(Z)k Fv(de\014ned)g(b)n(y)1165 812 y Fm(h)p Fv(\()p +Fm(e)p Fv(\))23 b(=)g Fm(g)s Fv(\()p Fm(a)p Fv(\))18 +b(+)g Fm(g)s Fv(\()p Fm(b)p Fv(\))166 b(\()p Fm(e)23 +b Fv(=)f Fk(f)p Fm(a;)14 b(b)p Fk(g)p Fv(\))739 b(\(3\))365 +977 y(is)21 b(a)g(bijection)h(from)i Fm(E)5 b Fv(\()p +Fm(G)p Fv(\))23 b(to)h([0)p Fm(;)14 b(n)6 b Fk(\000)g +Fv(1])20 b(\(recall)k Fm(n)f Fv(=)f Fk(j)p Fm(S)5 b Fk(j)23 +b Fv(=)g Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p +Fv(\).)44 b(W)-7 b(e)21 b(are)g(in)n(terested)365 1076 +y(in)g(a)f(lab)r(elling)h Fm(g)k Fv(:)e Fm(V)42 b Fk(!)23 +b Fh(Z)e Fv(of)g(the)g(v)n(ertices)e(of)i(the)g(graph)j +Fm(G)f Fv(=)g Fm(G)p Fv(\()p Fm(h)2523 1088 y Fu(1)2560 +1076 y Fm(;)14 b(h)2645 1088 y Fu(2)2682 1076 y Fv(\))21 +b(with)g(the)g(prop-)365 1176 y(ert)n(y)g(that)g(if)k +Fm(x)d Fv(and)j Fm(y)e Fv(are)e(k)n(eys)f(in)25 b Fm(S)5 +b Fv(,)21 b(then)g Fm(g)s Fv(\()p Fm(h)1876 1188 y Fu(1)1913 +1176 y Fv(\()p Fm(x)p Fv(\)\))5 b(+)g Fm(g)s Fv(\()p +Fm(h)2254 1188 y Fu(2)2293 1176 y Fv(\()p Fm(x)p Fv(\)\))24 +b Fk(6)p Fv(=)f Fm(g)s Fv(\()p Fm(h)2671 1188 y Fu(1)2708 +1176 y Fv(\()p Fm(y)s Fv(\)\))5 b(+)g Fm(g)s Fv(\()p +Fm(h)3046 1188 y Fu(2)3084 1176 y Fv(\()p Fm(y)s Fv(\)\);)365 +1275 y(that)40 b(is,)f(if)h(w)n(e)f(asso)r(ciate)f(to)h(eac)n(h)g(edge) +f(the)i(sum)g(of)f(the)g(lab)r(els)h(on)f(its)g(endp)r(oin)n(ts,)365 +1375 y(then)29 b(these)f(v)-5 b(alues)28 b(should)g(b)r(e)h(all)f +(distinct.)h(Moreo)n(v)n(er,)d(w)n(e)i(require)f(that)i(all)f(the)g +(sums)365 1475 y Fm(g)s Fv(\()p Fm(h)488 1487 y Fu(1)525 +1475 y Fv(\()p Fm(x)p Fv(\)\))18 b(+)e Fm(g)s Fv(\()p +Fm(h)890 1487 y Fu(2)927 1475 y Fv(\()p Fm(x)p Fv(\)\))29 +b(\()p Fm(x)23 b Fk(2)h Fm(S)5 b Fv(\))26 b(fall)h(b)r(et)n(w)n(een)e +(0)h(and)f Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)18 +b(\000)e Fv(1)23 b(=)f Fm(n)17 b Fk(\000)f Fv(1,)26 b(and)h(th)n(us)g +(w)n(e)365 1574 y(ha)n(v)n(e)g(a)g(bijection)h(b)r(et)n(w)n(een)d +Fm(S)32 b Fv(and)25 b([0)p Fm(;)14 b(n)j Fk(\000)h Fv(1].)490 +1674 y(The)j(pro)r(cedure)f(Searc)n(hing)g(\()p Fm(G)p +Fv(,)h Fm(G)1609 1686 y Fu(crit)1714 1674 y Fv(,)g Fm(G)1823 +1686 y Fu(ncrit)1965 1674 y Fv(,)g Fm(g)s Fv(\))g(receiv)n(es)e(as)i +(input)26 b Fm(G)p Fv(,)21 b Fm(G)2892 1686 y Fu(crit)2997 +1674 y Fv(,)g Fm(G)3106 1686 y Fu(ncrit)365 1774 y Fv(and)31 +b(\014nds)g(a)f(suitable)g(log)1224 1794 y Fu(2)1275 +1774 y Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)i +Fv(+)f(1)30 b(bit)i(v)-5 b(alue)30 b(for)g(eac)n(h)g(v)n(ertex)g +Fm(v)h Fk(2)e Fm(V)18 b Fv(\()p Fm(G)p Fv(\),)32 b(stored)365 +1873 y(in)i(the)f(arra)n(y)23 b Fm(g)s Fv(.)32 b(This)h(step)h(is)f +(\014rst)g(p)r(erformed)f(for)h(the)g(v)n(ertices)f(in)i(the)f +(critical)g(sub-)365 1973 y(graph)24 b Fm(G)663 1985 +y Fu(crit)801 1973 y Fv(of)32 b Fm(G)i Fv(\(the)f(2-core)e(of)25 +b Fm(G)p Fv(\))33 b(and)g(then)g(it)h(is)e(p)r(erformed)h(for)f(the)h +(v)n(ertices)f(in)365 2072 y Fm(G)430 2084 y Fu(ncrit)608 +2072 y Fv(\(the)k(non-critical)f(subgraph)g(of)25 b Fm(G)36 +b Fv(that)g(con)n(tains)f(the)i(\\acyclic)e(part")g(of)h +Fm(G)p Fv(\).)365 2172 y(The)k(reason)e(the)j(assignmen)n(t)d(of)i(the) +g Fm(g)28 b Fv(v)-5 b(alues)39 b(is)h(\014rst)f(p)r(erformed)h(on)f +(the)h(v)n(ertices)365 2272 y(in)25 b Fm(G)524 2284 y +Fu(crit)659 2272 y Fv(is)k(to)g(resolv)n(e)f(reassignmen)n(ts)g(as)h +(early)f(as)h(p)r(ossible)g(\(suc)n(h)h(reassignmen)n(ts)d(are)365 +2371 y(consequences)g(of)g(the)h(cycles)f(in)e Fm(G)1501 +2383 y Fu(crit)1634 2371 y Fv(and)i(are)g(depicted)h(hereinafter\).)365 +2531 y Fg(Assignmen)m(t)f(of)g(V)-8 b(alues)28 b(to)f(Critical)h(V)-8 +b(ertices.)66 b Fv(The)24 b(lab)r(els)g Fm(g)s Fv(\()p +Fm(v)s Fv(\))h(\()p Fm(v)h Fk(2)e Fm(V)19 b Fv(\()p Fm(G)3078 +2543 y Fu(crit)3183 2531 y Fv(\)\))365 2631 y(are)g(assigned)g(in)h +(increasing)e(order)h(follo)n(wing)g(a)g(greedy)g(strategy)g(where)g +(the)h(critical)g(v)n(er-)365 2731 y(tices)25 b Fm(v)j +Fv(are)23 b(considered)h(one)g(at)g(a)g(time,)h(according)d(to)j(a)f +(breadth-\014rst)f(searc)n(h)g(on)h Fm(G)3119 2743 y +Fu(crit)3224 2731 y Fv(.)365 2830 y(If)e(a)e(candidate)h(v)-5 +b(alue)25 b Fm(x)d Fv(for)i Fm(g)s Fv(\()p Fm(v)s Fv(\))d(is)g +(forbidden)g(b)r(ecause)g(setting)k Fm(g)s Fv(\()p Fm(v)s +Fv(\))e(=)g Fm(x)f Fv(w)n(ould)e(create)365 2930 y(t)n(w)n(o)26 +b(edges)f(with)i(the)g(same)f(sum,)g(w)n(e)g(try)f Fm(x)16 +b Fv(+)g(1)26 b(for)e Fm(g)s Fv(\()p Fm(v)s Fv(\).)j(This)f(fact)g(is)h +(referred)e(to)h(as)g(a)365 3030 y Fl(r)l(e)l(assignment)p +Fv(.)490 3129 y(Let)21 b Fm(A)694 3141 y Fj(E)771 3129 +y Fv(b)r(e)g(the)g(set)f(of)h(addresses)e(assigned)h(to)g(edges)g(in)h +Fm(E)5 b Fv(\()p Fm(G)2466 3141 y Fu(crit)2571 3129 y +Fv(\).)21 b(Initially)g Fm(A)3016 3141 y Fj(E)3095 3129 +y Fv(=)i Fk(;)p Fv(.)365 3229 y(Let)32 b Fm(x)g Fv(b)r(e)f(a)g +(candidate)g(v)-5 b(alue)32 b(for)f Fm(g)s Fv(\()p Fm(v)s +Fv(\).)g(Initially)h Fm(x)e Fv(=)f(0.)i(Considering)f(the)h(subgraph) +365 3328 y Fm(G)430 3340 y Fu(crit)555 3328 y Fv(in)20 +b(Figure)k(3\(c\),)c(a)g(step)g(b)n(y)g(step)g(example)f(of)h(the)g +(assignmen)n(t)f(of)h(v)-5 b(alues)20 b(to)f(v)n(ertices)365 +3428 y(in)32 b Fm(G)531 3440 y Fu(crit)667 3428 y Fv(is)f(presen)n(ted) +g(in)g(Figure)24 b(4.)31 b(Initially)-7 b(,)32 b(a)e(v)n(ertex)h +Fm(v)j Fv(is)d(c)n(hosen,)g(the)g(assignmen)n(t)365 3528 +y Fm(g)s Fv(\()p Fm(v)s Fv(\))f(=)e Fm(x)k Fv(is)f(made)g(and)g +Fm(x)g Fv(is)g(set)g(to)g Fm(x)22 b Fv(+)e(1.)31 b(F)-7 +b(or)30 b(example,)h(supp)r(ose)g(that)g(v)n(ertex)f(8)h(in)365 +3627 y(Figure)25 b(4\(a\))i(is)g(c)n(hosen,)g(the)h(assignmen)n(t)f +Fm(g)s Fv(\(8\))22 b(=)h(0)k(is)h(made)f(and)g Fm(x)i +Fv(is)e(set)h(to)f(1.)560 4524 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 560 4524 a @beginspecial +0 @llx 0 @lly 352 @urx 115 @ury 3520 @rwi @setspecial +%%BeginDocument: figs/grafsearching.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearching2.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Mon Jan 10 18:31:58 2005 +%%For: fbotelho@tigre (Fabiano Cupertino Botelho) +%%BoundingBox: 0 0 352 115 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.824 0.824 0.824 srgb} bind def + +end +save +newpath 0 115 moveto 0 0 lineto 352 0 lineto 352 115 lineto closepath clip newpath +-272.1 431.6 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +n 6210.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 6210.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Arc +n 7740.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 7740.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Arc +n 9270.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 9270.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Arc +n 4860.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 4860.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 6210 5940 m + 6435 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 6210 5940 m + 5985 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 6210 5940 m + 6435 6480 l gs col0 s gr +% Polyline +n 6210 5940 m + 5985 6480 l gs col0 s gr +% Polyline +n 7740 5940 m + 7965 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 7740 5940 m + 7515 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 7740 5940 m + 7965 6480 l gs col0 s gr +% Polyline +n 7740 5940 m + 7515 6480 l gs col0 s gr +% Polyline +n 9270 5940 m + 9495 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 9270 5940 m + 9045 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 9270 5940 m + 9495 6480 l gs col0 s gr +% Polyline +n 9270 5940 m + 9045 6480 l gs col0 s gr +% Polyline +n 4860 5940 m + 5085 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 4860 5940 m + 4635 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 4860 5940 m + 5085 6480 l gs col0 s gr +% Polyline +n 4860 5940 m + 4635 6480 l gs col0 s gr +/Times-Roman ff 165.00 scf sf +5490 5445 m +gs 1 -1 sc (b\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +7020 5445 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +8550 5445 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +4320 5445 m +gs 1 -1 sc (a\)) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 5985 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5955 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 6435 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +6405 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 6435 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +6405 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 5985 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5955 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 6210 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +6180 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 7515 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7485 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 7965 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7935 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 7965 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7935 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 7515 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7485 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 7740 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7710 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 9045 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9015 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 9495 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9465 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 9495 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9465 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 9045 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9015 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 9270 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9240 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 4635 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4605 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 5085 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5055 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5085 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5055 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 4635 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4605 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 4860 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4830 5977 m +gs 1 -1 sc (8) col0 sh gr +% Polyline +gs clippath +6228 5199 m 6255 5253 l 6389 5186 l 6269 5213 l 6362 5132 l cp +eoclip +n 6255 5220 m + 6615 5040 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 6362 5132 m 6269 5213 l 6389 5186 l 6362 5132 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6146 6680 m 6120 6626 l 5985 6693 l 6106 6667 l 6012 6747 l cp +eoclip +n 5760 6840 m + 6120 6660 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 6012 6747 m 6106 6667 l 5985 6693 l 6012 6747 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7676 6680 m 7650 6626 l 7515 6693 l 7636 6667 l 7542 6747 l cp +eoclip +n 7290 6840 m + 7650 6660 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7542 6747 m 7636 6667 l 7515 6693 l 7542 6747 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7496 5735 m 7470 5681 l 7335 5748 l 7456 5722 l 7362 5802 l cp +eoclip +n 7110 5895 m + 7470 5715 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7362 5802 m 7456 5722 l 7335 5748 l 7362 5802 l cp gs 0.00 setgray ef gr col0 s +/Times-Roman ff 120.00 scf sf +6345 5985 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +6570 5310 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +5715 5310 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 120.00 scf sf +6165 5310 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +5985 5715 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 120.00 scf sf +5985 6255 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 120.00 scf sf +6390 6255 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +6390 5715 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +6165 6660 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +6525 6660 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +5715 6660 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 120.00 scf sf +7875 5985 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +8100 5310 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +7245 5310 m +gs 1 -1 sc (g:5) col0 sh gr +/Times-Roman ff 120.00 scf sf +7695 5310 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 120.00 scf sf +7515 5715 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +7515 6255 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 120.00 scf sf +7920 6255 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +7920 5715 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +7695 6660 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +8055 6660 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +7245 6660 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 120.00 scf sf +9405 5985 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +9630 5310 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +8775 5310 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 120.00 scf sf +9225 5310 m +gs 1 -1 sc (7) col0 sh gr +/Times-Roman ff 120.00 scf sf +9045 5715 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 120.00 scf sf +9045 6255 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 120.00 scf sf +9450 6255 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +9450 5715 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +9225 6660 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +9585 6660 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +8775 6660 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 120.00 scf sf +4995 5985 m +gs 1 -1 sc (g:0) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage + +%%EndDocument + @endspecial 560 4524 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 560 4524 a 665 4707 a Fg(Fig.)15 +b(4.)27 b Fv(Example)g(of)g(the)h(assignmen)n(t)f(of)h(v)-5 +b(alues)27 b(to)g(critical)g(v)n(ertices)490 4863 y(In)h(Figure)c +(4\(b\),)k(follo)n(wing)f(the)h(adjacen)n(t)f(list)h(of)f(v)n(ertex)g +(8,)g(the)i(unassigned)d(v)n(ertex)365 4963 y(0)c(is)h(reac)n(hed.)e(A) +n(t)i(this)g(p)r(oin)n(t,)g(w)n(e)f(collect)h(in)g(the)g(temp)r(orary)e +(v)-5 b(ariable)21 b Fm(Y)42 b Fv(all)22 b(adjacencies)365 +5063 y(of)h(v)n(ertex)e(0)h(that)h(ha)n(v)n(e)e(b)r(een)i(assigned)e +(an)h Fm(x)h Fv(v)-5 b(alue,)22 b(and)g Fm(Y)42 b Fv(=)23 +b Fk(f)p Fv(8)p Fk(g)p Fv(.)e(Next,)i(for)e(all)h Fm(u)h +Fk(2)g Fm(Y)c Fv(,)p eop end +%%Page: 8 8 +TeXDict begin 8 7 bop 681 387 a Fv(w)n(e)32 b(c)n(hec)n(k)h(if)g +Fm(g)s Fv(\()p Fm(u)p Fv(\))22 b(+)g Fm(x)32 b Fk(62)h +Fm(A)1612 399 y Fj(E)1668 387 y Fv(.)g(Since)h Fm(g)s +Fv(\(8\))21 b(+)h(1)32 b(=)f(1)h Fk(62)h Fm(A)2598 399 +y Fj(E)2654 387 y Fv(,)g(then)h Fm(g)s Fv(\(0\))f(is)f(set)i(to)f(1,)f +Fm(x)681 487 y Fv(is)e(incremen)n(ted)h(b)n(y)f(1)g(\(no)n(w)g +Fm(x)f Fv(=)e(2\))k(and)f Fm(A)2136 499 y Fj(E)2221 487 +y Fv(=)d Fm(A)2375 499 y Fj(E)2452 487 y Fk([)21 b(f)p +Fv(1)p Fk(g)26 b Fv(=)i Fk(f)p Fv(1)p Fk(g)p Fv(.)h(Next,)i(v)n(ertex)f +(3)g(is)681 587 y(reac)n(hed,)21 b Fm(g)s Fv(\(3\))i(is)f(set)h(to)f +(2,)g Fm(x)i Fv(is)e(set)h(to)f(3)g(and)h Fm(A)2212 599 +y Fj(E)2291 587 y Fv(=)g Fm(A)2441 599 y Fj(E)2506 587 +y Fk([)8 b(f)p Fv(2)p Fk(g)22 b Fv(=)h Fk(f)p Fv(1)p +Fm(;)14 b Fv(2)p Fk(g)p Fv(.)21 b(Next,)i(v)n(ertex)e(4)681 +686 y(is)k(reac)n(hed)e(and)i Fm(Y)42 b Fv(=)23 b Fk(f)p +Fv(3)p Fm(;)14 b Fv(8)p Fk(g)p Fv(.)23 b(Since)i Fm(g)s +Fv(\(3\))13 b(+)g(3)22 b(=)h(5)f Fk(62)i Fm(A)2460 698 +y Fj(E)2541 686 y Fv(and)h Fm(g)s Fv(\(8\))13 b(+)g(3)22 +b(=)h(3)f Fk(62)i Fm(A)3297 698 y Fj(E)3353 686 y Fv(,)h(then)681 +786 y Fm(g)s Fv(\(4\))19 b(is)g(set)g(to)g(3,)g Fm(x)g +Fv(is)g(set)h(to)f(4)f(and)h Fm(A)1853 798 y Fj(E)1933 +786 y Fv(=)j Fm(A)2082 798 y Fj(E)2140 786 y Fk([)r(f)p +Fv(3)p Fm(;)14 b Fv(5)p Fk(g)21 b Fv(=)i Fk(f)p Fv(1)p +Fm(;)14 b Fv(2)p Fm(;)g Fv(3)p Fm(;)g Fv(5)p Fk(g)p Fv(.)i(Finally)-7 +b(,)19 b(v)n(ertex)f(7)h(is)681 886 y(reac)n(hed)g(and)g +Fm(Y)42 b Fv(=)23 b Fk(f)p Fv(0)p Fm(;)14 b Fv(8)p Fk(g)p +Fv(.)k(Since)i Fm(g)s Fv(\(0\))s(+)s(4)j(=)f(5)h Fk(2)g +Fm(A)2339 898 y Fj(E)2396 886 y Fv(,)d Fm(x)h Fv(is)f(incremen)n(ted)f +(b)n(y)h(1)g(and)g(set)g(to)681 985 y(5,)j(as)g(depicted)h(in)g(Figure) +g(4\(c\).)f(Since)h Fm(g)s Fv(\(8\))10 b(+)g(5)22 b(=)h(5)g +Fk(2)g Fm(A)2540 997 y Fj(E)2596 985 y Fv(,)h Fm(x)g +Fv(is)f(again)g(incremen)n(ted)g(b)n(y)681 1085 y(1)f(and)h(set)g(to)f +(6,)h(as)f(depicted)h(in)g(Figure)h(4\(d\).)f(These)g(t)n(w)n(o)f +(reassignmen)n(ts)f(are)h(indicated)681 1184 y(b)n(y)33 +b(the)i(arro)n(ws)c(in)k(Figure)24 b(4.)33 b(Since)i +Fm(g)s Fv(\(0\))22 b(+)g(6)33 b(=)h(7)f Fk(62)h Fm(A)2567 +1196 y Fj(E)2657 1184 y Fv(and)g Fm(g)s Fv(\(8\))22 b(+)h(6)33 +b(=)g(6)g Fk(62)h Fm(A)3483 1196 y Fj(E)3540 1184 y Fv(,)681 +1284 y(then)d Fm(g)s Fv(\(7\))f(is)h(set)f(to)h(6)f(and)h +Fm(A)1675 1296 y Fj(E)1759 1284 y Fv(=)d Fm(A)1914 1296 +y Fj(E)1990 1284 y Fk([)21 b(f)p Fv(6)p Fm(;)14 b Fv(7)p +Fk(g)26 b Fv(=)i Fk(f)p Fv(1)p Fm(;)14 b Fv(2)p Fm(;)g +Fv(3)p Fm(;)g Fv(5)p Fm(;)g Fv(6)p Fm(;)g Fv(7)p Fk(g)p +Fv(.)26 b(This)31 b(\014nishes)f(the)681 1384 y(algorithm.)805 +1483 y(A)j(pseudo)e(co)r(de)h(for)f(the)i(assignmen)n(t)e(of)h(v)-5 +b(alues)31 b(to)h(critical)g(v)n(ertices)e(is)i(presen)n(ted)681 +1583 y(in)c(the)g(App)r(endix.)681 1730 y Fg(Assignmen)m(t)k(of)i(V)-8 +b(alues)33 b(to)h(Non-Critical)f(V)-8 b(ertices.)76 b +Fv(As)30 b Fm(G)2918 1742 y Fu(ncrit)3088 1730 y Fv(is)g(acyclic,)e(w)n +(e)681 1830 y(can)37 b(imp)r(ose)g(the)h(order)e(in)i(whic)n(h)f +(addresses)f(are)h(asso)r(ciated)f(with)i(edges)f(in)g +Fm(G)3398 1842 y Fu(ncrit)3540 1830 y Fv(,)681 1930 y(making)g(this)h +(step)g(simple)g(to)g(solv)n(e)f(b)n(y)h(a)f(standard)g(depth)i +(\014rst)e(searc)n(h)g(algorithm.)681 2029 y(Therefore,)29 +b(in)h(the)g(assignmen)n(t)g(of)g(v)-5 b(alues)29 b(to)h(v)n(ertices)f +(in)i Fm(G)2676 2041 y Fu(ncrit)2847 2029 y Fv(w)n(e)f(b)r(ene\014t)h +(from)e(the)681 2129 y(un)n(used)23 b(addresses)f(in)i(the)g(gaps)e +(left)i(b)n(y)g(the)f(assignmen)n(t)g(of)g(v)-5 b(alues)23 +b(to)h(v)n(ertices)e(in)i Fm(G)3435 2141 y Fu(crit)3540 +2129 y Fv(.)681 2229 y(F)-7 b(or)25 b(that,)h(w)n(e)f(start)g(the)h +(depth-\014rst)f(searc)n(h)f(from)h(the)h(v)n(ertices)f(in)g +Fm(V)2917 2241 y Fu(scrit)3074 2229 y Fv(b)r(ecause)g(the)h +Fm(g)681 2328 y Fv(v)-5 b(alues)27 b(for)g(these)h(critical)f(v)n +(ertices)f(w)n(ere)h(already)f(assigned)g(and)i(cannot)f(b)r(e)h(c)n +(hanged.)805 2428 y(Considering)22 b(the)h(subgraph)f +Fm(G)1817 2440 y Fu(ncrit)1981 2428 y Fv(in)h(Figure)h(3\(c\),)f(a)f +(step)h(b)n(y)f(step)h(example)g(of)f(the)681 2527 y(assignmen)n(t)33 +b(of)g(v)-5 b(alues)34 b(to)g(v)n(ertices)f(in)h Fm(G)2052 +2539 y Fu(ncrit)2227 2527 y Fv(is)g(presen)n(ted)f(in)h(Figure)24 +b(5.)34 b(Figure)24 b(5\(a\))681 2627 y(presen)n(ts)29 +b(the)h(initial)g(state)g(of)g(the)h(algorithm.)d(The)i(critical)g(v)n +(ertex)f(8)g(is)h(the)h(only)e(one)681 2727 y(that)e(has)g +(non-critical)e(v)n(ertices)h(as)h(adjacen)n(t.)f(In)h(the)h(example)e +(presen)n(ted)h(in)g(Figure)d(4,)681 2826 y(the)h(addresses)e +Fk(f)p Fv(0)p Fm(;)14 b Fv(4)p Fk(g)23 b Fv(w)n(ere)h(not)g(used.)h +(So,)g(taking)f(the)h(\014rst)f(un)n(used)h(address)e(0)i(and)f(the)681 +2926 y(v)n(ertex)e(1,)h(whic)n(h)h(is)f(reac)n(hed)f(from)h(the)h(v)n +(ertex)e(8,)h Fm(g)s Fv(\(1\))g(is)h(set)f(to)g(0)10 +b Fk(\000)g Fm(g)s Fv(\(8\))22 b(=)h(0,)g(as)g(sho)n(wn)681 +3026 y(in)37 b(Figure)24 b(5\(b\).)38 b(The)f(only)g(v)n(ertex)f(that)i +(is)f(reac)n(hed)f(from)g(v)n(ertex)h(1)f(is)h(v)n(ertex)g(2,)f(so)681 +3125 y(taking)23 b(the)h(un)n(used)g(address)f(4)g(w)n(e)h(set)g +Fm(g)s Fv(\(2\))g(to)f(4)11 b Fk(\000)g Fm(g)s Fv(\(1\))23 +b(=)f(4,)i(as)f(sho)n(wn)g(in)h(Figure)h(5\(c\).)681 +3225 y(This)i(pro)r(cess)g(is)g(rep)r(eated)g(un)n(til)i(the)e +(UnAssignedAddresses)g(list)h(b)r(ecomes)f(empt)n(y)-7 +b(.)765 3864 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 765 3864 a @beginspecial 0 @llx 0 @lly +383 @urx 86 @ury 3830 @rwi @setspecial +%%BeginDocument: figs/grafsearchingncv.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearchingncv.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Wed Jan 12 17:46:18 2005 +%%For: fbotelho@tigre (Fabiano Cupertino Botelho) +%%BoundingBox: 0 0 383 86 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.824 0.824 0.824 srgb} bind def + +end +save +newpath 0 86 moveto 0 0 lineto 383 0 lineto 383 86 lineto closepath clip newpath +-19.8 144.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +7.500 slw +n 1035 1890 m 1215 1890 l 1215 2070 l 1035 2070 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +1095 2017 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 1215 1890 m 1395 1890 l 1395 2070 l 1215 2070 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +1275 2017 m +gs 1 -1 sc (4) col0 sh gr +% Polyline +n 3015 1890 m 3195 1890 l 3195 2070 l 3015 2070 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +3075 2017 m +gs 1 -1 sc (4) col0 sh gr +% Arc +n 1102.5 1462.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 2992.5 1462.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 5107.5 1462.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Polyline +n 1215 1440 m + 1755 1215 l gs col0 s gr +% Polyline +n 1216 1443 m + 1756 1218 l gs col0 s gr +% Polyline +n 3105 1440 m + 3645 1215 l gs col0 s gr +% Polyline +n 3106 1443 m + 3646 1218 l gs col0 s gr +% Polyline +n 5220 1440 m + 5760 1215 l gs col0 s gr +% Polyline +n 5221 1443 m + 5761 1218 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +945 1485 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +630 2250 m +gs 1 -1 sc (UnAssignedAddresses) col0 sh gr +/Times-Roman ff 120.00 scf sf +2835 1485 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +3285 1305 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 120.00 scf sf +2520 2250 m +gs 1 -1 sc (UnAssignedAddresses) col0 sh gr +/Times-Roman ff 120.00 scf sf +4950 1485 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5400 1305 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 120.00 scf sf +4635 2250 m +gs 1 -1 sc (UnAssignedAddresses) col0 sh gr +/Times-Roman ff 120.00 scf sf +4590 1890 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5670 1890 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 120.00 scf sf +5670 1080 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +4590 1080 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +4320 1125 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 120.00 scf sf +3555 1080 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +2205 1125 m +gs 1 -1 sc (b\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +315 1125 m +gs 1 -1 sc (a\)) col0 sh gr +/Times-Roman ff 120.00 scf sf +5850 1485 m +gs 1 -1 sc (4) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 675 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +645 1252 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 675 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +645 1702 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 1215 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1185 1477 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 1755 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1725 1702 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 1755 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1725 1252 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 2565 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2535 1252 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 2565 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2535 1702 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 3105 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3075 1477 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3645 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3615 1702 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 3645 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3615 1252 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 4680 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 1252 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 4680 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 1702 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 5220 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5190 1477 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5760 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 1702 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 5760 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 1252 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 5217 2000 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +% Polyline +n 5235 1940 m + 5198 2061 l gs col32 1.00 tnt ef gr gs col0 s gr +% here ends figure; +$F2psEnd +rs +showpage + +%%EndDocument + @endspecial 765 3864 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 765 3864 a 900 4005 a Fg(Fig.)15 +b(5.)27 b Fv(Example)g(of)g(the)h(assignmen)n(t)f(of)g(v)-5 +b(alues)28 b(to)f(non-critical)f(v)n(ertices)805 4118 +y(A)19 b(pseudo)f(co)r(de)h(for)f(the)h(assignmen)n(t)e(of)i(v)-5 +b(alues)18 b(to)g(non-critical)g(v)n(ertices)f(is)h(presen)n(ted)681 +4218 y(in)28 b(the)g(App)r(endix.)681 4365 y Fg(Analysis)21 +b(of)h(the)g(Searc)m(hing)h(Step.)56 b Fv(W)-7 b(e)19 +b(shall)g(demonstrate)f(that)i(\(i\))f(the)h(maxim)n(um)681 +4465 y(v)-5 b(alue)23 b(assigned)e(to)i(an)f(edge)h(is)f(at)h(most)g +Fm(n)9 b Fk(\000)g Fv(1)22 b(\(that)h(is,)g(w)n(e)f(generate)g(a)g +(minimal)h(p)r(erfect)681 4565 y(hash)38 b(function\),)i(and)f(\(ii\))h +(the)f(p)r(erfect)h(assignmen)n(t)e(problem)g(\(determination)h(of)25 +b Fm(g)s Fv(\))681 4664 y(can)k(b)r(e)h(solv)n(ed)f(in)h(exp)r(ected)g +(time)g Fm(O)r Fv(\()p Fm(n)p Fv(\))h(if)g(the)f(n)n(um)n(b)r(er)f(of)h +(edges)f(in)h Fm(G)3063 4676 y Fu(crit)3198 4664 y Fv(is)f(at)h(most) +691 4731 y Fu(1)p 691 4745 34 4 v 691 4792 a(2)734 4764 +y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)805 +4863 y(W)-7 b(e)31 b(fo)r(cus)f(on)g(the)g(analysis)f(of)h(the)g +(assignmen)n(t)g(of)g(v)-5 b(alues)29 b(to)h(critical)g(v)n(ertices)f +(b)r(e-)681 4963 y(cause)34 b(the)i(assignmen)n(t)e(of)i(v)-5 +b(alues)35 b(to)g(non-critical)f(v)n(ertices)g(can)h(b)r(e)h(solv)n(ed) +e(in)h(linear)681 5063 y(time)28 b(b)n(y)f(a)g(depth)i(\014rst)e(searc) +n(h)f(algorithm.)p eop end +%%Page: 9 9 +TeXDict begin 9 8 bop 490 387 a Fv(W)-7 b(e)24 b(no)n(w)e(de\014ne)i +(certain)f(complexit)n(y)f(measures.)g(Let)i Fm(I)7 b +Fv(\()p Fm(v)s Fv(\))24 b(b)r(e)g(the)g(n)n(um)n(b)r(er)f(of)g(times) +365 487 y(a)h(candidate)g(v)-5 b(alue)24 b Fm(x)g Fv(for)g +Fm(g)s Fv(\()p Fm(v)s Fv(\))g(is)g(incremen)n(ted.)g(Let)g +Fm(N)2166 499 y Fj(t)2219 487 y Fv(b)r(e)h(the)f(total)g(n)n(um)n(b)r +(er)g(of)g(times)365 587 y(that)g(candidate)g(v)-5 b(alues)23 +b Fm(x)i Fv(are)d(incremen)n(ted.)i(Th)n(us,)g(w)n(e)f(ha)n(v)n(e)h +Fm(N)2457 599 y Fj(t)2509 587 y Fv(=)2596 524 y Fi(P)2698 +587 y Fm(I)7 b Fv(\()p Fm(v)s Fv(\),)25 b(where)e(the)365 +686 y(sum)28 b(is)g(o)n(v)n(er)d(all)g Fm(v)h Fk(2)e +Fm(V)18 b Fv(\()p Fm(G)1223 698 y Fu(crit)1328 686 y +Fv(\).)490 786 y(Com)n(bining)23 b(the)h(fact)g(that)g +Fm(G)1448 798 y Fu(crit)1552 786 y Fv(,)g(the)g(2-core)e(of)i +Fm(G)p Fv(,)g(is)f(almost)g(surely)g(connected)h(for)365 +886 y Fm(c)i Fv(=)g(1)p Fm(:)p Fv(15)i(\(see)h([1,)g(12)o(,)g(15)o(]\)) +h(and)f(the)h(fact)g(that)f(ev)n(ery)f(edge)h(is)g(either)g(a)g(tree)g +(edge)g(or)g(a)365 985 y(bac)n(k)e(edge)g(\(see,)h(e.g.,)f([3]\),)h(w)n +(e)f(see)g(that)h(the)g(follo)n(wing)e(holds.)365 1167 +y Fg(Theorem)16 b(1.)41 b Fl(The)28 b(numb)l(er)e(of)j(b)l(ack)f(e)l +(dges)f Fm(N)1887 1179 y Fu(b)r(edges)2112 1167 y Fl(of)h +Fm(G)c Fv(=)e Fm(G)2448 1179 y Fu(crit)2566 1167 y Fk([)13 +b Fm(G)2699 1179 y Fu(ncrit)2868 1167 y Fl(is)28 b(given)g(by)365 +1266 y Fm(N)432 1278 y Fu(b)r(edges)653 1266 y Fv(=)22 +b Fk(j)p Fm(E)5 b Fv(\()p Fm(G)926 1278 y Fu(crit)1031 +1266 y Fv(\))p Fk(j)19 b(\000)f(j)p Fm(V)h Fv(\()p Fm(G)1375 +1278 y Fu(crit)1480 1266 y Fv(\))p Fk(j)g Fv(+)f(1)p +Fl(.)1488 b Fk(u)-55 b(t)490 1448 y Fv(Our)32 b(next)g(result)g +(concerns)g(the)h(maximal)e(v)-5 b(alue)33 b Fm(A)2209 +1460 y Fu(max)2368 1448 y Fv(assigned)f(to)g(an)g(edge)g +Fm(e)f Fk(2)365 1548 y Fm(E)5 b Fv(\()p Fm(G)528 1560 +y Fu(crit)633 1548 y Fv(\))28 b(after)g(the)f(assignmen)n(t)g(of)h +Fm(g)i Fv(v)-5 b(alues)27 b(to)h(critical)f(v)n(ertices.)365 +1729 y Fg(Theorem)16 b(2.)41 b Fl(We)29 b(have)i Fm(A)1274 +1741 y Fu(max)1424 1729 y Fk(\024)23 b Fv(2)p Fk(j)p +Fm(V)18 b Fv(\()p Fm(G)1740 1741 y Fu(crit)1845 1729 +y Fv(\))p Fk(j)h(\000)f Fv(3)g(+)g(2)p Fm(N)2254 1741 +y Fj(t)2283 1729 y Fl(.)365 1911 y(Pr)l(o)l(of.)43 b +Fv(\(Sk)n(etc)n(h\))24 b(The)f(assignmen)n(t)g(of)g Fm(g)j +Fv(v)-5 b(alues)23 b(to)g(critical)g(v)n(ertices)f(starts)g(from)h(0,)g +(and)365 2011 y(eac)n(h)c(edge)25 b Fm(e)19 b Fv(receiv)n(es)f(the)j +(lab)r(el)e Fm(h)p Fv(\()p Fm(e)p Fv(\))h(as)f(giv)n(en)g(b)n(y)h(Eq.)k +(\(3\).)c(The)g Fm(g)i Fv(v)-5 b(alue)20 b(for)f(eac)n(h)g(v)n(ertex) +365 2110 y Fm(v)41 b Fv(in)c Fm(V)19 b Fv(\()p Fm(G)716 +2122 y Fu(crit)821 2110 y Fv(\))37 b(is)g(assigned)e(only)i(once.)f(A)i +(little)f(though)n(t)g(sho)n(ws)f(that)25 b(max)2940 +2122 y Fj(v)2994 2110 y Fm(g)s Fv(\()p Fm(v)s Fv(\))39 +b Fk(\024)365 2210 y(j)p Fm(V)19 b Fv(\()p Fm(G)552 2222 +y Fu(crit)657 2210 y Fv(\))p Fk(j)e(\000)f Fv(1)g(+)g +Fm(N)1016 2222 y Fj(t)1045 2210 y Fv(,)27 b(where)f(the)h(maxim)n(um)g +(is)f(tak)n(en)g(o)n(v)n(er)f(all)h(v)n(ertices)e Fm(v)30 +b Fv(in)25 b Fm(V)19 b Fv(\()p Fm(G)3087 2222 y Fu(crit)3192 +2210 y Fv(\).)365 2309 y(Moreo)n(v)n(er,)f(t)n(w)n(o)i(distinct)h(v)n +(ertices)e(get)h(distinct)26 b Fm(g)d Fv(v)-5 b(alues.)20 +b(Hence,)g Fm(A)2561 2321 y Fu(max)2711 2309 y Fk(\024)j +Fv(\()p Fk(j)p Fm(V)c Fv(\()p Fm(G)3018 2321 y Fu(crit)3123 +2309 y Fv(\))p Fk(j)t(\000)365 2409 y Fv(1)f(+)g Fm(N)575 +2421 y Fj(t)604 2409 y Fv(\))h(+)f(\()p Fk(j)p Fm(V)h +Fv(\()p Fm(G)957 2421 y Fu(crit)1062 2409 y Fv(\))p Fk(j)g(\000)f +Fv(2)g(+)g Fm(N)1429 2421 y Fj(t)1458 2409 y Fv(\))23 +b Fk(\024)g Fv(2)p Fk(j)p Fm(V)18 b Fv(\()p Fm(G)1829 +2421 y Fu(crit)1934 2409 y Fv(\))p Fk(j)h(\000)f Fv(3)g(+)g(2)p +Fm(N)2343 2421 y Fj(t)2371 2409 y Fv(,)28 b(as)f(required.)346 +b Fk(u)-55 b(t)365 2573 y Fg(Maximal)46 b(V)-8 b(alue)46 +b(Assigned)f(to)h(An)g(Edge.)103 b Fv(In)40 b(this)g(section)g(w)n(e)f +(presen)n(t)h(the)365 2673 y(follo)n(wing)27 b(conjecture.)365 +2805 y Fg(Conjecture)17 b(1.)40 b Fl(F)-6 b(or)41 b(a)h(r)l(andom)f(gr) +l(aph)h Fm(G)f Fl(with)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2239 +2817 y Fu(crit)2344 2805 y Fv(\))p Fk(j)44 b(\024)e Fm(n=)p +Fv(2)e Fl(and)i Fk(j)p Fm(V)18 b Fv(\()p Fm(G)p Fv(\))p +Fk(j)45 b Fv(=)365 2904 y(1)p Fm(:)p Fv(15)p Fm(n)p Fl(,)30 +b(it)i(is)f(always)i(p)l(ossible)g(to)e(gener)l(ate)g(a)h(minimal)g(p)l +(erfe)l(ct)g(hash)g(function)f(b)l(e)l(c)l(ause)365 3004 +y(the)f(maximal)h(value)f Fm(A)1115 3016 y Fu(max)1272 +3004 y Fl(assigne)l(d)g(to)g(an)g(e)l(dge)g Fm(e)23 b +Fk(2)h Fm(E)5 b Fv(\()p Fm(G)2303 3016 y Fu(crit)2408 +3004 y Fv(\))30 b Fl(is)g(at)f(most)h Fm(n)18 b Fk(\000)g +Fv(1)p Fl(.)490 3169 y Fv(Let)32 b(us)h(assume)f(for)f(the)i(momen)n(t) +g(that)f Fm(N)1903 3181 y Fj(t)1963 3169 y Fk(\024)f +Fm(N)2126 3181 y Fu(b)r(edges)2324 3169 y Fv(.)h(Then,)h(from)f +(Theorems)24 b(1)365 3269 y(and)h(2,)34 b(w)n(e)g(ha)n(v)n(e)f +Fm(A)1012 3281 y Fu(max)1173 3269 y Fk(\024)g Fv(2)p +Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1500 3281 y Fu(crit)1605 +3269 y Fv(\))p Fk(j)k(\000)f Fv(3)g(+)h(2)p Fm(N)2031 +3281 y Fj(t)2093 3269 y Fk(\024)34 b Fv(2)p Fk(j)p Fm(V)18 +b Fv(\()p Fm(G)2420 3281 y Fu(crit)2525 3269 y Fv(\))p +Fk(j)23 b(\000)g Fv(3)f(+)h(2)p Fm(N)2952 3281 y Fu(b)r(edges)3183 +3269 y Fk(\024)365 3369 y Fv(2)p Fk(j)p Fm(V)c Fv(\()p +Fm(G)594 3381 y Fu(crit)699 3369 y Fv(\))p Fk(j)9 b(\000)g +Fv(3)g(+)g(2\()p Fk(j)p Fm(E)c Fv(\()p Fm(G)1222 3381 +y Fu(crit)1326 3369 y Fv(\))p Fk(j)k(\000)g(j)p Fm(V)19 +b Fv(\()p Fm(G)1651 3381 y Fu(crit)1756 3369 y Fv(\))p +Fk(j)9 b Fv(+)g(1\))23 b Fk(\024)g Fv(2)p Fk(j)p Fm(E)5 +b Fv(\()p Fm(G)2307 3381 y Fu(crit)2411 3369 y Fv(\))p +Fk(j)k(\000)g Fv(1.)23 b(As)g(b)n(y)g(h)n(yp)r(othesis)365 +3468 y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)551 3480 y Fu(crit)656 +3468 y Fv(\))p Fk(j)24 b(\024)e Fm(n=)p Fv(2,)27 b(w)n(e)g(ha)n(v)n(e)g +Fm(A)1382 3480 y Fu(max)1532 3468 y Fk(\024)22 b Fm(n)d +Fk(\000)f Fv(1,)27 b(as)g(required.)490 3568 y Fl(In)33 +b(the)h(mathematic)l(al)h(analysis)g(of)f(our)g(algorithm,)h(what)g(is) +f(left)g(op)l(en)g(is)g(a)g(single)365 3667 y(pr)l(oblem:)e(pr)l(ove)e +(that)g Fm(N)1160 3679 y Fj(t)1212 3667 y Fk(\024)23 +b Fm(N)1367 3679 y Fu(b)r(edges)1564 3667 y Fl(.)1589 +3637 y Fu(4)490 3767 y Fv(W)-7 b(e)26 b(no)n(w)e(sho)n(w)h(exp)r +(erimen)n(tal)g(evidence)g(that)g Fm(N)2075 3779 y Fj(t)2127 +3767 y Fk(\024)e Fm(N)2282 3779 y Fu(b)r(edges)2480 3767 +y Fv(.)i(Considering)f(Eqs)g(\(1\))365 3867 y(and)h(\(2\),)g(the)g(exp) +r(ected)g(v)-5 b(alues)24 b(for)g Fk(j)p Fm(V)19 b Fv(\()p +Fm(G)1716 3879 y Fu(crit)1821 3867 y Fv(\))p Fk(j)24 +b Fv(and)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2245 3879 y Fu(crit)2350 +3867 y Fv(\))p Fk(j)25 b Fv(for)f Fm(c)f Fv(=)g(1)p Fm(:)p +Fv(15)g(are)g(0)p Fm(:)p Fv(401)p Fm(n)365 3966 y Fv(and)37 +b(0)p Fm(:)p Fv(501)p Fm(n)p Fv(,)e(resp)r(ectiv)n(ely)-7 +b(.)36 b(F)-7 b(rom)37 b(Theorem)24 b(1,)36 b Fm(N)2057 +3978 y Fu(b)r(edges)2293 3966 y Fv(=)j(0)p Fm(:)p Fv(501)p +Fm(n)22 b Fk(\000)j Fv(0)p Fm(:)p Fv(401)p Fm(n)d Fv(+)i(1)39 +b(=)365 4066 y(0)p Fm(:)p Fv(1)p Fm(n)19 b Fv(+)h(1.)30 +b(T)-7 b(able)24 b(3)30 b(presen)n(ts)f(the)h(maximal)g(v)-5 +b(alue)30 b(of)g Fm(N)2210 4078 y Fj(t)2269 4066 y Fv(obtained)f +(during)h(10,000)e(ex-)365 4166 y(ecutions)h(of)g(the)h(algorithm)e +(for)h(di\013eren)n(t)g(sizes)g(of)g Fm(S)5 b Fv(.)29 +b(The)g(maximal)g(v)-5 b(alue)29 b(of)g Fm(N)3057 4178 +y Fj(t)3115 4166 y Fv(w)n(as)365 4265 y(alw)n(a)n(ys)d(smaller)h(than)g +Fm(N)1178 4277 y Fu(b)r(edges)1399 4265 y Fv(=)22 b(0)p +Fm(:)p Fv(1)p Fm(n)c Fv(+)g(1)27 b(and)g(tends)h(to)g(0)p +Fm(:)p Fv(059)p Fm(n)d Fv(for)i Fm(n)c Fk(\025)g Fv(1)p +Fm(;)p Fv(000)p Fm(;)n Fv(000.)365 4430 y Fg(Time)e(Complexit)m(y)-8 +b(.)54 b Fv(W)-7 b(e)20 b(no)n(w)e(sho)n(w)g(that)h(the)g(time)g +(complexit)n(y)f(of)h(determining)25 b Fm(g)s Fv(\()p +Fm(v)s Fv(\))365 4530 y(for)d(all)g(critical)f(v)n(ertices)j +Fm(x)f Fk(2)h Fm(V)19 b Fv(\()p Fm(G)1479 4542 y Fu(crit)1584 +4530 y Fv(\))j(is)g Fm(O)r Fv(\()p Fk(j)p Fm(V)e Fv(\()p +Fm(G)2001 4542 y Fu(crit)2106 4530 y Fv(\))p Fk(j)p Fv(\))k(=)e +Fm(O)r Fv(\()p Fm(n)p Fv(\).)h(F)-7 b(or)22 b(eac)n(h)f(unassigned)365 +4630 y(v)n(ertex)d Fm(v)s Fv(,)h(the)h(adjacency)e(list)h(of)g +Fm(v)s Fv(,)g(whic)n(h)g(w)n(e)g(call)f(Adj\()p Fm(v)s +Fv(\),)j(m)n(ust)e(b)r(e)g(tra)n(v)n(ersed)e(to)i(collect)365 +4729 y(the)25 b(set)f Fm(Y)43 b Fv(of)24 b(adjacen)n(t)g(v)n(ertices)f +(that)i(ha)n(v)n(e)e(already)g(b)r(een)h(assigned)f(a)h(v)-5 +b(alue.)24 b(Then,)h(for)365 4829 y(eac)n(h)g(v)n(ertex)g(in)h +Fm(Y)18 b Fv(,)26 b(w)n(e)g(c)n(hec)n(k)e(if)j(the)f(curren)n(t)e +(candidate)i(v)-5 b(alue)25 b Fm(x)i Fv(is)e(forbidden)h(b)r(ecause)365 +4929 y(setting)32 b Fm(g)s Fv(\()p Fm(v)s Fv(\))d(=)g +Fm(x)i Fv(w)n(ould)g(create)f(t)n(w)n(o)h(edges)f(with)i(the)g(same)e +(endp)r(oin)n(t)i(sum.)f(Finally)-7 b(,)p 365 5002 473 +4 v 382 5056 a Ft(4)442 5088 y Fs(Bollob\023)-38 b(as)24 +b(and)e(Pikh)n(urk)n(o)i([2])e(ha)n(v)n(e)g(in)n(v)n(estigated)g(a)g(v) +n(ery)f(close)i(v)n(ertex)e(lab)r(elling)i(problem)f(for)442 +5179 y(random)k(graphs.)g(Ho)n(w)n(ev)n(er,)g(their)g(in)n(terest)f(w)n +(as)i(on)f(denser)f(random)h(graphs,)g(and)g(it)f(seems)442 +5270 y(that)30 b(di\013eren)n(t)f(metho)r(ds)h(will)h(ha)n(v)n(e)f(to)g +(b)r(e)f(used)h(to)g(attac)n(k)g(the)f(sparser)i(case)g(that)e(w)n(e)i +(are)442 5362 y(in)n(terested)26 b(in)f(here.)p eop end +%%Page: 10 10 +TeXDict begin 10 9 bop 1595 391 1054 4 v 1593 482 4 92 +v 1739 455 a Fo(n)p 1928 482 V 157 w Fs(Maximal)26 b(v)l(alue)g(of)g +Fo(N)2608 463 y Fc(t)p 2647 482 V 1595 485 1054 4 v 1593 +577 4 92 v 1656 549 a Fs(10)p Fo(;)q Fs(000)p 1928 577 +V 310 w(0)p Fo(:)p Fs(067)p Fo(n)p 2647 577 V 1593 668 +V 1637 641 a Fs(100)p Fo(;)q Fs(000)p 1928 668 V 291 +w(0)p Fo(:)p Fs(061)p Fo(n)p 2647 668 V 1593 759 V 1607 +732 a Fs(1)p Fo(;)q Fs(000)p Fo(;)q Fs(000)p 1927 759 +V 261 w(0)p Fo(:)p Fs(059)p Fo(n)p 2647 759 V 1593 851 +V 1607 823 a Fs(2)p Fo(;)q Fs(000)p Fo(;)q Fs(000)p 1927 +851 V 261 w(0)p Fo(:)p Fs(059)p Fo(n)p 2647 851 V 1593 +1002 4 152 v 1752 909 a Fs(.)1752 942 y(.)1752 975 y(.)p +1928 1002 V 2278 909 a(.)2278 942 y(.)2278 975 y(.)p +2647 1002 V 1595 1006 1054 4 v 1028 1149 a Fp(T)-7 b(able)28 +b(3.)d Fs(The)h(maximal)h(v)l(alue)e(of)h Fo(N)2181 1157 +y Fc(t)2235 1149 y Fs(for)h(di\013eren)n(t)e(n)n(um)n(b)r(er)g(of)h +(URLs)681 1292 y Fv(the)38 b(edge)f(linking)h Fm(v)j +Fv(and)d Fm(u)p Fv(,)f(for)g(all)h Fm(u)h Fk(2)i Fm(Y)18 +b Fv(,)38 b(is)g(asso)r(ciated)e(with)j(the)f(address)e(that)681 +1392 y(corresp)r(onds)d(to)j(the)g(sum)f(of)h(its)f(endp)r(oin)n(ts.)h +(Let)g Fm(d)2424 1404 y Fu(crit)2564 1392 y Fv(=)g(2)p +Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2893 1404 y Fu(crit)2998 +1392 y Fv(\))p Fk(j)p Fm(=)p Fk(j)p Fm(V)19 b Fv(\()p +Fm(G)3282 1404 y Fu(crit)3386 1392 y Fv(\))p Fk(j)36 +b Fv(b)r(e)681 1492 y(the)27 b(a)n(v)n(erage)d(degree)i(of)h +Fm(G)1537 1504 y Fu(crit)1641 1492 y Fv(,)g(note)g(that)e +Fk(j)p Fm(Y)19 b Fk(j)k(\024)g(j)p Fv(Adj\()p Fm(v)s +Fv(\))p Fk(j)p Fv(,)28 b(and)f(supp)r(ose)f(for)h(simplicit)n(y)681 +1591 y(that)e Fk(j)p Fv(Adj)q(\()p Fm(v)s Fv(\))p Fk(j)i +Fv(=)e Fm(O)r Fv(\()p Fm(d)1402 1603 y Fu(crit)1508 1591 +y Fv(\).)k(Then,)h(putting)g(all)f(these)g(together,)g(w)n(e)g(see)g +(that)g(the)h(time)681 1691 y(complexit)n(y)d(of)g(this)h(pro)r(cedure) +f(is)1051 1849 y Fm(C)6 b Fv(\()p Fk(j)p Fm(V)19 b Fv(\()p +Fm(G)1335 1861 y Fu(crit)1440 1849 y Fv(\))p Fk(j)p Fv(\))24 +b(=)1638 1787 y Fi(P)1726 1874 y Fj(v)r Ff(2)p Fj(V)14 +b Fu(\()p Fj(G)1937 1882 y Fd(crit)2028 1874 y Fu(\))2072 +1782 y Fi(\002)2125 1849 y Fk(j)p Fv(Adj)q(\()p Fm(v)s +Fv(\))p Fk(j)19 b Fv(+)f(\()p Fm(I)7 b Fv(\()p Fm(v)s +Fv(\))20 b Fk(\002)e(j)p Fm(Y)h Fk(j)p Fv(\))g(+)f Fk(j)p +Fm(Y)g Fk(j)3158 1782 y Fi(\003)1295 1984 y Fk(\024)1383 +1922 y Fi(P)1471 2009 y Fj(v)r Ff(2)p Fj(V)c Fu(\()p +Fj(G)1682 2017 y Fd(crit)1773 2009 y Fu(\))1803 1984 +y Fv(\(2)k(+)g Fm(I)7 b Fv(\()p Fm(v)s Fv(\)\))p Fk(j)p +Fv(Adj)r(\()p Fm(v)s Fv(\))p Fk(j)24 b Fv(=)f(4)p Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)2788 1996 y Fu(crit)2893 1984 y +Fv(\))p Fk(j)18 b Fv(+)g Fm(O)r Fv(\()p Fm(N)3213 1996 +y Fj(t)3243 1984 y Fm(d)3286 1996 y Fu(crit)3391 1984 +y Fv(\))p Fm(:)681 2153 y Fv(As)38 b Fm(d)857 2165 y +Fu(crit)1002 2153 y Fv(=)i(2)25 b Fk(\002)g Fv(0)p Fm(:)p +Fv(501)p Fm(n=)p Fv(0)p Fm(:)p Fv(401)p Fm(n)36 b Fk(')k +Fv(2)p Fm(:)p Fv(499)d(\(a)h(constan)n(t\))f(w)n(e)h(ha)n(v)n(e)f +Fm(O)r Fv(\()p Fk(j)p Fm(E)5 b Fv(\()p Fm(G)3264 2165 +y Fu(crit)3370 2153 y Fv(\))p Fk(j)p Fv(\))41 b(=)681 +2253 y Fm(O)r Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)966 +2265 y Fu(crit)1071 2253 y Fv(\))p Fk(j)p Fv(\).)39 b(Supp)r(osing)g +(that)g Fm(N)1889 2265 y Fj(t)1960 2253 y Fk(\024)i Fm(N)2133 +2265 y Fu(b)r(edges)2330 2253 y Fv(,)e(w)n(e)g(ha)n(v)n(e,)f(from)g +(Theorem)24 b(1,)38 b(that)681 2352 y Fm(N)748 2364 y +Fj(t)800 2352 y Fk(\024)22 b(j)p Fm(E)5 b Fv(\()p Fm(G)1073 +2364 y Fu(crit)1178 2352 y Fv(\))p Fk(j\000j)p Fm(V)19 +b Fv(\()p Fm(G)1485 2364 y Fu(crit)1590 2352 y Fv(\))p +Fk(j)p Fv(+1)k(=)f Fm(O)r Fv(\()p Fk(j)p Fm(E)5 b Fv(\()p +Fm(G)2145 2364 y Fu(crit)2251 2352 y Fv(\))p Fk(j)p Fv(\).)19 +b(W)-7 b(e)19 b(conclude)f(that)h Fm(C)6 b Fv(\()p Fk(j)p +Fm(V)19 b Fv(\()p Fm(G)3301 2364 y Fu(crit)3406 2352 +y Fv(\))p Fk(j)p Fv(\))24 b(=)681 2452 y Fm(O)r Fv(\()p +Fk(j)p Fm(E)5 b Fv(\()p Fm(G)964 2464 y Fu(crit)1070 +2452 y Fv(\))p Fk(j)p Fv(\))23 b(=)g Fm(O)r Fv(\()p Fk(j)p +Fm(V)d Fv(\()p Fm(G)1553 2464 y Fu(crit)1658 2452 y Fv(\))p +Fk(j)p Fv(\).)h(As)g Fk(j)p Fm(V)e Fv(\()p Fm(G)2092 +2464 y Fu(crit)2197 2452 y Fv(\))p Fk(j)24 b(\024)e(j)p +Fm(V)d Fv(\()p Fm(G)p Fv(\))p Fk(j)j Fv(and)f Fk(j)p +Fm(V)e Fv(\()p Fm(G)p Fv(\))p Fk(j)24 b Fv(=)e Fm(cn)p +Fv(,)f(the)g(time)681 2551 y(required)26 b(to)i(determine)d +Fm(g)30 b Fv(on)d(the)h(critical)f(v)n(ertices)g(is)g +Fm(O)r Fv(\()p Fm(n)p Fv(\).)681 2725 y Fn(4)112 b(Exp)s(erimen)m(tal) +38 b(Results)681 2871 y Fv(W)-7 b(e)40 b(no)n(w)g(presen)n(t)g(some)f +(exp)r(erimen)n(tal)h(results.)g(The)g(same)g(exp)r(erimen)n(ts)g(w)n +(ere)f(run)681 2971 y(with)c(our)f(algorithm)f(and)h(the)h(algorithm)f +(due)g(to)h(Czec)n(h,)f(Ha)n(v)-5 b(as)34 b(and)g(Ma)5 +b(jewski)24 b([4],)681 3070 y(referred)36 b(to)i(as)f(CHM)h(algorithm.) +e(The)i(t)n(w)n(o)e(algorithms)h(w)n(ere)f(implemen)n(ted)j(in)e(the) +681 3170 y(C)32 b(language)e(and)i(are)f(a)n(v)-5 b(ailable)30 +b(at)i Fb(https://sourcefor)o(ge)o(.ne)o(t/)o(pro)o(je)o(cts)o(/c)o(mp) +o(h/)p Fv(.)681 3269 y(Our)18 b(data)g(consists)f(of)i(a)f(collection)g +(of)g(100)g(million)g(univ)n(erse)g(resource)e(lo)r(cations)i(\(URLs\)) +681 3369 y(collected)h(from)h(the)g(W)-7 b(eb.)21 b(The)f(a)n(v)n +(erage)d(length)j(of)g(a)f(URL)h(in)h(the)f(collection)f(is)h(63)f(b)n +(ytes.)681 3469 y(All)i(exp)r(erimen)n(ts)g(w)n(ere)f(carried)g(on)h(a) +f(computer)h(running)g(the)g(Lin)n(ux)g(op)r(erating)f(system,)681 +3568 y(v)n(ersion)26 b(2.6.7,)g(with)i(a)g(2.4)e(gigahertz)g(pro)r +(cessor)g(and)h(4)g(gigab)n(ytes)f(of)i(main)f(memory)-7 +b(.)805 3668 y(T)g(able)25 b(4)f(presen)n(ts)g(the)i(main)f(c)n +(haracteristics)d(of)j(the)g(t)n(w)n(o)f(algorithms.)g(The)h(n)n(um)n +(b)r(er)681 3768 y(of)33 b(edges)g(in)h(the)g(graph)e +Fm(G)h Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))34 b(is)25 +b Fk(j)p Fm(S)5 b Fk(j)32 b Fv(=)h Fm(n)p Fv(,)g(the)h(n)n(um)n(b)r(er) +f(of)h(k)n(eys)e(in)i(the)g(input)681 3867 y(set)25 b +Fm(S)5 b Fv(.)24 b(The)g(n)n(um)n(b)r(er)g(of)h(v)n(ertices)e(of)h +Fm(G)h Fv(is)f(equal)g(to)g(1)p Fm(:)p Fv(15)p Fm(n)f +Fv(and)i(2)p Fm(:)p Fv(09)p Fm(n)d Fv(for)i(our)g(algorithm)681 +3967 y(and)j(the)g(CHM)h(algorithm,)e(resp)r(ectiv)n(ely)-7 +b(.)26 b(This)h(measure)f(is)h(related)g(to)g(the)g(amoun)n(t)g(of)681 +4066 y(space)20 b(to)h(store)f(the)i(arra)n(y)d Fm(g)s +Fv(.)i(This)g(impro)n(v)n(es)e(the)j(space)e(required)h(to)g(store)f(a) +h(function)g(in)681 4166 y(our)i(algorithm)h(to)g(55\045)g(of)g(the)h +(space)e(required)h(b)n(y)g(the)h(CHM)f(algorithm.)g(The)g(n)n(um)n(b)r +(er)681 4266 y(of)33 b(critical)f(edges)h(is)1389 4233 +y Fu(1)p 1389 4247 34 4 v 1389 4294 a(2)1433 4266 y Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)34 b Fv(and)f(0,)f(for)h(our)f +(algorithm)g(and)h(the)g(CHM)h(algorithm,)681 4365 y(resp)r(ectiv)n +(ely)-7 b(.)31 b(Our)g(algorithm)g(generates)f(random)h(graphs)f(that)j +(necessarily)d(con)n(tains)681 4465 y(cycles)36 b(and)g(the)h(CHM)g +(algorithm)f(generates)f(acyclic)h(random)f(graphs.)h(Finally)-7 +b(,)36 b(the)681 4565 y(CHM)c(algorithm)e(generates)g(order)g +(preserving)g(functions)h(while)h(our)f(algorithm)f(do)r(es)681 +4664 y(not)d(preserv)n(e)f(order.)805 4764 y(T)-7 b(able)25 +b(5)39 b(presen)n(ts)g(time)i(measuremen)n(ts.)d(All)j(times)f(are)f +(in)h(seconds.)f(The)h(table)681 4863 y(en)n(tries)31 +b(represen)n(t)g(a)n(v)n(erages)d(o)n(v)n(er)j(50)g(trials.)g(The)h +(column)g(lab)r(elled)g(as)f Fm(N)3140 4875 y Fj(i)3199 +4863 y Fv(represen)n(ts)p eop end +%%Page: 11 11 +TeXDict begin 11 10 bop 1215 391 1182 4 v 1213 508 4 +118 v 1260 508 a Fs(Characteristics)p 1804 508 V 1914 +455 a(Algorithms)p 2395 508 V 1805 512 592 4 v 1213 600 +4 92 v 1804 600 V 1911 572 a(Our)p 2148 600 V 138 w(CHM)p +2395 600 V 1215 603 1182 4 v 1213 694 4 92 v 1494 667 +a Fo(c)p 1804 694 V 382 w Fs(1.15)p 2148 694 V 161 w(2.09)p +2395 694 V 1213 786 V 1399 758 a Fr(j)p Fo(E)t Fs(\()p +Fo(G)p Fs(\))p Fr(j)p 1804 786 V 332 w Fo(n)p 2148 786 +V 250 w(n)p 2395 786 V 1213 877 V 1306 850 a Fr(j)p Fo(V)17 +b Fs(\()p Fo(G)p Fs(\))p Fr(j)22 b Fs(=)f Fr(j)p Fo(g)s +Fr(j)p 1804 877 V 223 w Fo(cn)p 2148 877 V 217 w(cn)p +2395 877 V 1213 968 V 1350 941 a Fr(j)p Fo(E)t Fs(\()p +Fo(G)1522 949 y Ft(crit)1619 941 y Fs(\))p Fr(j)p 1804 +968 V 147 w Fs(0)p Fo(:)p Fs(5)p Fr(j)p Fo(E)t Fs(\()p +Fo(G)p Fs(\))p Fr(j)p 2147 968 V 117 w Fs(0)p 2395 968 +V 1213 1060 V 1480 1032 a Fo(G)p 1804 1060 V 345 w Fs(cyclic)p +2148 1060 V 91 w(acyclic)p 2394 1060 V 1213 1151 V 1227 +1124 a(Order)k(preserving)p 1803 1151 V 144 w(no)p 2148 +1151 V 204 w(y)n(es)p 2395 1151 V 1215 1154 1182 4 v +1001 1298 a Fp(T)-7 b(able)28 b(4.)d Fs(Main)i(c)n(haracteristics)g(of) +g(the)e(algorithms)p 471 1482 2670 4 v 469 1599 4 118 +v 654 1599 a Fo(n)p 881 1599 V 1145 1569 a Fs(Our)g(algorithm)p +1888 1599 V 529 w(CHM)i(algorithm)p 2954 1599 V 2967 +1561 a(Gain)p 3139 1599 V 883 1603 1007 4 v 1889 1603 +1067 4 v 469 1709 4 110 v 881 1709 V 919 1694 a Fo(N)980 +1702 y Fc(i)1054 1694 y Fs(Map+Ord)c(Searc)n(h)41 b(T)-6 +b(otal)p 1888 1709 V 67 w Fo(N)1986 1702 y Fc(i)2061 +1694 y Fs(Map+Ord)22 b(Searc)n(h)72 b(T)-6 b(otal)p 2954 +1709 V 2986 1655 a(\(\045\))p 3139 1709 V 471 1712 2670 +4 v 469 1803 4 92 v 521 1776 a(1,562,500)p 881 1803 V +65 w(2.28)129 b(8.54)170 b(2.37)85 b(10.91)p 1888 1803 +V 45 w(2.70)109 b(14.56)151 b(1.57)116 b(16.13)p 2954 +1803 V 117 w(48)p 3139 1803 V 469 1895 V 521 1867 a(3,125,000)p +881 1895 V 65 w(2.16)110 b(15.92)151 b(4.88)85 b(20.80)p +1888 1895 V 45 w(2.85)109 b(30.36)151 b(3.20)116 b(33.56)p +2954 1895 V 117 w(61)p 3139 1895 V 469 1986 V 521 1959 +a(6,250,000)p 881 1986 V 65 w(2.20)110 b(33.09)132 b(10.48)66 +b(43.57)p 1888 1986 V 45 w(2.90)109 b(62.26)151 b(6.76)116 +b(69.02)p 2954 1986 V 117 w(58)p 3139 1986 V 469 2077 +V 502 2050 a(12,500,000)p 881 2077 V 46 w(2.00)110 b(63.26)132 +b(23.04)66 b(86.30)p 1888 2077 V 45 w(2.60)90 b(117.99)113 +b(14.94)77 b(132.92)p 2954 2077 V 99 w(54)p 3139 2077 +V 469 2169 V 502 2141 a(25,000,000)p 881 2169 V 46 w(2.00)90 +b(130.79)114 b(51.55)47 b(182.34)p 1885 2169 V 26 w(2.80)90 +b(262.05)113 b(33.68)77 b(295.73)p 2954 2169 V 99 w(62)p +3139 2169 V 469 2260 V 502 2233 a(50,000,000)p 881 2260 +V 46 w(2.07)90 b(273.75)k(114.12)29 b(387.87)p 1885 2260 +V 26 w(2.90)90 b(577.59)113 b(73.97)77 b(651.56)p 2954 +2260 V 99 w(68)p 3139 2260 V 469 2351 V 483 2324 a(100,000,000)p +877 2351 V 27 w(2.07)90 b(567.47)k(243.13)29 b(810.60)p +1885 2351 V 26 w(2.80)60 b(1,131.06)65 b(157.23)29 b(1,288.29)p +2951 2351 V 69 w(59)p 3139 2351 V 471 2355 2670 4 v 480 +2504 a Fg(T)-8 b(able)32 b(5.)27 b Fv(Time)h(measuremen)n(ts)f(for)g +(our)f(algorithm)h(and)g(the)h(CHM)g(algorithm)365 2734 +y(the)j(n)n(um)n(b)r(er)f(of)g(iterations)f(to)h(generate)f(the)i +(random)e(graph)g Fm(G)h Fv(in)h(the)f(mapping)g(step)365 +2833 y(of)k(the)f(algorithms.)g(The)g(next)h(columns)f(represen)n(t)f +(the)i(run)f(times)h(for)f(the)h(mapping)365 2933 y(plus)27 +b(ordering)d(steps)i(together)g(and)g(the)g(searc)n(hing)f(step)h(for)g +(eac)n(h)f(algorithm.)g(The)i(last)365 3033 y(column)h(represen)n(ts)e +(the)i(p)r(ercen)n(t)f(gain)g(of)h(our)f(algorithm)f(o)n(v)n(er)g(the)i +(CHM)g(algorithm.)490 3145 y(The)e(mapping)h(step)f(of)h(the)g(new)g +(algorithm)e(is)h(faster)g(b)r(ecause)h(the)f(exp)r(ected)h(n)n(um-)365 +3244 y(b)r(er)34 b(of)f(iterations)g(in)h(the)g(mapping)f(step)h(to)g +(generate)e Fm(G)i Fv(are)f(2.13)f(and)i(2.92)e(for)h(our)365 +3344 y(algorithm)26 b(and)g(the)h(CHM)g(algorithm,)f(resp)r(ectiv)n +(ely)-7 b(.)26 b(The)h(graph)e Fm(G)i Fv(generated)f(b)n(y)g(our)365 +3444 y(algorithm)j(has)h(1)p Fm(:)p Fv(15)p Fm(n)f Fv(v)n(ertices,)g +(against)g(2)p Fm(:)p Fv(09)p Fm(n)f Fv(for)i(the)h(CHM)f(algorithm.)f +(These)h(t)n(w)n(o)365 3543 y(facts)h(mak)n(e)f(our)h(algorithm)e +(faster)i(in)g(the)h(mapping)e(step.)i(The)f(ordering)e(step)i(of)g +(our)365 3643 y(algorithm)36 b(is)h(appro)n(ximately)e(equal)h(to)h +(the)h(time)f(to)g(c)n(hec)n(k)f(if)h Fm(G)h Fv(is)e(acyclic)g(for)h +(the)365 3743 y(CHM)g(algorithm.)d(The)j(searc)n(hing)d(step)i(of)g +(the)g(CHM)g(algorithm)f(is)h(faster,)f(but)i(the)365 +3842 y(total)c(time)h(of)f(our)f(algorithm)g(is,)h(on)g(a)n(v)n(erage,) +d(appro)n(ximately)i(59\045)g(faster)h(than)g(the)365 +3942 y(CHM)28 b(algorithm.)490 4054 y(The)j(exp)r(erimen)n(tal)f +(results)g(fully)i(bac)n(ks)d(the)i(theoretical)f(results.)h(It)g(is)g +(imp)r(ortan)n(t)365 4154 y(to)e(notice)g(the)g(times)g(for)f(the)h +(searc)n(hing)e(step:)i(for)g(b)r(oth)g(algorithms)e(they)i(are)f(not)h +(the)365 4253 y(dominan)n(t)e(times,)g(and)g(the)g(exp)r(erimen)n(tal)f +(results)g(clearly)g(sho)n(w)g(a)g(linear)g(b)r(eha)n(vior)g(for)365 +4353 y(the)i(searc)n(hing)e(step.)490 4465 y(W)-7 b(e)27 +b(no)n(w)g(presen)n(t)g(a)g(heuristic)g(that)g(reduces)g(the)h(space)e +(requiremen)n(t)g(to)i(an)n(y)e(giv)n(en)365 4565 y(v)-5 +b(alue)22 b(b)r(et)n(w)n(een)f(1)p Fm(:)p Fv(15)p Fm(n)g +Fv(w)n(ords)f(and)h(0)p Fm(:)p Fv(93)p Fm(n)f Fv(w)n(ords.)h(The)h +(heuristic)f(reuses,)g(when)h(p)r(ossible,)365 4664 y(the)41 +b(set)g(of)g Fm(x)g Fv(v)-5 b(alues)40 b(that)h(caused)f(reassignmen)n +(ts,)f(just)i(b)r(efore)g(trying)f Fm(x)27 b Fv(+)g(1)40 +b(\(see)365 4764 y(Section)25 b(3.3\).)37 b(Decreasing)e(the)j(v)-5 +b(alue)36 b(of)h Fm(c)g Fv(leads)g(to)g(an)f(increase)g(in)h(the)h(n)n +(um)n(b)r(er)e(of)365 4863 y(iterations)e(to)g(generate)f +Fm(G)p Fv(.)i(F)-7 b(or)34 b(example,)g(for)g Fm(c)g +Fv(=)g(1)g(and)g Fm(c)g Fv(=)g(0)p Fm(:)p Fv(93,)g(the)g(analytical)p +eop end +%%Page: 12 12 +TeXDict begin 12 11 bop 929 391 2386 4 v 927 508 4 118 +v 1092 508 a Fo(n)p 1300 508 V 1415 478 a Fs(Our)25 b(algorithm)i +Fo(c)22 b Fs(=)f(1)p Fo(:)p Fs(00)p 2307 508 V 227 w(Our)k(algorithm)i +Fo(c)22 b Fs(=)f(0)p Fo(:)p Fs(93)p 3313 508 V 1302 512 +1007 4 v 2308 512 V 927 610 4 103 v 1300 610 V 1338 596 +a Fo(N)1399 604 y Fc(i)1473 596 y Fs(Map+Ord)i(Searc)n(h)41 +b(T)-6 b(otal)p 2307 610 V 67 w Fo(N)2405 604 y Fc(i)2480 +596 y Fs(Map+Ord)23 b(Searc)n(h)41 b(T)-6 b(otal)p 3313 +610 V 929 614 2386 4 v 927 705 4 92 v 941 678 a(12,500,000)p +1297 705 V 27 w(2.78)109 b(76.68)132 b(25.06)47 b(101.74)p +2304 705 V 26 w(3.04)109 b(76.39)132 b(25.80)48 b(102.19)p +3311 705 V 929 708 2386 4 v 681 857 a Fg(T)-8 b(able)22 +b(6.)d Fv(Time)h(measuremen)n(ts)e(for)h(our)g(tuned)h(algorithm)e +(with)i Fm(c)j Fv(=)g(1)p Fm(:)p Fv(00)18 b(and)h Fm(c)k +Fv(=)g(0)p Fm(:)p Fv(93)681 1013 y(exp)r(ected)d(n)n(um)n(b)r(er)f(of)h +(iterations)f(are)g(2)p Fm(:)p Fv(72)f(and)i(3)p Fm(:)p +Fv(17,)e(resp)r(ectiv)n(ely)h(\(for)h Fm(n)j Fv(=)f(12)p +Fm(;)o Fv(500)p Fm(;)o Fv(000,)681 1112 y(the)d(n)n(um)n(b)r(er)g(of)f +(iterations)g(are)g(2.78)g(for)g Fm(c)23 b Fv(=)f(1)d(and)f(3.04)g(for) +g Fm(c)23 b Fv(=)g(0)p Fm(:)p Fv(93\).)18 b(T)-7 b(able)24 +b(6)19 b(presen)n(ts)681 1212 y(the)24 b(total)f(times)h(to)g +(construct)f(a)h(function)g(for)f Fm(n)g Fv(=)g(12)p +Fm(;)o Fv(500)p Fm(;)n Fv(000,)g(with)h(an)g(increase)e(from)681 +1312 y(86)p Fm(:)p Fv(31)e(seconds)h(for)g Fm(c)i Fv(=)g(1)p +Fm(:)p Fv(15)d(\(see)i(T)-7 b(able)24 b(5\))e(to)g(101)p +Fm(:)p Fv(74)d(seconds)i(for)h Fm(c)h Fv(=)f(1)g(and)f(to)h(102)p +Fm(:)p Fv(19)681 1411 y(seconds)27 b(for)g Fm(c)c Fv(=)f(0)p +Fm(:)p Fv(93.)805 1511 y(Finally)-7 b(,)29 b(w)n(e)f(run)g(1,000,000)d +(ev)-5 b(aluations)28 b(of)g(the)h(function)g(generated)e(b)n(y)h(our)f +(algo-)681 1610 y(rithm)32 b(for)f(the)h(set)g(of)f(100)f(million)i +(URLs)g(and)f(it)i(to)r(ok)e(3.06)f(seconds.)h(An)h(equiv)-5 +b(alen)n(t)681 1710 y(time)28 b(w)n(as)e(obtained)i(for)f(the)h(CHM)g +(algorithm.)681 1888 y Fn(5)112 b(Conclusion)681 2037 +y Fv(W)-7 b(e)30 b(ha)n(v)n(e)e(presen)n(ted)h(a)g(practical)f(metho)r +(d)i(to)f(construct)g(minimal)h(p)r(erfect)f(hash)g(func-)681 +2137 y(tions)d(for)h(static)f(sets)h(whic)n(h)f(is)h(e\016cien)n(t)g +(and)g(ma)n(y)f(b)r(e)h(tuned)g(to)g(yield)g(a)f(function)h(with)681 +2237 y(a)g(v)n(ery)f(economical)h(description.)681 2456 +y Fn(References)719 2638 y Fs(1.)42 b(B.)26 b(Bollob\023)-38 +b(as.)37 b Fa(R)l(andom)27 b(gr)l(aphs)p Fs(,)h(v)n(olume)d(73)h(of)h +Fa(Cambridge)h(Studies)g(in)f(A)l(dvanc)l(e)l(d)j(Math-)820 +2730 y(ematics)p Fs(.)36 b(Cam)n(bridge)26 b(Univ)n(ersit)n(y)f(Press,) +i(Cam)n(bridge,)g(second)f(edition,)g(2001.)719 2821 +y(2.)42 b(B.)26 b(Bollob\023)-38 b(as)39 b(and)e(O.)25 +b(Pikh)n(urk)n(o.)67 b(In)n(teger)37 b(sets)g(with)h(prescrib)r(ed)f +(pairwise)h(di\013erences)820 2912 y(b)r(eing)26 b(distinct.)35 +b Fa(Eur)l(op)l(e)l(an)29 b(Journal)f(of)g(Combinatorics)p +Fs(.)35 b(T)-6 b(o)26 b(App)r(ear.)719 3004 y(3.)42 b(T.)26 +b(H.)i(Cormen,)h(C.)d(E.)j(Leiserson,)h(R.)24 b(L.)29 +b(Riv)n(est,)f(and)g(C.)d(Stein.)42 b Fa(Intr)l(o)l(duction)32 +b(to)e(A)n(lgo-)820 3095 y(rithms)p Fs(.)35 b(MIT)27 +b(Press,)g(second)e(edition,)i(2001.)719 3186 y(4.)42 +b(Z.J.)33 b(Czec)n(h,)g(G.)26 b(Ha)n(v)l(as,)32 b(and)g(B.S.)g(Ma)t +(jewski.)56 b(An)31 b(optimal)i(algorithm)h(for)f(generating)820 +3278 y(minimal)j(p)r(erfect)g(hash)f(functions.)62 b +Fa(Information)36 b(Pr)l(o)l(c)l(essing)i(L)l(etters)p +Fs(,)f(43\(5\):257{264,)820 3369 y(1992.)719 3460 y(5.)42 +b(Z.J.)35 b(Czec)n(h,)g(G.)26 b(Ha)n(v)l(as,)34 b(and)g(B.S.)g(Ma)t +(jewski.)62 b(F)-6 b(undamen)n(tal)33 b(study)g(p)r(erfect)i(hashing.) +820 3552 y Fa(The)l(or)l(etic)l(al)29 b(Computer)g(Scienc)l(e)p +Fs(,)e(182:1{143,)j(1997.)719 3643 y(6.)42 b(M.)26 b(Dietzfelbinger)j +(and)e(T.)f(Hagerup.)41 b(Simple)27 b(minimal)i(p)r(erfect)f(hashing)g +(in)g(less)h(space.)820 3734 y(In)k Fa(The)h(9th)h(Eur)l(op)l(e)l(an)h +(Symp)l(osium)f(on)f(A)n(lgorithms)h(\(ESA\),)f(volume)h(2161)g(of)e(L) +l(e)l(ctur)l(e)820 3826 y(Notes)c(in)e(Computer)i(Scienc)l(e)p +Fs(,)e(pages)f(109{120,)j(2001.)719 3917 y(7.)42 b(P)-6 +b(.)26 b(Erd})-38 b(os)32 b(and)g(A.)25 b(R)n(\023)-36 +b(en)n(yi.)53 b(On)32 b(random)g(graphs)h(I.)53 b Fa(Pub.)34 +b(Math.)f(Debr)l(e)l(c)l(en)p Fs(,)i(6:290{297,)820 4008 +y(1959.)719 4100 y(8.)42 b(P)-6 b(.)26 b(Erd})-38 b(os)28 +b(and)g(A.)d(R)n(\023)-36 b(en)n(yi.)41 b(On)27 b(the)h(ev)n(olution)g +(of)h(random)g(graphs.)42 b Fa(Magyar)31 b(T)-6 b(ud.)29 +b(A)n(kad.)820 4191 y(Mat.)f(Kutat\023)-39 b(o)29 b(Int.)e(K\177)-39 +b(ozl.)p Fs(,)26 b(5:17{61,)i(1960.)719 4282 y(9.)42 +b(E.A.)23 b(F)-6 b(o)n(x,)21 b(Q.F.)h(Chen,)g(and)f(L.S.)h(Heath.)33 +b(A)21 b(faster)i(algorithm)g(for)g(constructing)f(minimal)820 +4374 y(p)r(erfect)39 b(hash)e(functions.)71 b(In)37 b +Fa(Pr)l(o)l(c)l(e)l(e)l(dings)k(of)d(the)i(15th)f(A)n(nnual)g +(International)h(A)n(CM)820 4465 y(SIGIR)29 b(Confer)l(enc)l(e)i(on)e +(R)l(ese)l(ar)l(ch)i(and)f(Development)g(in)f(Information)g(R)l +(etrieval)p Fs(,)g(pages)820 4556 y(266{273,)g(1992.)681 +4648 y(10.)42 b(M.)26 b(L.)32 b(F)-6 b(redman,)32 b(J.)26 +b(Koml\023)-38 b(os,)33 b(and)e(E.)26 b(Szemer)n(\023)-36 +b(edi.)53 b(Storing)32 b(a)g(sparse)h(table)f(with)g(O\(1\))820 +4739 y(w)n(orst)27 b(case)g(access)g(time.)34 b Fa(J.)27 +b(A)n(CM)p Fs(,)f(31\(3\):538{544,)k(July)c(1984.)681 +4830 y(11.)42 b(G.)26 b(Ha)n(v)l(as,)31 b(B.S.)h(Ma)t(jewski,)i(N.C.)e +(W)-6 b(ormald,)32 b(and)f(Z.J.)i(Czec)n(h.)51 b(Graphs,)32 +b(h)n(yp)r(ergraphs)820 4922 y(and)k(hashing.)67 b(In)36 +b Fa(19th)i(International)h(Workshop)f(on)g(Gr)l(aph-The)l(or)l(etic)j +(Conc)l(epts)e(in)820 5013 y(Computer)d(Scienc)l(e)p +Fs(,)f(pages)f(153{165.)i(Springer)d(Lecture)g(Notes)h(in)f(Computer)g +(Science)820 5104 y(v)n(ol.)26 b(790,)i(1993.)681 5196 +y(12.)42 b(S.)25 b(Janson,)i(T.)i( )-25 b(L)q(uczak,)26 +b(and)f(A.)g(Ruci)r(\023)-41 b(nski.)35 b Fa(R)l(andom)28 +b(gr)l(aphs)p Fs(.)36 b(Wiley-In)n(ter.,)25 b(2000.)681 +5287 y(13.)42 b(P)-6 b(.)26 b(Erd})-38 b(os)21 b(and)f(A.)25 +b(R)n(\023)-36 b(en)n(yi.)32 b(On)20 b(the)h(strength)f(of)i +(connectedness)f(of)h(a)f(random)g(graph.)33 b Fa(A)l(cta)820 +5378 y(Mathematic)l(a)c(Scientia)f(Hungary)p Fs(,)g(12:261{267,)h +(1961.)681 5469 y(14.)42 b(R.)25 b(P)n(agh.)33 b(Hash)19 +b(and)g(displace:)h(E\016cien)n(t)f(ev)l(aluation)h(of)g(minimal)g(p)r +(erfect)g(hash)f(functions.)820 5561 y(In)25 b Fa(Workshop)k(on)f(A)n +(lgorithms)g(and)g(Data)h(Structur)l(es)p Fs(,)g(pages)d(49{54,)i +(1999.)p eop end +%%Page: 13 13 +TeXDict begin 13 12 bop 365 387 a Fs(15.)43 b(B.)26 b(Pittel)j(and)f +(N.)d(C.)k(W)-6 b(ormald.)44 b(Coun)n(ting)29 b(connected)f(graphs)h +(inside-out.)43 b Fa(Journal)31 b(of)505 479 y(Combinatorial)d(The)l +(ory)p Fs(.)35 b(T)-6 b(o)26 b(App)r(ear.)365 673 y Fn(6)112 +b(App)s(endix)p 361 875 5 52 v 361 828 52 5 v 413 828 +2788 5 v 3201 828 52 5 v 3249 875 5 52 v 361 953 5 75 +v 3247 953 V 410 931 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m(r)m(e)42 +b Fs(C)t(r)t(i)t(t)t(i)t(c)t(a)t(l)t(V)t(e)t(r)t(t)t(i)t(c)t(e)t(s)t(A) +t(s)t(s)5 b(i)t(g)g(n)t(m)t(e)t(n)t(t)15 b(\()5 b Fo(G)k +Fs(,)49 b Fo(G)2075 939 y Ft(crit)2181 931 y Fs(,)g Fo(g)12 +b Fs(,)49 b Fo(A)2428 939 y Fc(E)2484 931 y Fs(\))p 361 +1032 V 3247 1032 V 494 1009 a Fp(f)s(o)s(r)43 b Fo(v)24 +b Fr(2)e Fo(V)829 1017 y Ft(crit)960 1009 y Fp(d)-5 b(o)36 +b Fo(g)s Fs(\()p Fo(v)s Fs(\))h(:)o(=)j Fr(\0001)9 b +Fs(;)p 361 1110 V 3247 1110 V 492 1088 a Fo(A)550 1096 +y Fc(E)622 1088 y Fs(:=)22 b Fr(;)9 b Fs(;)p 361 1189 +V 3247 1189 V 494 1166 a Fp(f)s(o)s(r)43 b Fo(v)24 b +Fr(2)e Fo(V)829 1174 y Ft(crit)960 1166 y Fp(d)-5 b(o)45 +b(i)9 b(f)48 b Fo(g)s Fs(\()p Fo(v)s Fs(\))29 b(=)g Fr(\0001)36 +b Fp(t)m(h)m(e)m(n)42 b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s) +50 b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)2666 +1174 y Ft(crit)2772 1166 y Fs(,)g Fo(g)12 b Fs(,)49 b +Fo(A)3019 1174 y Fc(E)3079 1166 y Fs(\))9 b(;)p 361 1263 +V 3247 1263 V 361 1342 V 3247 1342 V 410 1319 a Fp(p)m(r)m(o)m(c)m(e)m +(d)m(u)m(r)m(e)43 b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s)50 +b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1640 +1327 y Ft(crit)1747 1319 y Fs(,)g Fo(g)12 b Fs(,)48 b +Fo(A)1993 1327 y Fc(E)2049 1319 y Fs(\))p 361 1420 V +3247 1420 V 492 1398 a Fo(x)38 b Fs(:)o(=)46 b(0)6 b(;)87 +b Fo(g)s Fs(\()p Fo(v)s Fs(\))37 b(:)o(=)j Fo(x)9 b Fs(;)84 +b(E)l(n)l(Q)l(u)l(e)l(u)l(e)40 b(\()5 b Fo(v)12 b Fs(,)49 +b Fo(Q)9 b Fs(\))g(;)p 361 1499 V 3247 1499 V 491 1476 +a Fp(w)o(h)o(i)o(l)o(e)38 b Fo(Q)21 b Fr(6)p Fs(=)g Fr(;)35 +b Fp(d)-5 b(o)p 361 1577 V 3247 1577 V 571 1555 a Fo(v)42 +b Fs(:)o(=)35 b(D)l(e)l(Q)l(u)l(e)l(u)l(e)42 b(\()5 b +Fo(Q)k Fs(\))g(;)p 361 1656 V 3247 1656 V 573 1633 a +Fp(f)s(o)s(r)43 b Fo(u)21 b Fr(2)h Fs(Adj)17 b(\(v\))33 +b Fp(a)-6 b(n)g(d)35 b Fo(g)s Fs(\()p Fo(u)p Fs(\))28 +b(=)i Fr(\0001)k Fp(d)-5 b(o)p 361 1734 V 3247 1734 V +650 1712 a Fo(Y)55 b Fs(:)o(=)40 b Fr(;)9 b Fs(;)p 361 +1813 V 3247 1813 V 653 1790 a Fp(f)s(o)s(r)42 b Fo(w)23 +b Fr(2)f Fs(Adj)17 b(\(u\))33 b Fp(a)-6 b(n)g(d)35 b +Fo(g)s Fs(\()p Fo(w)r Fs(\))j Fr(6)p Fs(=)i Fr(\0001)34 +b Fp(d)-5 b(o)35 b Fo(Y)56 b Fs(:)o(=)39 b Fo(Y)57 b +Fr([)39 b(f)p Fo(w)r Fr(g)9 b Fs(;)p 361 1887 V 3247 +1887 V 649 1865 a Fp(r)o(e)o(p)o(e)o(a)o(t)p 361 1962 +V 3247 1962 V 730 1940 a Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q(n)q(m)q(e)q(n)q +(t)39 b(:)o(=)44 b Fp(f)5 b(a)g(l)g(s)g(e)12 b Fs(;)88 +b Fo(x)39 b Fs(:)o(=)g Fo(x)29 b Fs(+)35 b(1)6 b(;)p +361 2037 V 3247 2037 V 732 2014 a Fp(f)s(o)s(r)42 b Fo(w)24 +b Fr(2)39 b Fo(Y)51 b Fp(a)-6 b(n)g(d)36 b Fs(R)q(e)q(a)q(s)q(s)q(i)q +(g)q(n)q(m)q(e)q(n)q(t)30 b(=)k Fp(f)5 b(a)g(l)g(s)g(e)36 +b(d)-5 b(o)p 361 2115 V 3247 2115 V 817 2093 a(i)9 b(f)49 +b Fs(\()p Fo(x)29 b Fs(+)g Fo(g)s Fs(\()p Fo(w)r Fs(\)\))20 +b Fr(\025)h Fo(m)36 b Fp(t)m(h)m(e)m(n)h Fs(restart)26 +b(mapping)g(step)9 b(;)p 361 2194 V 3247 2194 V 817 2171 +a Fp(i)g(f)49 b Fo(x)29 b Fs(+)g Fo(g)s Fs(\()p Fo(w)r +Fs(\))38 b Fr(2)22 b Fo(A)1415 2179 y Fc(E)1503 2171 +y Fp(t)m(h)m(e)m(n)37 b Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q(n)q(m)q(e)q(n)q +(t)j(:)o(=)f Fp(true)8 b Fs(;)p 361 2268 V 3247 2268 +V 653 2246 a Fp(u)s(n)s(t)s(i)s(l)41 b Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q +(n)q(m)q(e)q(n)q(t)30 b(=)k Fp(f)5 b(a)g(l)g(s)g(e)11 +b Fs(;)p 361 2347 V 3247 2347 V 650 2324 a Fo(g)s Fs(\()p +Fo(u)p Fs(\))38 b(:)o(=)h Fo(x)9 b Fs(;)49 b Fr(f)8 b +Fa(s)f(e)g(t)51 b(t)5 b(h)g(e)45 b Fo(g)h Fa(v)5 b(a)g(l)g(u)g(e)48 +b(t)5 b(o)50 b(v)5 b(e)g(x)g(t)g(e)g(x)46 b Fo(u)q Fr(g)p +361 2425 V 3247 2425 V 653 2403 a Fp(f)s(o)s(r)c Fo(w)23 +b Fr(2)40 b Fo(Y)52 b Fp(d)-5 b(o)35 b Fo(A)1255 2411 +y Fc(E)1345 2403 y Fs(:)o(=)k Fo(A)1522 2411 y Fc(E)1591 +2403 y Fr([)17 b(f)p Fo(x)29 b Fs(+)h Fo(g)s Fs(\()p +Fo(w)r Fs(\))p Fr(g)9 b Fs(;)p 361 2504 V 3247 2504 V +646 2481 a(E)l(n)l(Q)l(u)l(e)l(u)l(e)40 b(\()5 b Fo(u)k +Fs(,)49 b Fo(Q)9 b Fs(\))g(;)p 361 2555 5 52 v 362 2555 +52 5 v 413 2555 2788 5 v 3201 2555 52 5 v 3249 2555 5 +52 v 904 2728 a Fg(Fig.)14 b(6.)27 b Fv(The)h(critical)f(v)n(ertices)f +(assignmen)n(t)h(algorithm)p 361 2974 V 361 2927 52 5 +v 413 2927 2788 5 v 3201 2927 52 5 v 3249 2974 5 52 v +361 3053 5 75 v 3247 3053 V 410 3030 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m +(r)m(e)41 b Fs(N)s(o)s(n)s(C)s(r)s(i)s(t)s(i)s(c)s(a)s(l)s(V)s(e)s(r)s +(t)s(i)s(c)s(e)s(s)s(A)s(s)s(s)s(i)s(g)s(n)s(m)s(e)s(n)s(t)53 +b(\()5 b Fo(G)k Fs(,)49 b Fo(G)2233 3038 y Ft(ncrit)2373 +3030 y Fs(,)g Fo(A)2501 3038 y Fc(E)2561 3030 y Fs(,)g +Fo(g)8 b Fs(\))p 361 3128 V 3247 3128 V 494 3105 a Fp(f)s(o)s(r)52 +b Fs(i)c(:)o(=)40 b(0)h Fp(to)f Fo(m)17 b Fr(\000)g Fs(1)35 +b Fp(d)-5 b(o)p 361 3206 V 3247 3206 V 580 3184 a(i)9 +b(f)48 b Fs(i)22 b Fr(62)g Fo(A)863 3192 y Fc(E)950 3184 +y Fp(t)m(h)m(e)m(n)38 b Fs(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q +(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)j(:)o(=)g(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n) +q(e)q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)h Fr([)d(f)p +Fs(i)p Fr(g)9 b Fs(;)p 361 3281 V 3247 3281 V 494 3258 +a Fp(f)s(o)s(r)43 b Fo(v)24 b Fr(2)47 b Fo(V)854 3266 +y Ft(scrit)1010 3258 y Fp(d)-5 b(o)p 361 3359 V 3247 +3359 V 575 3337 a Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 +b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1403 +3345 y Ft(ncrit)1543 3337 y Fs(,)g Fo(g)s Fs(\()p Fo(v)s +Fs(\))9 b(,)48 b Fo(g)12 b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e) +q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)11 b(\))e(;)p +361 3438 V 3247 3438 V 494 3415 a Fp(f)s(o)s(r)43 b Fo(v)24 +b Fr(2)e Fo(V)829 3423 y Ft(ncrit)993 3415 y Fp(a)-6 +b(n)g(d)74 b Fo(g)s Fs(\()p Fo(v)s Fs(\))29 b(=)g Fr(\0001)34 +b Fp(d)-5 b(o)p 361 3516 V 3247 3516 V 575 3494 a Fs(t)5 +b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 b(\()5 b Fo(G)k +Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1403 3502 y Ft(ncrit)1543 +3494 y Fs(,)g(0)9 b(,)49 b Fo(g)12 b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q +(g)q(n)q(e)q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)12 +b(\))d(;)p 361 3591 V 3247 3591 V 361 3669 V 3247 3669 +V 410 3647 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m(r)m(e)43 +b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)45 b(\()5 +b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1640 3655 +y Ft(ncrit)1780 3647 y Fs(,)g Fo(x)9 b Fs(,)49 b Fo(g)12 +b Fs(,)49 b(u)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(E)q(d)q(g)q(e)q(s)s +(\))p 361 3748 V 3247 3748 V 492 3725 a Fo(g)s Fs(\()p +Fo(v)s Fs(\))38 b(:)o(=)h Fo(x)9 b Fs(;)p 361 3826 V +3247 3826 V 494 3804 a Fp(f)s(o)s(r)43 b Fo(u)21 b Fr(2)h +Fs(Adj)17 b(\(v\))33 b Fp(a)-6 b(n)g(d)35 b Fo(g)s Fs(\()p +Fo(u)p Fs(\))28 b(=)i Fr(\0001)k Fp(d)-5 b(o)p 361 3905 +V 3247 3905 V 610 3882 a Fo(x)39 b Fs(:)o(=)g(NextUnusedA)o(d)o(d)o +(res)o(s)o(\()6 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q(d)q(d)q +(r)q(e)q(s)q(s)q(e)q(s)h(\))34 b Fr(\000)c Fo(g)s Fs(\()p +Fo(v)s Fs(\))9 b(;)p 361 3983 V 3247 3983 V 615 3961 +a(t)c(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 b(\()t +Fo(G)9 b Fs(,)50 b Fo(u)9 b Fs(,)49 b Fo(G)1447 3969 +y Ft(ncrit)1587 3961 y Fs(,)g Fo(x)9 b Fs(,)48 b Fo(g)12 +b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q(d)q(d)q(r)q(e)q +(s)q(s)q(e)q(s)11 b(\))e(;)p 361 4034 5 52 v 362 4034 +52 5 v 413 4034 2788 5 v 3201 4034 52 5 v 3249 4034 5 +52 v 689 4207 a Fg(Fig.)15 b(7.)27 b Fv(The)g(algorithm)g(to)g(assign)g +(v)-5 b(alues)27 b(to)g(non-critical)g(v)n(ertices)365 +4847 y Fs(This)g(article)f(w)n(as)h(pro)r(cessed)g(using)f(the)f(L)1621 +4830 y Ft(A)1654 4847 y Fs(T)1696 4863 y(E)1740 4847 +y(X)g(macro)h(pac)n(k)l(age)g(with)g(LLNCS)f(st)n(yle)p +eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/papers/chm92.pdf b/papers/chm92.pdf new file mode 100755 index 0000000000000000000000000000000000000000..08825a1315b7beeab0803141574fed3a9486d0ae GIT binary patch literal 191651 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μaS*y`qt+j=>cFJGd^LFMA-h<-; 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 aveZAW_}(wu-niVPxF9r# Date: Fri, 28 Jan 2005 20:12:58 +0000 Subject: [PATCH 086/739] Initial version --- figs/img1.png | Bin 0 -> 174 bytes figs/img10.png | Bin 0 -> 344 bytes figs/img100.png | Bin 0 -> 395 bytes figs/img101.png | Bin 0 -> 456 bytes figs/img102.png | Bin 0 -> 453 bytes figs/img103.png | Bin 0 -> 319 bytes figs/img104.png | Bin 0 -> 1009 bytes figs/img105.png | Bin 0 -> 1482 bytes figs/img106.png | Bin 0 -> 923 bytes figs/img107.png | Bin 0 -> 286 bytes figs/img108.png | Bin 0 -> 1064 bytes figs/img109.png | Bin 0 -> 788 bytes figs/img11.png | Bin 0 -> 181 bytes figs/img110.png | Bin 0 -> 464 bytes figs/img111.png | Bin 0 -> 479 bytes figs/img112.png | Bin 0 -> 270 bytes figs/img113.png | Bin 0 -> 454 bytes figs/img114.png | Bin 0 -> 755 bytes figs/img115.png | Bin 0 -> 191 bytes figs/img116.png | Bin 0 -> 329 bytes figs/img117.png | Bin 0 -> 200 bytes figs/img118.png | Bin 0 -> 199 bytes figs/img119.png | Bin 0 -> 258 bytes figs/img12.png | Bin 0 -> 271 bytes figs/img120.png | Bin 0 -> 284 bytes figs/img121.png | Bin 0 -> 341 bytes figs/img122.png | Bin 0 -> 296 bytes figs/img123.png | Bin 0 -> 331 bytes figs/img124.png | Bin 0 -> 316 bytes figs/img125.png | Bin 0 -> 331 bytes figs/img126.png | Bin 0 -> 377 bytes figs/img127.png | Bin 0 -> 644 bytes figs/img128.png | Bin 0 -> 284 bytes figs/img129.png | Bin 0 -> 210 bytes figs/img13.png | Bin 0 -> 332 bytes figs/img130.png | Bin 0 -> 475 bytes figs/img131.png | Bin 0 -> 744 bytes figs/img132.png | Bin 0 -> 453 bytes figs/img133.png | Bin 0 -> 728 bytes figs/img134.png | Bin 0 -> 290 bytes figs/img135.png | Bin 0 -> 443 bytes figs/img136.png | Bin 0 -> 252 bytes figs/img137.png | Bin 0 -> 411 bytes figs/img138.png | Bin 0 -> 5097 bytes figs/img139.png | Bin 0 -> 178 bytes figs/img14.png | Bin 0 -> 219 bytes figs/img140.png | Bin 0 -> 264 bytes figs/img141.png | Bin 0 -> 305 bytes figs/img142.png | Bin 0 -> 533 bytes figs/img143.png | Bin 0 -> 195 bytes figs/img144.png | Bin 0 -> 283 bytes figs/img145.png | Bin 0 -> 501 bytes figs/img146.png | Bin 0 -> 525 bytes figs/img147.png | Bin 0 -> 379 bytes figs/img148.png | Bin 0 -> 607 bytes figs/img149.png | Bin 0 -> 589 bytes figs/img15.png | Bin 0 -> 416 bytes figs/img150.png | Bin 0 -> 596 bytes figs/img151.png | Bin 0 -> 706 bytes figs/img152.png | Bin 0 -> 600 bytes figs/img153.png | Bin 0 -> 534 bytes figs/img154.png | Bin 0 -> 540 bytes figs/img155.png | Bin 0 -> 944 bytes figs/img156.png | Bin 0 -> 389 bytes figs/img157.png | Bin 0 -> 332 bytes figs/img158.png | Bin 0 -> 579 bytes figs/img159.png | Bin 0 -> 1117 bytes figs/img16.png | Bin 0 -> 772 bytes figs/img160.png | Bin 0 -> 695 bytes figs/img161.png | Bin 0 -> 542 bytes figs/img162.png | Bin 0 -> 566 bytes figs/img163.png | Bin 0 -> 396 bytes figs/img164.png | Bin 0 -> 238 bytes figs/img165.png | Bin 0 -> 271 bytes figs/img166.png | Bin 0 -> 453 bytes figs/img167.png | Bin 0 -> 374 bytes figs/img168.png | Bin 0 -> 255 bytes figs/img169.png | Bin 0 -> 208 bytes figs/img17.png | Bin 0 -> 355 bytes figs/img170.png | Bin 0 -> 416 bytes figs/img171.png | Bin 0 -> 5643 bytes figs/img172.png | Bin 0 -> 211 bytes figs/img173.png | Bin 0 -> 386 bytes figs/img174.png | Bin 0 -> 320 bytes figs/img175.png | Bin 0 -> 632 bytes figs/img176.png | Bin 0 -> 657 bytes figs/img177.png | Bin 0 -> 344 bytes figs/img178.png | Bin 0 -> 262 bytes figs/img179.png | Bin 0 -> 581 bytes figs/img18.png | Bin 0 -> 316 bytes figs/img180.png | Bin 0 -> 198 bytes figs/img181.png | Bin 0 -> 350 bytes figs/img182.png | Bin 0 -> 632 bytes figs/img183.png | Bin 0 -> 170 bytes figs/img184.png | Bin 0 -> 457 bytes figs/img185.png | Bin 0 -> 721 bytes figs/img186.png | Bin 0 -> 697 bytes figs/img187.png | Bin 0 -> 340 bytes figs/img188.png | Bin 0 -> 777 bytes figs/img189.png | Bin 0 -> 173 bytes figs/img19.png | Bin 0 -> 350 bytes figs/img190.png | Bin 0 -> 455 bytes figs/img191.png | Bin 0 -> 621 bytes figs/img192.png | Bin 0 -> 637 bytes figs/img193.png | Bin 0 -> 719 bytes figs/img194.png | Bin 0 -> 702 bytes figs/img195.png | Bin 0 -> 338 bytes figs/img196.png | Bin 0 -> 209 bytes figs/img197.png | Bin 0 -> 888 bytes figs/img198.png | Bin 0 -> 354 bytes figs/img199.png | Bin 0 -> 326 bytes figs/img2.png | Bin 0 -> 377 bytes figs/img20.png | Bin 0 -> 214 bytes figs/img200.png | Bin 0 -> 474 bytes figs/img201.png | Bin 0 -> 348 bytes figs/img202.png | Bin 0 -> 442 bytes figs/img203.png | Bin 0 -> 4001 bytes figs/img204.png | Bin 0 -> 240 bytes figs/img205.png | Bin 0 -> 329 bytes figs/img206.png | Bin 0 -> 534 bytes figs/img207.png | Bin 0 -> 2835 bytes figs/img208.png | Bin 0 -> 303 bytes figs/img209.png | Bin 0 -> 532 bytes figs/img21.png | Bin 0 -> 342 bytes figs/img210.png | Bin 0 -> 1360 bytes figs/img211.png | Bin 0 -> 9580 bytes figs/img212.png | Bin 0 -> 4654 bytes figs/img213.png | Bin 0 -> 495 bytes figs/img214.png | Bin 0 -> 2405 bytes figs/img215.png | Bin 0 -> 644 bytes figs/img216.png | Bin 0 -> 438 bytes figs/img217.png | Bin 0 -> 343 bytes figs/img218.png | Bin 0 -> 330 bytes figs/img219.png | Bin 0 -> 893 bytes figs/img22.png | Bin 0 -> 210 bytes figs/img220.png | Bin 0 -> 576 bytes figs/img221.png | Bin 0 -> 357 bytes figs/img222.png | Bin 0 -> 415 bytes figs/img223.png | Bin 0 -> 355 bytes figs/img224.png | Bin 0 -> 322 bytes figs/img225.png | Bin 0 -> 118 bytes figs/img226.png | Bin 0 -> 523 bytes figs/img227.png | Bin 0 -> 773 bytes figs/img228.png | Bin 0 -> 559 bytes figs/img229.png | Bin 0 -> 700 bytes figs/img23.png | Bin 0 -> 318 bytes figs/img230.png | Bin 0 -> 1606 bytes figs/img231.png | Bin 0 -> 1907 bytes figs/img232.png | Bin 0 -> 893 bytes figs/img233.png | Bin 0 -> 972 bytes figs/img234.png | Bin 0 -> 1138 bytes figs/img235.png | Bin 0 -> 1223 bytes figs/img236.png | Bin 0 -> 329 bytes figs/img237.png | Bin 0 -> 333 bytes figs/img238.png | Bin 0 -> 314 bytes figs/img239.png | Bin 0 -> 412 bytes figs/img24.png | Bin 0 -> 509 bytes figs/img240.png | Bin 0 -> 486 bytes figs/img241.png | Bin 0 -> 219 bytes figs/img242.png | Bin 0 -> 490 bytes figs/img243.png | Bin 0 -> 267 bytes figs/img244.png | Bin 0 -> 223 bytes figs/img245.png | Bin 0 -> 287 bytes figs/img246.png | Bin 0 -> 263 bytes figs/img247.png | Bin 0 -> 482 bytes figs/img248.png | Bin 0 -> 320 bytes figs/img249.png | Bin 0 -> 307 bytes figs/img25.png | Bin 0 -> 282 bytes figs/img250.png | Bin 0 -> 314 bytes figs/img251.png | Bin 0 -> 167 bytes figs/img252.png | Bin 0 -> 25779 bytes figs/img253.png | Bin 0 -> 22062 bytes figs/img26.png | Bin 0 -> 4678 bytes figs/img27.png | Bin 0 -> 487 bytes figs/img28.png | Bin 0 -> 228 bytes figs/img29.png | Bin 0 -> 344 bytes figs/img3.png | Bin 0 -> 644 bytes figs/img30.png | Bin 0 -> 456 bytes figs/img31.png | Bin 0 -> 333 bytes figs/img32.png | Bin 0 -> 229 bytes figs/img33.png | Bin 0 -> 479 bytes figs/img34.png | Bin 0 -> 446 bytes figs/img35.png | Bin 0 -> 879 bytes figs/img36.png | Bin 0 -> 214 bytes figs/img37.png | Bin 0 -> 214 bytes figs/img38.png | Bin 0 -> 210 bytes figs/img39.png | Bin 0 -> 393 bytes figs/img4.png | Bin 0 -> 262 bytes figs/img40.png | Bin 0 -> 362 bytes figs/img41.png | Bin 0 -> 236 bytes figs/img42.png | Bin 0 -> 244 bytes figs/img43.png | Bin 0 -> 336 bytes figs/img44.png | Bin 0 -> 377 bytes figs/img45.png | Bin 0 -> 356 bytes figs/img46.png | Bin 0 -> 366 bytes figs/img47.png | Bin 0 -> 493 bytes figs/img48.png | Bin 0 -> 936 bytes figs/img49.png | Bin 0 -> 488 bytes figs/img5.png | Bin 0 -> 298 bytes figs/img50.png | Bin 0 -> 281 bytes figs/img51.png | Bin 0 -> 682 bytes figs/img52.png | Bin 0 -> 345 bytes figs/img53.png | Bin 0 -> 421 bytes figs/img54.png | Bin 0 -> 445 bytes figs/img55.png | Bin 0 -> 430 bytes figs/img56.png | Bin 0 -> 416 bytes figs/img57.png | Bin 0 -> 278 bytes figs/img58.png | Bin 0 -> 330 bytes figs/img59.png | Bin 0 -> 564 bytes figs/img6.png | Bin 0 -> 339 bytes figs/img60.png | Bin 0 -> 200 bytes figs/img61.png | Bin 0 -> 820 bytes figs/img62.png | Bin 0 -> 194 bytes figs/img63.png | Bin 0 -> 298 bytes figs/img64.png | Bin 0 -> 554 bytes figs/img65.png | Bin 0 -> 578 bytes figs/img66.png | Bin 0 -> 495 bytes figs/img67.png | Bin 0 -> 432 bytes figs/img68.png | Bin 0 -> 614 bytes figs/img69.png | Bin 0 -> 818 bytes figs/img7.png | Bin 0 -> 210 bytes figs/img70.png | Bin 0 -> 320 bytes figs/img71.png | Bin 0 -> 524 bytes figs/img72.png | Bin 0 -> 393 bytes figs/img73.png | Bin 0 -> 336 bytes figs/img74.png | Bin 0 -> 467 bytes figs/img75.png | Bin 0 -> 822 bytes figs/img76.png | Bin 0 -> 472 bytes figs/img77.png | Bin 0 -> 4740 bytes figs/img78.png | Bin 0 -> 540 bytes figs/img79.png | Bin 0 -> 199 bytes figs/img8.png | Bin 0 -> 193 bytes figs/img80.png | Bin 0 -> 240 bytes figs/img81.png | Bin 0 -> 236 bytes figs/img82.png | Bin 0 -> 331 bytes figs/img83.png | Bin 0 -> 343 bytes figs/img84.png | Bin 0 -> 330 bytes figs/img85.png | Bin 0 -> 441 bytes figs/img86.png | Bin 0 -> 1298 bytes figs/img87.png | Bin 0 -> 561 bytes figs/img88.png | Bin 0 -> 830 bytes figs/img89.png | Bin 0 -> 395 bytes figs/img9.png | Bin 0 -> 362 bytes figs/img90.png | Bin 0 -> 327 bytes figs/img91.png | Bin 0 -> 406 bytes figs/img92.png | Bin 0 -> 411 bytes figs/img93.png | Bin 0 -> 409 bytes figs/img94.png | Bin 0 -> 290 bytes figs/img95.png | Bin 0 -> 293 bytes figs/img96.png | Bin 0 -> 141 bytes figs/img97.png | Bin 0 -> 283 bytes figs/img98.png | Bin 0 -> 491 bytes figs/img99.png | Bin 0 -> 437 bytes papers/bmz_tr004_04.ps | 10732 +++++++++++++++++++++++++++++++++++++++ papers/bmz_wea2005.ps | 8159 +++++++++++++++++++++++++++++ papers/chm92.pdf | Bin 0 -> 191651 bytes 256 files changed, 18891 insertions(+) create mode 100644 figs/img1.png create mode 100644 figs/img10.png create mode 100644 figs/img100.png create mode 100644 figs/img101.png create mode 100644 figs/img102.png create mode 100644 figs/img103.png create mode 100644 figs/img104.png create mode 100644 figs/img105.png create mode 100644 figs/img106.png create mode 100644 figs/img107.png create mode 100644 figs/img108.png create mode 100644 figs/img109.png create mode 100644 figs/img11.png create mode 100644 figs/img110.png create mode 100644 figs/img111.png create mode 100644 figs/img112.png create mode 100644 figs/img113.png create mode 100644 figs/img114.png create mode 100644 figs/img115.png create mode 100644 figs/img116.png create mode 100644 figs/img117.png create mode 100644 figs/img118.png create mode 100644 figs/img119.png create mode 100644 figs/img12.png create mode 100644 figs/img120.png create mode 100644 figs/img121.png create mode 100644 figs/img122.png create mode 100644 figs/img123.png create mode 100644 figs/img124.png create mode 100644 figs/img125.png create mode 100644 figs/img126.png create mode 100644 figs/img127.png create mode 100644 figs/img128.png create mode 100644 figs/img129.png create mode 100644 figs/img13.png create mode 100644 figs/img130.png create mode 100644 figs/img131.png create mode 100644 figs/img132.png create mode 100644 figs/img133.png create mode 100644 figs/img134.png create mode 100644 figs/img135.png create mode 100644 figs/img136.png create mode 100644 figs/img137.png create mode 100644 figs/img138.png create mode 100644 figs/img139.png create mode 100644 figs/img14.png create mode 100644 figs/img140.png create mode 100644 figs/img141.png create mode 100644 figs/img142.png create mode 100644 figs/img143.png create mode 100644 figs/img144.png create mode 100644 figs/img145.png create mode 100644 figs/img146.png create mode 100644 figs/img147.png create mode 100644 figs/img148.png create mode 100644 figs/img149.png create mode 100644 figs/img15.png create mode 100644 figs/img150.png create mode 100644 figs/img151.png create mode 100644 figs/img152.png create mode 100644 figs/img153.png create mode 100644 figs/img154.png create mode 100644 figs/img155.png create mode 100644 figs/img156.png create mode 100644 figs/img157.png create mode 100644 figs/img158.png create mode 100644 figs/img159.png create mode 100644 figs/img16.png create mode 100644 figs/img160.png create mode 100644 figs/img161.png create mode 100644 figs/img162.png create mode 100644 figs/img163.png create mode 100644 figs/img164.png create mode 100644 figs/img165.png create mode 100644 figs/img166.png create mode 100644 figs/img167.png create mode 100644 figs/img168.png create mode 100644 figs/img169.png create mode 100644 figs/img17.png create mode 100644 figs/img170.png create mode 100644 figs/img171.png create mode 100644 figs/img172.png create mode 100644 figs/img173.png create mode 100644 figs/img174.png create mode 100644 figs/img175.png create mode 100644 figs/img176.png create mode 100644 figs/img177.png create mode 100644 figs/img178.png create mode 100644 figs/img179.png create mode 100644 figs/img18.png create mode 100644 figs/img180.png create mode 100644 figs/img181.png create mode 100644 figs/img182.png create mode 100644 figs/img183.png create mode 100644 figs/img184.png create mode 100644 figs/img185.png create mode 100644 figs/img186.png create mode 100644 figs/img187.png create mode 100644 figs/img188.png create mode 100644 figs/img189.png create mode 100644 figs/img19.png create mode 100644 figs/img190.png create mode 100644 figs/img191.png create mode 100644 figs/img192.png create mode 100644 figs/img193.png create mode 100644 figs/img194.png create mode 100644 figs/img195.png create mode 100644 figs/img196.png create mode 100644 figs/img197.png create mode 100644 figs/img198.png create mode 100644 figs/img199.png create mode 100644 figs/img2.png create mode 100644 figs/img20.png create mode 100644 figs/img200.png create mode 100644 figs/img201.png create mode 100644 figs/img202.png create mode 100644 figs/img203.png create mode 100644 figs/img204.png create mode 100644 figs/img205.png create mode 100644 figs/img206.png create mode 100644 figs/img207.png create mode 100644 figs/img208.png create mode 100644 figs/img209.png create mode 100644 figs/img21.png create mode 100644 figs/img210.png create mode 100644 figs/img211.png create mode 100644 figs/img212.png create mode 100644 figs/img213.png create mode 100644 figs/img214.png create mode 100644 figs/img215.png create mode 100644 figs/img216.png create mode 100644 figs/img217.png create mode 100644 figs/img218.png create mode 100644 figs/img219.png create mode 100644 figs/img22.png create mode 100644 figs/img220.png create mode 100644 figs/img221.png create mode 100644 figs/img222.png create mode 100644 figs/img223.png create mode 100644 figs/img224.png create mode 100644 figs/img225.png create mode 100644 figs/img226.png create mode 100644 figs/img227.png create mode 100644 figs/img228.png create mode 100644 figs/img229.png create mode 100644 figs/img23.png create mode 100644 figs/img230.png create mode 100644 figs/img231.png create mode 100644 figs/img232.png create mode 100644 figs/img233.png create mode 100644 figs/img234.png create mode 100644 figs/img235.png create mode 100644 figs/img236.png create mode 100644 figs/img237.png create mode 100644 figs/img238.png create mode 100644 figs/img239.png create mode 100644 figs/img24.png create mode 100644 figs/img240.png create mode 100644 figs/img241.png create mode 100644 figs/img242.png create mode 100644 figs/img243.png create mode 100644 figs/img244.png create mode 100644 figs/img245.png create mode 100644 figs/img246.png create mode 100644 figs/img247.png create mode 100644 figs/img248.png create mode 100644 figs/img249.png create mode 100644 figs/img25.png create mode 100644 figs/img250.png create mode 100644 figs/img251.png create mode 100644 figs/img252.png create mode 100644 figs/img253.png create mode 100644 figs/img26.png create mode 100644 figs/img27.png create mode 100644 figs/img28.png create mode 100644 figs/img29.png create mode 100644 figs/img3.png create mode 100644 figs/img30.png create mode 100644 figs/img31.png create mode 100644 figs/img32.png create mode 100644 figs/img33.png create mode 100644 figs/img34.png create mode 100644 figs/img35.png create mode 100644 figs/img36.png create mode 100644 figs/img37.png create mode 100644 figs/img38.png create mode 100644 figs/img39.png create mode 100644 figs/img4.png create mode 100644 figs/img40.png create mode 100644 figs/img41.png create mode 100644 figs/img42.png create mode 100644 figs/img43.png create mode 100644 figs/img44.png create mode 100644 figs/img45.png create mode 100644 figs/img46.png create mode 100644 figs/img47.png create mode 100644 figs/img48.png create mode 100644 figs/img49.png create mode 100644 figs/img5.png create mode 100644 figs/img50.png create mode 100644 figs/img51.png create mode 100644 figs/img52.png create mode 100644 figs/img53.png create mode 100644 figs/img54.png create mode 100644 figs/img55.png create mode 100644 figs/img56.png create mode 100644 figs/img57.png create mode 100644 figs/img58.png create mode 100644 figs/img59.png create mode 100644 figs/img6.png create mode 100644 figs/img60.png create mode 100644 figs/img61.png create mode 100644 figs/img62.png create mode 100644 figs/img63.png create mode 100644 figs/img64.png create mode 100644 figs/img65.png create mode 100644 figs/img66.png create mode 100644 figs/img67.png create mode 100644 figs/img68.png create mode 100644 figs/img69.png create mode 100644 figs/img7.png create mode 100644 figs/img70.png create mode 100644 figs/img71.png create mode 100644 figs/img72.png create mode 100644 figs/img73.png create mode 100644 figs/img74.png create mode 100644 figs/img75.png create mode 100644 figs/img76.png create mode 100644 figs/img77.png create mode 100644 figs/img78.png create mode 100644 figs/img79.png create mode 100644 figs/img8.png create mode 100644 figs/img80.png create mode 100644 figs/img81.png create mode 100644 figs/img82.png create mode 100644 figs/img83.png create mode 100644 figs/img84.png create mode 100644 figs/img85.png create mode 100644 figs/img86.png create mode 100644 figs/img87.png create mode 100644 figs/img88.png create mode 100644 figs/img89.png create mode 100644 figs/img9.png create mode 100644 figs/img90.png create mode 100644 figs/img91.png create mode 100644 figs/img92.png create mode 100644 figs/img93.png create mode 100644 figs/img94.png create mode 100644 figs/img95.png create mode 100644 figs/img96.png create mode 100644 figs/img97.png create mode 100644 figs/img98.png create mode 100644 figs/img99.png create mode 100755 papers/bmz_tr004_04.ps create mode 100755 papers/bmz_wea2005.ps create mode 100755 papers/chm92.pdf diff --git a/figs/img1.png b/figs/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff303145d65386a0dcbe38127efdb15324673e86 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^+#og!GXn$TuRA;E0XbR$J|V9E|Noykb7pyYd1z?p zyLa!-oH-*XD7b3Xs*aA1w6rv!Di;?QB_*ZZyLZ1jv4tJTXDkWw3ubV5b^|171{ym@NMFtd{J%wx_3!2|||r2;ID U2QIAJ2Gq^q>FVdQ&MBb@08j8b`2YX_ literal 0 HcmV?d00001 diff --git a/figs/img10.png b/figs/img10.png new file mode 100644 index 0000000000000000000000000000000000000000..f1802b901af59a0e4a79e96ac705893e36a237eb GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5Z!py+HD4X&IBw!HW6XN>+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{69AXCuTIQ=K1{Djg23@OYfcFJ2x z+~C!7h&jVy&hjFejkPG&LF&OxmQDT)XUdv5Hs&x0c?DE58=Tydv76zr8C%=c<6V*x zcFnDOWPdPAm>Fy^IKpiCU;_KApU3${k{(zbIKc4Dp4pkP`72Y~XP!0saoPq3KF$%< o>`ou+9g4d2X3TN$y)Veiz*-^4-p-Y>66iw)Pgg&ebxsLQ0A9#^GXMYp literal 0 HcmV?d00001 diff --git a/figs/img100.png b/figs/img100.png new file mode 100644 index 0000000000000000000000000000000000000000..0794acddb7f9180964cc8434241b0a0a0dc770bd GIT binary patch literal 395 zcmV;60d)R}P)Q0AX`MF$2Q~AZ8&(J3jCr0Z2G7Brq`oX-cLo8|ZchaL8-`ISazR#Q+yG0Z|H2|3Jk+ zeggTHUjZr>4HV$Iz_5D(1K5w;duZ#Wfdx`5@kl)83rq)C43GrWt-;g=aGC>xTWSoT zMC<(llyZT9cToa};)bdM)1P#qn%6)mex(Z#2C}Ly6{sTK{a}h?kply=DkFv-1|-9{ p4ltk^#*OBWOK5yv1%^?83INifGsHHiN2mY*002ovPDHLkV1i-Ri{k(Q literal 0 HcmV?d00001 diff --git a/figs/img101.png b/figs/img101.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf4b4ab453a3795f3137f9f1206da6aaec67d35 GIT binary patch literal 456 zcmV;(0XP1MP)FVhy4AL4+8X zIcpIEHn1B)aWEu+%z$t{Fz|u7P>{-?0Hy^Bu$q7{YB$IM3=S8d{Jn4)4hDwXKr`5( z-0T8okWtTom>W&|g$?-aAOh^(jKU3IVA}mU0ptjF4u}XZ#Eu6H{HzcGE|}T{AVNU^ z>@0JTN~rju3n1rjaR5aC7c35dfQgeqECIq4fO~~~_wE30cBn7|_bvvu3WN?u(}qW6 z`;1b+vVd8D3AZ#4DB_qeFdbkqKnUict3n8{thNGC4Gi8NfCLak@7}$Yfx!@62Uvi0 zH!xV(8O}n4)&MbY7z-ppz1u7RqJZHB*3S~c`GDbSf;(7_Y3Dl!5Y4+EtYQgPhx2`4 y7GS8}<$xl{bpT{*0*e4v9S;9E8NwJG5h4JM7)0<8H*I+U0000!p>~ybE+!IJl zYjckf8*2-zfUu}=ML@5x5Jb36%it3P@&eB6oq9PeqK$sA^K&z^^UW*=SV&iq?4pJO z4FqL|^kA-=vF{Q1DM?{%&t4uwRsKfs((Mk6HOCPN!^K8VUx}VW{!UAipC}Efqq2nC zxThC@-n`9Eu*TkZ7M2GiW|F|dI$FRZl_Dm}Q5a$iAwU#!0}0`yM~d>>7(uu_z=^Ai z70=*|K3niu?Yp83{BJnJ>z0JS3H{xg}6F3_=kk8WbF#xO&FLYHQj!2TX^ v{zW6mE90cVOG#{58$dLFh3T)>^XGU6B#k(W9|4x400000NkvXXu0mjf?vu&Z literal 0 HcmV?d00001 diff --git a/figs/img103.png b/figs/img103.png new file mode 100644 index 0000000000000000000000000000000000000000..88a9a9770143f17cf69d3d74979d9abb1c5363d0 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^azL!W!py+H*pT`37La2Q;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lkz5ba4!+n3J5~z*@t@UB+&nx?4yP0nn5|C~w28Dc zh%t5u{&5KAcy*j%56>I{HwNp&>;{V)IaByfn@*U+e1SWMhe!B8U1D0o4W>|KhRxYb z%-k=_Cb3vJ{!0yP_&ilYVxN(LLG#VH-$D}G3^U%}J9Z$S;faxN!VQL&9R7x!fPf-n z13d<#3Mrw6d(5A1#@#kDn3JAx@6CY&GZ~EE^Ue6vzac<8MbmdL3nRnLOj+*G6FnP& P9%1lw^>bP0l+XkKzqfH# literal 0 HcmV?d00001 diff --git a/figs/img104.png b/figs/img104.png new file mode 100644 index 0000000000000000000000000000000000000000..4debbf6c4330525cacf67816af7c6bef5c44d309 GIT binary patch literal 1009 zcmVOl1U}v8%$wsG-vuA3>QptJOZLY{fRrDjKCk^pSO6~Hjp6oZV1OT za@2&pMflN@mZAtRgQ}SW0DS`@EiE7k^s&hjM&m%ig68poo&D5vqGhhJPmuyMAqxl!#IIVqf@Ot3%I4v zW+Zjw_A2?g%eTERZ13(R#hr2Yg5u7Q_!OX&QUGpBJzoL5 zz5xJkmnWruUZ3mAw@cDKg3x?Ced+%azxmA5+>y|+Mm)(nob{?d1Fm{BiOCi)N^Ddc#_6aP9{;*o+SNxc!J~zl2bgs z5J>iY`-AW!RY8#A8pYKRI)581(03nNy@ElSkAnB!& z(Ey71Ga)-aw*}NDzM5~@iybx;<-H(3iBGR(2Po4wA?T8btu4jaNb%r6l0l=Lv_l&- z*#fefivp@y7QM-7PT~Ve*H;A1j{GD(mvtGEnw+(3M}{Ik+pl8sl|8nAZr%DPXt^ZD zA)H!nJxL2J!?AHRXmnFWa0ts)JlS$&6aY-0s?s5lbkLUU(9K1BIi?*~(69sGIY5(E zjCo(xKA~Z(?@tAVR<2cwBlumpn*QMKV2_i^g19X!+P_7!6&!N%-=L_~+TZod*T#2z fUmM@?eQo>#t!sOy&E%ZL00000NkvXXu0mjfIep$J literal 0 HcmV?d00001 diff --git a/figs/img105.png b/figs/img105.png new file mode 100644 index 0000000000000000000000000000000000000000..d29b1bf264f22024dfa2e083f8f8cc31e34a6649 GIT binary patch literal 1482 zcmV;*1vUDKP)LE?@J-Ei&zMJY zm0{>a)1Y?L?mwQ+zXzw8di?^xfXk;_RMPHW#`SK65Txf(xc{MUu7V-)l&4`lu z5LTRV^{MFHrg98wn<_iaE%48k68v^1Gg{aLKcXnowv>U} zbzvTWl!6B2&H#kT$*rfYs19#{YeSx?w1cWIr06&5rf!x;)`+M`SFBYXnkK)fiSnos zbu;Y^{y&&B(oUKvcTQF*<6;x#hVK$LujN@UKYfF0Uy4bvlp0G1dMP=koQ^vg-*gJM z40T(YYmNA9Zrm0I=CUzW)UbVvM6hTwEuBp*Q(e#eTlnrxjsr+J$+bH$8;tZR4K-tu z`$5?@G4V0eDJglfW9kg-l7B&E5nPkzEMUUZbgzKOmnQ;FtvMbaQMR4goOE@%8{;iu z7!#Y-0{ctQU5(1Kb40iqGrQzz6H2hW=<>%wFxc+-c#RbrJ8b zi6goSfq&9oHLsfjfTyopOu|gBOw<3Uh%adDh`)Q=+RP@ zW78j2-9A`!d*^V3cI?ORtWLG8r9ek0vaM^oh1(<`;R{z@Ew96CP{oU62i*}@0lvqr zJJ9M6z%g^(j=+sla0?JYWFH|PK!ViVpBnYJFj>~TUT=klw z2z#E_RWx;GTHQIIs~B>%aoe`RIhx$u{%UsZa{zrG-ox0JagEz9#&YIli`DDh-sUpK zZ-bu-w@ILRw!bU6ZB&0IF#?C|C<3{P7yW)RVs!)0i=1&(zAk?`qds5MD&pQ$Xs*+l znG~ZqM-P(SIf+wzi`9uGYsuiqkKa{f+iES9+az2Eq(6Y~^jWhdgN4i&Pch zH?Xco#VqkaPqI;t!u>D1hbC$rFC58ImdUg;JAcmVMp$C1;yADM^I9EYjoq1CcrUBW zvWmI%qUgfn_u73mw8}2kA0^M#GQp}}x#|d)?ZQlO*7bUSWKFyZ->!?;{(4=^2qRe= kwG;jqsW;eQgF6p@0XJ_(hI-fUApigX07*qoM6N<$f?B4~0RR91 literal 0 HcmV?d00001 diff --git a/figs/img106.png b/figs/img106.png new file mode 100644 index 0000000000000000000000000000000000000000..69fa53e1db2948b8f2e9512eacefa98ab9c34d3c GIT binary patch literal 923 zcmV;M17!S(P)U;0I3+4c!(?HTe4s3#I6w}!i-?>#&-fV!Q6BBL4b?W-U`Pu8uKsP1QvuhfOO!g|ZvfL}#9#W|{ttD>}6$sKA9&s>ik+)~Okj&{~PU4#pZK1GNoc zG#6w-3@V8qi*xWjA8u3qyyfBiXSWp>n^ZhJQ`IrtHq$q+ZN16Wt6+0&P4 z#&~Iy8M`a<;{Vxx{nQ>`0D18;*W-BVcnUtPDe$YzcI#xuQTRlZWlV6u zW9EJuFEe-&2VW1yy(~zu=dsOM`!9gLj&r#xCs;B2rj%sO?Fr#mh_Zea3(3riuP23j z^+u=ktzq%o$DU*@SmlJ{v8&}+Z@b^2Yj-XVb+%t#~V+rXGA&@7k+ z8XXoAdpYA}`rNgq+?rl;b21b(2`NkWwT}2kbkj6X;JwIJk&p? zj4_ic9w)P@vE=H(Vsxha=hh7UmWG^sKUiFIS8d8=o7q!Hjkr;BHI`TiWX~V$H33r) x4H0`shq%J#N+sVQXLlHAjeVjV!4Vt~{08`6&2iHtwfF!4002ovPDHLkV1iqxtaShY literal 0 HcmV?d00001 diff --git a/figs/img107.png b/figs/img107.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0b60664500c5eb74291d264772ce3603267629 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E!!py+HctY8*2gor9@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaK?Rx;TbZ%t=lF0`^CoJOUFA95`@{IW3n#@cO$C1`C?G9nSEk6`p1kEqot#AfSoC zpjcf8s5X_!$V@CJ;lZAG8Yi4>xkbsA@IfQ^nR`4Kra1gwx zgfWL)JU9pm1PK@qLfFed4!O?3lM6Bjy(yHU_*1*=9L1H;3CYF1wB{mAB+XvEz-ik^0XuBEao_xbNN0D#K?ymzoZ%2g^2t zS9E(j22P4t;%mSL&)lpNWw z3O(mSsBii?!G@9+POsU>7AbLIl8GJX318elASkqk?$d9JeqEyc(1-NU!BRq>K{kSf zd+{m-i^D}+`o#N6<^bcA2i!IEC9+mWtCpiX5IN6WxTLV*df5y~e2lIev7jxA;l!i? zqrFaqIH6yaX-Kt&CoI3CPJ;~mJsWPI zo=l#!-J#8OO$Us#M8g(nC^bOzmUca7+&xNn9~;lik>Dnidp8mXi4wP0M`;!H9|MQe z(DuIZAXZI4(B_fX>o+NJ1?q}tIn{dnIMTHntt@m+bBVYK=c37zG#$?5aViRO^7ml5 zR~l;E+ZA(x1qyKXR4uoIkCbHN;szI01kT5(q!ty;Z^O&!wXUEuz@LK+jo)R2bI2`hs|5_zHeZ&g(el=?{OwshQXn<^QN=O z)CZDl`5d>4U#bXpVXtX5>7-FA;LLV66Sm@#+NmPfy;VVQg5o}BHCZs9VNx2|72MH| i@16fqZGi>;2lyAAlIZlbe$eLt0000WP)jRV#_bHdcq=o7wCp+2p(vv^cmIb~5wc z_q};D@4W$PGJpvI$}*mB>37tryWa;g5C07O>MZ0Tp%K0fg~@#E8RGtHiXS5ZnDxH&PQM`#`WJsxKcW>t`_@+ zRO$(1nf7q*iAoWN`T;iQt3Wjvb&>ylK@cJ00ngVIO0#nVKi3uB#Q? z6(J(@^kR)aZ=g{am?l;cHVPW2^F-+*=erL1f0TpsODeyCHn@Sx<(Pfh%3h$PKqCMJ zU794}IzrLnFo;?y)M#M1o|xz*m^b}au`tUp?_a$+t#at`WGFfAigFs?*r6JF#+ zTp}B(@ok2A2IV{AJ*r%>=05NditzIkPOnuk9$M`c#C`(r2CvV~xH6Lh6LeC{y4pfw zg9)Ev#>5qjhrWDXG(u84p_OUOv$>-SI8uh1@L~?8hMU}#DO>h<*}peo_=Qnp>`prC zs@3!Gi(Lika$a^Tm{3<`UqF+aa;s~-g`Y>1#QM?Z1~2cbGvkV{>RMY7POjq0a0)A5 zVY6&1Klx1R{a@GZIQK~VxU+;%!7A)S)Wr&Gu3$f2LRf?yLhQu&TgtH<8Tk$DT&qN0 S|L!>e00000WbcEP)CLR&BtbTW*0C>%@PTGg`4ma zb~&Pa{n=*e0U43C$P;A-jyP0Szl|ycn1^td1qVa6!h*oO%G*X&!ofj+!rK>>icr>0 z`m2BU1DCjLLOQw35j%JpjG2k4^D^<_g;PwK@|gP2rkM)QM_L(C!qhF8a``OdBbt0}P2-C^8_Jc$SG zoMYt_-AQS@HX}hgEpqh@8v(Pcr_pT@C|!lqiZtn$U48GH8x9J3CqU*VxK2EUR?XRJr}5Jy|#XPw@$9fkEi0M<$8@0000-E(|5fTzl-tio7XJ&U6=)mooxO5_t zyyXditkgVO468%ZI#5L@-*J}DC`FOkpp4g@8mofi(6V4kM>)Pb2D zPKYeM}XZNg002ovPDHLkV1lQ%&)@(6 literal 0 HcmV?d00001 diff --git a/figs/img112.png b/figs/img112.png new file mode 100644 index 0000000000000000000000000000000000000000..2f806bebb16bc3c193419128c9d18632c85ddcac GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^8Xz_cGXn!-+%`sEAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlJD_!aSW-Llbqndmcyh_-ns)57*g|g z9OzipD%v8Yr^Ei5O_8mQJz$wd(@B8?oZ$fq3?@0>8`*dB&tVLTh+$-Vb4D1_x0a1|^onf5{PCYR`={3{#9M3>g?a-paA@8O|vN Px{JZn)z4*}Q$iB}a&BAb literal 0 HcmV?d00001 diff --git a/figs/img113.png b/figs/img113.png new file mode 100644 index 0000000000000000000000000000000000000000..97dbbf340ddf343c9ab47366f38c5a4946349dbe GIT binary patch literal 454 zcmV;%0XhDOP)bA*EUsPr2~uz>qWATgCTYcplb%5CNAA7n8+z4mdriwQqu%BXWFrEDUs{wfk4#%#R_* zMgyiMC2bpz$zJpu?(fi7Vm8%+oK5ZekrAO`BcnI1li>|3Mr5X2q}FO7FpG0nYbR;g~ftddAx@^KF*XbYSV>}Oj32v69gYZz8) wH2l=CztBW_7?>#4gvKyYVe-0k5&k7U0OtcgI_o^fmH+?%07*qoM6N<$f;pJQsQ>@~ literal 0 HcmV?d00001 diff --git a/figs/img114.png b/figs/img114.png new file mode 100644 index 0000000000000000000000000000000000000000..681e3d30186333d2858d206a22b5c1ef1110b99c GIT binary patch literal 755 zcmVGWT*rfoMA7A3f-VPD3|(*W|KCf}T-tgZh;VRUo0s?U z{onWg_wpwJN{C>0B}6=-es4?4GCzlg74V4~QR9w>Ge>F)a0ItLgsdbxLdet$^;t-K z9KQ?&{RM}b3b0AZ!m|0&b&*Ki0c`M$CWlE=w4qp6g^FvXS=}_R|AMAcXghZ!J?IvQ zv62?nwr%h}xnCe?Q6|c#V@iid%!4ju11+p_l;D42Vg1ubG18%X#*0Ylqm5pAk6YZV z4~0EqFQsCjuZc+8FRg@|N7u-S$FtT@5 zz$+8AN}?+26&)pPxQ)!YLQz-gJWd2;fc~brwUAAprIUd!MUh4+DKJVnpLZs&`&6VW z6!&w|AETPiNbzo;>V6}=iLa@=e2jNt$|%kLAQWenMAF;}^~1wllRMvco>K)0R7nPm zbT}_u=M{4kk*AF7PGjNT1`8%tmXxFm|G3i8?dnm z%PYL4#f@L3MV16koLfCc&Ov_X>S#VLj|RAAsLg z5%vu`&G+haFtaKP{2?(?tRsC98T;-YML`VJo;V76_aG l%Rd;);D*+5C8szs_yfx^pKidDBW?fy002ovPDHLkV1g3RS;PPU literal 0 HcmV?d00001 diff --git a/figs/img115.png b/figs/img115.png new file mode 100644 index 0000000000000000000000000000000000000000..325241fad51f86712a450727b7bb77b11a4bfbeb GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#p#JPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3EJ!EiDbG%EiUy?%lgeN=mzT?`~gq@I6q7u_VYZn8D%M4UoKp zr;B4q#hm1Xga=6sjPrPT*6{HZFbG{?H579&6bLae_^`=wiNlQPt&NSjs!rUGS+27S ltYqTY%HU|IU67N&z>vF$!!dj9)&QVc44$rjF6*2UngDqMJ_G;& literal 0 HcmV?d00001 diff --git a/figs/img116.png b/figs/img116.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b0af44a13273102d8bc1508569fe4dd876dd58 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-P!py+HSgfk#0^}G3_=LFr|NnpH%$eoo<)NXW z@7}#LHa0$U=8T}A;Hp)tIyySi($atmU0hu5-o2}&q_lhYZh2Y7sX!sdk|4ie28U-i zK=Q{uT^vIy<|HRDFxIiLrLmbjC}@1hIBNov@OKtAJ9ag;Hr6>@FJ4`2WHdHEk+8!m z&Pj@cVI2#{UdE0_zGx<4dxmn^Rxts#s|s8APwhN%-~g|ig1Ll2O;W?BqIG@y&6I~!VW4bJPLNK-RtyN0{5)eGg#n} zuM^I&(ZrFZeIoM}o;;SBTuKUU9}Yj6$g`g>>8Yrxfr8KVdwbgz`Fx(e30!byag2c)I$ztaD0e0s!4VZ#4h_ literal 0 HcmV?d00001 diff --git a/figs/img117.png b/figs/img117.png new file mode 100644 index 0000000000000000000000000000000000000000..85c13a98d7e92c7b65697c31cd9c64db6b6489b2 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~i!py+HxR`CDK9Hjo;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKP?atx8Kv11fQGak+c-O@6k;q1@(X5gcy z7*a7OIiZ2+-BF%`0|yTrU`^e$IYuKP;X#T6+Zi7no&duQoAxR!Vsz!ad}d~Gnjf=K xkz|CZ1j~V>sRk#V17;O6wVazHnaHq&L8FB$^^VKq7eI3vJYD@<);T3K0RV}EN9zCp literal 0 HcmV?d00001 diff --git a/figs/img118.png b/figs/img118.png new file mode 100644 index 0000000000000000000000000000000000000000..79436640a261c406449adce938cf606f6aae2a64 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!py+HSmSZp0Lak|@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!H$lOw6rv!Di;@*yLay@DJkvVy}NA1W(}YaV@Z%-FoVOh8z6ZP zPZ!6KiaE&%2@imH2E!4aHwlxP86{;H9@JQ&?3W6{Q)$IvFo z^H{v*zysdn4$@`s?GA*To3N{zQ^vVb;Ot)y8wQ3ce0s^3SEwih-NNAM>gTe~DWM4f Dsufef literal 0 HcmV?d00001 diff --git a/figs/img12.png b/figs/img12.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b34f34ec6fa56d87d12aaa158700865e153abf GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^S|BzHGXn!-l=H;`AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlJE6&aSW-LlbqndmXlD#EMS~_)z2v507DVa9Uf`34~7OGnkP6hJEiS*suAqj`_PF= zdX`(5K-Lb1wBlw#<|f^90b3aLI~BaHqVt`;hRx(U^xRamKqw#?owwoz?eQ zS`5s4?li2C(EBy%Xp{0w#nWsd7nvQJ{xVHw>e(;ib1pR?X~xll*^?O=Ha?a+Tzo*k Q73eSqPgg&ebxsLQ0Bw*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAq=2;uumfCpm$E@!egX6AjWXDh@Y%dKeciTExS1X0Di+7*7PFvDAFQ-9~p3m^m61 z*xDN#=Y||EXv%6+m2co+IT)wIpeVpnD6nl&p$MOdh75zFj+$1$+1w*d>kn|O%uZ;S zV8FxV5WYY4L?Vbe^#(&XX1uLE a#mMl1)zUV4nk6V47(8A5T-G@yGywp)KV8!R literal 0 HcmV?d00001 diff --git a/figs/img121.png b/figs/img121.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3f77c2ef39a5d9ce0ab3b9e5efa1329b2b0887 GIT binary patch literal 341 zcmV-b0jmCqP)wzMNj$2shU{ekT z+$=0W(t&{+#>c4=KLF}00KyF*M-+g$8=w$`Xa<-J7+D!v85ov)Sn`n-;tsG63K*&x zkhmKdc4Ol*b1-vo3Md>i$5OvHh?gY^MJt{grPj9-MbI4MelL|VWx71 n)ZI%!7{o(&xeyIQh1LK7kSaaWaxUH200000NkvXXu0mjfs6%}S literal 0 HcmV?d00001 diff --git a/figs/img122.png b/figs/img122.png new file mode 100644 index 0000000000000000000000000000000000000000..b33ce5b657897220701cd4260463698d8dbf4107 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^u0Sly!py+HSXtR42ILq7_=LFr|NnpH%$eoo<)NXW z@7}#LHa0$U=8T}A;Hp)tIyySi($atmU0hu5-o2}&q_lhYZh2Y7sX!sdk|4ie28U-i zK=R8xT^vIy<|HRHG~AUwAR^6d_26Ew)~O>3T3V+hBqRbt%PH0 zCpeBUv6u)kn>8r*98x^e=X6mj#MnURCqt7#SEIB>6hoUqm-OMeH(ayydUC+fiho%e^Mt0v5;@H*IfIJBhF1NJj@94g*uFMh rx$7;FATgDlxrgh7oab ztp~?d6&)Ou6E`q&C5kXJD>JtV$ZQDCkvDAUoZ6Upl3k!BFrk|JfPkB!@q*pK46!Y} zt-%ft892loG&(dh7{n5}NK-^gNcm`q#WB=6n-`w1PSoG*31QvuS^1*hgaB0B!oD8)6~kp!Nia&lNfhBYQGoI7Yv@R KelF{r5}E*VC~xur literal 0 HcmV?d00001 diff --git a/figs/img125.png b/figs/img125.png new file mode 100644 index 0000000000000000000000000000000000000000..c73bb65d98ae5a60d77cf44eb336706e3ead3b58 GIT binary patch literal 331 zcmV-R0kr;!P)(RCt_YV1R(#8^9DB11eBp;NH!^z=R?uDk{nt7#P67z;0n- zF}b<9fdM~Y#3dm>KqEoG!oaWr3}F-l2Lpx>0~l%N(u32_OJ z56g}e+c7W3vZu|vxi%22q$(X~$*ht!jIi#<4ORkEceZbKqy$jBv-&`D-;bkM>PdU*mNFq45_c$TO zK1x7`4|O^=_Q#$7lCk_$-%hnk93Lfh$K5)y8HiSrwO_fU|LKh+mGwmcZ4ai?oQ!NF zY?DrLbt2&J60J?=-b<>d;rSiu5mgH`EfDYy&JHg29uZ}I8YJ8-QO*{V*?;-w|BLtp X^Rv{#x_p5TU~$$qS6i(?lsGY_vJqsk7TL4!%HZQYUo;8q0^HbIs zI%VzOt8j+jz*BrHrF@BpG`4nLy#MK1EAgj`x{dAU6UXgMc}^iGo~wY1-mISEW{2vE# znxp$p6dgBurmq9JF`I4^(d_uc=Ii#&A)VuuoTC;Wm3|R|BC^~-&ZKOyPT~XkX+sC$ z&)fi}=hv!N;Ch`fhr9C79k>-r+eMxd0npu+}Nz%Hypee78gS e>%bXK7e4?CC4CpKM352y0000(Ml$LAJxZpjesZhocAMipi@P6nDsG z9Ajf^ySv-m;fJ)|1Ct4&Em8uX?j*3V++*U{XEDK$G189V&9u9_nHSV7xZAJrX*a*k zjoJr1cKQjdudW#sec#6!@nmPB$`yAzdAnxW4b|VnL|#tU5mUHUEwhW?Va9n0nTt!N fH=W$cgebIs&a90xqJ7nl9JNy-MghC_~n5@j3q&S!3+-1ZlnP@ z!JaOTAr*6y6A~UIH!!faF>o}OGBX=xFid9UiEwCSU_Q*4BgAoFJ7dPHMsA)teLOsG z9RBJ2Ikl1D*`b%$8?G=rv*{}wEo)2^_PDTzLuI=6tU!hjc|50f8_t>yG@ilJ)z4*} HQ$iB}nGZ-% literal 0 HcmV?d00001 diff --git a/figs/img13.png b/figs/img13.png new file mode 100644 index 0000000000000000000000000000000000000000..5b76fcf656fac76efd34129a8a20687a4a6c8676 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^S|BzHGXn!-l=H;`AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl0W6?;uumfCpm$E=^YyzM?h-A1KSTt%oC2jT0SlHKm+3wi5-$=IS-N(E+i);h<^xc z=*UaB@uBgdV~t?T*$W>U6dQSclUbRYtqvEl3ryzMn7)7^h+~W7npWL~8O$wv%b3^C zaAXSL<(|MC^7(--GxKe|ur^zsi+oIpGu|~a9b;W5-!Nr^w@$O|X{{L=7Y;CO=>BIQ z!^Iadka@tBpz*-=kidZt-HBp{ cbN$#D=1kVza!`9IKhReUp00i_>zopr0BzfQZvX%Q literal 0 HcmV?d00001 diff --git a/figs/img130.png b/figs/img130.png new file mode 100644 index 0000000000000000000000000000000000000000..cceae99f957e4254cd5ebfbdcf80caa97130f4a0 GIT binary patch literal 475 zcmV<10VMv3P)9LZU@QR)V|b=s6R z^|CS{br&sN%?e0o>|AX_AkmDQtW!I(RfcwNpd* z7?@-e^hc82wIbo$x`f=6V3pN0`oqx1$i+PWH)!lpPn#=VZe8RaSbTHwq~P)x(tmAuv?j`yBQH{&J|UzXBm%yM_(K{#lAvW6;$@ zuTY*7Z4T#gw}{VbsnG`?EHwj4Vsz!x7z?68`QRknq%_C+zaeLPs}hVf^in1Z&B*Wl z`6>S;SXeAuB{HK4>7>gPgwD>;Ef!)mbYmm}rb2xT+bC+MYL&na_Sm@N3$3;B3juWUOl9i!r8_sywM=6CL|zmi1hIz;49`ALmMS~f2U>iK-`O(Dr#==P4baaaV7 zhl;yv?D+JwXn@kaWoGFfO^a=g=Y*2pi0KK3b&jwF(n|(hj>#a{0 zm{2nJ)t~zz@0~O2(kZQHxLQertFnGOggVV?oG$U3u;P}iJvo~+Zt*u{=SOaePt!5} aPkaMAh;FKD#V|bp0000XP!Rs|lKx0jlTOZ|h?|(*{@Z81yRK*cOoFKYdi_D zBm9Zf*-iipmo!Waj_W$E44VeV%JKRa-TyFG#(7i&TRUNsF+`AEYeaN?B!GPlyUDmQ z#|k`V1A?f*$jw1d)~iAOlW}m)Plz1`_JUNz9C%1h4C5a11+QQg0#pJw;lS)x8^$x7 v_X`9CkC4FWBEzQyMmQ|n?D3X;15Et_4Kq4Lfn*C600000NkvXXu0mjf5y!&j literal 0 HcmV?d00001 diff --git a/figs/img133.png b/figs/img133.png new file mode 100644 index 0000000000000000000000000000000000000000..432cafb2712563c49a1c4ae9d692912991764e2a GIT binary patch literal 728 zcmV;}0w?{6P)aPGq@8Y~%|6fT^!q!B&WJaNebGE9(UnTf1FQA=ujZ-emISe%-B{RemsU-h1=r z&6}AwZ-5d!m+6RF1J+0Cn&{%xXx^wR&WC8iZ0o1@k--j$gi5HX-t59HS=Df+&@7;% z__~oswgZUFghRZ@OiN1?-e=etQe-N40hg^GsCaLkZN&eMF6i2NwffS_v#G^$n{h!a zXu9tGZF!Ts&~|fG7jmEG^zDE2#Ds&dPuMRTu?AGBKfGok)(xz5b;&TTK6;UJNPar z_xx0`6Crfq5qF!#1|{4haJrbhbgV%x=E9(n)&~toEVdvMRAypJKjPdPjys&f(RBH(vVL_#z+aBK)@{4sv(_AYx-2C;hw~(LWPxZor%bVLE&Fp5npic*;~}8hC70U z-^Y?)jE&ue!xL!14-f0I>`c&}fccr=hv&#WTwCZ;m5y!DmX)wQ$CN)DE_C|$=S8*l zVsEBP8=992^ZqK<53t@=p3?LAi6^rEbm%4uDqH?n{`A(QU^so^vjCVl>Cur(S~pZh z2l{?j1tnv!x(|b7;4*Oc4p$W+1^s1Es4)5)BCpK+=+??{UlO^?d~Zz||7Jnh%%?aW z%7wa|VCOF|{e~^>%<;TyoyODMy;*8~U#TBQuTSi&LWK(d1AhQBR%;o2BPw420000< KMNUMnLSTZ@&0>%M literal 0 HcmV?d00001 diff --git a/figs/img134.png b/figs/img134.png new file mode 100644 index 0000000000000000000000000000000000000000..f8920ff1a777b714650d04bbd79e96c321834f04 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^W*{~TGXn!-`o#@mK#oCxPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3ELKqoX4&Ee)v9#l_|B-MdOkO1pROmX}qW3KU{23GxeOaCmkD zB)`DZ#WAE}PI7_+dku%0amS4U24~L4%xrpgV(e^f><;IuSb2W_P|{HDN)?{qlfb+& zvO!J$(a`{J29aEbiCjEB`8&BJByR8sImE=X#XVzID7UNNeiWCGkf_N}$a+X&)(o#1 zhO(}*2PS@*kjmV1_z8o`6p3li?NTCG9&L_KV7eK-SDHnuVGS>jPQRqY4#%R+5_!dk jzBEdD=`8A#ZrsIqtVv!|)2pii=vD?#S3j3^P616GKrq0YtC@@grnW?mc`= zyV-UT;b=@?zz~Ze#=L>Sfx!h+?FL2$RVdRN=#l`g5{NJ-P&otyd;kRu$l>NZ`xzK^ z!gMBpgwq%pxR^kJ1_uHl;fqLdz)-z=D+40~)DX4`WZSDZ1aR+R-9ow-k$tvZfv_SL zAifD=FeMOH401ZiOuy|Dh*HeOz@UMaIG8?s1qK9zx-|oXJFv`7=AG@0088KIg#e6cm4nX002ovPDHLkV1nm-qLBG^#H7Jvv=5FxODfe;XY8@Pdi;RBFj zW?(o#P#1Qd z0W84Hpb)?fqW9$NZ~+Q8{`)dgfe>jDOr)s;XRA}Z>@!0-uKo*R_j_#Z%h&9wkX z_@K!HQ|SW+J}~b$P&>m4Wcf)TVj?hp6ca$I9i$t0K#c0$Ko9_AcuxSuTLJ^m1h8_6 z%}N&>(9CDwz54*veju>k!+<7_LSq1>1`x@pflGb}0RUfmF;P$gLZkoy002ovPDHLk FV1j1Fo5278 literal 0 HcmV?d00001 diff --git a/figs/img138.png b/figs/img138.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef03e27dd9f5d3bb2682ab9b4bdc790ba0f1afe GIT binary patch literal 5097 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 N!PC{xWt~$(69CTXN#+0m literal 0 HcmV?d00001 diff --git a/figs/img140.png b/figs/img140.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca3189eeb23384843d8fd28675e302d9140d83d GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^njkg{GXn$T#*(aJAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl5g{LaSW-LlbqndDEwdz3maQriliNzngOrS9cJ;TS`0!_1*$weI($4=cW*Z`*kqW% ze2?QZvz>u~h)u)Iqw5P84~Zls-1yL#`28I(PmjYqIhPGp%wd-e7%#W4XPU9-je~Kc z$p8CH6U0}QGdnVP%-PB4vdQd&l6G2)#DTZFSv)7?GM#2(V|cMj@=KB4f<&N;7(8A5 KT-G@yGywp&j9d=@ literal 0 HcmV?d00001 diff --git a/figs/img141.png b/figs/img141.png new file mode 100644 index 0000000000000000000000000000000000000000..a7a8adba2109f69d70bcdad3289eea44862a916f GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT~Hu;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0LicSba4!+n3J5)z?jKuv6-=BXSwr@J9iSgE=J`sGpjxL#v06|(9~)D{Q%>F0JX!6 zI$9GM52>;J<5VzWP&st8;JrEXVYZxW0_;1?3l8Vn9bgf^SHRdilR=5k(B`T2_TF^n z8m`*4qqjrp*c)$a*F_nw@tVc?ah*$iYdc)I$ztaD0e0syJ% Bay$S4 literal 0 HcmV?d00001 diff --git a/figs/img142.png b/figs/img142.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4897661e7cbdcedff1e4dbeab17e19a978fc59 GIT binary patch literal 533 zcmV+w0_y#VP)sbb-r0y5nQN%!q}gCF7qp{2M*KS3Yrw*ZIEL%^V~TrKT*3MDl2$jewCsey&l&i^8`R~NG62`G*DiEP6@ov=hp|9yWEp8(&`|!1Z z!nyl>meXkBm<+mU!h8ciSL|9JW>YBAr+Bl19a1k zx$;~8C@7nzc)|s3_l|B}CJK{h%|3+iiLpqfl96h|1GX~;IZd|$)usb)B(p+1Qy2SK z3y_&ff~(5!GF~P&9-^)-^>htARK)d2cBorOPq^b95Zz6!?^JwbU8FkKQ0PUkwfp$7 zO~Qs!vyO__cu1^w6j5_?F5WiPH798-+h3HKa+GWeJ$~7>JFKnSaS@oDl`Q|a^S|*8 Xl6zH2oGUYr00000NkvXXu0mjfhZXHb literal 0 HcmV?d00001 diff --git a/figs/img143.png b/figs/img143.png new file mode 100644 index 0000000000000000000000000000000000000000..f6922edc7c1131553558cae6572c058620f86778 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4zdz`*$Z(8-%Xj&6WYi0l9V|7XseSzcZq8XEfU z-8*ArV?jZ|RjXEYbabSpr2$pBxVYTCdsj(GY4`5k(+wh{fkKQWL4Lsu4$p3Y- zLn`JZCnP*bOGpS{NMc*Y!p2c?;J|^`45|7S3`$870SuQ}7O=50va#7Kq#tEvoAcnO nA)Bv(@|;B8BNop!nRpnCPH@XN-|21u8qVP9>gTe~DWM4ft3f{t literal 0 HcmV?d00001 diff --git a/figs/img144.png b/figs/img144.png new file mode 100644 index 0000000000000000000000000000000000000000..b0518cbbf1d86b9ac0ead438b9aaea0e0373c857 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA$!py+Hn6&lZVj#yLz$e7@|Ns9pXU;4yFAoh3 zefRF2v9a-)GiL+^1y`+F)zQ(BmX-!o=;GpX_wHRKC8gcFcgxEvP6Y}vmIV0)GdMiE z0g|8T>EaktF()~}ftf3Tg+<(fg?*QafKNlWQPMb^YO*iAb?E-WpgQu&X%Q~loCIA~tUrYc1 literal 0 HcmV?d00001 diff --git a/figs/img145.png b/figs/img145.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bf9a802c2b713fbaea221e80f1dc9990b5a44e GIT binary patch literal 501 zcmVDu$R>sK8UzdNMzPa_8q4+8Q1_}rQ z03!evDEOuQ27A_)^eRE18&-B65Go6Rn9T=J&3|vdKdDq*yLFOum7b;BRo5>Y!c8*h zCij8ny^(-ssy{|X2mOf64-=3mUKprhtatjrOMj1Z!0Uj_Lb?2q0}i^Jvv$C49v(p; z7{TT~`fYQ%OvzcHtM$(!(3m5XfUxVc5V!=;LNns>S!(I}O!3Q{e0gmO?YKk~@?0zM zhbH+;-TnKNBiZ~TMh8`lF-FqenA5wY*Q+Gyet9-*`$>-QJ4)`#t z+lbtfatqi-kKL9LNWcp#YrdR=Jsd5Yh#596h2B6O<~us%xcFH;jSVSRAr z#zo~3H5Yo0geo>E3|$;;yF#^uT@zg6Y%4n({pair7_wY|>H@3^ P00000NkvXXu0mjfU*qR_ literal 0 HcmV?d00001 diff --git a/figs/img147.png b/figs/img147.png new file mode 100644 index 0000000000000000000000000000000000000000..d63a4c58057305421a63919ae4a70cb9aab7da6a GIT binary patch literal 379 zcmV->0fhdEP)^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H`AI}URCt`NQN4=7KoI`27foa@KaUWE>nwbP^j?wT+Jn4__9Dd6 zLa-JNwzw`LYi)6P1bds@6Xa$m20ern(GO+w;b9nU6GQ}2r z&|u6X%C&hB(7xxKF04%Sb;vnjN{29!#Q0*vxf1Sif0)rSZ4puC&nLFh?FKgIB%evd`iP|co^+}U?f z?fV1p(x)ycN95wCwQ7tNLY5?)&^2x~oxowaY$fdKvSvjumFi=U$VBNr$aG`iXj=Xv z*ez*LitwGX0CEonUiXc|0x|8_)=S7i*=+(-@UMY5MZ&&SaF!n>S&O4%Tnf_?ypq8_&D4f1B_0z+GG@@s^x(fes{f@e9x tN(!&qUD`$S2gv$8;1>IsXY@ZFiyL_1avDhOE=>Rc002ovPDHLkV1fq{9Gn0E literal 0 HcmV?d00001 diff --git a/figs/img149.png b/figs/img149.png new file mode 100644 index 0000000000000000000000000000000000000000..45c78c59698120473e1e624cec2db7e23c70b080 GIT binary patch literal 589 zcmV-T0d z(+YAtAEN{4VWT0pgXRS5S3pz>V~?uPTwfp_S&9B2z~<@wJ}hZ0cROjD#BL!>luNxv zesxCZ0yLFgNf4*XLL03cOlAQsO?}Ws23q;l>}d3LBr|Asv0Af;6q=+? z+p!<*Xim`|PauoILoO%KA%*m3<%^*`tX_5ru b@j2cAxk+YiGEdnD00000NkvXXu0mjfoZSSi literal 0 HcmV?d00001 diff --git a/figs/img15.png b/figs/img15.png new file mode 100644 index 0000000000000000000000000000000000000000..c09c8dd78260b01099b3dbf99e100bc15e41ca79 GIT binary patch literal 416 zcmV;R0bl-!P)K=!P&M&dw&#>9DZ45sKW||7m(@`G>(JljTpM zPYQZ62r001Ba0{{R4NGZ)p0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*I(n&-?RCt{2R544#KotIriEVmq+C>mt4slTt`V)e)gOiI(ccFv$ z1Ns9LI=Q&`2ZZ1tXhe&Hn^;#7$q#Ud6eovz?;lce20FWqTn0i5NYh_M6`dNK ze#C=1g__LS2GhcVprtbCl}9G)B|b46>{k($cZK1TviUaREb+}%5GyCTuRlaYp|6MD zSJq`B=%L}@ZKlb!1~qKOU}GWz>7ra~p~afAqO88bO4bZj(Cw}oztT5ZpEXvOM#5)} z$b2-*nvx1LjZM6B!x3c}Y_c92ki}s@r=C7lvoh1&?ssH!gQKK74rLMKWQVKNO{}i83GlCp&b)(Y&0000SHp`)fVjzFQa;;aSuoEGL zbt-$eve6=yAcv4z2n>e^I*abv9^z^#BC)YK!Icyi7W(GR?2p7dP!QqZzL4R~n{VEG z^WK|TpoK&a4*hC4I2zK65tsNpfuu8^W3C}wAYkbX2?Fjhmj4nn8>Tib!zStg z1;;7Mia{YsX~nSkNACX!vWK*fZn3oUQV;LwpCc;pturc3s15|udRM}EB>dECu+@>h z5?$Qx;Z~?q-`MhiaVOd_3R$~htQ~f+sW`bPTJn-d&RD-zP=dQU!G_Y|yv!-fxsNe! zhDH$w@cR=?tf7>2L+V#Z7pX_xq7}Lb5G`*K3)bk~_l<%&Yo=8qvHoRc=?Qc-9-991 zbR^M^5QFhuQp6krk>2RFBsU6%dLP9CH>NNr? z)%K0&AJ&(**BXf%MoC=D3Qcz}sYPBhB%GX|(kcc%Fi3oJJ-1# zN3|ti;w=eJadwXNo1?KZyw$}jCfq|m(sVoq->6k>2`__!g&zq*^{lqhojB$=8sWeS6HAsbYFcr z&o1k07*qoM6N<$f)4>gGynhq literal 0 HcmV?d00001 diff --git a/figs/img152.png b/figs/img152.png new file mode 100644 index 0000000000000000000000000000000000000000..90e01e0ddc373a4e6c4f4a564ac36d5d94be5171 GIT binary patch literal 600 zcmV-e0;m0nP)K~#90?Uvn@n=lZCFYbUX0hhqOn0-SRy&ZVdC>|iq=XHFa z^aTD=4SfmbhJo@jHjI;vHZv*9vP{w?%MNEr-+xGwE~ob_`#2w@%W2Tuj%#O_3K;s| z7yw&_i67dxUhg4SK5VZ^9|~v%bg@U}f#Wa>x^QT{V$(>HUl8_3<+jY7$z>)sk)!Dn zS6p}j3rWp&b1_a|EXHLTz*F0(mDsGzI9CObhhb_5J7r=sza}SMY1QHvL>iqcd^fRa zlCc`T0oqC`DjPo`8ow52t$OLX_eE}6Y73NwA0GU>EN4O++6ch=PNI_ynQ2s0bN+03Sin zRn4r+38I1sbrpmng2;))*(HMykiAPl>FjscOSB~g1qX-zAm6{c`||y}14>+IZlDrw zwVA;6xeO*40~0YHyLTMYZ*lwgS~a*jNI#?v~#CK6>tyqri^ zMnEu0mzjO|Qrn?#x|Vo4Msfo4uJFjq@c$ozN~?p|g_UN0p{^Dy3}K714H^U0HKl`D z9}yV!8!^z5b}CVySW7jDgP7Vuujx45x(K&*402IbA)U!g$ z$3{K@)mwD2@s#3(`mi8wllJhkBZPPyJ+q|hP2DuMh;b|rtxmz{$4Y7+EE2V(cnp{3 zgKgsm>Opufw+D*OpDJc1*e@f?uOx+c5A*~lsld9t^J}{0ENphlXy=p#IHdXL>R&6o z(P#IAfyM5fOAl&xOm&!MtMU5$LSdf`<#I{s?@FQOu8b7HO|+nH`p;nM$Lja5+yqtl Y1V-jbcV2;KN&o-=07*qoM6N<$f`&ux>i_@% literal 0 HcmV?d00001 diff --git a/figs/img154.png b/figs/img154.png new file mode 100644 index 0000000000000000000000000000000000000000..889bb93b7d85565dd945fb5de602e35043294d3e GIT binary patch literal 540 zcmV+%0^|LOP)$|^#7EdoM71a;;fd2vajsq(?j%+9y7JG-;HKp%xr zClQNU5@HGsqyg>qQHQ21ebShTD4`x0IUoV8zetgVj;xCKf5w6@HJBa_3+M(;Jwwat zStc6}9NHKR1mcsFxzCK1f~gs96a%11tV)l9?N7N+}z{qZ93(f@^sMED4t?&K<0!n?tD- zCuUv8l&d$V$XyTYCpzZ`=yZV9gZnnBV;N7+J=*42i{- zKc54Q-qt#zM@q;WO!rEG$HF$J(V-thy(vZd88}n#tK_^G*-L}Ae}Y)FBSUuM2gG12 e)U)}L<_^E%n^sS4k6yw600000000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*KE=fc|RCt{2R?TbFKotLFo9s3_-E0u`;w5-#Z53Akf^F$Z!RDkO z3PF07^(-xW^tin!=p}!EhfrIk24t_&g9|!qV7G9e+I9Jlc)k^Z0$7RRt0V0C0lwX-h5)X9zf0pd6!U#pbs zp6{X0y*>s4SNiTQQ|6AOZ;mtwvwE{gNx>vXTez-#i%L`OmOOsCeKBt(eC}mC)O+K2 z0X<{$j}kPc0+o7zSDF{Dy}n&-w_xORw!SB#o=7?)=V4xemY&E{8cCb6xK%?X;&nBv zO3|Te$O6%qIQPMAMp4vRCxA!sE{tWW#l#WDmcytN`?>x)-R{`uu_kDDDc*z--Ke$0 z`xH?UFr+RM)ozfnzUrJvNl=e8z-+uA8_NoO%T(d{iG?+u3&xAxqB73*49nCJuVK(? z>)d)de4;YX_Z&2eG6VJ0%}#4m+yQAo7bQi00kT8Oe3njlN>lnbwC~ZdC8jG?=}Ceu zJnzBuss?uD!{$yddr8B+4DJR!4F%CVZdDerBHu|>yDHPg3Ma~^-_%mVEiOF-3xI>y z9=;bXRyG&7pt-*YC6J!Y`NJXc&+Xqrw-PE|Nu;u8fk92-?rtEulYldK@Pk9P-TOgd zQ?#uyHaO!Fo@t+Qyo}a_@%TTK_LKP$NIBV_!k~Vfb|S2tS3nJ~o1{!Fcx$Hy8&eww z>)RpcM%V~c&zGKe2!?l7^ON`(sd$!J8V2T`!r=b|H(k6_e(1w%<_+djG`}nWPYMvt zuTLjjaN+9hp%O^U2YVZWe@Oc&ZcfsBiB!%u$Cw|$c}p1G97OxL{6< z{R2<)e^wmhV@(zW8D6$5`e}&2-%%ClB!S@D6*ke8ifSnZXNI+YrZlDhhJFDy%()QB S(|pJP0000^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*I14%?dRCt`NkTFifKoCWro!HLeICg`CM3a`z2cWQ0Q>3SHPeZ{0 zasY~O1C9_;Ai)TU6QDf+NbaF9HAR@sVvz<51-`U9fB$~X{#j52$&{awb!6FNf_TA* z6#)RHw+}0QGmk7IF25Wf_%GSL#qRDD%*FU{s z<)T*`Ppdq2lx1AZgW`nN_nB_x$#o6?9&J}ViO2(2%4Vnc&%>`!gKNzf>S4cvBL-eQ zvojsBW>0Ui-EXOy=*WjE%yk9wD$+1k=~CVf^o#26AlYNb j*4z0)>#O_5W@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaFhkx;TbZ%t=mQV9sM(lfXR3A&hm&4s!#Mjqi@F>r{BqHY38J?;bA`W5G5f7nTgE z_C?H_q?+40dAQ4zx(y6eCL~M0Okg%@XFn4CiSgX}HVNOU_rxVaaZnTbGa;J3||~%V_UY1Ek`ImQ8SPEaCDnYj@AxAEi;FRHD6!N{;=A^ zAmzm2g^w7U%{vZ$Yj}8*^^I0gxqf1RenNs+LWj45#)W%(+1D|#NQf3#h;e*Kk&-Ji czM{a&(3N9s)u{a>0O%_QPgg&ebxsLQ0B{0#5C8xG literal 0 HcmV?d00001 diff --git a/figs/img158.png b/figs/img158.png new file mode 100644 index 0000000000000000000000000000000000000000..087859682aa34419e12e320d1fdf374626d25160 GIT binary patch literal 579 zcmV-J0=)f+P)^rq43mBj@}c*EFdf+&#(m zXt$(RY7R=ss`D=W${dN79AE?aSiS$zwlnJIKE~7yze;2sC5l21QMnST)x4z!nU(TI zWlX(;K^XGOfysM<3iocpJfcsV&P5Lf(bO;Wvau8gwJRElNR9GZC8`#wx1qeG_EENO z*Rz>R{FUeOlE*WHS$8JS5CuO3mXUm=ickK7RX(qvQhrh;M2zaPInX Rgj4_k002ovPDHLkV1n>G2x$NS literal 0 HcmV?d00001 diff --git a/figs/img159.png b/figs/img159.png new file mode 100644 index 0000000000000000000000000000000000000000..7658f2b7018bde59027fe30d70db390400fda61f GIT binary patch literal 1117 zcmV-j1fu(iP)(aRS^E>P4~{u_Dpvla+c>3h`13JZz4!%4dk#M z`V<5~8ZWs7S;;9034Qb+VRDI}m%+cF6V?RNAr8btK+pjXUOY6OBnx3cgC~Df)qDM8 zdS*02Fo#U>ru%jE_r9vGS5@5utdta+bSN~R=H<9XXZ5;8@h558=2i%Sgy+fA(kNia z=Mm3|%;q(S8U7nh%vls>ma8|SBU%9K1TI5sJV zx3J5B0r@X`kb<8q&tBrkl4qk?=4R;SeqsWE4NFE-jWlFiJTgSgRbaEzd&ZCWJYYJWEgQIr*EO~C2X$mA?7v1E@=u}&cC!e z2iYGAkzz;FOEm#~7oxJ5{_9vrrf$L97(uRCb~Gs8b zUN_$(bPE>qHZvqJ`wdRu7>&&C)Vd`_(I|kF8;OrPuRyJ30@H3JVLG)gwF{(k`f^#p zDEr+ZsHwgamAThB1*xUX`9_K)&$CL0-&MQ5%3AWNWevK>JY$FI?IwzZTnLMUOu8JT zaEy+l;0QR+(IKkIF2P*0lnW`?OfwfMDq|HFpt9VEVjPzss7l9o$MdC1u(B+Dv6ZQ2 ztO^cJ5^B^nXms3e4&=;^B+9~03#?~rk{v3W$5s3KA_@tgZswx1?BUbnogbxJ~*m?#M%V3AXN?+eILwcFMwD-T4U1VKz`L+-;~!_yG7-M&*=q z;^&ko8b(iyH+03OCb+_O_oE>0elCk5cV>LaYNssBIm8nL@4dSOwuLtC4Y@bl#zUd? z8cv-=Z|WJNhAmKfkXCG7)F1O?8-E7n(oc9@ETeSF!jujQa^?I2>~c;Lw{XV9VGzsr zrQ2}o5TEf(j2bpCdQ!7(9DO>)_n+hz~v zaI}(`cOFv+Zpf&d`tYkOOd&=Mo4Wr?&E^bW2Yxb)gQKr8G^v5VWK_A*gq@)`cN^x| z#A@Qc%V#wGar831*k(M$h8&|GbV*^@h8I=XG|KW?Jyr7g)UW>y;%Q*rRX8&pq49k- jPw}rt*Rqzi{BQC%vUMPeL&PAb00000NkvXXu0mjfYEcu# literal 0 HcmV?d00001 diff --git a/figs/img16.png b/figs/img16.png new file mode 100644 index 0000000000000000000000000000000000000000..e715e726c4c5d4715a69aa751f45ce33a01f8147 GIT binary patch literal 772 zcmV+f1N;1mP)001Ba0{{R4Piqrg0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*Jf=NU{RCt{2R=bPTKpg%hn`E<_>}|NhPMEtBRyd2j!hW%}a65}b zSp-{6XR(Ok(0UP&gC*_WUq><5|r9^Y@i zdF271!cA!Fso`2+0m2pe6%jIowj4Le<%}5NLy9v<%2e~RjX@6l1^8k}1*qeeE*ni# z%9DAug51F@-!B%_OTg0Wgn2KkF8;qjA7Wv>I4`5)d}{{n8vr}?vK>A-!y+Ac7*jg| zCws`tJmQS;F*hZ+Tc2{%q>W{pxsTGYWex5ZZcMX#SKS?xH0+T4RkrgR3W`**%gXro<6ZouZU%SA} zPSn_fZ`5jHf@7B5Aa80Kx(9w_qETIYOu1z5;rgT?YqgyW-om#0&Z8{8#humhAfAQ05b~~C!)?@QGYSviezr-)f6^>X!%f%J|0000Nf;h@6duHixav+;JeXf?FKc0sla-5aF7D*6Mq2CL!+b;ejkz+_y8soAGPTyf|RpNjS)_l_S!M33O!>3&!bo+`W z;BFX@s_@wrBZ2M2#@>6)O(K0w9mvhdyOINvuwuDD1@0p5#e36`H3TS#s9bf(2r23%X7MDyWj z!KE){RKR=lPQGGf;_as$;Jb`2%`)xWhx=0`Q%AdkVMWZFS(5v&<)Hv~?bA^&O^=q` z-ePB_xCxCT9O4xl7w|J_A05ph-#FDv)2HEqIG?dUceID^A7k8L8&~%@NT&LBOecRS zqf67L-4oiK=OlMnI9m2uBc2O&eEhLBku*HSiv`+^*?vd+g_b75SBvIu_rKP|5-r3k d+8O>^{0133hae3MDZc;!002ovPDHLkV1maNM=}5a literal 0 HcmV?d00001 diff --git a/figs/img161.png b/figs/img161.png new file mode 100644 index 0000000000000000000000000000000000000000..32140661dd6acdfba43dec8cfc7ee1bbc3da9caf GIT binary patch literal 542 zcmV+(0^$9MP)DPG=qZR5^!>hyF=;hkjMnMz@ zw<3tE4)q`S6QYBlhvF}g`~ZhcE;>Y4hkCC`)22<@4q6cUK_0n#-+jm3%ew$M7?_P4 z%}L*af?W#;CpC3|1l@Efnj=Lyth~7oTnsHva2m#4GM*B008eP@)BzqTePP=Aw zbGDN$rD*U|oyu6^ufRw9LPU?aVx!f5c&$45q1N!GM5mj~uUzvf%N)Db1h!Ban~X(c za%_{=gRsS)qK_Jj@d$0WQ$+T@I!>X;4to6w@!f<)_rg^wqE>7*DiTre#8qSwjX&-U zc6kLN9qt=(1CC%F7KljnPCV)BtZ+#m>wKmBQ4yKwc_e5X%G>1TfNy5h-i%%rAgfSL g|4RC(bBX_sA1MWBhGKX5NdN!<07*qoM6N<$f_um7^8f$< literal 0 HcmV?d00001 diff --git a/figs/img162.png b/figs/img162.png new file mode 100644 index 0000000000000000000000000000000000000000..fb23886c42ed23293c0b492c5f4df289a6fe7413 GIT binary patch literal 566 zcmV-60?GY}P)hYvwA!UD$tUu>j=iSU3uwL1*t&1*k4AOFC{_!#K=OS!`0Bj zR$1bfCeVp|7WXj)U6rn|%Y>1)h?(}I$YTbe@hww6utjVVy(T5VDZgFEVWH15Oyr3^ zkfNF{j8Pt+659%CHLi}umF7F=PUy2mWa9WoCgh1PRfkS@u-5kq)LUi2xpY_Kwnuo6 z;wIA25dV%EAZ-w{X*~3FWUR=y26hKaz1Vn!5}kAdTtLj-TXvdHgULp72t7ChzxE1E z&(N`X-Pvg>jt@NeT3Z;4HHb7EQk^7n8ENvcE$bSk7f8Wm3vSOr!T?kfxmV1Z(g`FsolC?>K$0EI7R z+zb)G3Gs~+P6bL(+5nrRQ=JCGHU1m13{8F}1z^x|BgwNc z#Di&W2hIhc;O2Jl2L?7!fPFU*Yy~nn4uBP~y`Fx7;XKf!eF+Q<(~wMHeeqfWY!a^# q1H&DN7(Y^~L<72D5?4+b@&Ev+OfSScf-TVi0000;HD literal 0 HcmV?d00001 diff --git a/figs/img164.png b/figs/img164.png new file mode 100644 index 0000000000000000000000000000000000000000..5e28bdd767c65696c9c8de7fc47a5a1fa5523965 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^nm{be!py+HxM@+w3m``~z$e7@|Ns9pXU;4yFAoh3 zefRF2v9a-)GiL+^1y`+Fm6nzURORC0a`*0CB_*ZZyLY!QJNO;_0a z-_yl0q+(8T0s~VTTSx&z@A?A=4xDQcmoPAhVVK>rZmPwBLk9x3W+_HSePmd$c-4Y4 ztUNq14ySH2o@03wx>~GZrVmHpid&3K{((DVG(?`iDq;2sWWUB9amA=4*;sK~xu8&Z k_SGzr+dEE{o9i+#97-2_GU>(xN1)XVp00i_>zopr058W_$p8QV literal 0 HcmV?d00001 diff --git a/figs/img165.png b/figs/img165.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcfcb279455e1709f47d895d2e4840946e6eefc GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^(m*W7!py+H7-8Vy4CELD_=LFr|NnpH%$eoo<)NXW z@7}#LHa0$U=8T}A;Hp)tIyySi($atmU0hu5-o2}&q_lhYZh2Y7sX!sdk|4ie28U-i zK=QqwE{-7;bCMGh5+1NW;^pCJIFpuifPq!v5kp5n0fSJEw87K^j%HUx(%97e7Pv}B zm}~qwuvmt9hhruu$5D<_K7IaXrW04W?j#&9%H1$8fnj3e{l5(&p9`5;MdY5>g`D&~ zVWZx5n1|=l?sDfV8(#j8KYZZ82ibHXR)#&k5*trF SX_5pwjKR~@&t;ucLK6UWd1I^q literal 0 HcmV?d00001 diff --git a/figs/img166.png b/figs/img166.png new file mode 100644 index 0000000000000000000000000000000000000000..ffef2a64e4b3423954961ae499d35b89ee992a01 GIT binary patch literal 453 zcmV;$0XqJPP)Tyy^A`gWmX}}+ri~V~ zGGt91{snTsj!9L>f(SK}LXk5!9$WE#NaM;?jw&(?a`3vB zs7}%S^^X1!Pn`2xoRT&=ynb%^Zlcf5Ikjrj$94+r8i5^sOvH#Lm|=_jAPjq?C%%Uj z*@2G~A-~e51GORf>%qO0`y#tXV;#UP=dXi@;_-$|V-ky(oEPYm@r1waNJo0qwpiBQ v70fHeEt9i*c4t%k%IwlMD^p-!iGPSs0g*w=GU5q000000NkvXXu0mjf9y7vo literal 0 HcmV?d00001 diff --git a/figs/img167.png b/figs/img167.png new file mode 100644 index 0000000000000000000000000000000000000000..0f322d4f76e4919d5f54188ade3e259ecd46cd06 GIT binary patch literal 374 zcmV-+0g3*JP)2hd~zeum!*AhHJ(uxh71CvB!xEXds_1=Kc0uyNOYU%(^ zD9uuaA;lKr=Kx_P?!b^_XHYu;W-xv@gdxezvH+Y&7<3tIfPtrg2wadPGb9B8Ls%Qg zb5H*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKu=mX-!o<>KOU_wHRKC8gcFcegJ)_#P<4SQ6wH%;50s21vfa z)5S5QVoq`b1Ct#aM?pdZ^EFl;o){jF2U0U)4jf=qF%~=|>TqT%Pg>Jd=A}Es)+Rkj zO+3IgLr>v`%^ioNGDhYYV{PUp-YKi2wu&6ux0<2wlF*y9B*sZPg%K{|1{<1JDBn?Y z2;Z=tscC6KV2AzQ3s;(4xqBk`6gs60ON<#9%1cC^{r&yJ0O%G5Pgg&ebxsLQ0QLe~ ARsaA1 literal 0 HcmV?d00001 diff --git a/figs/img169.png b/figs/img169.png new file mode 100644 index 0000000000000000000000000000000000000000..3898a7c467c298ffcffb45a9eafcaf041b0748e5 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#o>`Pl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$c64;4rKJH?xwyF8y?a+lNhvTmpcxAo z_!u5AFgP$U0C@}_fOz%>+*(io3lJXw;sp?HGteZE2os3ZR)7eu{y?N*1Oe+VFvYx; z+kkmd3SeLZQd}UlObi#m%D5ST1nYJOh^x0k4dmXvomy_A z959-(=z-|w-4Itv1BD<#_xl0^2auW!Q~3zwFEC(>-k!jKh;&9EqYcagh6c+4Agu$H z;ZuObE&~J4T81tM5JLuH5AzgW4Tu^Cs(Wc50RTQnCc$JQ{z?D<002ovPDHLkV1f*w BeoO!W literal 0 HcmV?d00001 diff --git a/figs/img170.png b/figs/img170.png new file mode 100644 index 0000000000000000000000000000000000000000..3aed625f255ea2f4df71e07518cd9d95064fdc54 GIT binary patch literal 416 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 literal 0 HcmV?d00001 diff --git a/figs/img174.png b/figs/img174.png new file mode 100644 index 0000000000000000000000000000000000000000..4d02f0d4c6dd03c9023647920d0646934dcc884d GIT binary patch literal 320 zcmV-G0l)r9xI0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*HzDYzuRCt_YV88+t(D)lRFfe?;rVs%h7%*@t6fmq{U|?ZzU}(Uv z7!z1;VBluB0Aw&R0u6vUfqNbUBhaYt2S_yzCt%#lUjSzC?@nNlWdbrbTwwSDr1*gL z@GBf(*Z{H?q+mlVg8`6Y2eI`^71<+~+dIvcowfzG{q_wKzQu6F`doSVhU5vXkel&g$pA;0zRZB%qWod5ty{2+Y2 S-x}Zm0000MG{d)hsCu@$%lx1f~Zl%OfWQ-V^0w*;pI zrG%G*WLr{Z5MTlX!D9bO5=DNJqR0kixZ77JHEMQQgRNgC<#Rp;l*#$}h^;RCJ5^607ZaNeB@$w4-ekQ@P|6+A46r3y(4 zKo7S$e_LE1+Ivac)8$*~xY_p5VGztMBbXz+mB9c5xRj(GoFoK3I68nKq|`;U11sS1 z066gAHG;6RkOaBT4*%}tGl}>DrLT7{zV6fYiv?m5yCS_qmE!ogOk463lT9X`B}wPp z>S-@6`+P9D-~hj3r9i#7bs3-+5U-ITpsaFchRCweNH z@@qApKEUrn_x^7sE()`*%>2_|8PEWJkfeOhElzWJM*zXL#?IRav>IWx(ZXe-QT@_x zGT#QE&#gL7UpXzn_CUKPTOMnnceV9w8K67HhypO?M(qkiWVV*r_LOc;<6%ny-?75c zKC6hBvjB!bD0u*^Hd{x>S&XK31^Vcwm6=)-fGNv+M%0X~1 zBmwBzfha>770G)flfc*D*QC4m+r-rz#~l~oT&yqSa@A0EfaEd{34*6i9*zy9tGjL^ zgnxe9d&J}FLtfPChxD46+HW(@!_zQGsi))Q3%KY2WFfAiQb-ar;GX7cnxl*Kav4cBEJ7!A3jgj2SX& z_LOEExhzNCe@k$baLyNJ3H(~8fOGH&d~{UMQICmx`4)aC9|s=1n&cIhDZdqf0pF!CO=@rmE6Z4!8@00%vBbZW zlm9!z9U9%uxI>$}84C@^lce@=XeGVv^sU#I9nQ7!Yd(29{9Kr4Rbnkr08ub@yUl{# zDc_mV8!0bm2u|lM_h^gKod_`iy$cBXguT7NDOI`&nzhbmlIixnKw>ekH8m)xQ5_ r?>=(q0+%Gr@aU5X4-E+q4GF&hY0Df##7&d~00000NkvXXu0mjf=#w3d literal 0 HcmV?d00001 diff --git a/figs/img177.png b/figs/img177.png new file mode 100644 index 0000000000000000000000000000000000000000..790d3b279003daa9e5c46c460749174e5a3d5c2b GIT binary patch literal 344 zcmV-e0jK_nP)f@Bf#;kld3n@Au*3v9nw1&-Kw6cl%Z7w5Gau^? z=A-7%RSYqcDZPX=;KB&nF6vF1Z1s+EnwtW%XRK#+#454f;!;UWAABXb^Ww+>hPxHa qm1HX&I6WIwuSv6(v$KD1`KAZ6P9v-KTD4990000*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl5g>JaSW-Llbpc7RL90qkkG(Mz%E#s~I{EvmeRk637W#@qa#k)0dyj8#}}t zYD!vyyXdLr}`IMa+O3>g@N*hH+9D~vY+-NWGN>gTe~ HDWM4fn|N9~ literal 0 HcmV?d00001 diff --git a/figs/img179.png b/figs/img179.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd7dfa1620333838b4b18c3ea5a81de89637afa GIT binary patch literal 581 zcmV-L0=oT)P)Z@dM-&vLI0%f`~8ZcQ9pP0S3;#IB`;|tr$R{UTXK{<=y#wxfq}@TY(rLfraK5 zusv7UlF~@Pv_Vq`LZF{?ilfB~Et7}Ly)W-Qfn$MOP)M2`-OzlnmI@zQx5nGF*h^Rb zoVf<*!hTNno1B%?hHZo$bs8H0L%bJvF-&RpI`9#(FT*+n`YI%vvrk*Y(Koj9 z7p>)iNyPgt1h(g^q_^gW)r{hzcs54}ciU7b*O& zJ|XF_D?_0>BHe(=3y~vvhAv>XEW>WYqfVGvm&_aI8ESA=XQ&J0$AHLf{x`m|Uoz)< zN%oY+8=V=`5?hbxJPtJa{J|8jVDpyY2ClY`dZcJ8eKCa7*lN5@b38>K!ZEd@uYaIr zR>fQQ892M4uDs3SWi&N*k7RuzrgId<`C4Y1RG1U`cP1RKJuXQHV~)r4J3{SjLWe^- z($*}qJNO!AN%Zj1P(K?nDbbgRPqQ_wvf3wIj%T8mFuN;et6QP>Mn-yN|IfYve2#6R T9Ajnz00000NkvXXu0mjfZ|nid literal 0 HcmV?d00001 diff --git a/figs/img18.png b/figs/img18.png new file mode 100644 index 0000000000000000000000000000000000000000..49a5fc89ee5564be180f7c41ab90ed3f26bb332c GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^+CVJF!py+HXmI#cHISnl;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`oN=r)vs&a90xqJ7nl9JNy-MibD9efWIVk`;r3ubV5b^|28 z*VDx@q+(8T0t1s7TgifkL&eCJ3KsW z3TDCr_d^*9CAWyIc+957{E%fiw?|B&puy4YZH)^Vk60YaWtx&E*5I{#omR8K9tW1| zt3p>da7pqR7*sU7a`!|uFVdQ&MBb@0OpQty#N3J literal 0 HcmV?d00001 diff --git a/figs/img180.png b/figs/img180.png new file mode 100644 index 0000000000000000000000000000000000000000..33e9d0176a5a86b8b3a3f38e673f747c542ba5f8 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#p#JPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3EJ!EiDbG%EiUy?%lgeN=mzT?`~gq@I6q7u_VYZn8D%M4UoLM zr;B4q#hm1XgoIQEMm;vRZJay>3{Q+IG#NU%6Ij?T%QhTgTCj_SjZKb`!}=8C!sC6Z tY8|%@eUNf7Y%_OgIp5U5&^Dci;Xxp`>-XET*MLScc)I$ztaD0e0st~6LN@>a literal 0 HcmV?d00001 diff --git a/figs/img181.png b/figs/img181.png new file mode 100644 index 0000000000000000000000000000000000000000..57474281e88ec124a94a4d208b15358afebeb8d7 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!py+HC^^w4AILEX@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaLFZx;TbZ%t=l-z*6JGoG)Gwl8dKbaZKG+}QAtky-vk zW(|+DM8wYq9z8Zz0e^-ylm0TE;P-jq79?N5Wl)hDo><`2p<&1nd*tka1cqmpS2GQA zm@nm=myob)W|_ffaD_>fVXycJh9EW-84K|S7rBNVYZL^xUB9f~aLB&&yAWGjrh=eY toHARRwE*`Idj*}#tdoT^Uc2)!Ft~9j^FEc=od@(MgQu&X%Q~loCIHL;b)x_P literal 0 HcmV?d00001 diff --git a/figs/img182.png b/figs/img182.png new file mode 100644 index 0000000000000000000000000000000000000000..241cac5a6995486c3297a4cec591fea580d9d085 GIT binary patch literal 632 zcmV-;0*C#HP)OfYeDm z0+z_xleTrabY`-w%KI76Tex&UpAbn}R5J>wJR>H;a_fhFDpQ?+PhuJ~%f8fc&XUWuk&rgtS;2Uk)L|Kn1(O{)<< zRK6B18zQtsZ-5PfK#0^(gXs#?i|MIEcZF>Q!y zX?gWcaa+GZihBh$>*gS72y1Dru)ra3{ZLrj%H~Tsuw~Edn%0Eu$vi!3{7-AP=eZTu zvL;}p{HDeYb-mDI+}57bP@qfO`$?@F`@kQmoJd!Bq+e!b*vcARa(omsHjI|73S4dH z>i2~yX(E0#oGlX~XD9cqKIL{#tVzpjdl^Z-RKxo&;OTgDv@e1>rF SuR^E*0000W+J=QM9r;*O05)wh85&{k)K1PjK3=FgzdJEcTvMgb^Ig|O-!EMRs QfMzjxy85}Sb4q9e01M+Ys{jB1 literal 0 HcmV?d00001 diff --git a/figs/img184.png b/figs/img184.png new file mode 100644 index 0000000000000000000000000000000000000000..36ccefc39d06dcf0266571427b4664dbb90e16cc GIT binary patch literal 457 zcmV;)0XF`LP)<}eYi?ShjisN_ZXW#P~DB+vGi#CYOl+cK1 zWUV%7olQ07M1xPO00c1y%1Ku(PxuLe_Cm-zeJXUKd2c`kr3B7!0eCqSw24yL4ZVRE zG|!3H(=Xx9Ohd3?Wr8@IlBtXz=(I8>$aJbW$L+k9PsFU0qKGf&m#Pl1PbV!zuDO9i z-$jvpYwBp^GSjGFi|((&lJ5wYNA=VtFkK#MI=TY7rs>uzY}MGB^QZgcLgZDa9(r?Z z>fn4Zvmf6QZoh^fHDw;hd*@7@<4FW@km&raS#~9X-&8yUg{kKA;lV<$f8DG$u10ld z@*blU&g3P=w%4uv@dZmiJ9YNB9$DjEx_^u{0WCM`=S=vQ00000NkvXXu0mjf+XT&X literal 0 HcmV?d00001 diff --git a/figs/img185.png b/figs/img185.png new file mode 100644 index 0000000000000000000000000000000000000000..013477d5e87f4c8c1849bae44d45ba595ea0d068 GIT binary patch literal 721 zcmV;?0xtcDP)?}BT>@1CT>?}BQvzKA zRKm*vAO(oDt;Cv1X5xR4NMQHx;$yL3fi7?-Nh-9H3LPX#0EAz@0u(E+)ySP5w3kkj zq=WVn7E6S-NYpkF0E_YMBpw|Y8&fy1jTIozC};`l5*lur*LlNu0^_mx1#fW`k{v zW_I%A9}?IJnvj&WK<8ou_RzIUoa!9XoSl;#s`R~FcGWC)QyC{4kIz$p<*Jd7T~)wX zsVgVu@6^#qtq155!IK=$23s1`O0@33eK}9LRstF$bzmEC43XM1H5OpXb`F=e_I&DE z_~w;~G3b{`8ex;WviqZ`IbKU4!)Koi_{<^TGlzg*va<9AYSr7Q00000NkvXXu0mjf DWBfyJ literal 0 HcmV?d00001 diff --git a/figs/img186.png b/figs/img186.png new file mode 100644 index 0000000000000000000000000000000000000000..f492beb0ac84aa31613e8b08414bf6532dc7bda3 GIT binary patch literal 697 zcmV;q0!ICbP)Z<6#XNup%JH-M*A)N1Eh(n)$zqB%)` z9a*$V0?_jgL>bbrLdtz5@HO}~>E8MFaWlvH9T%W07Ke#7E;|cQwSaWpEs-F2>g3_r zfB-5_k6ny%T#(gPriVQ4nP)So{*|bB_UOSD*)V> zJBxur@(8L_%OwGP&M;d64bTkr8bGPW5ELcQrVHJ=of+(U>w)R~yA<~yr z^CBYMN)I;Lv1SYaJ~r9C8OGJ%G(?Wi5*#IT*=D5980u7HMI0+LW2h(*v`S19Ln`J; zXw@Zk?n>_@q4aV=ph&UT!)4<;ofJvx0jzI;E_eh!Ix1+X$HE;2=6Oi1;)jND;K8d& z&S6>dVi!N9kmUx4u(FJuxzRfd_|?w8RFnTZ!vhB0-FU#5yBiA)=T}Lm!{H?9vOBjf z$EU;T@&V(^%;E5B5i;u%Yk>lYf^pid8&>Z%@Z9K)l(#bkr*0#HXp7Qzpa58z-h@Q3 ztpNySU>B3o7ZGOT7U!uKLqq_!28w=I1rv?t<8G~?uQtEL7Dh$pvl82bNusO;T0dqk zLfeq%F}<Je)R6ESJ<}XbgsaLj00000NkvXXu0mjfq{%ug literal 0 HcmV?d00001 diff --git a/figs/img187.png b/figs/img187.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f6221e7d2481ea24e4a5716d19de15877b78f3 GIT binary patch literal 340 zcmV-a0jvIrP)U7t(M9Ds4T& z#=?e%-a-ywK~F=XosBa~%odPX@spkX^LDbcv%pwk0wGLlbrUrtfs&%n_5--nMMe#k z_O$1%vVElF-ZCGUxFQ1Ve>Y4k_?aBi(x#x>3t%PbiD(hJjG*9z`Z%TuA+=q!JcGdO z^0;4(%#egurhuK!vf~CfVA&ISF%UHl^kl3#=s)&T??Q>Fsw#%V#O=-v9%SxBPE71z m4?KqkQE!@Ubu4EcajY++8YM9aF-Ot>0000>^yd6 zXLlz+4FX7cOzNu55E)%IsiIAOJ^DiW;!^aRmkH7U8291%fNR)ZH;&X`>uFeOl0+B9 zWAc@WyG)6m_@raQI4gq%l{Id%i8bY7M#`^!t*QSjy31A8r=N#m3|!=L4|j?F8K6aH z;4PFe9Jb{WQYM=9$jpH=0p3pf$P|vUB+*k^{1N8h(@Z>FNyUoEbMhQ5XPAdYJYa@t z963RE&=>1-XVthq4a-ZjMKeSL+Z$wqHCUPE*k$6C^MbYUJ%)FlHw_!7v?d*Wa7?#g znwcGzZU%dl@*+jAA)a4|?X%2N+`dFx%8_Oj_JExhopGj6d9)~NdSr_s??wDX=R|L< zV27loi;c(7Q+DGG?r_VqDTzUVU$N3E*1?G0GUBK!@+9eLBXaHT0KGP*p)Nsc6-Fulm_2y_~wNOLdSj<}~aL4?c ztVngFE{E?w(d$vmx;-`=GHo7hriKRN5Q3KakhNs$Z&H4&O5e~?P#>|+xuNO0^dtCF z(}T5nv|aTNSu;j(mf(S$ieb<(5?z&AmlyAKtzO7?xF5m2{L*x8hw?LPDT7qJT5s&0 zO1VH4RjF>9R;b2?TViN$Y&5kk3t0oev@ z5C}kUlp#Vu_i!lQLQ!SVFp*)wh8M^}3=9cm+e!vN4I~~AcgY8YKs7`GQb2G+L^d$6 zJ*eG)D#CC<;Q+(#-4CE53I_@}Sse0_)nKt&0jFbz4%ooJRM&uA>MJZ=ZeV!Jkb_+f zH$u$@2#d8|eP`+>{Av;m8Cn@`<52T}!5hS2d%$plL5U5!n$+D(7}N_Gm<9L`Fq~FE wDAC@%2d)ML7?I@AtYd&@73_cquk6qU0DT}jOdl$h@c;k-07*qoM6N<$f|kL9LI3~& literal 0 HcmV?d00001 diff --git a/figs/img190.png b/figs/img190.png new file mode 100644 index 0000000000000000000000000000000000000000..80c9e67b0ccb652a138c7ba1dc7464b50e614b35 GIT binary patch literal 455 zcmV;&0XY7NP)nwup ziKMf=M~Gl80TIzfxJL;10%fEv>5F1jExM?x#4 zm3R8YJV7}!PG?nsO_n3!r1OpuzC*xT2!++BM2Bp91Inco5bFZ{0wq{P&Fp#pzz^DS zD2nq7a(;wsbL`TJSt=pgIw4WH)_?RRj0TmK+Naw&RrlIQR~ZU4!vuP4#xuKM+n^MI ziz<;=Ma!3)Mg?nle-)N`#m>Y2qU)5Zyv*1fo&$Z;bn6+SY<;B;zTr$;E~uSNr*6Fr z%e?wk+`S~&uH7q$gGRCt{2RWWPZP!Rt7>`1nsVrj@yT!`otFaZ(h)J1sd&>{W_ zS-J(f1TvHw{ee;srCl>*>+%xXEH4!OgKF#2LAwbUk}1j1yC=z#8rOtEh7^Awzq|MD zzIS&zoq-A@pu9ptfQ9G@v-l83P>Zc{G^WI*S&E@?i`i1^B@meWxy3iP%q8WHR1phO zS+f|h>ef&G_40cmX{>R2!8{(FN8HJh9;J$^8k$Ia;I00KG{|iIz}94R<&Bzc<|u1A z@zDh*q9kpKQ@DA~{{zTA}w*7S3NA9RU620m31aSTO){c{ueQ&R!= zi^6j~5rNw_Ra@Tye&xl=#$t?n!J-J$Qr$Mccm5Jqc#QZBT_tR*X(8Zp00000NkvXX Hu0mjfM@AZU literal 0 HcmV?d00001 diff --git a/figs/img192.png b/figs/img192.png new file mode 100644 index 0000000000000000000000000000000000000000..95997dacaaa59cf576944796ed22a367f0e13c25 GIT binary patch literal 637 zcmV-@0)qXCP)lJi8>Ykc0 zZr?-Q55GHogjja9H%fu^5&tIP2izYHz}|4IxKmH?&aqfhD?VGR-J%D^v4eH{Aez=I zK6`mP#?RzOt$4G^h^#)oNy07`mY)J&o#m$#mg8c2S9y4C?MIQrF2YY~)5eRw-E2RA zSA{sd4l!*Tb~-Tt=JWUG499AdP{U*)kuNmvNrKvp`VKH*U2rf;^epe&t&4p`Lu|+s z;K*^YdFdwNU0*3Nrz;SD5Ll8u){1MIY=7pc4@|MlLl XFqv@Xu?XV$00000NkvXXu0mjfd_@~( literal 0 HcmV?d00001 diff --git a/figs/img193.png b/figs/img193.png new file mode 100644 index 0000000000000000000000000000000000000000..6330273f2281b35093171d5d91ab34a9329dfb32 GIT binary patch literal 719 zcmV;=0xs zlpwk_!Nl7(C-U&;yS+y|t~K&5?e!!bB}vbcq^+J3!EKhssD{$h>v33uf*i%|`y>*U z7BG@jB$1A>wp3swhrs!k0xAyR5{hQ3&1tfZa~&wANmyA1U4J@13G906e&PJf6t{2W zb|(gg_v=++eeH&E$VvgVcggt#n%VgqMF*i_7~cl~6W;;VGWQ<9_@OcrhSpE4d1BPt zXggRhBW)Y$N@yh^^08ZlBVr_}1+#GBF!1#N*44nFbBH1uwv@BNZPP6caPbJV;J~R4 zambm6@DhGXQ-Dio5he#3q932Zt!DnEn*84x?$GFN#vR(+&6xY}x|gKgZQcBcLKwpdONiM0TE58cpDMkIo*1qx2X&QGYTr1UsL*J{x=!o6)x zZVwP-r=K8KEd&Ehmzzs{z>PMX@x=Z(ZopA4lm*xlF#TXB`Bl?gaQJl4pNj(=CKK{N zoi5rQs^FBhK;r_nJT&!aCkK4^ObjJHRF0{Yn=z|{a54RfR31Nf0miFFKITk7m#Z;7 zP&$CFkZKR}doL{>eV>s!VF)1GT_UHfG-~ceggzv^WNBp2W0>N002ovPDHLkV1m#b BOuzsD literal 0 HcmV?d00001 diff --git a/figs/img194.png b/figs/img194.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c4fd54b3edac47fe2e8b9dd09de1cbd5a3cb41 GIT binary patch literal 702 zcmV;v0zv(WP)dsFflf~p33pcJtUyB@k>IsY!j^$WRP#Kds8Jmt8^ zNN;5T8|~y713*htm?F$(Nw%Z-ufb6>8cCCLG9*^2I5{(8Xs8kNN=!3Dk~9fTPB)W; zNDEF9N)HzVs+2qB_*p10Hcd$y0IctTQ}76UbTrV@PR31{ePQFYRs6Vp9C+~R(&VtT zyx7HW>0F-{9Ky;n?aYn6vw&ZX{7atv-x+Su=&r^M+T7JxXgIz|Iy^iaB)#wVt@r1< zZ?B&SJ{9qYw=!C8Lu*N$APVNbwA!%FLfHb@3wk5v+Zlq>smw^s(N?uRfdXJ<1``s& zwuUOy)ovrmgT9JDTS)Y@i(CQN7N~~tE|_SPx4V@Fc^LNUkOvikE|1y)OcG@+(EE{D z5&CX=&iSXPcc#I3rskc#bR?zEokh?@VkrUUqed}r?4ed)4M6LGV5BZWcF-*}V5_Fz zDMJ}_Kfj*?zLNmcNIh5sp3}q}8H@!OidW~0)?S1zMKn8skm^^%`gpSEPxk$lUXDEp k1-|-Z!k31GFAWKQ0Nh*@l>!q>x&QzG07*qoM6N<$g6Swa1^@s6 literal 0 HcmV?d00001 diff --git a/figs/img195.png b/figs/img195.png new file mode 100644 index 0000000000000000000000000000000000000000..37a9713a3539aa38a3136406a584e27f6b72a29c GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!py+HC^^w4AILEX@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaEWDx;TbZ%t=l-z*6JGug7QRyMHBB z4wN)3oW>{;;OlUPSLk8cgBS)ePR69L2^_ayzZ91^$1JIEF;hWMEKZrN&02u_hrNQ% iW!A~U8BZ)@7#McyDDC^VTT2A!HwI5vKbLh*2~7a#Np&j# literal 0 HcmV?d00001 diff --git a/figs/img196.png b/figs/img196.png new file mode 100644 index 0000000000000000000000000000000000000000..396778ed3e28a87c2cd0cb05afa809aa9a111eba GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#oCxPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3ELKqoX4&Ee)v9#l_|B-MdOkO1pROmX}qW3KU{23GxeOaCmkD zB=7I(;uumfCpjVEL25$6jROZbRMZU)Fj@-~+a@He2u?^aXy~e}Pe=&hNJ#Kt-(=75 zlAo1_XBCGokBxAU;}pr3?I#@tU9K7zG;4Uasj)Hm{NfI|t=_r;Xf%VTtDnm{r-UW| DGR{QF literal 0 HcmV?d00001 diff --git a/figs/img197.png b/figs/img197.png new file mode 100644 index 0000000000000000000000000000000000000000..9dac2cc8f8a50e71b944b96ae9c1b1311c756e14 GIT binary patch literal 888 zcmV-;1Bd*HP)s?Tyev8VqqHlR0=kx5kv(&=RT4U;6j!#5fSMFJ)_c+uO!ZtS5j{<%da|t;q`e=tOixHpH#6GMr*{o85Vz&f zzBOP4hb|E}a&suQ1GB7=q}&7}P3!Ls>~icV4cD@2ZtI2b^q40#nC7bpnP(ke?H&m%rtY6Nx5t5Fi*I#I7c zqgC>SHT>u*SgComC|sEE)>-GVg-*Afua&~8TOf36(SrD_DS%FYX~xRsTjo;!zLZ1x za#J;5c}I2Bp;R0+3>wjM?@Z(x{m>3gPthNLrPMP;Hw zukt(s2t7lkuKFQehR)g0WISYfY5QI&M7e-YMCl*3^(=WVgQ=Fyk3l*1Ko;}5+z$h-Z8wQ`@DTT>{$D(dzl`Cfl{nqO{G>?`+}o9}DZ z?N_sckG%oLKOpMrYv=NfnYeDL=|){@1LX;T@n_fO8lN-Vn-Sac+QBzIMaub&O4hvK zbgvcWf0X=V_oZcXS9HhoxIoj1>|&kun&2hk?&5=li=NPzVuCy7h zcQV$yutuz=oYkffswUgs0-eugdV4#-MP1|aP2epn1!la^s0n^VefbAw+pDrZ+T4mP zr{4u~H+Seq&oHr;k@cPspJTnT?t_l|P)C_Q^EL4rXWBfW9{0K{g O0000Cs*g#?juqkF>V1erbv4DyjxIjF1 z?5Z&>69`~nU<9*S88!e(1qNQQxIx22s2ZS|3<<;;hZk@OfGI`+u&bAR0NJtuB2~b^ zpbcYhU|`_}x`Khh0L13!X7C2Gc^MQA6d=??6#~r!yBKHS&;>*RgQ%_n!sY=6;{^y4 z=)AWKIbbG>HX>R#fDnY!52W}YqMQnFVI~JqTq-7jHST0!cmNIn2JPLuH!<)`fE$v! zdkKR&Fx+^6!boO=0HXqgh6yuiAUl^4g*V^;03eqkr~Ss^L;wH)07*qoM6N<$g3ES* Au>b%7 literal 0 HcmV?d00001 diff --git a/figs/img199.png b/figs/img199.png new file mode 100644 index 0000000000000000000000000000000000000000..02743e9af33a0595f44a39f2abfb245b6e1cba03 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!py+HC^^w4AILEX@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 zfaH&Ox;TbZ%t=l-z*6JGuS1QGGdx6q?M~l%N(u32_OJ z56g}e+c7W3vZu|vxi%22q$(X~$*ht!jIi#<4ORkEceZbKqy$jBv-&`D-;bkM>PdU*mNFq45_c$TO zK1x7`4|O^=_Q#$7lCk_$-%hnk93Lfh$K5)y8HiSrwO_fU|LKh+mGwmcZ4ai?oQ!NF zY?DrLbt2&J60J?=-b<>d;rSiu5mgH`EfDYy&JHg29uZ}I8YJ8-QO*{V*?;-w|BLtp X^Rv{#xHATXI~sR5O&~zF{2XKl-z^_ivx!m7-!6EI3g|3T`JkZ@^apV zLkAibPSMZ0C}XggWd*~T6<3>2Ryu3VrM44$rj JF6*2Ung9e+PqqL6 literal 0 HcmV?d00001 diff --git a/figs/img200.png b/figs/img200.png new file mode 100644 index 0000000000000000000000000000000000000000..22ef4d7880ebc1219bc7702708fe72b4d40f48dc GIT binary patch literal 474 zcmV<00VV#4P)Ss1+lZR zvshg63ESCP><0`1Eu1EQU_QVir63Cy_Bu0}O|nUf)keevnR{|_xHI?O46p>c7@<)S>$9tXQz+!C{7IKG$PpCg%{< z!?IDj{X{a80#0A&*1eLT@LKv}XYzEx&&&IxAk(O(I3CE2Z}=9*ePQap>?LUhKJ+}8P1fI5u9A@Gv(&&Jnw9LU94)BMlz1#aF%eK?R% QD*ylh07*qoM6N<$f_y{TBLDyZ literal 0 HcmV?d00001 diff --git a/figs/img201.png b/figs/img201.png new file mode 100644 index 0000000000000000000000000000000000000000..40dd4853586a9975464187d69ffb4f4100c360d4 GIT binary patch literal 348 zcmV-i0i*tjP)VQ-NGL{v0LC?`OaR6Yr!M<9;i zDzrHQqDTrTxB(o1!aa?nP$Omx$Vj$C15eudd77Ph56TD)#uTlycPfU!kVqU}I=^z} z23zBiNsiMwFLb3k*w}ZKGYcYc?`^0?<66Yg-&yFCx;)-3ypj^CG|L<>gy4-2aVWi_ zmZ}F++WBwT0Q-_N#e uV6KoET_&c`ybQ&6J_Q6NP~5hqyX1U^FU5rJ|8 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 z zxo?WjWbWd7<(n<2M0YezVgTX!j=k4yG*$-JQXUxr&cK5d+T*U5>H|cpQz*`*&WK1l zBN>xww@^5TK>NPCeCR)8sn$zZ?M0A*!pV|e->u8Yp#IT7Llg=}BHkfv@3oVKNr(O2 z+gME1tS4HcOL{vJ)(QxXpR*ayZG)w~Xe47rXUct@%c^Kr7D$%|kSm^SJJ};5qh+Po_`-o1&K|U^()^^6I*tx4flqC-+^{o)4WHfT%FvW34Xm85JsES+v>f z$t9L2cw4{9R|+vuF<;r)68O;CwO^|CR>yJIyY3v7{JEKli)0UXk^Gle{p{{V#+xof35%SuU8v@#Ah zKYH}mweMDtk>#Pj{p`jcyntw6cg#Mp81h@#Lfz+aDUyqkHjN(R;Xf9 z6KY)Cg##ilr&-kj{?-_lyOT`}m=^`GWqN-Kx z+PP3q#7rSo{yr3wMH^_=xOXWf0EgT81km{$()k>MKyb2?J0ki|`RicPYI8vL2L$Yh zD8Ft;L@AxmQ-9*4Q(;A*RG14)Hx-5QbFQ!ul`FI^(4Oe*fUfAC5Lx%e{2nnF%mH&E zZX9tSA`S$D12;cXx zffX`cdJgf^J6{G1fDLC3a{Zwhz@#=-6b)y}|ZC$n4_>rgv**ojCA| lNAcK}>hFwPcf7J07#7%y%#Q^88$Eg z*#X>F7!*Lt6=2%=;U>@u@Vws2z%UWabb<;Q11*KRzyM6LZDU~IPGC@9z{kMw87#sK zl;CFIXHwt=(IAk00nFld@Mi!ACWG|8V?fhCFfi>)U|^UAw~zM##A6>2PGADZ;{;mx b4i5kTZ@(U+UK%un00000NkvXXu0mjf9_4zr literal 0 HcmV?d00001 diff --git a/figs/img206.png b/figs/img206.png new file mode 100644 index 0000000000000000000000000000000000000000..8919988badafbbb6df1e483e09e69a230c9dd994 GIT binary patch literal 534 zcmV+x0_pvUP);qQ{I#M*NRvX8fM^|j06E_vrJ!IG zE2})hRo2lLFhUZGMNMVv6_ysMY%B~|Scu@v?B?gxD?}^tgPZ+kZf167XBU{FV9R3L z_!{+37GKpgnPX7~Itigk@D+u5L{3=&nr!r(j)Yvd~$_kpXt= zdWWRj_Ls4Cj_gHk)?yu!$Shux%suvG4ulQ;(|c{0Q=MQ_ba{5GK*d;f$~~)_|9Ifl z$dF7Q=)*qZVLgi_#0t&eEavVU7?P^-php#cDZa#yklMnMYUs`Tw_@4X&AM=P1Ka{j52PGV|EKq7z2`-q80}s!#n>yHK|u*7hr4Wg{6`|* Y0ik_T4l4F=w*UYD07*qoM6N<$f>mkrrT_o{ literal 0 HcmV?d00001 diff --git a/figs/img207.png b/figs/img207.png new file mode 100644 index 0000000000000000000000000000000000000000..093f134e4a4397844c3c8fc405a7e3fdcb775830 GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/figs/img208.png b/figs/img208.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9b8a7314706037e28d80fa0ba33fa80ad33eab GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!py+Hc>7CX1(0J9;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0LicQba4!+n3J5qz~m;d(Z7L_ZHB{F0C2(iSW~I5Uqi-w-^L!}6K`Q0EzrK(%Q(+F_0CtUQ0DBg_p7 zjB^_@(yH^$<_ZKjG%9m2tK~FpwoeE=v9>|+*rEf;4T>|q{J+jvVt9;Y!F7pk8*?6~ z%_x}N`1S@%%N4dZ-a9g;v~I-J4N)z4*}Q$iB}x-4-g literal 0 HcmV?d00001 diff --git a/figs/img209.png b/figs/img209.png new file mode 100644 index 0000000000000000000000000000000000000000..2715a154566b168495036be87ba8dd18aa8db330 GIT binary patch literal 532 zcmV+v0_**WP)QCsAk@}Uiet^Ol&MUyyjX7Z_hE#(O$Axx;bM)CE65=gO2!7A+udkzc0x| zMsoT?{$<=S#><)G)u~j^9%2iXn5~zYD5BD$qAmgR7O)Zzvrg09iOIDMN$rIcqJunl zLKqjn@{u=oYWz)FlG?x}7$xG@9r}9ZjmqM;YqJ&8yrcRs-n$Nn)&xFy0u|zs5Tc W(^jKN_ZkrZ0000&*+(55x0J0tc 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 z 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 literal 0 HcmV?d00001 diff --git a/figs/img213.png b/figs/img213.png new file mode 100644 index 0000000000000000000000000000000000000000..f378f2f01098af352fd196dc679d60c7ef48321b GIT binary patch literal 495 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 literal 0 HcmV?d00001 diff --git a/figs/img218.png b/figs/img218.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d0ac3ad3af3a3034930567577763dec123e6fe GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6mdKI;Vst0J$}HLI3~& literal 0 HcmV?d00001 diff --git a/figs/img219.png b/figs/img219.png new file mode 100644 index 0000000000000000000000000000000000000000..83f9a54f0c2949938bf6bfa27def26151ef56c56 GIT binary patch literal 893 zcmV-@1A_dCP)JJ7lih)o(3H6W)o(hta z2Ycv(ha$PG_D~^+J$WjavmnHS2tCNyRw+)ad(w;0`~e;o5y6Yi%|kD~H#@u8O}0N2 z#UJD&nc4Tv_r85QnVk$k26EI$;ps5ESb7^|X^(;uH3kRoR%+)MBAyMVm_vHc0Y0yy<5FzDhCam4%)SmXM_0q`2wW6UAuh$-Wz9w&Gp z)c7)kR>TRNF|~2hnQ64t>mdZ0^tcx|(WXW?pdjdxI4VZ@Y0py##R zGDH!2OnBld+ul`q_A3kC!`x*#24PM3W)#<&ovN4$YhqiG&ImQ=B*SSvU%;9c3$5pH zIEopZpNj0QBiM{E!oP`!KIFRxDsr7Gw5Q3}ZJ0FYjm4qATx3;$LP=ACG1Z=(9`-v( z*1q09&t-$rHWThkf=*IHH7OSFGOMK`m7C~Ne*4SvFy1~j;p?$W$=sGiG?bFkznB+k zm!sf*tumXciOfvSv@{_|-fX~cKN;0j+T?M`1E-moq;Wdy=$hazoI%E-n*>o!51?O@ z7N{yJ8S|uT+DFy~*z3Y3@Kw_*z#e!Duxc(HyP5D9;}d?N0go{M0<4f%zEcwIzJS;# z%95lhLDp}l{SK48fzA$ei&#_bGwi?zcOh%Segc^j|AVqTx4nbLM;Kv*{}JB-+mq@@ T_oAdN00000NkvXXu0mjf7RsXp literal 0 HcmV?d00001 diff --git a/figs/img22.png b/figs/img22.png new file mode 100644 index 0000000000000000000000000000000000000000..690cb14e0ae6b06167d984315dffa8b87739572f GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eV!py+HD1B`~4UnT7;1lBd|NsA)GiR2Um%n@W z&e+)a%$YNSf`Y47t?KCLNJ~ots&a90xqJ7nl9JNy-Mcv@X9xm?7)yfuf*Bm1-2ll4 zd%8G=RLn_EXlQ2V5nr%|ljlT(FQZG5Q37Ml83!fC**s1s85fkbv-0qCH=1l_Wd2;V z=hQ~Vt(Ax4u^jJg@GeqdRhS2D*emc4e zsMUu&Mz$@mNNV*q@5MC#82g9#;sTDg#tb`mI|+&FO&OfjB66RS0aF1YBL0m$y9X^B zg$&NR6m;j4FPjrT!sHQ4odrCL)als@{iLCiuuT6IQP!Llq+rU}_HCp^M*q1%hLF{I zQ!SbzrAoqBc+_7(B&6VKwBJ2Ka-Vt#f$j&wSFWp=YZEiI=GYlG*j}k3H!rsIPUxYb zsD`gk@f%2&04L#;d48S#)5|`W(}}npRwPo)05x0#)7}CDuhZ*RY&eA7h*f7xQPanx z1x3gWxHaWy%xt{yc%(+_pdVsnH|%MEXmKhNZ}jOBeG&J7YFyk{1w+B2pr7-4W#!PP zu>^HEbu^BlC5_0#0qVvR-6ZWenCoawu$}~c?Cp%t*TWHPhVP!@f8ZPB+Hhlma=WMi O0000 literal 0 HcmV?d00001 diff --git a/figs/img221.png b/figs/img221.png new file mode 100644 index 0000000000000000000000000000000000000000..0dadf659cbd76d2fe65b19c7692a0f2f27e8d946 GIT binary patch literal 357 zcmV-r0h<1aP)_7~n{~*agM7SAVvRE)2W02-ZddRW?RptN?bC$X? zuwP&Txt&>o;{aCxgAqdy!(0X>h63Ir46_(+b20z`y@@)SHZ+np00000NkvXXu0mjf DD6oO| literal 0 HcmV?d00001 diff --git a/figs/img222.png b/figs/img222.png new file mode 100644 index 0000000000000000000000000000000000000000..1a55143ae15da756430bc0ba07333054c8c5faf5 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^$v`a2!py+HXl?bs5y&wJ@CkAK|NsBYnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKJHCy12O9y?a+lNon`)-SV=EQ-MN^B|(0{3=Yq3 z0Oc8FJzX3_D&{07II!(DZ_rd@`|hIpuwwAE(=p;<<+AuU+?mWQ zmaPXx%)TeE37OPx3_QHundt+2gU45Kj-GSP%$kfE%u_D>(Ayx}kXRze?EGVS7Hh|? zb(#gb2X5SCIQ+tf%`A;^8@qt65z~>(#1qL6PO}E-MDd>BOHP1DvpKU}OZSLNy0!Or zLltB67d>`~G%fdMikiLm_Evwl)0iE|sG88i!Twp}05d~gTe~ HDWM4f`XrOn literal 0 HcmV?d00001 diff --git a/figs/img223.png b/figs/img223.png new file mode 100644 index 0000000000000000000000000000000000000000..c94fc02d301c538416920d19e09c8bf51adf2bd0 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6!}EqW zhF{Df)r=u=E|ar!jbO|70|y%#rz$q`9`4|p5cZy5{D6$zfGnqofK$=%$8BRvjMxdqxHu-X^7Xlm)PIakeBDtIHVZ75rsbvLxb>WQE!i zqdE8XRx^dLWz;amGWv literal 0 HcmV?d00001 diff --git a/figs/img224.png b/figs/img224.png new file mode 100644 index 0000000000000000000000000000000000000000..5c314131f7df3d0c8e68b97e9ccbaaccc7640a56 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6|=ky)RaIsT9_qrmLkOtIzL7@5r!jvqL?VPOKZJTr4Ovp}Kk zgZ3=;g;uO=Z9kM0-ZwG}H1c>P95!&|Z`otN!Kp%=k71${gE{k|86^uuU8NKD@H5`Y zVdE@_V>Cb9yxqZX%i-n>_RzMw>@0^i>=Nc%67guE%K4TMw$kjDGi+>S8kua5ij+?m zIG^<8>r#;HThgv09gzCUQAZ(Z|A8e8lMItyBt~$lsY=c|V6<5xuNW9Ef4>g Q9_SYaPgg&ebxsLQ0Q|>rE&u=k literal 0 HcmV?d00001 diff --git a/figs/img225.png b/figs/img225.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f6c365fee624919c9fb7dcc6502ae21843114e GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^96&71#LU3J=&d5Q8_3}d@CkAK|Np(n-aq_YrG zXnsI`fJ!PG8-K!*BA^>gu&@))UgUm&#fey1=*-^594Bd_l|I;+-I=#v^9GopXsioF z3ONKgWY++~T&7OLG5b_8oy~;+%409+85+usd+^fd2y$A?eR38RbgQt!$Siys;T8&f zi=d0TDT(WFR7IKjF)VZ{i0lK`@H2=f6ZtDo`!Vv$FvbWhyc8N{5hSsaB-I?))fQSN zVAE(y78f5d6;I$L3#~(l9#36q;!F_I{J%t_5H#_|9g|ArYjZ4@6(=g~swt)|QlI0K ze+XKmsPEvAEZe(RkD1JNmgaBj0XZ=?1zQ0YC9s-h7o(|E^OT5ix!~JqLvov4DX!p-Y&NbG@@Z*_mY<(pr zfGmrpja!L@#oE}|TrCL0c`D}|Y!F*9Hda@}#zuvprG>sXlWelAt`;IF_d#YSZ@%~D z&G+79fi^-QuBJ9rjGtpHXz-A)p!65sY)pXw0y7^d=oiAnjTP>{3(nGS8zxA4cAY~| z5TOK|Hc9Gnz{98Ng;?<)NaoiFoWcb%mhNh3OeHKc@g{35S_D1>rzc}bul7t>H>D(H zYzyy9LPx^5!z-_Ww3lQdc&)5!c-~4}?CeLz+nheCgE?H0IZ7SD#ZHtb7Y0!&YiqP*Q`!trQ4YMUq95#u@n)BST_^xDIN5b zN_8Q-g$$YIK?FQqxZZxhE*;ZNAA31u zLgAX4TFsdwO`D5gYib2Mr8Naxm_j@zETeK$rAeF%zTa@*%+#Q0QlE!FN)rCp4b{-Iq-67I>e-HJYhS zvj?#+XbXK>@2ZcdbRv?>oX>q;_J?iFwjU2Pxii4EArTtT=|w%CmvOY~tMWl{F+-&H z`i5mxWc^v0!_LF`{L+%kl>fo~C38cb{&4LG|1Q1*MN5-xHqI(l00000NkvXXu0mjf DtK(?t literal 0 HcmV?d00001 diff --git a/figs/img228.png b/figs/img228.png new file mode 100644 index 0000000000000000000000000000000000000000..3477dcfe189632bff32a015984b2767b24caa810 GIT binary patch literal 559 zcmV+~0?_@5P)dQgF>=nlUN&m)Z7TGEvFi5Z!mawu>eW$-#+2NJk!X>`U8JfyxkG?poZs z&MoHR&Y^*IQ)#8Z;3nwVWVDkw9$#*g-#k^wfIE0+bm^i_fe{k(7!TnUUm^v4O~&ic zS{&xG6j5qhLok@apzqWD={n5h{ISHi9&FrVBU5O}@ws@#7Nc`Kf_6bVDYLa8;fye*=002ovPDHLkV1kT30t^5E literal 0 HcmV?d00001 diff --git a/figs/img229.png b/figs/img229.png new file mode 100644 index 0000000000000000000000000000000000000000..bd31a4d959b99c972198ed3e37eabfd703452982 GIT binary patch literal 700 zcmV;t0z>_YP)=bID$>E@QQ%N zHCtNAbymVvHa2Htq0M0_2#a4SCW$9l2tnLlixWG8upnZo@6AVU_c$9#z#>1`w{PCO z`OW*<1)3;>xn5u?iUqCH*iC6EFt%hyN-4enXgT9QLjW@NOC11kvUUmbfL{bGP>*%NT`x3@(Up?wJzwCK)7SwQycR{U6XBu6VGxf z=pjwVKRF%Y)52R+s3#PAMV(E0XN%lO9+~vSCfwU)HlxfVDkr*bqE^FMiOA}eIlwMv zB0J7y$j4e%S1h7i7*YMQQl%0rTK8#ex<%Vv+GBBj&z87fy3wUROp7dVF&L^86}uet zgukeTepscrR}?lDo0K`^KL8U#nxN3N9t}A=HFxn%5C2xFbDRpeeNR}4H1Hj9*I2jf z-C~4S_MQO`Nc(h9vntQgS<6{7hc3F^ttLmXOI=lhkHnLjz2!N!d2Yp>P5OD^HLyOR zY5dXTcuG$)l{uoL^|EHqwj77TH=a((ivpQY2?tf@$X=3It;n>2N7mHNg)aq(pu+vp zoCC6VgIo*;eJEPLBIOO$>z(zun@7hVzU<$|(LQbT4Tl&gG0+f)o6pJPBV~0+<$1VJ zkHL#BM}oDhH%Erb1{&ul!8q&=@!17mE%e18nVMI0yrHYdGeL3uHip@P-(@4m^?%D8 iqHM0?B|hi)Kkx_B-hy;d0<4w*0000gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lkz1ba4!+n3J5qz*NSj#+I^yfy0pDJDZq~W6A;MBU}nu-`VN}?l&$J*w3a?z~Hoz z$x!^n3^um5a)-@44R2}%G}9KHJ(O%`1T?J7$Xc42ncLpwh42Y(ht;dg^HU$N?P}dB zt-&smRMl8;*q60S#!2hJ5j~xb&?$ioorhl++~D`v_@1q4Ef3G1dhQt_4v%!C7j)S- zXkO#L!>5pXhHGEKK0B9bvr`2(o%E4kz%xxKC2>X4wCma&RW0)v7&ht4-pbF--VO8z NgQu&X%Q~loCIHqyaee>* literal 0 HcmV?d00001 diff --git a/figs/img230.png b/figs/img230.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7dbee51edf8eee53ddf1b3a1b9517e9467d82d GIT binary patch literal 1606 zcmV-M2D$l(P)001Kd0{{R4&a^6v0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*M#7RU!RCt{2SWSo=MHGHr(=)rXHPbVPMGr>PiU)CtnOv2?5Ofd8 zM)sz%9$Jwc+_(%Pf~;sCB&fOcLGU1$IV_$8E74?Edt(~WRau2mk$_&>OAx#ai=Nh? z@4c$(>E0iAH)NyWyq&Fn{i@#k-g{m3s=5LGk)D9o;D%X;e-a>35mW%05D6(G>Jt3B z`II+WF#-kp9}*JPp$|}w@pk!IOI1wQts+bYMBqh+ZRffkK#8vh^(Azr9-*5$|1^2A zdJz2M5EyOU(bIi)%zpX5C)z%<3d&UhoqKZsADVa{GZed*s~|o}NZ^7r*&2t+x0}Y(lNqB+TBWg?s^BRn%kue)jgI9V zom;A7XeqIxmSMW0x6?}2K8U}cv?I>z<&K99W%>GCi5fmeRZ=p1E=GeF=#G-)UzXg4wx_ zZS9+cv%GG7x>5Y|QN_>nK-EE&c#I^TsS7<^xT*(g%x)~6@q|%huHX&ncS+VvVNBuwT6ycpq8oKwE(hnm^5i->NC)1 zKrS>%km_m}$BGLN(PFLXmo5PqThc)@1VmNT0%7B#(=eG}6Xt+I19Wx)5UH;nUfKh{bO{KG+lj4V1`hSc?PH3$VU6UPfV60}*ej$HkSN z$0%knZe*1gBkZ2U^odZ~31u7w+Vi+v6N*+&iWR%THN8-`g_mW;P^2$$9Jkzl8xK_; zbOR8g&1tn~LZRceY(3Lsx#stBew)earZ+IvvEA@cQQUtS)DG^8QzO!1Xlfl`YL zo3!Y8Iez0{DqCr_AexVfKHLoy0g?4H1w3Q7Pzx>cA!>?vskwSZxtHrV0sZ+J+|{a2 zQ#tD`ZmCiTJK=d z$deqfwDOX*rsc{8bTz>H0AH1`YXaacer?jioVojGxCrwIvxU1|1SCA)xWE|3u7pge zr7r>esyi8Pg}26S6x zi6ZzJ_*m1p-VtOs9}u3I) z;jFjP%JYhw1A=oo$aCg8ccB{h-$}(XzaS~s&nrAl%~PwG?jPtR8^D3@%*hX4Qo literal 0 HcmV?d00001 diff --git a/figs/img231.png b/figs/img231.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ba522d6f4defbc99ea45d7326a2c24c7255fb8 GIT binary patch literal 1907 zcmV-(2aNcMP)!+l5d)H4TMl4BU zjg$t!D!i4svC;#>SV_h}^4TGLn!!KkNvtDD((7AzzLTCp%~}OR_*-G3>!;_I9zL&w z?JO*2WRIYaU+Pt5cED*akDJ%g(6(^%qwsDf^&olDxjHo>2=X>S+V^N|Bw=GIpza|n z$F`TK@b$rn?gmNk>1TDm#OLSm|6PF7>nKT*Q`K*hqBqZKytoqdW#yO3c?xDRKG zhG-3r4tl20B<>#HW>w({PC?fC5+h8Ieif1ueZ9&4<*VQi;OZKtRuHr?KFd^kUJ%y(B4-UPu4+GKLW&LcyK%pa<#Ki(YXk<13?{x-in?P*EEbS zt0tufhG7xB4EtOzL2vH3in<0mJPz`>!Uo$dW4xfkp|b79Asa5O$&-WnVd;GX1ZhyG z_Y4KJIZbfFZlQoQR=a2*BdeoLtA+eG6@ZNj=!$`%wee;4SB-m^8*DJ^m=PEY2R7Sb zYNBl`qOq~dbbnvn?S1U~DYgfoltJZG2n6wFS5~KB0glNs=V_ah~w` zWMPO<7FngYsN!O#2lTtWM>yIfPNITwll3PF0eWa#BP*w!DIDEA@YsH`H1Jo;QCmevzShQQ;T#CC!6We8)bo-O^Lma0Zs#% zscb>Ar0;v6AOq@rEL;SnQ5NzesOEEbeu8X@a3WK^77y<`(pNAj_V;{ z{1YzWp5_G7t9_qv|EB$hC%;~JoGBjfEq9i@O>EwuAClzh?Qy^DS^n?O_sQLpY0fzQ zct~C(JtcQ@hVCudSMGb9Bl}YUcV9(mlp)(De?9}}u=8jer#qHoE6a&8DvW+Y7Q!n^ znnh>VorWirH@G;}P}=#(jcj~w$2NC(XSLxUKab5@7YSCk>R6qJ>xzBE7lwZTZRytM zRG0RLP|96fzsCXt}EyY2umTACiMaF z*u0b#-9(8~X8qUEk8rshxZFY`r_9Z>xYzK6@`}j-ykrT%Y-ZCGQdaorPD(5n{f7TC z29V0p*%dAHE;Xwt0K1OyDt(?d@m*ZRzwUrMHdi&kP^Btr2TfNwoJ!vcXREylrsOV; zDI>~y@pJTl4#y48wb-S&MAD1-U(9ijJ#f7(;8IlaR?*}td#8d{HF;V=_XTIj+s1b) t_{Q;_3chiC8^Dd@+W>AH-v)5w_z!zeRzvF?&-wrW002ovPDHLkV1n1vtkM7g literal 0 HcmV?d00001 diff --git a/figs/img232.png b/figs/img232.png new file mode 100644 index 0000000000000000000000000000000000000000..56ea7c95cd0fd2c636044bf3353504045bfc35e4 GIT binary patch literal 893 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 literal 0 HcmV?d00001 diff --git a/figs/img236.png b/figs/img236.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b1e4ec105582ddb2adf87ce7842c1247b4667 GIT binary patch literal 329 zcmV-P0k-~$P)17ASYZ1t75n&1CAhmxci7CI0A5Yq7c%C|AP3umG1_ojwDq4_WKgH$mkX zJc3c>5)2vgAaV)}43{8s)w_Wp0GJ9MFg&{emJ8ZlY}mlZ zz_6TwfxUrU03!2%VFSa45Aj7nra%J20|$nN1U6K?EISz(^cd8^Y*u~-h6@K06u=yi zI-usF4M3U^#9q72AOU0!SX|-3TcAC=Ss9`o_Am&9G2jABAHIS#NU_8-2)o3>MA<<` zfG|4{|3Ro`ZUBpNGaO@(=16+T0#d}l2=)s|l(W>8f&Bs#$bD=RSQc;vFc>lPFck0} fVVK2mo092F5V9lnuWbnVI=pPEKM<`DCDzc!2H3!6z&N2iby7w}gsbIm5YIT|`5N zVUwJMjX^=WCCjCi29AxL2U+{|9yzESW@KxtbvSXFTeR>ogHW*4G7}k-n+z$r2{#TL zWB>A)wUwJo=1q-&DVL74#1kXd(NNGL z(UT&%L5^T3kl+c46QDf+g?lJWog&Px*A7iYq)=p}-Sy1-_<7dA20Vlcg?kzl`vSwb?8X+VOg!XP001xs+K zN#qo|!D1RRek3(h1VY}Gyx6V-D{V}+!P7nlK0+ych~RTUGD)aiSOu<=3UWh zvtls9;c9FwoscLzOy~4D)&n+q88RkTDCw4Xbxv2B=t^=#TZ0}g9R%2qshm8|7?>go z$($TCp<-jpVlau6<)Kt4lgNUP`&#=2DeR#uAg7_yY++svC}CiVDoJReY|MK z%pOLjVApNa4A0{Y;L9;>$v*zk49BDKFSUFFaVSxt%`snR00000NkvXXu0mjf&z|8i literal 0 HcmV?d00001 diff --git a/figs/img240.png b/figs/img240.png new file mode 100644 index 0000000000000000000000000000000000000000..78e703584a8cbe548365e0080593643b95d3c69e GIT binary patch literal 486 zcmV@P)EX7F$qE3P*bXNQVz4w|G*t}UXVZu%0Ew-0YVKGF}U6+x>&M^4x! zQXw*BEx;3}pM047O4JwCYEMdC7UrD)NIj%|*m*JNaAJZWmHmS;3K-i}zJ!ha9&|n~ z^qmro*E;--?!Ku)Y`NHc4fvu{1U8 zIqa*zQUt66!_U$##T_>nSUiQCg6D49T6;+Kohwfa3dL&#pH1YiZKpTknq&ZGR?<>v2&R?!^ym#4QXzHBlft=-Ep_}-sGUwJ=aW`LD@}5_hF5EO}FYZYeJo9 cp?@j81M#g=?Y6`ti~s-t07*qoM6N<$g4~wXF#rGn literal 0 HcmV?d00001 diff --git a/figs/img241.png b/figs/img241.png new file mode 100644 index 0000000000000000000000000000000000000000..9f31282b4fbe11f650a2683c178d4a86f7c37fda GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^A|N&kGXn#oPG$0MAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl8^LsaSW-LlbpcN#O`1tcqHKg^Jc+@lMLs+i2Ys1u;hk>ki>?Dr*CdKT;(~L!^3lj zr=~_+;)a$)Q0i|l*17Dud%W5FO%>Iv3)FJjgdUtEhQQDck)dO3IEy& Pw1mOa)z4*}Q$iB}qE1fU literal 0 HcmV?d00001 diff --git a/figs/img242.png b/figs/img242.png new file mode 100644 index 0000000000000000000000000000000000000000..2173e404bf1f95d56ae45665154a6a2d2cfa601b GIT binary patch literal 490 zcmVS8g$fRvdj>Iy@5Bvb|_ zIz$MG4dnqq>VTL#^a0F*1cuT#Xf~D(*#Rktk%c=asc6-u-QZW^vp=7Gcea64DmcRe zDTIq~5jG$&LJ#~crI=P5IWKn3WX_h8+lJ;0>UCIA?4$`J_5dvfXI^6Dh5eqSgpVzp z*Wk=-F%Mg^R zP}Ks$7mVbn9Z6Mzhk|>6qR1nXCkm!FgUrFpDf+7_UWU|ew&mxN1n#lkhqTwi&7+TpjYP$AbQVJqK34{(I;6NhUKwH^Xv;7Y%5(&R1XFJ?NP(+>EaktF()|z2v{C5uyH&{ZD7=7V>3I(%yXh)>fFZ0`-~?H7(Pl#Y+yXcD=^Ey zQ8**Ymf4vpELGybtVH9ENB#i}ft=DT4p&%MH-ySZIKE51b%1%}jK+lx7RH=Sk?ax{ z`VKdR7fH-m;N!>kjdN3h*?T_L8A5Dr_r)#t$O^En$yhMSJAjd4$#Y@#=>k?CfsSJE MboFyt=akR{0NM*%X#fBK literal 0 HcmV?d00001 diff --git a/figs/img244.png b/figs/img244.png new file mode 100644 index 0000000000000000000000000000000000000000..201f9ba953bfcede35fc887006f0c3e8022a6c95 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^8Xz_cGXn!-+%`sEAV)XAC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^LyDq_lhYZoipjRX{#tNswPKgTu2MAjt$z z7srr_ImrnQOk4$G(ag-vX3S~{?2mX0^&&xE5NY(rcijr SyWS|ET@0SCelF{r5}E+3z)dCq literal 0 HcmV?d00001 diff --git a/figs/img245.png b/figs/img245.png new file mode 100644 index 0000000000000000000000000000000000000000..317800115a22fb06224373ed0bdf49b7ab1f0e57 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LrKMGXn#oZ=&N)AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAr78;uumfC$&$J?@)k%i~Q34yi=AuWfQH?NoQbIUm(_g{0oPzQ|!d8Po!-)A9C0- zv7LV-?rLx{uT0%|a-*QI#3|*QlTY`jxbaHX^2=^{BQ=pZNn1l}&QG@^<`pw9JpJV* ztTutYy=3B}CzH;tSy}$;&)j;K_x&L@d-AXSbPVUpTJT0R{i>l)_HFLy*%$V6dTu6{1-oD!M*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl5h2NaSW-LlbiqqsSQkdY;3G-+m_zqS+RgoV`CySbMtm4X8XfT6HYL97__9hhV8z? zcw#?8Qf`C9@dMKsQa&)VR0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*IU`a$lRCt{2Q$0(=U=V)t(WLok4gP|FNCYQm7e~>dbrvLp-HK#$ z5d6T&LD13NAMh#^!DJ}?1=(CPiHo3vO9%0C&5MZ`so)^!b3A!-dG2zT;{p`W9lAI% z>fno72^v7EJsv;7<}iggI~on^Q)1dQ(& znGPn+gN+ceA@Zf@!Ihd|t01ZzzY?aHd4`kO9lHaiky}X=lP@#LdQP2B_-FamVBpWn=Ms!RoB#-xlP}zS~>n8UVycmeE%143U&XGNeCX^`3Y$L zUA%(-PCTN|1lp-Flq9!t5L|yu19pg4yFRbNWF3e?lH72KW2$ME$G5%uG$X@(N~;wU z21T0U8QkO@GORPHN$5h7T+PE)SSq#{C$x?Uf~cSP=*5@JATl;@S0uj}sN&aq|M)Sy Y0Yze2@n&J$O8@`>07*qoM6N<$f{;*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlHcd);uumfCpm$E=^Zyu!i2M@4jg!QVnbtNWA4E#I=O5q2bk1$-jpJ}BHu{LWbNIl-YbRgn37ONhehd8wk!yG$cCOn4~QEIFgJFVdQ&MBb@0BM|e761SM literal 0 HcmV?d00001 diff --git a/figs/img249.png b/figs/img249.png new file mode 100644 index 0000000000000000000000000000000000000000..1f808c97202c8437afa4f6e279f079c1c430c4c3 GIT binary patch literal 307 zcmV-30nGl1P)Jabp`Z_D-@bisW)>7;=wM;qP+07J`&2bNhwG}PDky7_8zd}4QA5*q zisq|aMv>qye8Y1L#j8_`w57uIy909FFbETtYAn_>Hcl`uy&9KjLii7J5TbhHl>;8m zort;y(b;=t^dBXZABOY>Gg$M>IFtF&m=sx~Jl*xS@CK>$D~`Q@`H=ts002ovPDHLk FV1gYReklL| literal 0 HcmV?d00001 diff --git a/figs/img25.png b/figs/img25.png new file mode 100644 index 0000000000000000000000000000000000000000..0b3799f4842ee839043dc1f2bf8fb34be29725fd GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^h9EWzGXn!-EAQ%jAjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAqz};uumfCpm$Ek&n&I;B3O_1IHPdd(swLHcH0!EzG#hW^ndbETe~= z#exF|_EncNNXG~#9{5$eifP8db-XGpObX9bHyavkFf>_VSn&Sd*#pPR8yjcNXH+_T z!fVe>mnJjY#@E?99oM|N>mYF8z{D>TSd*f4n}wYDH${Ep_DOhNq?d5>(1$hho@ru- dbN$%Z7=)|kX8n)&y$Hl5jm?cC-sY^}GC`llrIracY;6f_Y+JW%*}}xe@O&-X`e`{m-9S?q NJYD@<);T3K0RYm!GV}ld literal 0 HcmV?d00001 diff --git a/figs/img252.png b/figs/img252.png new file mode 100644 index 0000000000000000000000000000000000000000..9164a99f5cb4e1ef5d6db34a50718ee51a422027 GIT binary patch literal 25779 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 bhk;Rl-q`kITnmHVBmx5j$ctBs8U*|gTu!01 literal 0 HcmV?d00001 diff --git a/figs/img253.png b/figs/img253.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4414e3dc2c3b879867e8da94fc9c8d325ca25b GIT binary patch literal 22062 zcmV*JKxV&*P)-(oq9pEy{{Unw$K5Q$3U5!}>cqp8 zgv2q!9;RAk^6%bUUa8xgooDT>o$xm95dfaB!nlO9(-S}gkYo>Y&~^hofNa^4fq4DCSj(Dh_ZvS>**tWdNvc!Qy6ALw>uK$d*~kk6(%C2@TD zawp;?@m_s-!Y*VmuX%Zl19TyRIHe`E+t();5fF2o8=vRYNN*}=UdVNK)-iXI|L^EXXSj(q0 ze4U==(Twg=^&M5gAgqq2QlrRag(u0btLRmDaOnNZRW5(;rfp9`y}-5rR@n=- z`*jB3dAmCFwYneAE0p_Ul_B3|Ypk*T$ktdL&-(Hf<-S-IX8|Ab(v&-DF8@9z91^;P_@kRJ@Fra{P_*Q(;)}4 z3?%>*cf8}5@hBA&_N@T`FWK8WGGxH<-3ge<4vhSL)}LJJ3bvnn%4cuZM)r}t4oc?- zxu)|n1?5E7Rk~tMx@9gL{PU_3W9V;nLcKf6eUX{UxLs#2SZ}jc_LQx+TVxrKts!1s z)>#H*6|!x%$})8iPU=P-=Rb?Cz8(FzJc1Lu`ODV<I4_NMfV zQ{TAHybNqR`zzLl|9(W}?8J~JbUWTrirTRNijZ`Tda^U0i#gEVfJ)+O+u;;qY zcWip2xQ4g?F0bW4sEmSs!kK-Y0V4xx*0ke?+RVB?s&-HA!KJ;%rm8fM0< z4wF|Voe*Tn9H`ilyOslc%39LY`U}6aE~D2YRJ&FNF@?I>K!0q3qk1>%#0a{!)iSg0 zw4fZoyEs~`qU>~)s+HeOtA8O@y2|b**Rgx`C3@)Ds4vbC&zbx(k9CQIXkG% z9I<*kXJ-KCGl2KZ%;sb`z5>AU^(=cbx`T2)14o=Q87*_aO13BS%`78lu;YoxH>|TT zD|mZ*US+@*8Q$KW;pAw0%#h8zR-z5j#(#@m-&oLqy`h9(i8?iU{RimaJLJwN`aDclGrnZnIOOO@8ey6&OrH)(bj^n_- zB6O$Jv_B?|fkZRZIufk&pmUx)NNdJP5V@RT6C08M$iWyOm@_9X_jPBGUY`o;^_gKM zUr4768MZI)cvCN|tsbP@%lF#b8dza3KgF?Cyv-$gn;> zt1(N}27Y8XuCT(BrUHCqa^7FlH&+0jR#?GM5Vb{Z`V73R)sq#Con@M;;o`&2nP+QY zyVhSY&!-oxkI$!jEH3z(8Zpt-K5`439u0;6uxxGEKac+axFb_@$TH{EnIXgL78x?x zlzgn!8oUqHB)n{8h{#$O%|ZBhabj=J!1nCL1~R-vx@m^NaFk@o3wc}yvaoce(MzRO zpGlScAUIHe?iab@Hg&l?F^FCg?(`>lW2h(Imrzd{ULM@o%y-TQeX}FD@yw8H4`fbx zMSrdJh4Lw1M(LYCY9kcn>+_7$7RN1s?F(MEe&6wwAzJ|%PXBUa;?#(J{eyn|I8=w~ z1fT}Y_XV&Y6ESs#I0L3n6Ot(3Lxznpj}Py1>_g_X{lO0z+gyNjXDmBApaPH`2SEPp zDah9QN-@pUfh7CzL!>0Y)-xY|$P64feDB&352>+K@V+%x0G^JppA!Ip>;=y!j|Ab( zYGeTLf*11}0M^I#5pcdYUSXc6Ew(_mbwYn+S_eQ5@~nU00ZBDNVf^*!BXjzNd%b|@ zRehJfeY~CkobdJ`Lp`tTZI1BOR{&Nf_8waqd#^rl-#%XD`lV;TLQD+-25<8b`TaUv z*Q7+}_s3)O7cmoia;|^Wl8(mnKQlG|#aw3xvHVTU#)*YO*nb92K|HA`snyfb?HDa;4%Yzia@szPnfg;}WY_c7uUmuvbaX9c zP=2hQq{4@3_Rl7ScYXzbUrzG$Jr5w+=S|)i&aZK)p&N~?OVM)&s&VeRl+kiIz>b0yMGg!-3z-+4m6GJ3 zzC#B2vm~wh0_f0xXb0I@ALO9BKQ3k6lfJorOOyE^3bv}m^mO@dLpf(Kkn-cA6@!c- z1~txw0b$>0C*`qJDspl2AZ?0)97r+9Xc$Nq(vlbe_5=$>Z>kS$oRK!Gb7cNeC?{I| zd2ZtEsK!$#_l`CWDkkWXE@|{J)bt(!!CPaUt^Ac`ufUwHfcz{xN(IH=-OKcA)IhRi zA82^=jjB(EFT;Wy6yZ-TI?{cwUkaJEf`XzYNr;1>6f?<-Q8)`&h8+z3cQOCVb>T9w#mNTyEn9b299Q2PnWG}!HwnU*!Jz5SFa#4 zX~-^e#Tj-sa#KjB&S!gK3p=Rht|318uMlNQucVc+htu{M6<&dt;pChzvTf;%>&Y}v zW-u^Qqo!{w==Hi!&v-`m^bCCB@x7uwk)P$}*DYiD;b5DmvSr8kr&bH{lD^aJt##^9 zDTHlAh7b8TDxT5`&(j?$J7V__fTS~2H?S8(MH0@u5qKarZP$~8pddC4v0*{T5xaJW z-#%s+4An`FSi=pW=voISkX$rEvz~cF$Pv5Znx^J4v8av67$?pCOAXAwl$TH8zo#Qk zmN(@Nw(aq*uGq%%>4?Z^+`j=rbY|728f=4VL`6rrqRpT%16kr*^wqx&{}pJ(dk)C^ zF5U~YQcfIuoWwhTgDSBzUh&$XKr4^FUp(t8A=`*mwF54HU>?6&i03U!Rsg zx6W3OpE+Cq#A=<%&$9D&mZR*A>dDxr=TYno=dE2vhuHV`!ms&j;Wik0>2FUd5Cglc zmjlU)hYd8H#|q651!7}d)Q=7d~P zuSWGu>~fH?a~&H4C>PwzGRY}QR$bMBAi$D9Nw5$U(nIwxJAP8HU}+n1x<=G}qS1Y5 z)_ZC!75>lv``@2-;W6-^>_Ggq8$XZqXecD2h{6>GvCWKP;~QSKA1}xHZnV@g$g$I#|yAM`=jBZp=|4_GJWy^&$%PWM#_`qgcRw<2Ag)r z9Fzg-LH9LCcI+WIuq}1}Cnp6_3ECc0UvkjGeb`7&9^{~)8R)aIc|gvC6I*aomrB5p zM6QMo(G?9hHNbk1Vt_e2p|yf;hmKy1&VVcsc2i7h%}x$d>V=wJo`Y=cO3orLD1XYn zqv;oV1AR6&NkKO@D9F5UW?*~rAeW#zvX>;;+(G>5wsPFeUk#OK=f(Dx5wt-aCV0X4- zBL~jZ*wTTGBo~L1CL|{&O%xSY_FND6{z(&^n@;vxcI*cuL+B}Y|#{;F1EvdsT#J8&}FX&lLu~*{KDP!cdA!yIxhlQn6W2xXZ zmS%3jYcCz4As@$yRxPq3b++~MdC%F4p8NP-xYeUz4(^CRC4-b7%H~V8+w=t~3e$o@ zcwa`f+>ah0x#4iN4h8FYWtz1o*=7mh$Fn5n?KOm+tFYQzQrKCqPpw&B#FfU~8OsgfXvrfZ!2C7{Y- z5W;+SlRYWq%?uoXy3ncRx^gA#$O#>@C|I!YY(3D(A4vA{T_xC&q94eX8ww5sIqU`* zrgit@kh>QPeRJ}jmCgAebGPA6a$MA06qS?^DA(gc1`!+x-Qv__&4RToAYB7nQwfv- z*iB@4~GszpuE5 zId0G$o8YQ3knrPhTZr{DuwC`oS~mWAv^fRS@znl-v2K?uw6gH zM}}vt-gn6N*+xa!uCc{-mFmOeAoU>c37zL-$v*6jBPihA<oJ~P@0jy~(`JV9ir z-^yh2z+NY9BTkG+MGeH0K^W-Dk=pB0lcAPdcZzysD2G=bPS9FAHd)jL@P3(yZc)cu zh@du>XAC&0DGI4+FLycofGfK*l7}8LU}q;D06R^gw~ugRo!?I8>!U=0OeQU{(KfR2 z6p6N?3_P!}&yE1F#j{$QYh%ekp1>iHWlwlsNzt4vd(!b|Ar0-bqnBEyeN<(Vz3Hs$ zLXy6?sX21+x~NauF&%f11y-I%L3eM!QNStc45$6d6t&r$S%#7@w`R!T7xmKGYXe4S zYc9lz;ewre2s}3&{5g}mD$8F??M6s4fj;Wov(ccFSEqyf5#6Froyr6c-Ya80y8M!D zfe%m1G5nfT$evtHwgp`rYv%-Pvok)jwSJA@m6E2!lt3yaK?}l9Dy}kNCQ^J1%+Lc%0cr!v9A?a~05T5@!9Pd)+rcWmEr!WJ($t?-l`)hPoTLdM^Q0q}&Qj45pZ z0M3iWh2E8WIAJSIg=s&TVFn{Lw}(6%4e$CI1VHAnLSy~%2o?nbf*lgS36n1qkh0HM zNM-#}v*h4&;ixEZepJg=lgzd_>#X1=MoUxNv!V#2$)&iOQAbj9?1b+67{;660va22 z9x3;O*8QcJul*rz(D1K7#i9#ofFNW6N+zKUB-m?ep`s|}Y-CZY-_#=Y-->vJ7}WBU zzSAxl`diJy9H_BUcw0 zm67pBdn$_um_!C-*^5u8OZah&E5zEF3hXw_1`sFU;{@#V9Gt~2)3fOUDu6n+lWck$ z3Y^{O!yd#*B>^wa;$C>d-7!z0lWezlY=E;`ySW9hUaibM<2ILz_VnEAdWH3BwSIQO zZ-KWASg({=T6P4ms_~AEN2tqouj|!njXv9^xr`sem3@fUiCwG#wQPAVfQNk^AK^^+ zS?CIJHX`rta`yAA^t-t_T?Q8zHRU({8`HR?LwTZFNe|9j}6i*=n{&vtIJEPDrnL4!9a+TAug z{VxE`wc6}*rDE44rVxK)Z z;y9j95qhB`fPTFE!hC=|3S#5gz((@u>VnL3f*erGQx(7gwVVaXNkDPqNRpkV-IWJ5 z{Ue}H8Q2gx!SXN)AlY;RBUPCQF;C5^qLJGSmoYMY9n3&vxo`WOV4^-4QJ=<*# zrDTXX6^4+enTG)+n+_nQ4RV^8N3!?aQ-9^;RzS>i)7DjbGVLbs z3FtFUdZp&Z_hie%fy!P^kitxTQWu*E1cyRcn1ail-`_pAImVr5J7)#+FG?w0)>>Mw z#uQ}ia>UW}%*>M-ZA2wPFrv9&{g_O43e>5v|S~_;&Tc}kE&|Fp-Sw|14N6V7JL_a zRF%0PMLCd=i@rgDR-IB&Iu;-Wb~WW#t0)H+Ac0aI2mp;7wyt0*L`$;5MjRl>8a0`V zfh|yX6uQ`3pzaP3zr~$Gf&kN~>KuZDXJqgdW zpEh$bfCU`qg0v411ZwF+g^i#!K?ulXOTkj+A1LJtdeqvZa-b+6gnA@pG3NtCIj9o* zsa=M?wGZ*xy+x+6Ew3TuCHmepQl~P(gVU)DdQ9F-Y^--T5iu>c_|0RgQ znThGxVUEJwnDK<3zO*ubZmj5AF>WC;e>_;Ozi zb~%V{mY*7tJWP#r%pAoFP|~s3j@Env@3|X}&uaR2r#fVusElJkYDC zpGq`pAaly zFxY0JU3~qu3m(FS3Q-l~w~+}q>B!e?<^;NF`9mP$ymx}e7H9msm})xA`h+}Z9$Q`E z0K<-Q=?1#IA+T}RE`YhSoFiPQAabZRAolvg!nW1#>@1Ir?r(Q0x0VW-puY3M#!8%m%F?RbNEG=eW46O(9t*Udb!9q zXG2fl7*fyI1GK6!W0Jt?P@o&)0hEdB^o<$OH=fliE;-C=D;F$c0kjR7@J<&>t~QtN z5BgHq*E|q9kou}fr7(sm=_^ls&Bk8eNS3_<9WT}W;o1iE7$bImyHSLL)YtsN!B#V z#4rQmtt>J_yR0dHn-eWJMhIDO(1rMuJI8#*`23u{@#T*C*XbMIl6Ig?yzDz8ltI1{ ziY@#zc%TWJ8%KuCP`5cVnJ523y$g4`oWpK+(ehz*CWc`YU{)afyD?KCCN7QUGIs~b zXC_(7QgOfX2QD4Z@!p&lbP{aY_asYpIeQ9L>~ogrxI0id_eUP;3oxE7SmAFR0a>C` ziMiK1nWV`k$R_55irLF5?ArQy5de$pD+D*em4g>HcJmLNSM>4xNA}5`ZZm8ug`TDE zsb2UwMl;{?Fh}U@vX)u;i_z}7WU%kCUY4?9%n5(G-nI2eyUjt4D$2gOnlh~Aldd~% zgAnqR!eIa@*y@h7#2|#bL`N{EeURmTAYEUp?-p`UL3BS`Z7ULX)s+WL*XXYtnWpo( zqQ40)Z`oqMdJHP*_{6p0_bx)bmRc!BsaPIAC%3l{g!}hz^f2-(+@*ULVu9< z+?9mW5UE4-+>wKPMk~^^LF3h4CKYpGkd}2~3hEHOEhA8{jW}Uqg5nUf^$-BTN@lyG zke_aXgZeZw1tm-^Rv%VEm1Rrr8Xg91jZoM7L4UB4Y7696_xeG30;&K2AOJ~3K~&`j zt>_2);idMO8GXCiTU8kYt@@}WDeGE6vc0^AkNpfLX+L2(su1ocEVRE9pRjiGAKLBJ z53UojFKy4(gY_XMdl8-a=SLuxb-&H~*D_jcj)Jy0lGW=rGIyKF3zjE?YC?|_;F0ziuX&sW^3T&&#aASgeHULxy+ig zAm)+i?P+o=!NV8nLnQoGxE10!UXB^j>IH!9#3o2D+18<<1^9@N(f$IB`FFvs5Km*q z$plZO?sZM^x*+QU&1#|!0UKGrj%8k*b&W_btcQc`UrIdk&+pX%+x2R-ehvo_wpoS)wkVJ1w@TKaKHFw8$%IEi8iz>mkj5brJfsSd z;9+Tnkb8GuxBKQ6*KH5)@6>S1nAM`K9`3du#3Dl%)NCV&OO-^=o}o+lb-!G<1V`ZnPfEcszy1u3?Kxe^> zTr;8=g6@Ku+*xs)10L1O@P-yG&*{1Y7cS57ikg(VC-Pj$$Z8=S)KEGkVN8+%5601u zA{gA7J}Bx1ErcS1ft?^NYX$6g_OV6mZ@p0ujV0>Y^qNuXnB$h8XQ#6mK(Q1j8;&wW-(^rwcJo>R+U~sWlrc-Q+fpz4E-wX)}Hj<8P{O^^s>9E*ky<2N}BK_$NcN*#-ChL_oJy< zQ{vJ+8n|?gW8mL7{P3uPAqhW)G*X%1VV*)K*>2lR4wJnCp#q#49b2t{Op>J{f*BE5 zJ5LdjyF{(~F*q-f(YvY}a?$nFqe8Qy#=ZjZH7`?;K*d7fPsqGIIA$qyitSb&nCFBX z>;x(003}=nT47BdNMg6~xO9eY*Pu}AUa%plcExg44|8uDtAuYv&_c)$Vl$>`x2Y?5 zutT-ZFo1Ak56-FHn$cm4wsUsKvrt>)Is4lc-k*f;M6^O^7;(m&{onFism1~KGC0f#AVn+QR9XZ2WlA@?iX=t@?h zvs)(0M7%u{<%WmSD}nUN_!(R`4zaHnoRTKr7w?3ahC&_**NsDr>qF!ew*U~^-Xebs#8R53LvYW#XGoo>NbmIct>FSG0aIWrTJ7THDeGLO>-y{~X>Rb-r z?8Maqk-WPj>d?~u{fOgIxUy`LoYKz=x5bp*9DbM;jaxqcY3LOfmEbOK+~)Z@L<}0= ztQj9;R-MP;o1e*C_+;J_QHMau^~wqDlva?-*(l9x8`e_5Kv$NHgtv zH7SgWE~X9?hs#jF2v?R(3%+4mxUFs&Q)9FIFe4i0)At-7gF!NL5K_auv`J`so%c{< zB0PEuMh%i2arow0buNd`VbvkVs=EV8=vu@pgc)=O$f~DRki#&TgKngIZY1F@>z>y* zkX3&{oZO1WdGtNHY#%w=xwFBvYWqbcIMwbbiM-1y=rM!$Q9%zmd_Sjxe&0Ii&TJ?+ z)UUX3o8!Sqt}PP$8qAq?w{|4MtsTembq$Ad+TaB4!K(Xa9l$#`N^{FJE-J~-2Dpj7 zH)C26-n7F(4fwmV_-SA&!9$|ZC3yHGg)VzC!*{QXR`#CUU)$^)-yk)*xog6AAkdid zaV*w#l^0qP>Ku_8dg`z>Laea>5!eV=wK|Duw-UY;P8a4D3Y|Z6vLhQ54RTTH3u@B> zG=@1>nMBKjr%6{A%CyLT-~&8?&V0v8&e&t^cAek?c8^m@5+fC9j+~^7Sz;Lg6eG3K`y$V)R~$i-?gl98<#7hYGk`M$JPRKHaD@1( z_AcSmP!&Uy#DcZEvz2N7YR9N_+RyC_o3I4VIK<0)(H8hnJK-#x%2s#{H$;6trJa+0 zCDOoDf`>$*OYm@Wg~+n(2?%+2dqunZ$XD=bj4&JxigL>wrp$ zvn$R+XL;*31W5uFg8)X5E;lx=S=(t4(YCW`7wj&iEs;m%@$A6Lr7viNfo3DzssnvL z#N4X@$)jtrBO$7atn-1`ZP=lZ2PD}`5=G^Ht0?w^TD8=MG&#B1hmH_wL6Zs-8k(IwVO7_X#=%l5Bet9VxtlkpaA6VEGQ+t zFdr0cFc+jKOdvu)pJ-(nR_IK5%0g`T(-q^svkLPo9xwJ)=K@GaZ&uK_nD$7mCGUgm zEb40SK6gV~F4)HGOL6CErZ42i3i68YjNeJpeSlfuG*X%1;s5-<|NUtf5*`Wvm6yXL z{2^q#Zdx2;q=GU#gvzlMG&CWQj*2gHv z?IMHClHg9OwOS&0?cTAcxapT{3!mE;OIv#vCE&TZz^==HEX%SjB4z!9T)OFLj)_ax z@aw{eny;4kBt?wlc9FqmNpQV&W;wsk@qT1l9=hDVXxiGl7y-}4MRuJ;qch;)$GCK8 zkPAub5;^5RhWyolicB{ciQWpD16EM+>ju>FR0Y_OJqbw4ok~g*mdb-F7lFg>#CeQ zJTNn9cKu5>?--Bj0t!$#eiL> z*m3sK#uBQ0hd1oq68i~&uqCNBTD9aa!w@Xo7>a5sj~Y*6F1H~o^>5=u)O@wP>qx{n zZkE9&b?-(DHcNu*Ohq>QI?HFYx$}!&hG?Ru0^$Y=zWZvX`lz`{lb<3_(Ri?>% z$0K8Qr`!@7d9wOhRs;wrfjIff04@280uWM^&TcCt3K=}FRYPqh<|=eDBqYDC*w~F% z9DZFc26lPbx*WF%d#+-X!Db0~U0${xzfPcy@$0m*-bev2n)U$#b&qKR9&<4Wne1bUFUcNA;*O`s;r^jBeKMPtWrdGZT=d}^6M_|H}-Y>x*O6CnQ}|EOPgoc z1&qBP>_dDX62ERSe(tT2Mk*6Lq>;)54^D;fH^-2=gn%41i;e3|M4a3NBjGo|R)}Mn zSLYKNs_|wsdYZog4cAx~XhvJCj3YK&t1}6|5vDg`hvB#>YO=HpdWpq_1~3-Smd-tZ1bh zaVOWkkH+s3ehr*w-foTo)M{v?BFV-Z*CWH3OcN0-;BJDE8j0VB*f_+hD^3NTTYapB z>8{4j5fgq4GXqm6r8fGOWJdoG(nw{3hb1GGpWo5o{0aoSDD3xeW%I{FUQ1K8;ZD)B z^Km{C_NARZKJ4!je{-h~r*eQ4Y{@}r?y6)*6-D^So6RxonWk&FVXir9 z133tx&dP^(Clk<(fgsgqZD~aZX`j=g(CL$uhCw(6)HS`+hw@9A@M16D=|jdA)LVr( zs&?%E#7-YUh46FCLZhrNx8eHO<(}6Ha=u>u1Dx~`Xr@cczm8< zr;i{bUhGJYfY?qSHaF<~oj&0G`FAmDAw0Fjf@E9cKn^?IAlM=_tR8);l03=5rwvy& zm72nAnIO+~BumwVRFZ6&$$DY61U6cI3h9#e!!B9n{ zmp9$EO)QZ!gAnu8v%PUYFM-|F0npOeJ_o z6uJZt(-mU0>UNSBw|>G$z^?Q6lyEWHKq5LMxDQQuE&KB*ytMjie_y*T#m)S|e-2Zf zi_xmvnRTtZ-s^)oD{vzKFRz2ueN5*Y^MY19oIsdKU1GG9)?dc!c5*9nYSWB=5|ia- zR^5iYIC9L5%L%g1hdgI)7SyU$uMG&h&Bka0iCoy_#1)`6>oDG_g|h<-yDdedmd2t3 zU8@5Ns+F@Mhcv6VqR{J*?Y0zt1{U%M|9w*6bcHahZkO=lD)m&#RkFskS?TC(vtic3 z7NoNhcf+1V+sT!&&Z1p86eUuexl#*pO?^^yX86Kr`n*lj7)(pU!jWVAdSOrE@qNwYSI z5w7D8{>zxI_IlNA$crPxc~Q9^2}L=e?$v@?yQc&NAk4N9qYWhFzP}`M!3v#RFuWl> z6Qy8jx1|sufm&@#p{=SwYL#-KRw?VPDD*mHyDf!}h5W&PzZ>zG;}EBCbLkM0<##h? zxP9~d!GE6=_?Q&}+vY2+FCYc}S^nUIR)~b3!dHw`>Jc0}{xdmBlwAtok0G5eO`41y znbvb#oc3il-69svQmW0{jr}CdbfabZ=gXk)r1^Mq~@bV#*>Od4m6Ad zD6*UI7{2<^ci4H#6iC5b(f^E{p4vdfbWyNttB|Ybcqh=YKg0u=!8efXx&t{7>VHY; z10jn{)vT^NC?cLbp|0j^WZ`vvtqO7A4-Sc5t`L$HS2v0SN0K{qG;(6 z0R9C7^yU?4>xfMyc(;NiJI@XOAsL2I@ay0hh^5W>v<2C?0mfZ}7$l|dX8dR$;tM`I z4IM5w%QNg?NAOKW04Uu6Cx7RT+*{%yM~SZb_H+!y(#Cw+)hau=Y`SHigp$&CE6xp~ z%U`|;H&mkTnpmPhNwNhnQ}g>eM6_ry|wmZ15{8z+s0A^sHMEb3$^3x?&JH1iQQk z!7BF(MV)d2MGSdYBStJ-s=~eCWKDlWfmO~coYpZox&_MNW?@N0i^AH9`}Je{Q9L%l z1`v5JNH)N(*pQ@v9@i7d%S^`w?QH5+RH=( zv^hjqqUZw;bP(-CP&}P1f zx<}3cvon^fBAQTP5>=%_I;1%pJ@-c%+`*-Ate|j%`T=_EsMn)gN3=E1%qUw`AzHnr zRgf&?%T=GYm(4gMthw+f0uTHkA#@QGa$J--iLR_vp&aTQ8=6y2pb>(r5hDtX-RD9! z1*(kv36as8qS#)GRkJC8)6;M{=mMNx+slEX*q?4>r8_r#pI0}gzR3I-H#1~ zLR#v4qX7A>@e&deB&HgOWxH)YU6a)Q73ZgrGWs433IO}3ci^~Pz2oT&9Ip`i+OA$Q z05+aA6(Y4D2?=wU`o#ExPmhcMR{j{#$IH}6-)njP*cBfy!}k2%t*`Y)rlsOJros>I z^o5m>FpG)V4K;T)kgcQ~LX3&R!zgx1r9lS36(TbxV;meWA$viG2StIR8_=*rGq72( z9zwZapy+&47UH0pOyk585)w#G>x{|s8U3H}Pz&K08(A1%do9oJhvK{%j_*5UJgx1F ztP}1@E3p)P-0W#h-&Dk%sACBU36};b#Su7OGXXR=C{b;J_t9kY`Mi!Mw8LI9bc*Wr z>|bw{~_ zIelDQ?zi9z^EQz+=lmVAHm=o6Dw}-*;`Jl)tT<-x`OrKWD|1hcIx}6Xub&wWqfDrV zsbH6M&Ft2EH+iwlyo04WYd4FY&F@e;!nBmk=auiY(Rf}alD#9oFmDrCbJF@`)?&4K zN!^)O+KWCbj@f%YG}G!tkrXFu_2Oc*Vr^lg5?2j#ZlR9vDw-+9I4xC%T@JBG{Y?KX zeDl6Cn%1?8iM;6u%9banW^t?NnMqOQh(>&FA|dx7@`8+&?-mH(jghfvKs;oG9^K)-Kx*+Q3Ml*Sv$eMHB{L*;~vk>NOoV94JHkD0E?-|uaE8BQM zX)pe)ShM$hXiRqIo*I2-qE?sJw6lSPkelg8E%#r+Z4I#L;K>duQ)itA4Ha3w0 zUAq7xXdDp>cDv}=$f^;aizbALSP|vB1;TeRWkA=GbJ~>#^8^D&I(so)zD4lz=H}jd zbWzlAT#gf2bI!XVWZuFogn1ihZ9)rA)t$o8+cOS#s>;nM?ZvGcv-f;x8s}X!^VFC# z6Sevd4MbEmY^-bM*J7g>2mPNEHH+2wm=j9Z%nM?S__}tZEN-0eZZrp<5IuwSUdgnL z{Bu#Zq}gxA2@+AhTOfQFQwDS`O*9ZroQTd|M3>LQ6t~{bo0EITql=<`<8qwH+EfGK zW^FQWe##nMbN&zU5x& z*|~~lS}~3SMQ23K7O0<%o2g#tYepH(k<5#Ty!A#jEr@24aYWAm=nYyhBYNgUM$v^b zZKW8Z3F*SybU_xP%6AKd@5ai2z9mO6(1r*E14Es?u`Zv3`7H%)-du4$Pf~7P)Gtzw zlUeh`5Q{(zF~~xgw^-JqwYvAE7>(+pmTjC++Ph%Yn7!viV{FYmHTuj%tW(sd&xgjbB{6<#F6#p(s&zs_!X)m+qzu*FmJyhi(wxq(ulp;4Uy1#8uaZduQwa$k zJ|Q{h3b~C`;Yus-HnRl09E-r6SNn0SRkN$(!Eb=JY>d^7YVEI(=8=(C881+X~CcKO# zB>ZhmOi-zbqZ!FLU&u|VyB!MZDOSA~s?wz!&_pEaVtXo!oa}uCI5WRqX`6zAlOlBa zKsIt#Pw1&;lYwD8<)djMG81uyIxA6^6zUTG4(1z(fVSnK-Zf><0Yh8M>+Q)w~<NTN*crUZ;l+qb*XebYt+&T)p#t25DxSP@K_hI|g!RMV3e~X77z?mnln9%0dX#a% zl(5Bl>zlu&Ot6dh=jgwQ{J>?w9(M=bThKkV*tWh&?-6UjvNnU@ zVEsF(QArrdbUU;0cF>${3bHddyR|RgF{<>NtT$w5=}G7=m-3}* zw^xetB^EqiLXd8ZzCJfy3I^v+P-O9eFAPuv>RG!uFRCelB#=t?NXjIED{E$qMTy)v zZ>P@Oo7SwUd+B1U*Q}I4vS(wqiME>*gQSMl1qii@8LbC4&vf}JGVj!x!3oEP(g8&6 z5dd1%cF85QPO5-FvjlBH3r92E^rW0Za!X0jv1F3!P2|2XcNlb)_z8Qn{l##X6rv<; z=sjf;Qs7AYy%y;kLvh3{=Nc{xInlKe8(o^1h#ejt@pKRM>)O^MoWTTL#tOpX=aX$g ziEh1m|K%$10DYYygvRkTO+Ad?f#_@993Ve*(?BTIBh*>VgnUp?HDOa!0X3twD z#w}EKnzoEEMy|b7m*MzbG;*aC?FK$@j|D_ewR1zlfF+LV5~~$9xvTmz;W7Imp51-O zSc}1S&OLnTd+}wOV~mdePUPyj_TjALB#z$i7Wz4P8F+0Q)%%5?ipzY=+(xcW-VgOr zh3{{5pXK!64K%(Q>at0D!ht2iwr(umBhSN8HOSEV1^wka)I`awYUPTUmgT?-=T~4t zLP9h+hMH~%tdB;Li)Nxr)lOPptu+0kwGC4p7sbSJF_GP#C(3;|DfagTa)eC{l>vIP z(u7~-UE%f(M#1g|!Aq@#V5J)I2X?UAsgyghPw=(*dhPkD@~+EPO@FeM%A9R}@8eX|&bV8%Z0#Xuf2)2TCeS1Ql@h z?cd3@S5UEEmPT;S``z48_mFSMTgNL5od_mgQv@W(#!?W_84V%0)ABUANMhVIs-${F z7c3q|i0eh@L`<5Y#M*Z2o$b2sszILWWj`b#0kIE%cvIVoq~W}#rd6+%fo(UmI3{y) zaEz{t05LCAh7JWLaHz-h99;Idb&@$ER#cK_j90Ooq{30Vkx2Z*QhOk~DgS=B{ zKVn(948+z(w3r*bZK-Knj_AvyVPESm$J1celzA!HltT)aBC6&iw|jC*Xm(-!WY7}E z0*~vFvR6`}sLHX4*~X=uWZ>-nkoy!mU|4I6zzlla*1oiBIhNxhm*RG?s7N)xH|ufb z?{Vt8+AdnKAD|WfxAlHY)$^|Gp0#f0BXNzQco(N5A%fy*{iDx1-^2@x(zJ96!N$G# zqJ)OE`N-4h!a&G&cq z6bXq`V@8}H;_p=(8TE3oILsh#8t~6gr(9b4-&E=QeeMB-Iq!bj7FxOF7O(;F^*6Yg z{BiZV54kfIw@SoVXnORydi#A&xkj*zsYbyxON5d2Cl;gdaIyhsUuid1r|!!S9COB7 zVn238gm1c;e>Xi6Bebzu;8QC1CWXWv6ixkzNI&DhLmoqwqHTH;#WLWb_tZGbi$+K+ z%qzh|Qy;`xC~c`VzI$9qWybleBpagB+IDtQu@XtF7*)R;|D(jk%WF$n>pr7|k<6gC zWaA{NS)dEBrC7HR!<{h^F``ldAp`COK3R+O)jG8# zIju|^zGS2Nz2{g=Qa$EF_`;{qvgwjrqwT03Nl?H$xD?!x)M|XQu=Ci%qNi>n3l}Is z9Tk%y1f~!~WsaIJWbRc`L}1KZQu%nPrA85{A(U&H37)hs`*<=RkSzqmI|Fwu_s*;R z1%+4{;*|`S?AD&o=5q-vtQ-i0nZ{$cb+F#jr=kv?fA8txmbmStdtpNwnPtyC;6ala zpvD7cRhC+4RyG4~<6hR%HX1NamdU&?k=A%$yjVkf5HFcd$)eY6q&!>hFY<>qnmt8!sXzn6}irv!9jfMKlpf$FK*jKtKN5bl~eJj3odm> z_(p1V*LD`eV;Nk#G93C zBOExuFzGq0G!k719(6jl3|s4^$qP$@V0Xwo|6Oe-J+`QQC%jF|;XRGN!u3vKpt|qQ zml&h|lad`0BBu`TSGE}|C`_`w7X z3P&~Bf8uMsK6pGD-&gH z_~^_EFX5FRBu{iv-lTM#veZ1+m@XU@l<~bJDjfBPpuAbXOgE|bLDh55bnTPqI!vu8 znyunbsfZ@1zKqy;?X!O=H^><^_gq}i$e~1m#b~>C@_djo-*Y+kqBi1@VGd(4!=Jt5 zr0}OJyb>xXd+Trpq|fJ;1plr6mFAI#mL2HrFm1HzJH}=gNwxzyS4wLMOYrC98{l zU76r^p!j4_>(kC|D0G9^|zd#YUqfh51F`J?v<3VvL{Y#(O zQ8C+1Srgn*4pOx?C^c__{&Oy%PpBo6#pmuC1h@3jl+G*=;DMgx(Z_YZHw5~aoV0cN z&YFj6#d1qFJ$}T=*3VU(&z?6GC|m~CtF_N9_LglyoF={=%QtV-pq-3{Mi4GLdsOIr$&=IbFQ7GVF(R{uD& zJ^+07KkPD8_?wkS9-jkX=`wJd9+zMiiI_%?K0t5V^apkIUw#%iMF>*5@8XG{ae2g4 z$&Yd89%6~Jk&F619D-Vh#@FI>39Cic);|(1(f@LuEQ1?Kp zKz=S_K|w+Mqez7fiv80p7Sle^_5G;cUV+dDS{WV!kG*$t=@xt3bJ^-YOPKnVpJBFc z*!;;`i{h%Int*9JoJ7iYLzDEfsRYb#HIWo`PC) zRcWIs_8&gaxt)jF&340Qy`X(Xp_XV3|; zZC;NQa)NvkS{XFVf*37Le+O8vau=VJe+#T@Q{7-ZawpTQX^r(p^fI@pF=rTD9wJ_| z$m0~`nWtP_Kp0ssntF^XkeDj_Vd%8P*Fk$hAhkSWm=hmfI@n8kgTj`D2QTQDFqdwg zTOG*a5L4yiD`=P6ItC2a0lKKil$QHV6~P9P%P1Re``TTZz( zM-Q!cwL3FfWsh#4hB^#AhM`Z=e|#{VpobI43tW}VlQoE@AKK0fD<8()wZ#0*th#)x zq86`e^rK2-GkB;1DNWMxaJl<~KAdowbNZi`XQ$K1kLr?g6I0GFB7f!7&9~E*zBI%u zEMz_GPw}n#GM(Lgwve3w){6bboIAajyJcLne=NlBP+yMImJE1jO{Cj>6 z{Yz0$))GT)FWbG!0OOY`cmv_EQ-J2+?j7T7Us-QBbLo7lF?yS^d3 z$G%hoZ~N)^z;yceVJAs?r|#Ont8Q1HRRYJlUmc9SbGM)TI^ z9X}01YPEb|naLRmIpkL?&>c&|^3{j$23$v->fbUQ{My@}#<*TN>9xQq;fxf{hU4Sq ztJ01up((xGzl~dlAzmhM#zR3y+V>3&C!5g@NBrWc$^n5gNLQA%g*iw~>0T|nl0d_s zda`in>>uc!b7v~44;J<+^)R_291D%t2iEblcskF@hd|zHAaY04{O6F>DVbzzG4TM; zRfqQ+(HUV=F3Okt=K);1E>`==OV#MNRDpCjd^Y$58A*!4&l z(aOQ=R_pb-7g1yd%)J!@+XYf|kv#!`0-7Bz%rgtXtfnG3b{n4zS zV(KMMc)H@Iwx(ba)Nq>M)xW+lK;Net;)%Z;WIh**{I*VzTIVMl2p|z#1;jCg|Nq|6 znhP(IIXaP_tvYly@o6IQ9w#`?_F z`7H_yop`QxLQS+=oWZkM1K}U0jWs+r4pbn0ZLvG<$u984XOHB zVTFB9VkN}y*YRfX_!~?K(UyEy>D~6&U^;8P3Lz;^Xs{st_L`;jk$IB5CDBi-BpCnD zcE5=6P|~^QPvXq8trP(RCJAj_t7GTfA52(Js)h#9lIJm{iiJ%|;F8x$O1~4jN)&7N zv0BG$J>=rL6NXYsAQMcJ^t6I*g-&SONSxiYul;8$tTY`j>g zwBM!EW~&OX7x1J>05lJmNU!uY;|~2e@mNPLXDeWb*SeGdTX~U!)XZ{9soTi#Q5s}J zxvLEo0~B-x4?>Mm&MA`zHM#p z%+^p^^<;hxZ&)f+jZ+_lZ%(t3zN~&KwV7Ym{HX)#SQ7Mw(I?SjHG3vT&u+(RKnF^} z{TviJey?XD&WXyGM`g!I$Vh&!DP?*%TTxb3b90nrOWwJXKIvJW|Bu^atFP=~Tbel$ z(k?D*wr&Iz?tl^P#+cL`Ci8mLS$?)e2Tc@ejY`VDSgx4Vfpq!vr_%4ynaok&@WrkP ze%(Gf3D!_L;jVfDam!e!-mQm!K=zher$n3iPHAyXXFrLVn&cR}sf!VeT!n(a#DIJE z1?JXQvb&E~6ngVll5O7ot~H$>INYtBh2%4*n00N0beg8%sLH(5<&?~1NW?<1g3VF#9XXD9?8&#-v%#@tMe#$HWd&5np3Fe?^{4g=Wl{r*kVAn3HGa*i^loiL zgjnqkB_Y);Y)sXs^OzkL9F4|*JZ(jNRn2Nd2%v(TVu}Bg=lg^I0Dl02qU`@79shwM zY=Zsb{PB;m<_bT+4R=eKu>2veeOJ}hA+!hNUeq|^o0u~vEwbh|sK`*GB`2#$&xMq> zCRrnI;_EWYBrlZet2EuW%hTyR`Bf{sc_?cRb+yd*@;C0q#U?GQajiS7H7f*w4I__! z(ab8Tck_0i;z3V|ZO2m7o=RgdQ{D88vdYJ;Y*YjA2mclo=1Geiph!3_+>j59_B=PF zR3FP4+z*t7RpwpEfl3Pwn$K_yHX0PURwtmGq}@c__+&LM>4znTe6!W5><<*6sGGZ& zje3UOCs-%u+EZ$eTS*?bafYeo8E??FfuQlTqe6v5bHPqU;1B}9nPEuVHuTDzOoB62 zKHNG;DdI-#>>?U^lm<-wWl~EWm6a~ROtEGEs~2mLP}x5!3+Zdk{{I7@9Q}*0wM+lD zd2Hv>^6ZK4gBaLb}F78*{mS&OWLQ{>U=1AYK;~H+R@2-2L zGQ+&vP3zNAEvW$-VdNi(_7l{p*}98*#@m#M&7a>H6;Do;dGxo;E_kcP)~Z6YzF-+| z$oUU|d~wiTJgEPbm-qrEo?W4^!{G>E2c?eV>dy!4zJc@r!ZDE={skZq2tbgnQQvzt zp@3pSwwSL9bSITc&IAAf0AS4)j+a`xoX-2+a{hZL>zhg6;=GS?^?*~=R1)ufJpFBL zqi0F#qnU zU35`yiYZ~RZ`7us8o5%t?UM&jxgy!=;7Usbnf5XLO=5I4pp}xet^p$?k0XmOv{Rk zj|Kyj^JaN(t=Sv=brWwG&N8p?3DiJWJYC9Z3e2P3aRsbmU>=TWa@QI6E`RgW)xvbY2U_EAzOp@Ne(g_x|OQS zdl35DRb40p);^u;>SM|vd7E`{OOj1uCU+i(O7xz{T|$c4`yj*54)x0WhoLR!n-c}( zoq9w?P+V=R&f3pERcdXop-TOiYvTEqMLPozwuanCFwM-4QCMS zZrpx6us>AN3%hYy&T%2kOtAGXCvX)p!-D17iO|yNwmCj@t^-+bp~mT92SY93{+Rgv z1m>%arOymkwTP-NMbLglrk8VMlH7Z$?k*CUw!m#v{H~@h{%Rrv5CueZF7pR;T@#%t z;7dGPEjpZUz#_#w0#YDSz#_#*c!`!u;|L~d%bqmffld2YtxBE-G0PfD9n)s|yk5TM z+M+T@2MFF$ca;{ej}aXzb{Nu@^L-3Q45cD%7rUBEYgJXsxC=@#^tK%j%triq1|y^! z<{C(4yawx&%z5S}#YY2I85}lh04~W5%YKPGTgC;B-w>*EFT(M> z&sNV86X&elO9he1syri^;T#HUO|MSpsqCwjmSY3KX!jp7qXqs553U z08_-t21sRb1xz(-CSQUY$zY!Vz*ZN`qEm0-1gnLfEuvcRgyB$x&5zvr-mh=Mf;pey%DU+M)&C>jQQw$L$zag@$)+?e=Qp!T|bacY8AY9NguNRIQ8GuXKFt z`+oPy%fhqY0NsJw?$p+fMO=jes+Vj2R^0V=l-qnVl#X~D$4Yb8-L#e`L+2h_KS@Id zt?gAK+zvDh9_5&v(pvQ@EqgGbmdXcI`U56|X4PbI^r42QucbM}Ws6b(uuy7OdELAu z$4dZEF;o`p<_6lUI5>O&m`5+kF#zEDfo&B;=lX%|3D~4xuX$nwK)M9>jbDgEgtyD9 za!lFCQH+NH2v`GKe7|n1&|%sK@sEjP|M(j?PF1yMULC4%IbdM{$ytofT6L*8Ng-YR z_U-brWlq8OR#;0nhpvqHM98i9*a5=BBi$V5+c%SMkh_W%Q2T4bG=uoZ#Ib)&9Q()L z%P~K9&mBzHLuY;Ic>HnYgLB#=j+1?VEgCQUZsyH*z zl6f8;!6*NlKt!ym&0rquewP(?h+|z~wg*(CdEE*JYV{^}@zQuar z2q?fT1@J9y$ch@T4r4Op|7*gDjv(XN0fZm9t7(ldo$FHdqj|}mITl%DMrjnI%300Y zA#xn&V;2Hi@37|A(HJc;V9v`q;GS}Kwkz6m?N)4RSn_+qeN0; z&gM1fF7y7i%}1>BXvt+TPUvRA$NOS{{)SP`Cu83tyeS` z7VQgdeC>VtjkN1lgxvuEKF<$VrpBJ7&x-_`tt@X8pF+v;{fnBX&A)@NCnBQrz|szQ z3;j3_!q(rn!duAr&GCL3{rh2(v44yuV}8MB+*Tbq)t#&_{O)#~q(~66evFAjfY}y) zw~WI;h3PTv29s4u_*q)qKU}LBX)R;1jI&wsc_)kIHxbc!Py2uv*2VPd2HJx$DJPHq8-TGNecc^v~dcqm@5-=0v0y{m; zYT&EpCf$~Eq`j-EfK77{+h^Kk{MF69AjvM0+knFjTqIyC0zNPUlH4F04>ip4pz5>* zA$K#hJ6_r(Ag#2hN`Iu{(U>KhFrP}7;EwCMpor#YFW!oPvX@Z)zOI@h=5r0Wv(+BJ z?nBLiVExsb-xf*@6mJfqfnk%0sPJihwv9X+z|v!|(QU-JQ5Kvl>LKGoKxGccPnPjN zpJ@Qh@7SaP;sI|4;-HFva+!3*gF<0@S-D6u1hq@n1ADDDAB(_6~o=$@r(;IOZ zfu{*t5t1OA^ju#b-WSYwfRI`W*pOh!wyPfx7-s~QzGcDwjHnXc1?_&6OUJF9 zHO40aU6Dr#+C|1j9<_v}cc$me`f#ABzykz5)S2D%kNjv_A(Z| zBcx9!Rc3uoKmcSxKzow6MY1QyKv-E@gj`4hwHxnRC=x@S_C>fQ8`3dsBK&&p7OjSkc?UUE1dJc^v)P>kw+--;BWK)nt_u;3-(`=UI@= z|BshQ!q%yg%Y{8B5?y`(#8Gk4e)|4xGHz;s8q@#f6N->t*0tpF;_vnovV+QOr3)l; zV2%rbOCEUq695pbvulXcuP*?&9B`OVGPVE_5s-$*Fa>U_1Axz_t3ZAY%iweYfJ2Dw zeUh;h@c|bk2Sh=7IN*p?93a9a#v$9Hi=bA>udUU5cfTM?Pe-+grtx?fSu0GsTOT~j zc)}={#$*4OWb7Z4jQzt!#;G(`;QL~fTa?UsJM7a|9S$>bjIyg54|zQIRnXa`dY7%d|ibPISL(p2%d-BC&^}) zN&?Avd`jnP*F7(v9GFE)q`p2L^BTDEae+!B>@FyS5wN#tjcEg)fy8F?*jIFy_th>D|yG3}g!a858AS7{`lO zOlxWXm~=P)m}Kl9W4%}5&0H}aIzo=tj@i-vW#b9unBu$n#}wb~5oD+MZc}`>embu% z<0-z|qsdP3-A2VjbvG|-X;Hj2;}szV?P>FF`V)-?zN!|6{*s;+w~hfItp6eKSi9id zegEO~TF4x`(#{cF#)H@Ti&#GL9?fRc44*y4Um%cBjv3+zQ9ffG#*LzvzXsP)#GpLP zn`LoQ0F+bUvyq^_Ki3t%yX8ocv1%3QCUJSh0j@!cB3L}X2?HqjQ1{?)yaDNaY_4?s zd$tnJf0Qp>?k}D@VZH#WNO$u)JZ+&izOX+91gaGD1Zk<4dkG=W_7Q-!QmY$)-N@U- z)h$wel_KxNjEsmHu{7CIWd-ebxjzMp;-naZ)5FLs$+m>78<$CE69(jZftLIb{kWDU z>gXm44aJucbEnMnh3t<54P~csf=O-A8?aV+0KC<&6S2;ZNJxNh+NRZ@v_5}$jJ=|h zDpm|csX$Nv_zUe7{JNu+stiHCLz3R zMPB__EtFEKI5eB54|+OIyV@1rbML=8Z@)!&CHlsmP&c9qwS>g=@qHh4Wv2=NiHXgq>(m90yuI=$V4a#c(;w=D#%Tsu? zAwK!A_{T4w^B#g{+oXO2rgrQflZ^dilCghGXVU#+>^W~blg_|my&{2KEI3&xIOq6o zxZWGpKlUi^=x2GYV!=s6!MVmMRISbMH*d#2&ZN8I*=N%K50R>h7xR!2Z2$lO07*qo IM6N<$f`@7;oB#j- literal 0 HcmV?d00001 diff --git a/figs/img27.png b/figs/img27.png new file mode 100644 index 0000000000000000000000000000000000000000..b526e06bd980578992b42d555d98caec918f9b63 GIT binary patch literal 487 zcmV@FgL zLl<`)>H`QqLJ%$JDf9_!9zdbH4smvc|L-h~D1aQ`vU|j~lstFN1g_qKA5@ z_>~A)F9&vjjiOVvOZh2kVlJ^co1(%HI7LhUUi)c}S6}A(9-&RQN5?gWT7%Fyqu13>#f|wP>oJdE&9;{zfqMJBvDRMh|g002ovPDHLkV1kUz+~5EJ literal 0 HcmV?d00001 diff --git a/figs/img28.png b/figs/img28.png new file mode 100644 index 0000000000000000000000000000000000000000..b128d5038a45818c0dbe63e90a72827b9bbdb09a GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^f+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6Fr~ zmyl4~z`0;WqQ&;=@9*{|h<#>aV`DYY{@o-Ta;@#5eapdZy^W2WM-uM*t@{3sori}( Yb-lpG#h08UfVMGsy85}Sb4q9e0LF|_UjP6A literal 0 HcmV?d00001 diff --git a/figs/img29.png b/figs/img29.png new file mode 100644 index 0000000000000000000000000000000000000000..646211cffbf20176281300f41617a97c788abd76 GIT binary patch literal 344 zcmV-e0jK_nP) z-CG%WnDf9cWSRh#;b-7w0@3U+rEH87F3`%M0|PcNfZ}ZTS)`_p5TU~$$qS6i(?lsGY_vJqsk7TL4!%HZQYUo;8q0^HbIs zI%VzOt8j+jz*BrHrF@BpG`4nLy#MK1EAgj`x{dAU6UXgMc}^iGo~wY1-mISEW{2vE# znxp$p6dgBurmq9JF`I4^(d_uc=Ii#&A)VuuoTC;Wm3|R|BC^~-&ZKOyPT~XkX+sC$ z&)fi}=hv!N;Ch`fhr9C79k>-r+eMxd0npu+}Nz%Hypee78gS e>%bXK7e4?CC4CpKM352y0000osEI@o~Oi3y^k8t5Zn4g+$40=x=f9WXJr2Mo`^X_K3A_v_ueAE4X8s=ZwW)m6*_ y3~>oiSHT^E;wltLWB|_+50FJ4ph=DbG5`SoDp8Di90%C|00003_XGwu0Rskx08RyT z_2^&&GdGk07a^ntF95oS8)nJ}B>n-4OeGdD0j*>Ldc2xpA4Gsr08D|M!15oY0?MD# zz`%zhzkz{|1+1TefeXmLpgpl*2w}#BPzEGkx#1D)wH@Mjj+G85 z(i_VafDEPyF#QKnbu%!e!Waw;PAf1CzYb)uJ=Z{T8Po3F2Us64Xz$*`kh4btF3h?c f2p*8()4>V=e;z6LkS-UB00000NkvXXu0mjf24Z#i literal 0 HcmV?d00001 diff --git a/figs/img32.png b/figs/img32.png new file mode 100644 index 0000000000000000000000000000000000000000..7282509bb60f399d410b856079961558c6fcce94 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^f+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6xA)#Y+zi|`1s4dW{1xV YZ2m%)Qeo;gKRZ^71TSE%#x_PSg0U)ihIwToZNeJ$p94+;1HjK zH&TVL#(h)72)!VlQsO;oZ*w2H4Ga{gWR_LGSZg+T3&%bTV!8#Kjn`CHT{fUW#IwG} z3NGD`DBaBT5Z|=iK)SzeoF73>yT>w-xiK`$*eKQ56>%P7bQ-=@s;|{Uz#*0S>4G@w zUFD5Pb+>F?oNW~Ja#M1o7+IZVSPCs&=5O@@Ecg> z*PpoTMXI`0L&eu9O6d6f{W~g|l&WkZznCB*{aj?4$Ed8iXEIymPsV>XK|El~rau^8 z-}0q)I6EiwhjH|LPNlulvLk*V?M1)_R&BQRe6m?wpEeH+Rx~|;CCVf)I;5>@kNueE z4b}^}!Y#FhOl}EiTZ%BVL;@_NRCg4NS~H7OLsJaTfLO7nctv=#6_=dS99CrNKO#ul o66J+i-`YrYH}o?O+DZQg@3?9^>gkk%=>Px#07*qoM6N<$f)HWDfB*mh literal 0 HcmV?d00001 diff --git a/figs/img35.png b/figs/img35.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5b65060160a3b21e5e89fe86191dd4a89ab1aa GIT binary patch literal 879 zcmV-#1CacQP)}(98S6Bz&?QZ4^kA`SBKW1(D)-9++ z)LVWE1iGUC;z+YhZ7>Y!l`*@LIIzM{T0p#?TOpMo;f>d*v-)x`@_Sy4t2?;)CZpc> z4^&t5o*@hw(xz}AQ(=75phhnYqaD;*aqgSvzG(B!Nc>}%vdAVAxwP7zH;1|<40xMS zHnn~wcrG~TP;r9t9&fs|n6{d7j-Ix}4TAj})X}A=^ou{3tg)h+7DCX%4+{yg64v$}7#SgBi;{??EGz(=? zP?ag?UAWDO9f;L>CQaW4;wN;CIpRgN(yS(;Qf`uR#qo$&hejt1`CTT}mL%;nb0-W- zZSCTU5#!p61gF72n9@muoYXQWI1A?tks2xw(MVx@{7i{0tC_qc<1Il|rgSnfJKw!D z=J7=$-kDVKeQQ6T?D-mLmq~c$T}bmRj1RdvJCf8*RVQy@9E}B4nTgec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lh1Vx;TbZ%t=m2c#z!Cz|h7kz_y=(St=nhA;3wTnX!?bhbQNT%7lgv24?vHUhNZ7 z3TgEY4z_9qt1dH4@?n?AY82Vd{G3VQ=(nn0tP>7b^m-U_G8|;)bf^{fIt?_R!PC{x JWt~$(695_KMBD%X literal 0 HcmV?d00001 diff --git a/figs/img38.png b/figs/img38.png new file mode 100644 index 0000000000000000000000000000000000000000..dc88155690e942fcb40fdba02248516bf62ac763 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!py+HIB&`YPawx2z$e7@|Ns9pXU;4yFAoh3 zefRF2v9a-)GiL+^1y`+F)zQ(BmX-!o=;GpX_wHRKC8gcFcgxEvP6Y}vmIV0)GdMiE z0g?~!ba4!+n3J54@E|22p@1QYZ6CYBq=$^m+!N*;U|{TVU}R=v@nA?&uxD8Dt(k$j z*`C>G$6j%tLOlkdoaI;b88m&{A{7?$@@!R@d#UXqFT=cRd>)A+N?t&-89ZJ6T-G@y GGywoaPD4=u literal 0 HcmV?d00001 diff --git a/figs/img39.png b/figs/img39.png new file mode 100644 index 0000000000000000000000000000000000000000..a6177f706e80b8763322469276aff00445324e87 GIT binary patch literal 393 zcmV;40e1e0P)m{h1q54(ft7*(0hkF-3d{)UZ9vS1ES(#>EaktF(*0U0IQjVfx(7V3posnjSV*BrX)N_zrpZCG~xR9UQU-HBf|nl&D=I- z8H-#8#x+c*5B@T1sQjZOe!yftll=sr1hE@u4;+X-e_#Papp3_ynJkRYrP$hb8koIi zn(>iGSVBuu|G>@dvn3?t8m2PHZkyhi%y@{wuAW`Xl9iQ#p}ALR;OXk; Jvd$@?2>{;%UUdKf literal 0 HcmV?d00001 diff --git a/figs/img40.png b/figs/img40.png new file mode 100644 index 0000000000000000000000000000000000000000..2febee93dca0751dee4392e6e6ae138f3a1ae289 GIT binary patch literal 362 zcmV-w0hRuVP)JQ0~buraU^5B#R! z!4knjuvU&P->JBE8~_{i;hco@4^@qdh51wU^zE+6oAYnD0prFgfVhdx^#A|>07*qo IM6N<$f>}tN0RR91 literal 0 HcmV?d00001 diff --git a/figs/img41.png b/figs/img41.png new file mode 100644 index 0000000000000000000000000000000000000000..9b193e63e04a8369b60d0c0d18ed5315384777e7 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz1!py+HxYAnq9FSuW;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Lf>0x;TbZ%t=lF0`^DzJP8X99AH*)obi&8nJb|wsqMbQnX?VN77ZtP<<}e(DKkBh zz$~;gios)p1&a^Etwa1m3F&bRfnR4Wu&iKw&2F)oT~X>}f%L1mK4zY_0QU`b3Axz~ gyVy@=USVc9ygec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0Ld45x;TbZ%t=m2NO-{Zh?ghe0MpW$b}9x6%oCLK7*+Vx8aj4u*u-XFAQG`LF|?V7 zuhEm;U}Xq{l6lRKy9W*|_%QDwL&ss3X)DDJESkz9z@J_y(_kE_{^3x~ox=xo4jjM0 q7brFH;DK!{%R1IJPBdD5k&$6pj$kmKylOGfb_P#ZKbLh*2~7aqM^|P5 literal 0 HcmV?d00001 diff --git a/figs/img43.png b/figs/img43.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7632dade97bfa9b8fedc3eb1df17df3b3ac0ab GIT binary patch literal 336 zcmV-W0k8gvP) i2R(q&eApz15C8yK&oT$^S-C&}0000zkfI*cpFo1#2!GIxUar*&u z^_YMKXfR<_!~&p&1q=)u7&d%hV0ZxGGlKZ+4%D*)H(&zV%J5%+VaW%R3t$080S1um zKsNy$a=-wn0?2Ow3MBvqKS1O`VY*>z00TpU09gNo1px{Nc}GC zxd1|#aUp~bVE6|l-!kMdJY#4A39zg#1WRzNbO6(N44{zW2IAi!t|m^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H;z>k7RCt_YV88+zP`MX?n8$#D1)EYNzyX8|+z`Y_KrImP12HQQ z3jlGz1)$-)%n$g0><=A41K15NFhSLE0^90000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H>`6pHRCt_YU?2=G05Jzc0}Eb7JU}HJ3=9Gc4BSA~jD$^Pg<_x% z22P+J243a|d_XE7j9~!-yTJt}s5(v{Rv^Naga8x7Ct!1aRU%PfSMlw6x_ga zguwyGK49>mU<1Pju)Yr+Yz_eoDq!^t3<&}XNbUieg+Eki33xU^856-Iivom#xSD|p z!ewBF@D^jT=%nE-Q#`|gblyayoc|ENx60tGZA*aras0KVTR-kF*l?EnA( M07*qoM6N<$f~;eGAOHXW literal 0 HcmV?d00001 diff --git a/figs/img47.png b/figs/img47.png new file mode 100644 index 0000000000000000000000000000000000000000..03d4a291d0dcab7f19d80577cf770961ba118373 GIT binary patch literal 493 zcmVdOCbIMnuRi$}UC4IkYxaIMLCml8)A35>>tQVw|xoAX9la-4TY_3px! zsUsXuWv0W)j6Y-1amrhNVw{jLw3o)S4p1FOC{0cSd#7vs20lwLT4b8XrNH1t^0$g8 zR|Xu|9|J$5PS#8n|B9`#^53A{H6%a3lFC@ZSkx(|zTTPIZA~mL`M0nW2^RFF$739G zPDWF7;QSE#*hCRN1TcJv977K!klCh`* z5tR@FL&}C&GBH4h>3U4CCpENfem>m6HCMdQ!QWu2JY@Xr%uvF{bQn6)pz%D zfA8M+&IbCZ1XzYCVgT60oNs0u=)%MHiTvxpYY`d+8=kR)AWUt|T5k~4V6kke_|395 zDI~U0PxN<~O{li0B_AE2zGegi_xT$Mpmf~^^~~*ceq*`oIj=-2?h>}2zJ|necFT$ zZ_UhV(W4T+Qd&TG;Uj6O%e0QDDCLrUAvR{B2l9tx3i(U$Rn?^}&Y$N6LnC?^E zo@dJx3<*jELeK(k$)tm$v1Iu0ET0kW3vz;3RSX>Cow&XG%}K6P5qH969*=<`0Sa>G zy|r#bVV8H#;PrX45iezW*NMu@^K6Z01JsX`p7T4EFXB=`_C9cs>Rj>r@f&EBBDqpS zy()ko?0KJ4S5K<)`jWwycW@l<-<1E4{_N=sXMPBX3FQf<)}vIilk#j0m>Dt!_`Pyq zbYat)7aJ(|y{qLd;?vd9rF>E>qt&a5B|b;6IqWl2)+zMf()ntEzh(v!(f^{>ziNI$ zo`sImDow?W=5V6Sf-n5He6u8p9)wGhFCEkE!!#wx|~(# zOcz#H_m*9hAtrR_+}sLn!O%^=jmS+8-OLnOOiJk!I2%a4R)D0kMVM80ZdSBuRR=D< zOq|6KTyrFY#-jaOW3oRwqTB@1B(00+h_ZK^9Hxf6>0JW8qqx9FG|euQDY_boXxk$zJH4mj_GzECN`C?NgtTkPWHQtM0000< KMNUMnLSTYvez|G@ literal 0 HcmV?d00001 diff --git a/figs/img49.png b/figs/img49.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6aebaacb2f32a96531f26df90be123dcc49d61 GIT binary patch literal 488 zcmVP)#wIKomXg_Oab=O9dnl%mf7_B#S{eNP<|0!1M<| z;nr-hAo>Y>LKOr?(BKILy`pL{h=N6wndy{tmXr{{kZ_X8J-InOy^k3{B19_^n~0z! zeSp;5H2{Z`;-TGT7Jlu{$VtuJBBr%KXU1Q*YeUk<*n^qnfnt`pI&&YhGF;e{4v}u< z30D^|any${)zOj%*?Pea`Gtypj!cfbffRv>XKhfZY2u*kMTm%+E>X=kWPwr`oHHep;Y;>bslYYv|ty~+c$b{Tv1K@<3oMCIO7|A{dFYZ!=$%x0$_XpYGRPtXVVnx zsTkf0un+=k=zJ#bCb(zh9KAE}8!$Ie#XA?l-phzoVq80!Ag>{OddXQ+%=T<`0xOr| z8~K&Z7QD>ZP>4sA@^>Nb$szm$DP9*2cfcuqT4bw^6ld#k6`L@pQe0tDld`?R{GDx7 e!BLX`Xu%t6eNq@&sVp@B0000%9M~XplT-SDnDXbwXPe&NlVy0m zIkaJ>&+bUcMY4+uZ@0@Dh&IpFIV!||Y(@feO9Fc`8{4$cf7lY(-`v|P>N!jLkpbI2 r{)p1UONAp?0+#M%lIW4BIv~N&7@->zyr%Ix(9H~1|~bUkOvA04Tr*0ACxAfcqATR{UIT7a0`Q avNO!f5WD44Qlt!YC4;A{pUXO@geCwi+Fkzu literal 0 HcmV?d00001 diff --git a/figs/img51.png b/figs/img51.png new file mode 100644 index 0000000000000000000000000000000000000000..08f8031fc56803ae308aa3cd83dea0926d4e9d9f GIT binary patch literal 682 zcmV;b0#*HqP)831Pg;=@AqcL-R$Lvw_>4qUy*t5%{TA8 zdGlrh)N#ZDQebO>HQ>fTnE@{W=NHs4*8sed+75$-A?*o*C27=MCwdEpK)whl$ZWup zG~fb0g?Cv98<#0X9gp99q-F)=Wz0)spuSQ64<)uXE=j_~w1pEQ6;fo9WgRO=mo*y3 z%3$47`c2G{`G&+TCAJ6`wBFOJeYz@)JRv#mJZeTP0ehjOc9Zar;&{G_+Ei+)+u8}0 zbWkK0N#O<81gnfL#*pF-ei}+WI7bsbjz8Pjj^$z`!Prn79`I|1&XhXSYYXvV-1zK) z0S~rAL!M{QL_CrEWaNIbp#wbB`u(XIJmyy!IWIbav_Wq*H=NIY_l_$U?c{O=9n!746AkNrE&?~ykM4T)P4ve&QJeMh z=Q8Npx`!F-l}fHB`Qt7_y%pgQ)Nh96`l6WrZL6qx*+|^_1M>mFoWlsc75f8R1-@dF zrjP0$=FM9Qglm0uI;ZxU8;C0ne==(G61`D7@vG+471aX!!?XPo5AZ+W2U2%-EkY#H Q;{X5v07*qoM6N<$f(dvx?f?J) literal 0 HcmV?d00001 diff --git a/figs/img52.png b/figs/img52.png new file mode 100644 index 0000000000000000000000000000000000000000..0faf8c97502883b44515d8185adfc6a623a9672e GIT binary patch literal 345 zcmV-f0jB1%kJF)3<3!td7%175c%B)9z;9r!RH06K%YMlNJ_E9 zGYGrHVoDb6%*QUK*L8K#&fDkTSCmGcet@zoZWlLt#keG-+E@kI06fsx>(Li9{na zu<6qAS)lZx<)vk*@vaTGqC#0@{HgVq3YE73rNL1`oMnTMH z3WzCRbVx>3uWWv(g%~4(tf{$me)~#k@~{ikpKpn?99Mh|daUsWI0oO|?fDGfnwKP0 zthqred|LK`upD8>&MmNmoV^Zt9G8wTG;;E&PMe6>E&9%tY`oS}`A>WRhwnw(JVG^B P00000NkvXXu0mjfG6J?* literal 0 HcmV?d00001 diff --git a/figs/img54.png b/figs/img54.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9e627558c295b24758057b1d37a999648e8812 GIT binary patch literal 445 zcmV;u0Yd(XP)b40zGi@o~8w! z_HF(F5o8Gr;+lBCS2&=9U7#H#d4+vO#o*nAoSgtZh7lD73wOpFgf3o!Q1c=v*D=Rx zD3*l@Fl{K~*y2>^(c-pEk(3LSO9b0z3w&@o;Se&VqJ6pfK@0FQOZ%qaQfneBaw#%% z?NfIaZ!LNJNxZ3Yx+FUD8@23TwoJVix|z60YG70N%&^862psR+3SfM{2WWj*t5#AP z*7(km*r`JrM?AmM@{B&ecrFcVd=%gXHrTg|M-Xc9S<4Qp2ZR}LbggWYia^79RVCee nP(5naZr=VHq95#6$3Md-PkceoSB$Bm00000NkvXXu0mjf*Oahm8(-L=n>e!w00#)g1s6B~w(!I61_qEH z6rhqDE`S&tn84iqFtrL)aRNyI8Wh$6n;{JD4c-^vqC7Acf!)cl8Wd3h4EGr(fOrZF z9H5wEaR>+naTh>T`Z6&51Zm)BU;`V^0T#Ug@f$nyf&>PJ2Mpc;FzX?@Sawt0UxOO3 zen8<$GcYisitrp@U}yxhdQf#fg2e?KFl}JqbO5s=8E(VO2VzEG9JV1;ft2v?hsGzz z0R}^c2OI@ZNj?Q=(yQJL0u>vK-kR*CXXY#Jp)^A9tGqB Y0GUrW%dj})+W-In07*qoM6N<$g10r7%>V!Z literal 0 HcmV?d00001 diff --git a/figs/img56.png b/figs/img56.png new file mode 100644 index 0000000000000000000000000000000000000000..23a0358cda345a93eab3afd84b5a1216b2160011 GIT binary patch literal 416 zcmV;R0bl-!P)hU;_g;gi?T*0^uy+ z-hf*RnSh6(0m5Kpg$XekfbC=g;@!I;ma`-4_yA=vb8rf<2w*jpjq2{C7;qzVP6P1) z28i3ax%^=sWZwW%rN9Z(0Tg9|u)z}lfw+42R-gos$BQJvGy$dq$eX~x3JSIj$l=D# z#KX?81xW{1SD{HTVOKTM05C9FcArHO;AUW|Yrs_Z6&6lR2N(0vM^Kw z#|DOr45%{D45+<(8#WCL`#CRQ*TD7ws|^f?AP!>R4Fp@kG7lKMK_Wa230O5~q4|!R zA$9i>2K534=FJWWQSIG(a3v0iFrxx48BAeZg$vJa91^1d4FCXCQ!|<3#h$MK0000< KMNUMnLSTaTgP%(P literal 0 HcmV?d00001 diff --git a/figs/img57.png b/figs/img57.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3d10c4acfeaf1bab0e341f6673cca0cc40bc80 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^`XDw7GXn$To-8R7AjcrUC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zlAq$~;uumfCpp1^iC;oU;)kM7o`PON@&N{)Gn_m+JUltQj2Vx1D}E^|%T>5}?7-e? z^9ww7`?zPgDKKo3ymR}2$mwH0loosxF!W<{vtwhEV{3bLH@fi-%L0SVj1g`A2OIe3 zpX7P7LuE>V=ar_Cw`@!kLha=3w!h@8XqMf`5P7wFgVzSdJ9zopr0AdDYn*aa+ literal 0 HcmV?d00001 diff --git a/figs/img58.png b/figs/img58.png new file mode 100644 index 0000000000000000000000000000000000000000..09cf9a357a3bc3fee64516f50754b77caf64d771 GIT binary patch literal 330 zcmV-Q0k!^#P)@}j8AzYpd3(x`(KXIYP>uXbo%si&S4pD_6B>f44 z;ASQfh)rV_e!)Vv5LQ7GBxVYQm_vXlVu}Q~?}M%TOdwN)lkDC5&b#;B`_6kEkVZ{f z9aA_Rt-8oeuS*z!W3b5k=eaR+QB3(c1+i!;sq=k#&DJQO^7H-YLF@H}b8I8fxaWYK zQ=GXPb&zMIVX`sk0XEq)OLpp0qroB2Kyt48%EacZdxYHeme=w!;SD{54R4tepE&Mn zk?TOGqhCVz6Uu`;Lbv5}h{Xn6nJ8+p8!|~Em8Ny_eKs|H9@;|NL|mfKJX|hl#yt>) zSJYS|^-NSWEiABFX)sB70jlYZFNsi2s=qq?AIAPs_h|;vfOS3M9z1STVb*+LJDnm3 z#ep%`;xz1$%qHLFH0J{P1=JG~jCu`uNyi|_@Y3tMwBi-yPm0000RCt_YV1R%Pst{U%fdj&L#@Efjz}CRPkQJ1+fB_F+2kGYK zMiOXXU>ERKU|`@XfEW!#9~d5h8M}9HV0hrbz|imjw}E;L4C)Na9pL;62N)6*K$^V; z7~lr7B``2dfVrJv?FL@39Q*Fw0bqHs`bQAyXom-TfCN52U;|Pt@jz18C6>XSWfi9M z28hQQ{xBQ?Vj%GO@EPoY-MhDfB|sr^j6s@#F}wjJ{T@v>NSd?M6-eF#2|QzPM3OdQ l=wVpOP{4bHA%Ni*0|2pqHec9#t*-z8002ovPDHLkV1oV}hX()v literal 0 HcmV?d00001 diff --git a/figs/img60.png b/figs/img60.png new file mode 100644 index 0000000000000000000000000000000000000000..6d439e078873aeb4cb53f24a8a26d48dc640e65a GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^f+|NogYXO@?jzkByi zP*8Bys#P5w9cgK4KzSDzm%DfG?%ut7U;K-0Kt5whkY6x^!?PP8$skV`$B>FS$q5b& zVG8#c(h7|X3N#u#G#(@vFid3Q(MVuwW?*h+lAf?t`ber5gOJV&F9|Cvi5b>ujZ4)T tM4jJcCPZ*deU}!^km?)MkQvB6nZarcXWUVKRyLsN44$rjF6*2UngF%pKcxTw literal 0 HcmV?d00001 diff --git a/figs/img61.png b/figs/img61.png new file mode 100644 index 0000000000000000000000000000000000000000..36839ebc7382285520565ab4eb811a752c729ee6 GIT binary patch literal 820 zcmV-41Izr0P)}4lrpIqHu-oXsI+uPu;-lp%0Z2sP&9#U7C8?7kNu$Wgvti zw|VE51TB86QkaF5fH%%%iXsI~M@pl(q{A}0BrMXiK~F3kQ)Oyf?K955BMPt|X#!Qr zq`)30wlc3ZIqsB^JId?xPGTThVH-8G+eShr@YQ@1L-lfTmWGI!C0LXMG^8#B@}j1Z zS<6Hzdrc&NT?`qn>33Avquy1g&bj6qXq$Gad}Cg<*|+rwP01Z&V19PX&!-45Q!c** ze7verWf___8B@s#kRlLhv7-89=n@C65*9EF+%?8TD{-S_ zZWNKA#|9Ua*Ypok^7cT@wKEIu(W9PLXFFzE_IBy#q;crxc}G?o-m)uqVOXd8U>$ul zi)UCTt=Ox3ctz`ZXVi(=w%DcTk>x+z^_aY!H1684yNhFWY2V4|$LRSVf ycAp4T8g3%~ik#h@>PodgCI94snp@NVKtBPtL4zCFc;BV~0000 literal 0 HcmV?d00001 diff --git a/figs/img62.png b/figs/img62.png new file mode 100644 index 0000000000000000000000000000000000000000..8c02086ea677350be962f203800473960707ea9b GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#p#JPl)UP|Nm#soLOF89vT|@ z?%g|MW8*Vt&Ik$$u3ELKqoX4&Ee)v9#l=NQNon`)-F`F6s(^gPk|4ie28U-iK$6a$ zE{-7;bCMGh5>gl#ud(yIk(PMSAlbP0l+XkKwXZ(g literal 0 HcmV?d00001 diff --git a/figs/img63.png b/figs/img63.png new file mode 100644 index 0000000000000000000000000000000000000000..86975a2fdfd289d1d14a458b58a493a558a448f5 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^sz5Bq!py+HsK@o|1dwA8;1lBd|NsA)GiR2UmxqRi zzI*r1*x2~YnKOcdf~!`o>gec5OG^VPba8RHd-txAlG5(oyX9pSrvil-OM?7@862M7 z0LicLba4!+n3J5)(AdIU@GMHeknvO}tKc7=o$LaiI1X%L>{QQ@Zg!+5=r%hTdc*23}-&Z6nN&fU3V}vQ|OjGQTN&Ep~-~G zUo6bbcbNOXomak}C&XC)fc4n%6;69n9h`VWdv-Ghzs^^fXUlr5nn6vHTQ=gHfx({i tr+FSX4m8N9^5|FOH~-ne>RRxCks)!iT5E54pa#&*44$rjF6*2UngFgOZu@eM*si-07*qoM6N<$f+&ysQUCw| literal 0 HcmV?d00001 diff --git a/figs/img65.png b/figs/img65.png new file mode 100644 index 0000000000000000000000000000000000000000..b91c16d0b4450a6702e811e3c7b5ad311a6f0d3e GIT binary patch literal 578 zcmV-I0=@l-P)I0R>>>zVikpbwEDpul!O6v?dqFz5 z3jP5Kom^b}6GG8~URyi42%24y>~*M!lY`#9yrj{_U#OcOy_fgice!_W?`wc@?6A2` z3c)b)6+J7au)^7FQ_+T<9_5?J?}X1y88UIy?dxF^uA2HsngV5h<;Wy#_=#1+EW-2y zHJ3V_mL`Zi*aQbUTV&aqxzeLmkLtjpiLC+xtL}_?l*BNaRDUo1zech-T;kej!HqL< zZ!D@siOoPQ;cCGu*7T0WcHn7(Xic>>)}UN+!Yj>)|hbNK?mTb!ziud zQP!az+@c4Hk2Yl3^VAKEVEeZo7@>8ixX1cIh1S=b-Hwj`zKbNAL8pFh) zT*NFeT?OWnOem~eH(Plpp}H^O+nD4KuXXwmhVD;A|G4!xr!V7~M-NX`xOAd@lpsP? z)@z(qZqUCip9dEmDAf`jOFnH?iibSMF7sEbBR&P{1E#!L?h*AQ3je%UpIL*rfdOy@ z?9$zg#1J1P>-~{iZcsTmvwN9NO2u(&H(TO^`99(jKf}V<{907*qoM6N<$f|vLU6#xJL literal 0 HcmV?d00001 diff --git a/figs/img66.png b/figs/img66.png new file mode 100644 index 0000000000000000000000000000000000000000..a40e4a4a7806e74e20dc96556573ab4d930cea9d GIT binary patch literal 495 zcmV`0V#5F2OYBY+aM|9+pAZYCsw%RR|Yp>Y(Z48KAzOo7qW%}8IocA;Ff z7W}JhCVZ%fm2*npX;d;|*P5SJatP$z2`1Q

3s3>U?vJVEHO);nGOrdN}c@7~6Gg z+9x!ZqH)_T`KndxskHPvpNN}2ddg&aRd0_Ecffwoh40EKk4FuCmsK$Tv~pUvO)}qX z)E++{)3088+&fuMIv4mWeEI(m(}J=I3e}n99HY3IcDx20%_diRiTM+(1cI(8U*lXB z`E)C44Pr4`YZ8|5sw=i$Vphg`Zd7OJ>r_I4XNYoN?dAv={21jO5FNR?$WDy-k l2FlGR(#xctMO4 literal 0 HcmV?d00001 diff --git a/figs/img67.png b/figs/img67.png new file mode 100644 index 0000000000000000000000000000000000000000..2b207a610684c0a61bd24fc6163a9ece101d6c93 GIT binary patch literal 432 zcmV;h0Z;ykP)=<^AQTgK?tud!>e&XMY$n5j*&7(RcPbETEOvm=a z&%jXVHsL)hcSFJksIf9ocZ1~Kvoh>p<3`xWz;KMM;05n(kQ25bi9)~&-V4C^$09Kb aNCyCCFjGzZ7H1~_00006I231x?p-1{2!e>X ziO|W(q0TP;35TGluNHSv@&_oyxq@+U64ZCe?P#6&xL4HaSY`Dugkq0VsV2->} zch#CHO}iS6RbUA|5>j&143*0Ktp!!Q07zGI;kxFJnQ3PfuKB!cYs1^e{wCb?A!tU# z(?}KGbh4|{LOUI|L#L270|n_QJ$j_*Vor7}wLMZRN9#sk*w(`r|%)smrAJdAJIboh@X2~-1&PcHyNM|Ne-E3${jmw4cO zc?Hp13opTD%T;5{(Jn^js1Q)agYiV&_?EZhgx8j_j)!fP1opJGV7*=TB~v!djMw4i zMQY|DyhKfi<<3mP+>Xj__8&j}g8;j0gcYjxyvw5VF#u?|G* zfz+W5FksgYR$7!Vt53apv*eOg0D`7jT}N6ZEzYp%EvbtJBNkvQ*5r|BkW|pjhJ|pB zu4JrLb0-TzK@0NQ_wpi0$RY2li==W;fp=puRezHzvfT<1mtz~rS;(OzpGfjC7NTys z5VouA`X;5Yl3I4pBKwtU#NEHp9crJq1)(L&Zs!9 zaRBfk9k7c9#@fZOqPmn!>FSB2ioCwo*OVb5_7nx`(hkLZS4!qI_BB1LJsHy^IX2G$ zCmBhSNi1+`q4J5Er~m)}07*qoM6N<$g8$QufdBvi literal 0 HcmV?d00001 diff --git a/figs/img7.png b/figs/img7.png new file mode 100644 index 0000000000000000000000000000000000000000..3313a941f7c283f589623494808754280e915ca0 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp@K+MO&%)r1{7`D3{$T0};332`Z|NqRHGt0}%LqkK~ zy?bYDY<%X-89_n8RjXEYbabSpr2!SXxVYTCdsj(GY4`5k^0JCkfkKQWL4Lsu4$p3Y zZlZhQKIKY4%>_O!g9DEI; zK4@>kp&kXWGH}A#8~DJsvN8b)o;?j4HZU-7a}#3-9>5ZP0nQd-P=K=+Fu=w69k@4u zXf_b>fsyw&+lJQ(r-AJ5hd>7~Y=A1`e5bZy|2#_FLkajQ%OGcfA$mQ5fq^LjLwE;P zBlv;7;oRwfB=P`EiiU0Xs5oj?WOsIw{=Kt4fm=j=Z5Cjxj zXt`}0jI>ZRhuY;z+(Xy(m54HWKJy~!3Q;tE3|9RkmQv}p)}eIm_uW`v7VKuEJWdsi zWMm2)<}OaPX##)4B(ET ziH~310IfMHvj0fwV{Iz z8^F4l8W*R|B0LiqmWZIK(q>?of-1tx-~%SwVBSN9JeUNx3Ph-SHwaXKm{aC5FoNiKmWK>bvv}%}EaLC)Ao19+szCx5fcOIt z2RzuoU%=o1WPK3`VDJKoF>PYtXJB9I;BQ{0tIc zI>1m1bTU7a0?>clAQ5f{&ILdbAngzI4@iXV_4Er2=YeYXB``2d1BtNk8Zj{3ff&sH i0b!Xgm_&{)dH?_mtsr~S%P4sO0000KoEW2I3&h#YzibK8g~e)6dYhhjYN7H9|0i_ zkONSJ8~6w=XkZ0cR5VDYr^o>)j3`p12ygsBBvFtos=Q)mJTp67Svm6uE|7GA5xOuenvbRM46vHiSV0e?Hrm-Fpgjc!RIY;j27M|!MlM+* zu6j@lXN&H`fBn7@6c#3yBFOM*4f5h^M|yEE@ghVa{49iAY0mk(kX2xq!59`9i^rt{ z4;nF5hcPQSMOmk13Kjl{8a}E;Z$3B&+q~k2=E?c}yB+=xei;){sZ{Q-7~0jqAzDT7 zAQo0kb(z{t@J7Bw*p4B*_Juya3O%aZy55sR!gB{RjlQ|7-h->pD39x$XX$`B9qwSC z=1`pKQTni6s+=PcLd0wHu}30A>u%?zwKZQq0#&}kW-oBV@C`dgL^h)EX7~UA002ov JPDHLkV1gvUz*7JK literal 0 HcmV?d00001 diff --git a/figs/img75.png b/figs/img75.png new file mode 100644 index 0000000000000000000000000000000000000000..93cb705a5de0bf26fa069d9dee8b27eecdb34141 GIT binary patch literal 822 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 literal 0 HcmV?d00001 diff --git a/figs/img81.png b/figs/img81.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0eef17ec5ca5bb9318bd0281dd57ee74d83390 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^nm{be!py+HxM@+w3m`{5z$e7@|NsBx<>jHFq3_SitaDhvAbX2O}$6*apQp32{u0Uo#q5JI^|=N?X&w>6EJAV$pD8 zR^!^mhZ)a2aqJLNn8C;KlzYV^zDWlJ*DR6|&{`tct#O^nF(+%LbOXzU)v~g>9*cT3 jK5AUN*m?XCBRj*3dOlsJq{8b!>lr*<{an^LB{Ts5%db?C literal 0 HcmV?d00001 diff --git a/figs/img82.png b/figs/img82.png new file mode 100644 index 0000000000000000000000000000000000000000..121fef45aa7cf58847a86692bf11663418362312 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^20$#w!py+H_`Y{T3P>QpC&cyt|Nk>*&MYr44-E}{ z_wJpsvGJKRX9NWWSFKvr(b18XmIhSl;^K1m?p-A%rQN%C%gZWG1qv~i1o;IsI6S)n zl0WI`;uumfCpm$E$&AgUfT445V`F2nIWx2HX-2=el2U;KtRaW?GNyPj@lR;YlwnL@ zSop(%#aQ68ih)5vgT?PM>xQ0`yL)H52ybM%mMc*8{T;JFwL=19Gt-HaJUX0Q9(o^` zlH3H;c{}yJcCl?`qi0(E3{MzyTxnGfDFqlpGy*F&uet zm*cDC;gSxo`7EX!kH537xaY;j7O8NwNR9DKDoYS=fOZv2!=vL3RShw9>}=CcntV9P bz{qffUqS!>$y7_Arx-k4{an^LB{Ts5`Js92 literal 0 HcmV?d00001 diff --git a/figs/img83.png b/figs/img83.png new file mode 100644 index 0000000000000000000000000000000000000000..131b9ca80bbf09aef3bbb3822bb9e9f1f7fc9a1f GIT binary patch literal 343 zcmV-d0jU0oP)9xI0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H)k#D_RCt_YU;u*!K+Mbl1N#ab7!W`KL~w(M4GcKI29S*Pf=vts zK>EWG1{Pcju>l3B=?qXScvxUo>9Mb74B{(Lbud6u&doqB*ubETVGj46-vXQk+$_6b zO8B^Wc)?D3uph|gW8eX@w`ohU9?)heVn{$}XG1dT5!p^66EuKH7EmC0BMI{tKxmLS zN-%9;U}xxNV0gly2^8l_xViu?&a3#Hf#Cp96bN_k4uFbp@#DUb?adItAOsX=`oMCa pWfqG4DR9;U><;9dK!&eq3;--KDXT}k`@H}F002ovPDHLkV1nD{g*X5J literal 0 HcmV?d00001 diff --git a/figs/img84.png b/figs/img84.png new file mode 100644 index 0000000000000000000000000000000000000000..5798151a2bfc5c5d78a44850230268ac9024f961 GIT binary patch literal 330 zcmV-Q0k!^#P)W52EXF#~07@&^a;N!r+zz1SY z0CT}^N&?~nMi7_D0jjs4kpUw(NDdvk184}NIFu`TcLIhS?W=>*Mn|mb^<8QL2_|@n^4{Id*ANeC1`Gm-o1PGK4kauL8u4B c`gza+0PlP)0=r=NaR2}S07*qoM6N<$f}pmCT>t<8 literal 0 HcmV?d00001 diff --git a/figs/img85.png b/figs/img85.png new file mode 100644 index 0000000000000000000000000000000000000000..3479e31816ecf0116a41011b622833ec31c16c49 GIT binary patch literal 441 zcmV;q0Y?6bP)KolH1PK>c(lb*s*KqMOXX?y~dn#v8mi!^jO z0^9&<8jAu6El4?nkB}=+q@v+{)`=|{2}MFkjAXyJv-3Q=Z`XigTuG=(^r7kwa~CaA zs(k1z>4G%A*to9^VMm;D z-+UiDYMAhApm`qB%F=o46bpG1RYIt%M#pE6NfQlX`_42`9s-_N5((}{6{5(ckXrEh zvNdKZ)^;_Ak^II6{|wjkY$OYwZs~&6tvNHZ(h2UA_IU`ib}4S2S+a22orW&Q8po0x z)n`oSN=Io+b5Dk+h4^ymz-fZloo0dp$(^J=m*Ql(^}4igxF``?yK3Z{&c58Q=cO8B j^uV9CN8Yqg^H1;v>L@cwTNFm$00000NkvXXu0mjfh8@6C literal 0 HcmV?d00001 diff --git a/figs/img86.png b/figs/img86.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5af38ad12df3303b648e8c266f86144f6d09d7 GIT binary patch literal 1298 zcmV+t1?~EYP)LG` z!n#s}4-pqaC}EeOF9T>Gxwf*W&oBDD^VU$r7vVKrCMX3UWr_WB}1lBm(65r zxS#Yc%haUw)79Ccz6vl02vTkC?V>O;_l#PAi$RcMQABc{U5>i4JaHTS<;65InCape z2KWOzc5iJNS+Q}VtE#qX$X>gt9*DBB2 zPz}SbYLXm3YTyk6ADf&$8Ne;}#M7@eg(F%(i>`aZ@}b(9>gC!ShOl&prbu!ZHp(TW-=t!+1+h2y1$HjI@rFYcgii1KNM);EJ$yj+V6c>)&W<)Ij5 zE&Gwdtw#%hE8i6WFAptrG>uKlni*?W+n!O~P*JFswK4vqUBqV{WiTfJ7LHAg3np}? zCdFYybgueQ2pbT}Vz7b)H7rFO)MH;6sU*ndMl80}*!nSL%$&^Rq(XF&C$O$z?2uu| zlln;6R%IIp|GE$IFARs*;Oi+O5EEP;T6H>*5IF9r=_EZOJu0;BCmM{#vdS~=Yp@yu z&tU$}8R){1XwEc)qg1#og4e#iJeksoXcn#O12F0SH0kof0&_mbHEJ>`dKT?GgEhR#&xes=8n1} z8HA&|HIPGDv2g4eub!B9@fuPbj6H9CydGi-YHJ~`Ucb7g8N;e)Y#C#)NlF`qh(B2# z+UynJZR24n!$=M|hjRspPtaw;uXoUT>0scpYfv^X>B9T!YNc&UK3!|!fUEJ>2Z6~F zY{siCl_sc4pl)w2ve{u=v@}|1#`Jq_lk=j=mAFNude0$#Xpxwef2fYm?W!jyd(imu z)ebnFeRe1hT-Akg7>=EbzkvMUB=vr5_dJ_D?9*NKpejuKBmV2*txKaV`Qm%H(CQI`68(&!5q}XAqn_A4`$g%wZ{U$#5N{kIu!M;(P678o6;1p* z0ruYB{`JOh=w@{FXcG;}pLvxT_qK&wWz5BYlDtrI`PPMO+0u@=FZnQ-_`Cr|vPazu z^#)U4P`yAG`=+kFoB@`}g+Y}`(8P^n7YLe9;@^5!6`j+2=d0 z-PI#wDf60sY~`82b^4GtT0`!$rSB^zetw{CH^RBu?odqfFM-zz<#dc&mH+?%07*qo IM6N<$f_cwx1ONa4 literal 0 HcmV?d00001 diff --git a/figs/img87.png b/figs/img87.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd1fe1f5a8261c912471ca6ed460efa6b893642 GIT binary patch literal 561 zcmV-10?z%3P)0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*IuSrBfRCt{2RJ}{XKotKqA0}zi#y=s5lOkjlL5hn*myCj-MFbZI zrK3wn2a&osi>pf%QScl(h>M{40~|66E&*{>@7`V7w9*Rd*k5w@-o1D4?tR=HP(UXQ zh}uDbLA1U}x=4Dg7s3#NPVFVddCisNM zQ_<5ZEXE?Vc~r4+hni6DbFZv0(a6X&8)a@eO;!RTj-YQ3Ekzy^m8T_JFDWi#FlnV^kx#ZoMq}hB!PBc2Wg!;XLLpne-P#12l{{eqdbyh@ z<#nN%{b_7d9AgMP1d2JL-Uy0H??N$-Oy-gt)s<9Jll7vFkr!@C(UAI?*)KZ@T0Iz3)vmW`wI*D4T-!AYll2!r%~8v2MZ_I;LH=umscL~aaZ-oGE_Q} z|HJ^6**Wkmc|YsdY4rFxgC+`d)VGId$M_jv#41;g*b;xf00000NkvXXu0mjfwcGcP literal 0 HcmV?d00001 diff --git a/figs/img88.png b/figs/img88.png new file mode 100644 index 0000000000000000000000000000000000000000..a45e3b578f5967764414d6afcf2b3ac1ef20c48b GIT binary patch literal 830 zcmV-E1Ht@>P)q-SZpOi zKo1)cL{2P%q`A^U#56W(f^C{rf+xNZuMiOgbAN!vmVziJB6jM```FvPB#i_Nk~wzY z%)H;u%$qlJ?*Y3g1NsP^6bAg-jrvO(<#tQz2KpY4X&WiMRokfj1M^#^+_`hmqzD?! zyu@4qCjg2h(1<7qP*=pMKr0$E1=OLTs(ow%NAerSK#N!tu83H6RHw)1)wC+v9IZ|z zl>SDwg*d?Fm@7e3j38JLQnZYv@Z=ZPKD7Z5e!#n`kePPLtu zIV#VccQDKUPe@EEvt>tWoX7j1rI~gcn}mt00-CANE~j~^24?6(x4GMoevcXex&eg2 zq#9zsU{pd5Qtu6yg5oAXEa1%qjalXbM6r+gg~s+IEP%FU+Kw{Zc7tDBGL zA5inTWmfgu3rn+p+uOJgybqnY2j~ZIaoTE4O?c0Cg|J^$O335Xx-!FJE*3$ysCkH{ zUFbQPXvNUbJvL*Z|}i^3Ld`Gv-W!BO3^bdfj<=r~eLmm|w>Y+VL^2J)&LryTvu^ z@PRn2qw-3d-$C`$=g@(ShmP6;o)B|(@N@h0*P&RZENyqVfacFRJD1cmw1$TNUD~jZ z6ZV4|=b`~M^Ep{KvG*sTuU6AHrZanqyRKFHoh(OmL(&Nn=xktMQs95^0h;0FYi|-o>Bk+002ovPDHLkV1j9GjvN30 literal 0 HcmV?d00001 diff --git a/figs/img9.png b/figs/img9.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecf93a492a1dcb87c2eef9e1b04b168ebb37b20 GIT binary patch literal 362 zcmV-w0hRuVP)N4t~G{r8^iME`XiIzyF1l|J>n*RfmAOq6{Fg1Z%9wi$906u^wWJuN#_5c6?07*qo IM6N<$f-u*E8~^|S literal 0 HcmV?d00001 diff --git a/figs/img90.png b/figs/img90.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce3cc347b60eb366f45e4553da357bd8407c012 GIT binary patch literal 327 zcmV-N0l5B&P)d0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*H#Ysd#RCt_YU;qOL1_cHp0Sky&fJXrzgxbK3N;7a{RgDwyFf<_R z;AR3Ez`lET07C&-_5;j3NAip(3OqpJZ8*Rn0A&K*ut9+nCZPc2{Rg{Y_ihG;3qT&z z1gI29%?5UuLT(2j57kU+JDGZbn*rz>mfdHuxsjWJ=>Wvv$f94NavU2NE;69XY46?! zkz?4;c>zt1?EzFD!yyF*s9g2#-JrN;;Au#J%4sn$py^}Y>;RQxz>tFiJ{aQxc0Ue! Z007On>bFg_^03i?ouHIi7rjx1SzSIPY_wO z6tOsgX{b2@is;f%QlS+maFvF}5*-z9*HPF|Sb_pZ^6b3XdCzMvSd{X3DGoAxve0)e z26{**G*q&*T{7;fJN^xWn0aVbV@rtO=7^aTFEZ_Mn2uD{wBd@raPLPi=tj0v=`3o6 z2MJ}o-71OEiUJmjnvgMYm;bjHWa8)RYWwU+#S3J!&xsggV(z%ccHEqNu2o)+WUS50uLQdJ@{;2*lj;Bdr z^*cKw`6{JQGv>YedSi^*;D()6I`T^jXKWpu^aQsoaTgE^lfRU3WLh+(oINO#oVaqu zFm(#&m3j4$>b;Sy)Ok?6?Z=|y#Nwz>9&aVo#MZmH9DYP+C~3%QO-aLeX0cuKL68`$ z{XDQ;O z6cPLj;_B4hMJi6WI6B_soXOq)z`IMNtuz%Ep%3!%?t72-y5&B*gSjz5?wG<3qC_t00000NkvXXu0mjf D@m+oZ8s9yWwD?bgZOEgXrg&0){}&GZrF=OnPjr zGxAzF6}%O59&)hhD;(Y1p3%IaX>Yr^b#J3G#IEetWBQ7kjT7OgCj9l zCt(KTk}VVe*b6kgWo$Yd!c)v+eBq_vH-o~C6{`>17@VyTi2P#Ptk`lozeVL&%m0Hc lDoc4z%)7FD+T~1chD%#yAIaPsg-ADA_r zp|ZyykyWVY0OO2^g+1OpZyY8)wP!x8&bC4Qr-X!sgBS>FVdQ&MBb@00BQ`P5=M^ literal 0 HcmV?d00001 diff --git a/figs/img96.png b/figs/img96.png new file mode 100644 index 0000000000000000000000000000000000000000..e0ad667420b500deb016aebf505229bc27eb326d GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj;GXn#o1jC}|K#oL!Pl)UP|NqO&%R@s$jg5^3 z1qFe^E-o&+ckgye)X4;L7)yfuf*Bm1-ADs+ls#P>Ln`JZCpa)1V_=yr+Hq4dfYCTa kMzUQ^;fZUAVAaMz20vcLaw&$Y2B2~VPgg&ebxsLQ04iQ2C;$Ke literal 0 HcmV?d00001 diff --git a/figs/img97.png b/figs/img97.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b89ba872e357c31c241adbceecae3ed3264816 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^Mj$o|GXn!-o|QljkYf+|NogYXO@?jhlYl} zd-u-R*!awuGlGJGt5&V*=;%mGO9Lu&adEkO_pXwX((c{6^DWqS-O4^K|QHzu~YXUq=fPIDd~IB+P4;fbNNL+CUE z?FZW%WS92{`OS>7@Mc|9Q2EZe&DBBdIn#vB-Hr*>%oBDtHa;~p*%8B%P^H%Jbwh_$ d9?L5hhMwzEN8|2&&;UA;!PC{xWt~$(695Q9Wi$W) literal 0 HcmV?d00001 diff --git a/figs/img98.png b/figs/img98.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0b70846d81f53df5421b550a04e8d24bf9cb92 GIT binary patch literal 491 zcmVQUbRGr3AO2ocE*_=n|w7TvOz>FL zFITl!Csxl$MuVId)u=uMb*pD3t5ySHtwaSb-eRiE&SQN(_3H#2YYS(938oy97OCaB zR-J5rDVdXoSag${KjTG3U5S<}YFK=pOF`<@wHs;+FiS>W*D!;G(sie>`to|66b6NP zm2r!?)T(%_wKKLD3#lu*)a}SBbitc#^rNImnuiLp zOV&ui%!e2GxO#AsEWn|f)EoMxLL7avGsa3ieTZK!MXrQeY)f=5+u9lJa=r2n3gTGU h4Sw8<`k(X@@dix<&=dRUTtxr?002ovPDHLkV1lMD;t~J= literal 0 HcmV?d00001 diff --git a/figs/img99.png b/figs/img99.png new file mode 100644 index 0000000000000000000000000000000000000000..211c1df31c63eb655b746322d2aae92e1762fcfe GIT binary patch literal 437 zcmV;m0ZRUfP)O9a0000mP)t-s|NsA) znVENYcU4tY?(Xh0Gc(N0%n=b0s;a7ph=^upW&i*HL_|d0-Q6N0BD=f09~~i;00001 zbW%=J06^y0W&i*IGf6~2RCt_YU_gKm4A{X2AZ`%AAqfT#fS7w91A_uSMYsXbf)<7a zP&W4lZU#OBxEu?4M#2Hq*lGxM;eY`n*trG)47+!4VBm%bbAc@K1QK2lK2(^8fkA+e zZvv*FTogKriU8sih#Q$8!N$zQ!ob16#=yXfsubv}3k=LaE&L4ZyLSh`gn_;^VC4f! zbHYSeckgCkxDQm#4-71JRL?E|8qI<&r3|7l86d#98HLLqfW%?iy?fv8ZIA?ZdoM`j zJ*wsnNbGzDRs{wDNZRED5sWcg6L2YJVCV*0p1{C%TKxi$#rJ`C18&8SKtvJ)gC@f) z5Q~q&4`>lEIqcrO6+)f Fy(2)59 b(the)f(probabilit) +-5 b(y)60 b(that)-161 4605 y Ft(G)55 b Fy(is)h(acyclic)f(is)1036 +5049 y Ft(p)45 b Fy(=)i Ft(e)1418 4981 y Fn(1)p Fr(=c)1620 +4789 y Fp(r)p 1786 4789 398 7 v 1806 4937 a Ft(c)37 b +Fx(\000)g Fy(2)p 1806 5011 358 7 v 1949 5163 a Ft(c)2184 +5049 y Fx(\001)1316 b Fy(\(2\))-161 5434 y(F)-14 b(or)60 +b Ft(c)52 b Fy(=)h(2)p Ft(:)p Fy(09)59 b(the)g(probabilit)-5 +b(y)60 b(of)e(a)i(random)g(graph)f(b)5 b(eing)-161 5633 +y(acyclic)40 b(is)h Ft(p)k(>)841 5568 y Fn(1)p 841 5595 +67 7 v 841 5690 a(3)927 5633 y Fy(.)69 b(Consequen)-5 +b(tly)-14 b(,)43 b(for)d(suc)-5 b(h)42 b Ft(c)p Fy(,)h(the)d(exp)5 +b(ected)-161 5832 y(n)-5 b(um)g(b)5 b(er)44 b(of)d(iterations)h(to)g +(obtain)g(an)g(acyclic)g(graph)g(is)h(lo)-5 b(w)g(er)-161 +6032 y(than)48 b(3)f(and)g(the)g Ft(g)53 b Fy(function)48 +b(needs)f(2)p Ft(:)p Fy(09)p Ft(n)g Fy(in)-5 b(teger)47 +b(n)-5 b(um)g(b)5 b(ers)-161 6231 y(to)76 b(b)5 b(e)76 +b(stored,)81 b(since)c(its)f(domain)h(is)f(the)g(set)g +Ft(V)37 b Fy(.)136 b(In)76 b(this)-161 6430 y(pap)5 b(er,)80 +b(the)74 b(algorithm)h(prop)5 b(osed)75 b(b)-5 b(y)74 +b(Czec)-5 b(h,)79 b(Ha)-5 b(v)c(as)75 b(and)-161 6629 +y(Ma)9 b(jewski)53 b([1])g(will)g(b)5 b(e)52 b(referred)g(to)g(as)h +(CHM)f(from)h(no)-5 b(w)53 b(on.)5 6829 y(Giv)-5 b(en)63 +b(an)f(acyclic)g(graph)g Ft(G)p Fy(,)i(for)e(the)f(ordering)i(step)f(w) +-5 b(e)-161 7028 y(asso)5 b(ciate)85 b(with)g(eac)-5 +b(h)85 b(edge)g(an)g(unique)h(n)-5 b(um)g(b)5 b(er)86 +b Ft(h)p Fy(\()p Ft(e)p Fy(\))95 b Fx(2)-161 7227 y Fy([0)p +Ft(;)28 b(n)49 b Fx(\000)g Fy(1])74 b(in)g(the)f(order)g(of)h(the)f(k) +-5 b(eys)73 b(of)g Ft(S)83 b Fy(to)73 b(obtain)h(an)-161 +7426 y(order)50 b(preserving)g(function.)72 b(Figure)50 +b(2)f(illustrates)h(the)f(p)5 b(er-)-161 7626 y(fect)58 +b(assignmen)-5 b(t)60 b(problem)g(for)e(an)h(acyclic)f(graph)h(with)g +(six)-161 7825 y(v)-5 b(ertices)54 b(and)h(with)f(the)g(\014v)-5 +b(e)54 b(table)g(en)-5 b(tries)54 b(assigned)i(to)e(the)-161 +8024 y(edges.)5 8223 y(The)68 b(searc)-5 b(hing)69 b(step)e(starts)h +(from)g(the)f(w)-5 b(eigh)g(ted)68 b(graph)-161 8423 +y Ft(G)e Fy(obtained)g(in)h(the)f(ordering)g(step.)107 +b(F)-14 b(or)66 b(eac)-5 b(h)67 b(connected)-161 8622 +y(comp)5 b(onen)-5 b(t)66 b(of)g Ft(G)f Fy(c)-5 b(ho)5 +b(ose)67 b(a)e(v)-5 b(ertex)65 b Ft(v)72 b Fy(and)67 +b(set)e Ft(g)6 b Fy(\()p Ft(v)g Fy(\))66 b(to)f(0.)-161 +8821 y(F)-14 b(or)54 b(example,)f(supp)5 b(ose)54 b(that)f(v)-5 +b(ertex)51 b(0)i(in)h(Figure)f(2)g(is)g(c)-5 b(ho-)-161 +9020 y(sen)48 b(and)g(the)f(assignmen)-5 b(t)48 b Ft(g)6 +b Fy(\(0\))46 b(=)g(0)h(is)h(made.)72 b(T)-14 b(ra)-5 +b(v)g(erse)48 b(the)-161 9220 y(graph)c(using)h(a)e(depth-\014rst)h(or) +g(a)f(breadth-\014rst)i(searc)-5 b(h)44 b(algo-)-161 +9419 y(rithm,)62 b(b)5 b(eginning)60 b(with)g(v)-5 b(ertex)59 +b Ft(v)6 b Fy(.)87 b(If)60 b(v)-5 b(ertex)58 b Ft(b)j +Fy(is)f(reac)-5 b(hed)-161 9618 y(from)63 b(v)-5 b(ertex)61 +b Ft(a)i Fy(and)g(the)f(v)-9 b(alue)62 b(asso)5 b(ciated)63 +b(with)f(the)g(edge)-161 9817 y Ft(e)56 b Fy(=)f Fx(f)p +Ft(a;)28 b(b)p Fx(g)60 b Fy(is)i Ft(h)p Fy(\()p Ft(e)p +Fy(\),)f(set)f Ft(g)6 b Fy(\()p Ft(b)p Fy(\))60 b(to)h(\()p +Ft(h)p Fy(\()p Ft(e)p Fy(\))39 b Fx(\000)h Ft(g)6 b Fy(\()p +Ft(a)p Fy(\)\))45 b(mo)5 b(d)47 b Ft(n)p Fy(.)89 b(In)-161 +10017 y(Figure)50 b(2,)h(follo)-5 b(wing)50 b(the)e(adjacen)-5 +b(t)49 b(list)h(of)f(v)-5 b(ertex)48 b(0,)i Ft(g)6 b +Fy(\(2\))49 b(is)-161 10216 y(set)60 b(to)f(3.)86 b(Next,)60 +b(follo)-5 b(wing)60 b(the)f(adjacen)-5 b(t)60 b(list)f(of)h(v)-5 +b(ertex)58 b(2,)-161 10415 y Ft(g)6 b Fy(\(1\))55 b(is)h(set)f(to)g(2)h +(and)f Ft(g)6 b Fy(\(3\))55 b(is)h(set)f(to)g(1,)h(and)g(so)f(on.)5061 +1844 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 5061 1844 a 5061 411 a + 5788794 5657231 0 0 5788794 5657231 startTexFig + 5061 411 a +%%BeginDocument: figs/perfectassignmentproblem.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: perfectassignmentproblem.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Aug 11 10:39:00 2004 +%%For: fbotelho@donabenta (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 88 86 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 86 moveto 0 0 lineto 88 0 lineto 88 86 lineto closepath clip newpath +132.3 307.1 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n -1195.1 4178.4 299.6 -46.7899 67.3996 arc +gs col0 s gr + +% Arc +n -3217.5 4972.5 1720.9 -11.3099 -41.8202 arcn +gs col0 s gr + +% Arc +n -4641.4 5663.6 3746.7 -32.5994 -18.0930 arc +gs col0 s gr + +% Arc +n -1645.3 4362.2 338.1 70.0577 171.8700 arc +gs col0 s gr + +% Arc +n -1353.2 4406.8 288.7 18.8384 127.7632 arc +gs col0 s gr + +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n -1474 3656 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1508 3704 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n -1069 4466 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1104 4514 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n -980 3926 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1016 3974 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n -1519 4646 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1554 4694 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n -1969 4376 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-2005 4424 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n -1924 3837 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 158.75 scf sf +-1959 3885 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1260 4860 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1935 4815 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1620 4185 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 158.75 scf sf +-1350 4185 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 158.75 scf sf +-810 4320 m +gs 1 -1 sc (0) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + 5061 1844 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 5061 1844 a 6488 555 786 7 v 6485 746 7 +191 v 6587 689 a Ft(v)p 6770 746 V 206 w(g)6 b Fy(\()p +Ft(v)g Fy(\))p 7270 746 V 6488 752 786 7 v 6485 943 7 +191 v 6589 886 a(0)p 6770 943 V 310 w(0)p 7270 943 V +6485 1134 V 6589 1077 a(1)p 6770 1134 V 310 w(2)p 7270 +1134 V 6485 1325 V 6589 1268 a(2)p 6770 1325 V 310 w(3)p +7270 1325 V 6485 1516 V 6589 1459 a(3)p 6770 1516 V 310 +w(1)p 7270 1516 V 6485 1707 V 6589 1650 a(4)p 6770 1707 +V 310 w(0)p 7270 1707 V 6485 1898 V 6589 1841 a(5)p 6770 +1898 V 310 w(1)p 7270 1898 V 6488 1905 786 7 v 4136 2267 +a(Figure)48 b(2:)70 b(P)-5 b(erfect)46 b(assignmen)-5 +b(t)49 b(problem)f(for)f(a)g(graph)h(with)4136 2466 y(six)56 +b(v)-5 b(ertices)55 b(and)h(\014v)-5 b(e)55 b(edges.)4302 +2996 y(No)-5 b(w)62 b(w)-5 b(e)61 b(sho)-5 b(w)63 b(wh)-5 +b(y)61 b Ft(G)g Fy(m)-5 b(ust)63 b(b)5 b(e)61 b(acyclic.)91 +b(If)61 b(the)h(graph)4136 3195 y Ft(G)52 b Fy(w)-5 b(as)54 +b(not)e(acyclic,)g(the)g(assignmen)-5 b(t)55 b(pro)5 +b(cess)53 b(migh)-5 b(t)53 b(trace)4136 3394 y(around)f(a)f(cycle)f +(and)h(insist)h(on)g(reassigning)g(some)g(already-)4136 +3593 y(pro)5 b(cessed)57 b(v)-5 b(ertex)55 b(with)h(a)g(di\013eren)-5 +b(t)56 b Ft(g)62 b Fy(v)-9 b(alue)56 b(than)g(the)g(one)4136 +3793 y(that)g(has)i(already)e(b)5 b(een)57 b(assigned)h(to)e(it.)78 +b(F)-14 b(or)57 b(example,)h(let)4136 3992 y(us)67 b(supp)5 +b(ose)67 b(that)f(in)g(Figure)h(2)f(the)g(edge)g Fx(f)p +Fy(3)p Ft(;)28 b Fy(4)p Fx(g)66 b Fy(has)g(b)5 b(een)4136 +4191 y(replaced)56 b(b)-5 b(y)55 b(the)g(edge)h Fx(f)p +Fy(0)p Ft(;)28 b Fy(1)p Fx(g)p Fy(.)73 b(In)56 b(this)g(case,)f(t)-5 +b(w)g(o)56 b(di\013eren)-5 b(t)4136 4390 y(v)c(alues)70 +b(are)g(set)g(to)g Ft(g)6 b Fy(\(0\).)117 b(F)-14 b(ollo)-5 +b(wing)72 b(the)d(adjacen)-5 b(t)70 b(list)g(of)4136 +4590 y(v)-5 b(ertex)45 b(1,)j Ft(g)6 b Fy(\(0\))45 b(is)h(set)g(to)f +(4.)71 b(But)45 b Ft(g)6 b Fy(\(0\))46 b(w)-5 b(as)46 +b(set)g(to)f(0)h(b)5 b(efore.)4136 5139 y Fv(5)270 b(The)90 +b(New)g(Algorithm)4136 5502 y Fy(In)80 b(this)f(section)h(w)-5 +b(e)79 b(presen)-5 b(t)80 b(a)f(new)h(algorithm)g(for)f(con-)4136 +5701 y(structing)i(minimal)g(p)5 b(erfect)79 b(hash)i(functions,)87 +b(where)81 b(the)4136 5901 y(order)53 b(of)f(the)g(k)-5 +b(eys)53 b(in)g Ft(S)62 b Fy(is)53 b(not)g(preserv)-5 +b(ed.)73 b(The)53 b(algorithm)4136 6100 y(is)e(based)h(on)f(the)f(MOS)h +(approac)-5 b(h)52 b(and)f(solv)-5 b(es)51 b(the)f(problem)4136 +6299 y(presen)-5 b(ted)49 b(in)g(Figure)g(1\(b\).)71 +b(The)49 b(main)g(no)-5 b(v)g(elt)g(y)49 b(is)g(that)f(the)4136 +6498 y(random)j(graph)g Ft(G)f Fy(migh)-5 b(t)50 b(ha)-5 +b(v)g(e)51 b(cycles)f(and)g(ev)-5 b(en)50 b(so)h(w)-5 +b(e)50 b(are)4136 6698 y(able)56 b(to)f(\014nd)h(a)f(MPHF.)4302 +6897 y(The)79 b(new)f(algorithm)h(lo)5 b(oks)78 b(for)g(a)g(function)h +Ft(g)90 b Fy(:)85 b Ft(V)121 b Fx(!)4136 7096 y(f\000j)p +Ft(V)37 b Fx(j)29 b Fy(+)g(1)p Ft(;)f(:)g(:)g(:)f(;)h +Fy(0)p Ft(;)g Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h Fx(j)p Ft(V)37 +b Fx(j)29 b(\000)g Fy(1)p Fx(g)51 b Fy(suc)-5 b(h)53 +b(that)d(the)h(function)4136 7295 y Ft(h)46 b Fy(:)g +Ft(E)56 b Fx(!)46 b(f)p Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h +(m)36 b Fx(\000)h Fy(1)p Fx(g)56 b Fy(de\014ned)g(as)5273 +7660 y Ft(h)p Fy(\()p Ft(e)p Fy(\))45 b(=)h Ft(g)6 b +Fy(\()p Ft(a)p Fy(\))36 b(+)h Ft(g)6 b Fy(\()p Ft(b)p +Fy(\))1256 b(\(3\))4136 8024 y(is)68 b(a)e(bijection,)k(where)c +Ft(e)g Fy(=)f Fx(f)p Ft(a;)28 b(b)p Fx(g)p Fy(.)108 b(This)68 +b(means)g(that)e(w)-5 b(e)4136 8223 y(are)65 b(lo)5 b(oking)64 +b(for)h(an)g(assignmen)-5 b(t)66 b(of)f(v)-9 b(alues)65 +b(to)f(v)-5 b(ertices)65 b(so)4136 8423 y(that)j(for)h(eac)-5 +b(h)68 b(edge)h(the)f(sum)i(of)e(v)-9 b(alues)69 b(asso)5 +b(ciated)68 b(with)4136 8622 y(endp)5 b(oin)-5 b(ts)68 +b(is)g(a)f(unique)g(in)-5 b(teger)67 b(in)g(the)g(range)g([0)p +Ft(;)28 b(m)44 b Fx(\000)h Fy(1].)4136 8821 y(Notice)59 +b(that)h(w)-5 b(e)60 b(do)g(not)g(need)g(to)g(tak)-5 +b(e)59 b(the)h(sum)h(of)f(v)-9 b(alues)4136 9020 y(asso)5 +b(ciated)56 b(with)f(endp)5 b(oin)-5 b(ts)56 b(of)f(the)g(edges)h(mo)5 +b(dulo)56 b Ft(n)p Fy(.)4302 9220 y(Figure)72 b(3)f(presen)-5 +b(ts)72 b(a)e(pseudo)i(co)5 b(de)71 b(for)f(the)h(new)g(algo-)4136 +9419 y(rithm.)120 b(The)71 b(pro)5 b(cedure)70 b(NewAlgorithm)g(\()p +Ft(S)10 b Fy(,)74 b Ft(g)6 b Fy(\))70 b(receiv)-5 b(es)4136 +9618 y(as)58 b(input)f(the)f(set)h(of)f(k)-5 b(eys)57 +b(from)g Ft(S)66 b Fy(and)57 b(pro)5 b(duces)58 b(the)e(p)5 +b(er-)4136 9817 y(fect)49 b(assignmen)-5 b(t)51 b(of)f(v)-5 +b(ertices)49 b(represen)-5 b(ted)51 b(b)-5 b(y)50 b(the)f(function)4136 +10017 y Ft(g)6 b Fy(.)106 b(The)66 b(mapping)h(step)f(generates)f(a)h +(random)h(undirected)4136 10216 y(graph)e Ft(G)f Fy(taking)g +Ft(S)74 b Fy(as)64 b(input.)102 b(The)64 b(ordering)h(step)f(deter-) +4136 10415 y(mines)j(the)e(order)h(in)g(whic)-5 b(h)67 +b(hash)g(v)-9 b(alues)66 b(are)f(assigned)j(to)3906 10913 +y(4)p eop end +%%Page: 5 5 +TeXDict begin 5 4 bop -161 620 a Fy(k)-5 b(eys.)86 b(It)59 +b(partitions)h(the)f(graph)h Ft(G)f Fy(in)-5 b(to)60 +b Ft(G)2654 645 y Fr(cr)t(it)2943 620 y Fy(and)g Ft(G)3401 +645 y Fr(ncr)t(it)3712 620 y Fy(.)-161 819 y(The)52 b(searc)-5 +b(hing)53 b(step)f(pro)5 b(duces)52 b(the)f(p)5 b(erfect)50 +b(assignmen)-5 b(t)54 b(of)-161 1018 y(v)-5 b(ertices)63 +b(in)g Ft(G)p Fy(,)h(whic)-5 b(h)64 b(is)f(represen)-5 +b(ted)64 b(b)-5 b(y)63 b(the)f(function)h Ft(g)6 b Fy(.)-161 +1218 y(It)55 b(starts)h(with)f Ft(G)992 1243 y Fr(cr)t(it)1277 +1218 y Fy(and)h(\014nishes)h(with)e Ft(G)2692 1243 y +Fr(ncr)t(it)3004 1218 y Fy(.)p -169 1623 9 103 v -169 +1529 103 9 v -66 1529 3730 9 v 3664 1529 103 9 v 3759 +1623 9 103 v -169 1780 9 150 v 3758 1780 V -72 1735 a +Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)76 b Fu(NewAlgorithm)82 +b(\()16 b Fk(S)40 b Fu(,)83 b Fk(g)15 b Fu(\))p -169 +1937 V 3758 1937 V 166 1892 a(M)-5 b(a)g(p)g(p)g(i)g(n)g(g)79 +b(\()15 b Fk(S)41 b Fu(,)83 b Fk(G)19 b Fu(\))g(;)p -169 +2094 V 3758 2094 V 175 2049 a(O)t(r)t(d)t(e)t(r)t(i)t(n)t(g)87 +b(\()15 b Fk(G)33 b Fu(,)83 b Fk(G)1361 2066 y Fj(cr)s(it)1610 +2049 y Fu(,)g Fk(G)1856 2066 y Fj(ncr)s(it)2168 2049 +y Fu(\))19 b(;)p -169 2251 V 3758 2251 V 177 2206 a(S)6 +b(e)g(a)g(r)g(c)g(h)g(i)g(n)g(g)93 b(\()15 b Fk(G)33 +b Fu(,)83 b Fk(G)1440 2223 y Fj(cr)s(it)1689 2206 y Fu(,)g +Fk(G)1935 2223 y Fj(ncr)s(it)2261 2206 y Fu(,)g Fk(g)24 +b Fu(\))19 b(;)p -169 2354 9 103 v -168 2354 103 9 v +-66 2354 3730 9 v 3664 2354 103 9 v 3759 2354 9 103 v +230 2776 a Fy(Figure)56 b(3:)74 b(Main)56 b(steps)g(of)f(the)g(new)h +(algorithm.)-161 3481 y Fi(5.1)225 b(Mapping)73 b(Step)-161 +3796 y Fy(The)67 b(pro)5 b(cedure)67 b(Mapping)h(\()p +Ft(S)10 b Fy(,)68 b Ft(G)p Fy(\))e(receiv)-5 b(es)67 +b(as)g(input)h(the)-161 3996 y(set)53 b(of)g(k)-5 b(eys)53 +b(from)g Ft(S)63 b Fy(and)53 b(generates)g(a)g(random)h(undirected)-161 +4195 y(graph)42 b Ft(G)e Fy(without)g(self-lo)5 b(ops)42 +b(and)f(m)-5 b(ultiple)42 b(edges.)69 b(T)-14 b(o)41 +b(gen-)-161 4394 y(erate)79 b(the)g(MPHF,)h(the)f(n)-5 +b(um)g(b)5 b(er)80 b(of)f(critical)g(edges)h(in)g Ft(G)-161 +4593 y Fy(m)-5 b(ust)63 b(b)5 b(e)61 b Fx(j)p Ft(E)658 +4618 y Fr(cr)t(it)888 4593 y Fx(j)56 b(\024)1196 4528 +y Fn(1)p 1196 4555 67 7 v 1196 4651 a(2)1282 4593 y Fx(j)p +Ft(E)10 b Fx(j)p Fy(.)92 b(The)61 b(reason)i(is)f(that)f(the)g(maxi-) +-161 4793 y(mal)44 b(v)-9 b(alue)44 b(of)f Ft(h)p Fy(\()p +Ft(e)p Fy(\))g(assigned)i(to)e(an)h(edge)f Ft(e)k Fx(2)e +Ft(E)53 b Fy(in)44 b(this)g(case)-161 4992 y(is)60 b +Ft(m)38 b Fx(\000)i Fy(1.)83 b(In)59 b(Section)f(5.3.1)h(w)-5 +b(e)59 b(sho)-5 b(w)60 b(that)e(the)g(condition)-161 +5191 y Fx(j)p Ft(E)8 5216 y Fr(cr)t(it)238 5191 y Fx(j)46 +b(\024)526 5126 y Fn(1)p 526 5153 V 526 5248 a(2)612 +5191 y Fx(j)p Ft(E)10 b Fx(j)53 b Fy(is)i(necessary)g(and)g(su\016cien) +-5 b(t)56 b(to)e(generate)f(a)-161 5390 y(MPHF.)5 5594 +y(The)73 b(random)h(graph)g Ft(G)e Fy(is)i(generated)e(using)i(t)-5 +b(w)g(o)73 b(hash)-161 5794 y(functions)66 b Ft(h)661 +5819 y Fn(1)800 5794 y Fy(and)g Ft(h)1229 5819 y Fn(2)1303 +5794 y Fy(.)103 b(The)66 b(functions)f Ft(h)2625 5819 +y Fn(1)2765 5794 y Fy(and)g Ft(h)3193 5819 y Fn(2)3333 +5794 y Fy(trans-)-161 5993 y(form)57 b(the)e(k)-5 b(eys)56 +b(from)g Ft(S)66 b Fy(to)55 b(in)-5 b(tegers)57 b(in)f([0)p +Ft(;)28 b Fx(j)p Ft(V)37 b Fx(j)g(\000)h Fy(1],)56 b(so)h(the)-161 +6192 y(set)50 b(of)g(v)-5 b(ertices)50 b Ft(V)87 b Fy(has)51 +b Fx(j)p Ft(V)37 b Fx(j)50 b Fy(v)-5 b(ertices)50 b(and)h(eac)-5 +b(h)50 b(one)g(of)g(them)-161 6391 y(is)63 b(lab)5 b(elled)62 +b(with)g(a)g(distinct)h(v)-9 b(alue)61 b(from)i([0)p +Ft(;)28 b Fx(j)p Ft(V)36 b Fx(j)42 b(\000)f Fy(1].)95 +b(F)-14 b(or)-161 6591 y(eac)-5 b(h)54 b(k)-5 b(ey)54 +b Ft(x)f Fy(from)h Ft(S)64 b Fy(the)53 b(edge)h Fx(f)p +Ft(h)2055 6616 y Fn(1)2129 6591 y Fy(\()p Ft(x)p Fy(\))p +Ft(;)28 b(h)2524 6616 y Fn(2)2597 6591 y Fy(\()p Ft(x)p +Fy(\))p Fx(g)53 b Fy(is)h(added)h(to)-161 6790 y Ft(E)10 +b Fy(.)5 6994 y(A)74 b(self-lo)5 b(op)75 b(o)5 b(ccurs)74 +b(when)g Ft(h)1959 7019 y Fn(1)2033 6994 y Fy(\()p Ft(x)p +Fy(\))j(=)h Ft(h)2638 7019 y Fn(2)2712 6994 y Fy(\()p +Ft(x)p Fy(\).)129 b(T)-14 b(o)74 b(a)-5 b(v)g(oid)-161 +7193 y(self-lo)5 b(ops)41 b(w)-5 b(e)40 b(mo)5 b(dify)39 +b Ft(h)1412 7218 y Fn(2)1486 7193 y Fy(\()p Ft(x)p Fy(\))g(b)-5 +b(y)39 b(adding)i(a)e(random)i(n)-5 b(um)g(b)5 b(er)-161 +7392 y(in)56 b(the)e(range)i([1)p Ft(;)28 b Fx(j)p Ft(V)36 +b Fx(j)h(\000)f Fy(1].)74 b(When)55 b(a)g(m)-5 b(ultiple)56 +b(edge)f(o)5 b(ccurs)-161 7591 y(w)-5 b(e)56 b(ab)5 b(ort)55 +b(and)h(start)f(again)g(a)h(new)f(iteration.)5 7795 y(W)-14 +b(e)42 b(no)-5 b(w)43 b(sho)-5 b(w)43 b(that)f(the)f(exp)5 +b(ected)41 b(n)-5 b(um)g(b)5 b(er)43 b(of)f(iterations)-161 +7995 y(to)70 b(obtain)h Ft(G)f Fy(is)h(constan)-5 b(t.)120 +b(Let)69 b Ft(p)h Fy(b)5 b(e)70 b(the)g(probabilit)-5 +b(y)72 b(of)-161 8194 y(generating)d(a)g(random)h(graph)g +Ft(G)e Fy(without)h(self-lo)5 b(ops)70 b(and)-161 8393 +y(m)-5 b(ultiple)60 b(edges.)86 b(Let)58 b Ft(X)72 b +Fy(b)5 b(e)59 b(a)g(random)h(v)-9 b(ariable)59 b(coun)-5 +b(ting)-161 8592 y(the)56 b(n)-5 b(um)g(b)5 b(er)58 b(of)e(iterations)g +(to)f(generate)h Ft(G)p Fy(.)76 b(V)-14 b(ariable)56 +b Ft(X)69 b Fy(is)-161 8792 y(said)k(to)f(ha)-5 b(v)g(e)72 +b(the)g(geometric)f(distribution)j(with)d Ft(P)23 b Fy(\()p +Ft(X)86 b Fy(=)-161 8991 y Ft(i)p Fy(\))46 b(=)h Ft(p)p +Fy(\(1)19 b Fx(\000)g Ft(p)p Fy(\))731 8931 y Fr(i)p +Fo(\000)p Fn(1)953 8991 y Fy(.)71 b(So,)48 b(the)e(exp)5 +b(ected)45 b(n)-5 b(um)g(b)5 b(er)47 b(of)f(iterations)-161 +9190 y(to)53 b(generate)f Ft(G)g Fy(is)i Ft(N)1183 9215 +y Fr(i)1238 9190 y Fy(\()p Ft(X)13 b Fy(\))45 b(=)1739 +9066 y Fp(P)1915 9107 y Fo(1)1915 9240 y Fr(j)7 b Fn(=1)2180 +9190 y Ft(j)j(P)23 b Fy(\()p Ft(X)58 b Fy(=)47 b Ft(j)10 +b Fy(\))45 b(=)h(1)p Ft(=p)53 b Fy(and)-161 9414 y(its)j(v)-9 +b(ariance)55 b(is)h Ft(V)36 b Fy(\()p Ft(X)13 b Fy(\))45 +b(=)i(\(1)36 b Fx(\000)h Ft(p)p Fy(\))p Ft(=p)2190 9354 +y Fn(2)2263 9414 y Fy(.)5 9618 y(Let)52 b Ft(\030)59 +b Fy(b)5 b(e)52 b(the)g(space)h(of)f(edges)g(in)h Ft(G)f +Fy(that)f(ma)-5 b(y)53 b(b)5 b(e)52 b(gener-)-161 9817 +y(ated)58 b(b)-5 b(y)58 b Ft(h)540 9842 y Fn(1)673 9817 +y Fy(and)g Ft(h)1094 9842 y Fn(2)1168 9817 y Fy(.)82 +b(The)58 b(graphs)i(generated)d(in)i(this)f(step)-161 +10017 y(are)64 b(undirected)g(and)g(the)f(n)-5 b(um)g(b)5 +b(er)65 b(of)f(p)5 b(ossible)65 b(edges)f(in)g Ft(\030)-161 +10216 y Fy(is)f(giv)-5 b(en)62 b(b)-5 b(y)62 b Fx(j)p +Ft(\030)8 b Fx(j)57 b Fy(=)1106 10082 y Fp(\000)1182 +10142 y Fo(j)p Fr(V)30 b Fo(j)1242 10273 y Fn(2)1368 +10082 y Fp(\001)1444 10216 y Fy(.)94 b(The)62 b(n)-5 +b(um)g(b)5 b(er)63 b(of)f(p)5 b(ossible)63 b(edges)-161 +10415 y(that)54 b(migh)-5 b(t)55 b(b)5 b(ecome)54 b(a)g(m)-5 +b(ultiple)55 b(edge)f(when)h(the)e Ft(j)10 b Fy(th)54 +b(edge)4136 620 y(is)43 b(added)h(to)e Ft(G)g Fy(is)h +Ft(j)21 b Fx(\000)11 b Fy(1,)46 b(and)e(the)e(incremen)-5 +b(tal)43 b(construction)4136 819 y(of)55 b Ft(G)g Fy(implies)i(that)e +Ft(p)p Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))55 b(is:)4331 +1313 y Ft(p)p Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))46 +b(=)5065 1106 y Fr(n)5000 1155 y Fp(Y)4991 1509 y Fr(j)7 +b Fn(=1)5268 1056 y Fp(\000)5344 1117 y Fo(j)p Fr(V)30 +b Fo(j)5404 1248 y Fn(2)5530 1056 y Fp(\001)5643 1190 +y Fx(\000)37 b Fy(\()p Ft(j)47 b Fx(\000)37 b Fy(1\))p +5268 1275 1035 7 v 5616 1321 a Fp(\000)5692 1382 y Fo(j)p +Fr(V)30 b Fo(j)5752 1513 y Fn(2)5878 1321 y Fp(\001)6368 +1313 y Fy(=)6544 1106 y Fr(n)p Fo(\000)p Fn(1)6564 1155 +y Fp(Y)6555 1509 y Fr(j)7 b Fn(=0)6843 1056 y Fp(\000)6919 +1117 y Fo(j)p Fr(V)30 b Fo(j)6979 1248 y Fn(2)7105 1056 +y Fp(\001)7218 1190 y Fx(\000)37 b Ft(j)p 6843 1275 619 +7 v 6984 1321 a Fp(\000)7060 1382 y Fo(j)p Fr(V)29 b +Fo(j)7120 1513 y Fn(2)7246 1321 y Fp(\001)7482 1313 y +Fx(\001)4302 1826 y Fy(As)56 b Fx(j)p Ft(V)37 b Fx(j)46 +b Fy(=)g Ft(cn)55 b Fy(w)-5 b(e)55 b(can)h(rewrite)e(the)h(probabilit) +-5 b(y)56 b Ft(p)p Fy(\()p Ft(n)p Fy(\))e(as:)5019 2321 +y Ft(p)p Fy(\()p Ft(n)p Fy(\))45 b(=)5553 2113 y Fr(n)p +Fo(\000)p Fn(1)5573 2163 y Fp(Y)5564 2516 y Fr(j)7 b +Fn(=0)5833 2321 y Fy(1)37 b Fx(\000)6119 2086 y Fp(\022)6528 +2208 y Fy(2)p Ft(j)p 6261 2282 695 7 v 6261 2434 a(c)6333 +2386 y Fn(2)6407 2434 y Ft(n)6507 2386 y Fn(2)6618 2434 +y Fx(\000)g Ft(cn)6976 2086 y Fp(\023)7126 2321 y Fx(\001)4302 +2834 y Fy(Using)58 b(an)g(asymptotic)f(estimate)g(from)h(P)-5 +b(almer)58 b([15],)g(for)4136 3033 y(t)-5 b(w)g(o)62 +b(functions)h Ft(f)5260 3058 y Fn(1)5391 3033 y Fy(:)57 +b Fx(<)g(!)g(<)k Fy(and)i Ft(f)6486 3058 y Fn(2)6617 +3033 y Fy(:)57 b Fx(<)g(!)g(<)62 b Fy(de\014ned)g(b)-5 +b(y)4136 3232 y Ft(f)4217 3257 y Fn(1)4292 3232 y Fy(\()p +Ft(k)5 b Fy(\))46 b(=)g(1)36 b Fx(\000)g Ft(k)60 b Fy(and)55 +b Ft(f)5567 3257 y Fn(2)5642 3232 y Fy(\()p Ft(k)5 b +Fy(\))46 b(=)g Ft(e)6161 3172 y Fo(\000)p Fr(k)6347 3232 +y Fy(,)55 b(the)g(inequalit)-5 b(y)54 b Ft(f)7584 3257 +y Fn(1)7659 3232 y Fy(\()p Ft(k)5 b Fy(\))46 b Fx(\024)4136 +3432 y Ft(f)4217 3457 y Fn(2)4292 3432 y Fy(\()p Ft(k)5 +b Fy(\))70 b(is)h(true)f Fx(8)47 b Ft(k)76 b Fx(2)71 +b(<)p Fy(.)118 b(Considering)71 b Ft(k)77 b Fy(=)7404 +3357 y Fn(2)p Fr(j)p 7210 3393 517 7 v 7210 3489 a(c)7269 +3456 y Fh(2)7334 3489 y Fr(n)7416 3456 y Fh(2)7481 3489 +y Fo(\000)p Fr(cn)7746 3432 y Fy(,)d(w)-5 b(e)4136 3631 +y(ha)g(v)g(e)4769 4083 y Ft(p)p Fy(\()p Ft(n)p Fy(\))45 +b Fx(\024)5303 3876 y Fr(n)p Fo(\000)p Fn(1)5323 3926 +y Fp(Y)5314 4279 y Fr(j)7 b Fn(=0)5583 4083 y Ft(e)5660 +3993 y Fo(\000)5764 3871 y Fp(\000)6041 3938 y Fh(2)p +Fm(j)p 5860 3967 474 7 v 5860 4052 a(c)5914 4028 y Fh(2)5978 +4052 y Fm(n)6051 4028 y Fh(2)6116 4052 y Fg(\000)p Fm(cn)6353 +3871 y Fp(\001)6484 4083 y Fy(=)46 b Ft(e)6736 3993 y +Fo(\000)6840 3871 y Fp(\000)6994 3940 y Fm(n)p Fg(\000)p +Fh(1)p 6936 3967 336 7 v 6936 4052 a Fm(c)6990 4028 y +Fh(2)7055 4052 y Fm(n)p Fg(\000)p Fm(c)7292 3871 y Fp(\001)7376 +4083 y Ft(:)4136 4587 y Fy(Th)-5 b(us,)5337 4948 y(lim)5278 +5048 y Fr(n)p Fo(!1)5653 4948 y Ft(p)p Fy(\()p Ft(n)p +Fy(\))44 b Fx(')j Ft(e)6264 4871 y Fo(\000)6419 4827 +y Fh(1)p 6388 4846 119 7 v 6388 4930 a Fm(c)6442 4906 +y Fh(2)6535 4948 y Ft(:)1262 b Fy(\(4\))4302 5393 y(As)59 +b Ft(N)4684 5418 y Fr(i)4740 5393 y Fy(\()p Ft(X)13 b +Fy(\))50 b(=)i(1)p Ft(=p)59 b Fy(then)g Ft(N)6076 5418 +y Fr(i)6131 5393 y Fy(\()p Ft(X)13 b Fy(\))51 b Fx(')h +Ft(e)6772 5271 y Fh(1)p 6741 5290 V 6741 5375 a Fm(c)6795 +5351 y Fh(2)6888 5393 y Fy(.)84 b(After)58 b(that,)h(w)-5 +b(e)4136 5592 y(empirically)60 b(determine)g(the)g Ft(c)f +Fy(v)-9 b(alue)60 b(to)f(obtain)h(a)g(random)4136 5791 +y(graph)f Ft(G)g Fy(with)f Fx(j)p Ft(E)5350 5816 y Fr(cr)t(it)5580 +5791 y Fx(j)51 b(\024)5878 5726 y Fn(1)p 5878 5753 67 +7 v 5878 5849 a(2)5964 5791 y Fx(j)p Ft(E)10 b Fx(j)p +Fy(.)83 b(F)-14 b(or)59 b(this)g(w)-5 b(e)59 b(built)g(10,000)4136 +5991 y(graphs)h(for)e(eac)-5 b(h)59 b Ft(c)f Fy(v)-9 +b(alue)58 b(and)h(n)-5 b(um)g(b)5 b(er)60 b(of)e(k)-5 +b(eys)58 b(presen)-5 b(ted)4136 6190 y(in)41 b(T)-14 +b(able)41 b(1.)69 b(The)40 b(t)-5 b(w)g(o)41 b(collections)f(used)h(in) +g(the)f(exp)5 b(erimen)-5 b(ts)4136 6389 y(\(T)-14 b(o)5 +b(doBR)61 b(and)g(TREC-VLC2\))g(are)g(describ)5 b(ed)61 +b(in)h(T)-14 b(able)61 b(4)4136 6588 y(\(see)55 b(Section)g(7)h(for)f +(more)g(details\).)4302 6788 y(W)-14 b(e)89 b(sho)-5 +b(w)90 b(in)f(T)-14 b(able)89 b(1)g(the)g(probabilit)-5 +b(y)90 b Ft(P)7266 6818 y Fo(j)p Fr(E)7402 6835 y Fm(cr)s(it)7614 +6818 y Fo(j)7751 6788 y Fy(that)4136 7003 y Fx(j)p Ft(E)4305 +7028 y Fr(cr)t(it)4535 7003 y Fx(j)83 b(\024)4896 6938 +y Fn(1)p 4896 6965 V 4896 7061 a(2)4983 7003 y Fx(j)p +Ft(E)10 b Fx(j)p Fy(,)82 b Fx(j)p Ft(E)10 b Fx(j)83 b +Fy(=)g Ft(n)p Fy(,)g(tends)78 b(to)f(0)h(when)g Ft(c)83 +b(<)g Fy(1)p Ft(:)p Fy(15)4136 7203 y(and)55 b Ft(n)g +Fy(increases.)74 b(Ho)-5 b(w)g(ev)g(er,)55 b(it)f(tends)h(to)f(1)h +(when)g Ft(c)46 b Fx(\025)g Fy(1)p Ft(:)p Fy(15)4136 +7402 y(and)76 b Ft(n)g Fy(increases.)135 b(Th)-5 b(us,)82 +b Fx(j)p Ft(V)37 b Fx(j)80 b Fy(=)g(1)p Ft(:)p Fy(15)p +Ft(n)75 b Fy(is)i(considered)f(a)4136 7601 y Fs(thr)-8 +b(eshold)78 b(function)e Fy(\(a)f(de\014nition)h(coined)f(b)-5 +b(y)76 b(Erd\177)-83 b(os)76 b(and)4136 7800 y(R)-5 b(\023)-78 +b(en)-5 b(yi)64 b([3,)f(5]\))g(for)g(generating)g(a)h(random)g(graph)g +Ft(G)e Fy(where)4136 8000 y Fx(j)p Ft(E)4305 8025 y Fr(cr)t(it)4535 +8000 y Fx(j)74 b(\024)4878 7934 y Fn(1)p 4878 7961 V +4878 8057 a(2)4964 8000 y Fx(j)p Ft(E)10 b Fx(j)72 b +Fy(with)g(probabilit)-5 b(y)72 b(tending)h(to)e(1)i(when)f(n)4136 +8199 y(increases.)78 b(Therefore,)56 b(w)-5 b(e)57 b(use)g +Ft(c)48 b Fy(=)g(1)p Ft(:)p Fy(15)56 b(in)h(the)f(new)h(algo-)4136 +8398 y(rithm.)4302 8597 y(The)68 b(MPHF)g(generated)g(b)-5 +b(y)68 b(the)g(new)g(algorithm)h(needs)4136 8797 y(1)p +Ft(:)p Fy(15)p Ft(n)52 b Fy(in)-5 b(teger)53 b(n)-5 b(um)g(b)5 +b(ers)54 b(to)e(b)5 b(e)52 b(stored,)h(since)g Fx(j)p +Ft(V)37 b Fx(j)46 b Fy(=)g(1)p Ft(:)p Fy(15)p Ft(n)p +Fy(.)4136 8996 y(Th)-5 b(us,)113 b(the)101 b(generated)f(function)g(is) +h(stored)g(in)g(55\045)g(|)4136 9195 y(1)p Ft(:)p Fy(15)p +Ft(n=)p Fy(2)p Ft(:)p Fy(09)p Ft(n)52 b Fy(|)g(of)g(the)f(space)i +(necessary)f(to)g(store)f(the)h(one)4136 9395 y(generated)j(b)-5 +b(y)56 b(the)f(CHM)g(algorithm.)4302 9594 y(As)h Ft(P)4655 +9624 y Fo(j)p Fr(E)4791 9641 y Fm(cr)s(it)5003 9624 y +Fo(j)5106 9594 y Fy(tends)f(to)g(1)h(when)f Ft(n)g Fy(increases,)h(w)-5 +b(e)55 b(consider)4136 9793 y(that)42 b(the)g(exp)5 b(ected)41 +b(n)-5 b(um)g(b)5 b(er)44 b(of)e(iterations)g(to)g(generate)g +Ft(G)g Fy(is)4136 10017 y Ft(N)4269 10042 y Fr(i)4325 +10017 y Fy(\()p Ft(X)13 b Fy(\))47 b Fx(')h Ft(e)4958 +9895 y Fh(1)p 4927 9914 119 7 v 4927 9999 a Fm(c)4981 +9975 y Fh(2)5074 10017 y Fy(.)77 b(F)-14 b(or)58 b Ft(c)47 +b Fy(=)i(1)p Ft(:)p Fy(15,)57 b Ft(N)6325 10042 y Fr(i)6380 +10017 y Fy(\()p Ft(X)13 b Fy(\))47 b Fx(')h Fy(2)p Ft(:)p +Fy(13)57 b(on)g(a)-5 b(v)g(erage,)4136 10216 y(whic)g(h)72 +b(is)g(constan)-5 b(t.)121 b(So,)75 b(the)c(mapping)h(step)f(tak)-5 +b(es)71 b Ft(O)5 b Fy(\()p Ft(n)p Fy(\))4136 10415 y(time.)3906 +10913 y(5)p eop end +%%Page: 6 6 +TeXDict begin 6 5 bop -90 460 8074 7 v 1902 635 a Fu(VLC2)51 +b(\()p Fk(n)p Fu(\))3155 b(T)-13 b(o)t(doBR)52 b(\()p +Fk(n)p Fu(\))p 383 727 3702 7 v 4283 727 V 139 895 a +Fk(c)277 b Fu(1)p Fk(;)25 b Fu(000)199 b(10)p Fk(;)25 +b Fu(000)198 b(100)p Fk(;)25 b Fu(000)199 b(1)p Fk(;)25 +b Fu(000)p Fk(;)f Fu(000)199 b(3)p Fk(;)25 b Fu(000)p +Fk(;)g Fu(000)398 b(1)p Fk(;)25 b Fu(000)198 b(10)p Fk(;)25 +b Fu(000)199 b(100)p Fk(;)24 b Fu(000)199 b(1)p Fk(;)25 +b Fu(000)p Fk(;)g Fu(000)198 b(3)p Fk(;)26 b Fu(000)p +Fk(;)e Fu(000)p -90 978 8074 7 v 10 1194 a(1.10)249 b(0.01)340 +b(0.00)415 b(0.00)527 b(0.00)600 b(0.00)649 b(0.02)339 +b(0.00)416 b(0.00)527 b(0.00)599 b(0.00)10 1377 y(1.11)249 +b(0.04)340 b(0.00)415 b(0.00)527 b(0.00)600 b(0.00)649 +b(0.05)339 b(0.00)416 b(0.00)527 b(0.00)599 b(0.00)10 +1559 y(1.12)249 b(0.12)340 b(0.00)415 b(0.00)527 b(0.00)600 +b(0.00)649 b(0.13)339 b(0.00)416 b(0.00)527 b(0.00)599 +b(0.00)10 1742 y(1.13)249 b(0.19)340 b(0.03)415 b(0.00)527 +b(0.00)600 b(0.00)649 b(0.20)339 b(0.02)416 b(0.00)527 +b(0.00)599 b(0.00)10 1925 y(1.14)249 b(0.30)340 b(0.09)415 +b(0.00)527 b(0.00)600 b(0.00)649 b(0.31)339 b(0.11)416 +b(0.00)527 b(0.00)599 b(0.00)10 2107 y(1.15)249 b(0.50)340 +b(0.56)415 b(0.65)527 b(0.89)600 b(1.00)649 b(0.51)339 +b(0.57)416 b(0.65)527 b(0.88)599 b(1.00)10 2290 y(1.16)249 +b(0.68)340 b(0.70)415 b(0.88)527 b(0.95)600 b(1.00)649 +b(0.70)339 b(0.83)416 b(0.95)527 b(0.95)599 b(1.00)10 +2473 y(1.17)249 b(0.77)340 b(0.82)415 b(0.90)527 b(1.00)600 +b(1.00)649 b(0.78)339 b(0.99)416 b(0.98)527 b(1.00)599 +b(1.00)10 2655 y(1.18)249 b(0.91)340 b(0.97)415 b(0.98)527 +b(1.00)600 b(1.00)649 b(0.91)339 b(1.00)416 b(1.00)527 +b(1.00)599 b(1.00)10 2838 y(1.19)249 b(0.94)340 b(1.00)415 +b(1.00)527 b(1.00)600 b(1.00)649 b(0.95)339 b(1.00)416 +b(1.00)527 b(1.00)599 b(1.00)10 3021 y(1.20)249 b(0.98)340 +b(1.00)415 b(1.00)527 b(1.00)600 b(1.00)649 b(0.99)339 +b(1.00)416 b(1.00)527 b(1.00)599 b(1.00)p -90 3129 V +-161 3477 a Fy(T)-14 b(able)49 b(1:)70 b(Probabilit)-5 +b(y)49 b Ft(P)1458 3507 y Fo(j)p Fr(E)1594 3524 y Fm(cr)s(it)1807 +3507 y Fo(j)1903 3477 y Fy(that)e Fx(j)p Ft(E)2424 3502 +y Fr(cr)t(it)2654 3477 y Fx(j)f(\024)2942 3411 y Fn(1)p +2942 3438 67 7 v 2942 3534 a(2)3028 3477 y Ft(n)i Fy(for)g(di\013eren) +-5 b(t)48 b Ft(c)g Fy(v)-9 b(alues)49 b(and)g(di\013eren)-5 +b(t)48 b(n)-5 b(um)g(b)5 b(er)50 b(of)e(k)-5 b(eys)48 +b(for)g(the)g(collections)-161 3676 y(VLC2)55 b(and)h(T)-14 +b(o)5 b(doBR.)5 4174 y(The)72 b(new)f(algorithm)i(do)5 +b(es)71 b(not)h(v)-5 b(erify)71 b(if)g Ft(G)g Fy(really)h(has)-161 +4373 y(at)63 b(most)g(0)p Ft(:)p Fy(5)p Ft(n)f Fy(critical)g(edges)h +(in)g(the)g(mapping)g(step.)96 b(The)-161 4572 y(rationale)65 +b(is)g(that)f Ft(P)1193 4602 y Fo(j)p Fr(E)1329 4619 +y Fm(cr)s(it)1541 4602 y Fo(j)1654 4572 y Fy(tends)h(to)f(1)g(when)h +Ft(n)f Fy(increases.)-161 4772 y(Ho)-5 b(w)g(ev)g(er,)43 +b(if)c(some)h(addition)g Ft(g)6 b Fy(\()p Ft(u)p Fy(\))f(+)g +Ft(g)h Fy(\()p Ft(w)t Fy(\))38 b(is)i(greater)f(than)g +Ft(m)-161 4971 y Fy(in)52 b(the)f(searc)-5 b(hing)53 +b(step)e(for)g Fx(f)p Ft(u;)28 b(w)t Fx(g)47 b(2)e Ft(E)61 +b Fy(then)51 b(the)g(mapping)-161 5170 y(step)56 b(is)g(restarted,)f +(as)h(sho)-5 b(wn)56 b(in)g(line)g(17)f(of)g(Figure)h(7.)-161 +5694 y Fi(5.2)225 b(Ordering)74 b(Step)-161 6021 y Fy(The)59 +b(pro)5 b(cedure)58 b(Ordering)i(\()p Ft(G)p Fy(,)e Ft(G)2095 +6046 y Fr(cr)t(it)2325 6021 y Fy(,)h Ft(G)2561 6046 y +Fr(ncr)t(it)2873 6021 y Fy(\))f(receiv)-5 b(es)59 b(as)-161 +6220 y(input)43 b(the)g(graph)g Ft(G)f Fy(and)h(partitions)g +Ft(G)f Fy(in)-5 b(to)43 b(t)-5 b(w)g(o)43 b(subgraphs)-161 +6419 y Ft(G)-30 6444 y Fr(cr)t(it)259 6419 y Fy(and)60 +b Ft(G)717 6444 y Fr(ncr)t(it)1028 6419 y Fy(.)85 b(T)-14 +b(o)59 b(partition)g(the)g(graph)h Ft(G)e Fy(in)-5 b(to)60 +b Ft(G)3529 6444 y Fr(cr)t(it)-161 6618 y Fy(and)68 b +Ft(G)305 6643 y Fr(ncr)t(it)683 6618 y Fy(w)-5 b(e)67 +b(use)h(an)f(optimal)g(time)g(algorithm,)k(as)c(fol-)-161 +6818 y(lo)-5 b(ws.)114 b(Figure)69 b(4)f(presen)-5 b(ts)70 +b(a)e(sample)i(graph)f(with)f(16)g(v)-5 b(er-)-161 7017 +y(tices)83 b(and)g(14)g(edges,)90 b(where)82 b(the)h(degree)f(of)g(a)h +(v)-5 b(ertex)82 b(is)-161 7216 y(sho)-5 b(wn)67 b(b)5 +b(esides)66 b(eac)-5 b(h)65 b(v)-5 b(ertex.)102 b(Initially)-14 +b(,)68 b(all)e(v)-5 b(ertices)64 b(with)-161 7415 y(degree)76 +b(1)h(are)f(added)h(to)e(a)i(queue)f Ft(Q)p Fy(.)137 +b(F)-14 b(or)76 b(the)g(example)-161 7615 y(sho)-5 b(wn)82 +b(in)e(Figure)g(4\(a\),)86 b Ft(Q)h Fy(=)g Fx(f)p Fy(14)p +Ft(;)28 b Fy(15)p Ft(;)g Fy(9)p Ft(;)g Fy(10)p Ft(;)g +Fy(0)p Ft(;)g Fy(1)p Ft(;)g Fy(11)p Ft(;)g Fy(12)p Fx(g)-161 +7814 y Fy(after)72 b(the)g(initialization)h(step.)126 +b(This)73 b(initialization)g(tak)-5 b(es)-161 8013 y +Ft(O)5 b Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))68 b(time,)k(b)5 +b(ecause)68 b(w)-5 b(e)68 b(need)h(to)e(c)-5 b(hec)g(k)69 +b(the)f(degree)g(of)-161 8212 y(eac)-5 b(h)56 b(v)-5 +b(ertex)54 b(from)i Ft(V)36 b Fy(.)5 8423 y(Next,)46 +b(w)-5 b(e)44 b(remo)-5 b(v)g(e)45 b(one)f(v)-5 b(ertex)44 +b Ft(v)50 b Fy(from)45 b(the)f(queue,)i(decre-)-161 8622 +y(men)-5 b(t)56 b(its)e(degree)h(and)g(the)g(degree)f(of)h(v)-5 +b(ertices)54 b(with)h(degree)-161 8821 y(greater)i(than)h(0)f(in)h(the) +f(adjacen)-5 b(t)58 b(list)g(of)f Ft(v)6 b Fy(,)58 b(as)h(depicted)e +(in)-161 9020 y(Figure)j(4\(b\))e(for)h Ft(v)g Fy(=)52 +b(14.)85 b(A)-5 b(t)59 b(this)g(p)5 b(oin)-5 b(t,)61 +b(the)d(adjacencies)-161 9220 y(of)c Ft(v)60 b Fy(with)53 +b(degree)h(1)f(are)h(inserted)g(in)-5 b(to)54 b(the)f(queue,)h(suc)-5 +b(h)55 b(as)-161 9419 y(v)-5 b(ertex)46 b(13)h(in)h(Figure)f(4\(c\).)70 +b(This)48 b(pro)5 b(cess)48 b(is)f(rep)5 b(eated)47 b(un)-5 +b(til)-161 9618 y(the)64 b(queue)g(b)5 b(ecomes)64 b(empt)-5 +b(y)-14 b(.)101 b(All)64 b(v)-5 b(ertices)63 b(with)h(degree)g(0)-161 +9817 y(are)50 b(non)g(critical)f(v)-5 b(ertices)49 b(and)h(the)f +(others)h(are)f(critical)g(v)-5 b(er-)-161 10017 y(tices,)75 +b(as)c(depicted)f(in)h(Figure)g(4\(d\).)119 b(This)71 +b(pro)5 b(cess)71 b(tak)-5 b(es)-161 10216 y Ft(O)5 b +Fy(\()p Fx(j)p Ft(V)179 10241 y Fr(ncr)t(it)490 10216 +y Fx(j)p Fy(\),)46 b(b)5 b(ecause)43 b(eac)-5 b(h)43 +b(non)g(critical)g(v)-5 b(ertex)42 b(is)i(remo)-5 b(v)g(ed)-161 +10415 y(from)56 b(the)f(queue)g(only)g(once.)4302 4174 +y(Finally)-14 b(,)79 b(to)73 b(determine)h(the)f(v)-5 +b(ertices)73 b(in)g Ft(V)7168 4199 y Fr(scr)t(it)7534 +4174 y Fy(w)-5 b(e)74 b(col-)4136 4373 y(lect)f(all)i(v)-5 +b(ertices)73 b Ft(v)84 b Fx(2)77 b Ft(V)5786 4398 y Fr(cr)t(it)6090 +4373 y Fy(with)d(at)f(least)h(one)g(v)-5 b(ertex)73 b +Ft(u)4136 4572 y Fy(that)56 b(is)h(in)g(Adj\()p Ft(v)6 +b Fy(\))56 b(and)h(in)g Ft(V)6016 4597 y Fr(ncr)t(it)6328 +4572 y Fy(,)g(as)g(the)f(v)-5 b(ertex)56 b(5)g(in)h(Fig-)4136 +4772 y(ure)72 b(4\(d\).)123 b(This)73 b(pro)5 b(cess)73 +b(tak)-5 b(es)72 b Ft(O)5 b Fy(\()p Fx(j)p Ft(V)6687 +4797 y Fr(cr)t(it)6915 4772 y Fx(j)p Fy(\).)124 b(Considering)4136 +4971 y(that)80 b Fx(j)p Ft(V)4664 4996 y Fr(cr)t(it)4894 +4971 y Fx(j)87 b(\024)h(j)p Ft(V)37 b Fx(j)p Fy(,)87 +b Fx(j)p Ft(V)5746 4996 y Fr(ncr)t(it)6058 4971 y Fx(j)g(\024)h(j)p +Ft(V)37 b Fx(j)80 b Fy(and)h Fx(j)p Ft(V)37 b Fx(j)88 +b Fy(=)f Ft(n)p Fy(,)g(the)4136 5170 y(ordering)56 b(step)g(tak)-5 +b(es)55 b Ft(O)5 b Fy(\()p Ft(n)p Fy(\))53 b(time.)4136 +5687 y Fi(5.3)225 b(Searc)-6 b(hing)73 b(Step)4136 6011 +y Fy(The)54 b(pro)5 b(cedure)54 b(Searc)-5 b(hing)55 +b(\()p Ft(G)p Fy(,)f Ft(G)6424 6036 y Fr(cr)t(it)6653 +6011 y Fy(,)g Ft(G)6884 6036 y Fr(ncr)t(it)7196 6011 +y Fy(,)h Ft(g)6 b Fy(\))53 b(receiv)-5 b(es)4136 6210 +y(as)69 b(input)f Ft(G)p Fy(,)i Ft(G)5186 6235 y Fr(cr)t(it)5416 +6210 y Fy(,)h Ft(G)5664 6235 y Fr(ncr)t(it)6043 6210 +y Fy(and)d(\014nds)h(a)f(log)7154 6251 y Fn(2)7256 6210 +y Fx(j)p Ft(V)37 b Fx(j)45 b Fy(+)g(1)68 b(bit)4136 6410 +y(v)-9 b(alue)78 b(for)g(eac)-5 b(h)79 b(v)-5 b(ertex)77 +b Ft(v)91 b Fx(2)84 b Ft(V)37 b Fy(,)84 b(stored)79 b(in)f(the)g(arra) +-5 b(y)79 b Ft(g)6 b Fy(.)4136 6609 y(A)70 b(pseudo)i(co)5 +b(de)69 b(for)i(the)f(searc)-5 b(hing)71 b(step)g(is)g(presen)-5 +b(ted)71 b(in)4136 6808 y(Figure)54 b(5.)74 b(The)53 +b(searc)-5 b(hing)55 b(step)f(is)g(\014rst)g(p)5 b(erformed)53 +b(for)h(the)4136 7007 y(v)-5 b(ertices)55 b(in)h Ft(G)5062 +7032 y Fr(cr)t(it)5347 7007 y Fy(and)g(second)g(for)f(the)g(v)-5 +b(ertices)55 b(in)g Ft(G)7671 7032 y Fr(ncr)t(it)7983 +7007 y Fy(.)4136 7491 y Fq(5.3.1)193 b(Assignmen)-5 b(t)103 +b(of)g(V)-16 b(alues)103 b(to)g(Critical)f(V)-16 b(er-)4720 +7690 y(tices)4136 8014 y Fy(The)76 b(pro)5 b(cedure)76 +b(CriticalV)-14 b(erticesAssignmen)-5 b(t)77 b(\()p Ft(G)p +Fy(,)j Ft(G)7779 8039 y Fr(cr)t(it)8009 8014 y Fy(,)4136 +8214 y Ft(g)6 b Fy(,)70 b(AssignedEdges\))e(receiv)-5 +b(es)66 b Ft(G)g Fy(and)h Ft(G)6822 8239 y Fr(cr)t(it)7118 +8214 y Fy(as)h(input)f(and)4136 8413 y(pro)5 b(duces)64 +b(as)g(output)f(a)h Ft(g)69 b Fy(v)-9 b(alue)63 b(for)g(eac)-5 +b(h)64 b(v)-5 b(ertex)62 b(in)i Ft(G)7826 8438 y Fr(cr)t(it)4136 +8612 y Fy(and)41 b(the)f(AssignedEdges)i(arra)-5 b(y)-14 +b(.)69 b(Suc)-5 b(h)41 b(arra)-5 b(y)41 b(has)g Ft(m)f +Fy(en)-5 b(tries)4136 8812 y(and)42 b(indicates)f(the)g(edges)g(for)g +(whic)-5 b(h)42 b(a)f(v)-9 b(alue)41 b Ft(h)p Fy(\()p +Ft(e)p Fy(\))k Fx(2)h Fy([0)p Ft(;)28 b(m)8 b Fx(\000)4136 +9011 y Fy(1],)83 b Ft(e)g Fx(2)f Ft(E)4870 9036 y Fr(cr)t(it)5100 +9011 y Fy(,)h(has)78 b(already)f(b)5 b(een)77 b(assigned.)141 +b(W)-14 b(e)76 b(use)i(a)4136 9210 y(breadth-\014rst)55 +b(searc)-5 b(h)54 b(algorithm)g(to)f(assign)i(v)-9 b(alues)54 +b(to)f(eac)-5 b(h)4136 9409 y(v)g(ertex)50 b(in)i Ft(G)4956 +9434 y Fr(cr)t(it)5185 9409 y Fy(.)73 b(The)51 b(reason)h(w)-5 +b(e)51 b(start)g(the)f(assignmen)-5 b(t)53 b(of)4136 +9609 y(v)-9 b(alues)67 b(to)f(v)-5 b(ertices)67 b(in)g +Ft(G)5805 9634 y Fr(cr)t(it)6101 9609 y Fy(is)h(to)e(resolv)-5 +b(e)67 b(reassignmen)-5 b(ts)4136 9808 y(as)81 b(earlier)e(as)i(p)5 +b(ossible.)148 b(The)80 b(reassignmen)-5 b(t)82 b(problem)e(is)4136 +10007 y(illustrated)56 b(in)g(the)f(next)f(paragraph.)4302 +10216 y(Considering)39 b(the)d(subgraph)j Ft(G)6300 10241 +y Fr(cr)t(it)6567 10216 y Fy(in)e(Figure)h(4\(d\),)i(a)d(step)4136 +10415 y(b)-5 b(y)47 b(step)g(example)g(of)g(the)g(assignmen)-5 +b(t)48 b(of)f(v)-9 b(alues)47 b(to)f(v)-5 b(ertices)3906 +10913 y(6)p eop end +%%Page: 7 7 +TeXDict begin 7 6 bop -140 2644 a + currentpoint currentpoint translate 0.9 0.9 scale neg exch neg exch +translate + -140 2644 a -140 210 +a + 35851059 9604136 0 0 35851059 9604136 startTexFig + -140 210 a +%%BeginDocument: figs/grafordering.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafordering.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Thu Sep 16 10:11:08 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 545 146 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.827 0.827 0.827 srgb} bind def + +end +save +newpath 0 146 moveto 0 0 lineto 545 0 lineto 545 146 lineto closepath clip newpath +-21.7 329.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n 1080.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +540 4545 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1170 4590 m +gs 1 -1 sc (d:1) col0 sh gr +% Arc +n 967.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 3240.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2700 4545 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3330 4590 m +gs 1 -1 sc (d:1) col0 sh gr +% Arc +n 3127.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 3261.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 4257.7 5095.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 4628.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 4406.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 3189.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 3427.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 2865.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 3732.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 3905.2 4770.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 4146.1 4098.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 3804.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +% Arc +n 3983.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3041 5079 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +2679 4173 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3040 3711 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3288 3452 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3595 3393 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3939 3487 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +4379 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +4447 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4377 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4047 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3715 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3402 5214 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3715 4589 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +3721 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +2520 3105 m +gs 1 -1 sc (b\)) col0 sh gr +% Arc +n 5400.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4860 4545 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5490 4590 m +gs 1 -1 sc (d:1) col0 sh gr +% Arc +n 5287.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 5421.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 6417.7 5095.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 6788.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 6566.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 5349.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 5587.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 5025.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 5892.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 6065.2 4770.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 6306.1 4098.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 6143.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 5964.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5201 5079 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +4839 4173 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5200 3711 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5448 3452 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5755 3393 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +6099 3487 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +6539 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +6607 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6537 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6207 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +5875 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +5562 5214 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5875 4589 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +5881 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +4680 3105 m +gs 1 -1 sc (c\)) col0 sh gr +% Arc +n 1101.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 2097.7 5095.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 2468.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 2246.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 1029.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 1267.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 705.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 1572.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 1745.2 4770.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 1986.1 4098.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 1823.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 1644.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +% Arc +n 7581.4 7433.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 8577.7 5095.8 515.7 -82.9475 -161.3616 arcn +gs col0 s gr + +% Arc +n 8948.4 2710.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 8726.5 5574.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 7509.0 4028.5 221.5 161.4436 -108.9703 arc +gs col0 s gr + +% Arc +n 7747.9 4718.1 254.1 74.4524 162.8718 arc +gs col0 s gr + +% Arc +n 7185.0 3652.5 493.8 76.6530 -4.9378 arcn +gs col0 s gr + +% Arc +n 8052.5 3191.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 8225.2 4770.6 216.0 117.0515 14.8509 arcn +gs col0 s gr + +% Arc +n 8466.1 4098.9 234.3 26.3682 -62.5758 arcn +gs col0 s gr + +% Arc +n 8303.4 4628.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 8124.0 3752.8 257.8 -113.3026 -33.1006 arc +gs col0 s gr + +% Arc +n 7447.5 4252.5 271.9 114.4440 24.4440 arcn +gs col0 s gr + +% Arc +n 7560.0 4899.4 792.0 -47.0146 -106.5044 arcn +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +881 5079 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +519 4173 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +880 3711 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1128 3452 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1435 3393 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1779 3487 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +2219 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +2287 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +2217 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +1887 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +1555 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +1242 5214 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1561 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +360 3105 m +gs 1 -1 sc (a\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +1550 4590 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +7361 5079 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +6999 4173 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7360 3711 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7608 3452 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7915 3393 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8259 3487 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8699 3966 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +8767 4261 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +8697 4566 m +gs 1 -1 sc (d:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +8367 5115 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +8035 5220 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +7722 5214 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8035 4589 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +8041 3847 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +6840 3105 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +7020 4545 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7650 4590 m +gs 1 -1 sc (d:0) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 967 3847 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +892 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 1215 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1140 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 1642 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1605 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 1642 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1605 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 2160 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2122 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 2092 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2055 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 1957 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1920 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 1642 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1605 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 1327 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1290 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 1012 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +937 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 832 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +757 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 2092 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2055 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 1867 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1830 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 1530 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1492 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 1217 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1142 4401 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 851 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +776 4551 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +0 slj +0 slc +n 810 2970 m 990 2970 l 990 3150 l 810 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +825 3112 m +gs 1 -1 sc (14) col0 sh gr +% Polyline +n 990 2970 m 1170 2970 l 1170 3150 l 990 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1005 3112 m +gs 1 -1 sc (15) col0 sh gr +% Polyline +n 1170 2970 m 1350 2970 l 1350 3150 l 1170 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1222 3112 m +gs 1 -1 sc (9) col0 sh gr +% Polyline +n 1350 2970 m 1530 2970 l 1530 3150 l 1350 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1365 3112 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 1530 2970 m 1710 2970 l 1710 3150 l 1530 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1582 3112 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 1710 2970 m 1890 2970 l 1890 3150 l 1710 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1762 3112 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1890 2970 m 2070 2970 l 2070 3150 l 1890 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1905 3112 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 2070 2970 m 2250 2970 l 2250 3150 l 2070 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2085 3112 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +585 3105 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 3375 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3300 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 3802 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3765 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 3802 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3765 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 4320 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4282 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 4252 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4215 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 4117 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4080 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 3802 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3765 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3487 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3450 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 3172 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3097 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 2992 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2917 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 4252 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4215 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 4027 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3990 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 3690 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3652 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 3127 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3052 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 3377 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3302 4401 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 3011 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2936 4551 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 3150 2970 m 3330 2970 l 3330 3150 l 3150 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3202 3112 m +gs 1 -1 sc (9) col0 sh gr +% Polyline +n 3510 2970 m 3690 2970 l 3690 3150 l 3510 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3562 3112 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 3690 2970 m 3870 2970 l 3870 3150 l 3690 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3742 3112 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 3330 2970 m 3510 2970 l 3510 3150 l 3330 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3345 3112 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 2967 2970 m 3147 2970 l 3147 3150 l 2967 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2982 3112 m +gs 1 -1 sc (15) col0 sh gr +% Polyline +n 3870 2970 m 4050 2970 l 4050 3150 l 3870 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3885 3112 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 4050 2970 m 4230 2970 l 4230 3150 l 4050 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4065 3112 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +2790 3105 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 5962 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5925 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 5962 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5925 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 6480 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6442 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 6412 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6375 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 6277 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6240 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 5962 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5925 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5647 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5610 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 5332 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5257 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 5152 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5077 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 6412 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6375 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 6187 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6150 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 5850 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5812 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5287 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5212 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 5535 3577 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5460 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 5537 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5462 4401 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 5171 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5096 4551 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 5133 2970 m 5313 2970 l 5313 3150 l 5133 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5185 3112 m +gs 1 -1 sc (9) col0 sh gr +% Polyline +n 5493 2970 m 5673 2970 l 5673 3150 l 5493 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5545 3112 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 5673 2970 m 5853 2970 l 5853 3150 l 5673 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5725 3112 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 5310 2970 m 5490 2970 l 5490 3150 l 5310 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5325 3112 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 6210 2970 m 6390 2970 l 6390 3150 l 6210 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6225 3112 m +gs 1 -1 sc (13) col0 sh gr +% Polyline +n 5850 2970 m 6030 2970 l 6030 3150 l 5850 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +5865 3112 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 6030 2970 m 6210 2970 l 6210 3150 l 6030 3150 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6045 3112 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +4950 3105 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 8122 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8085 4035 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 8122 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8085 4395 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 8640 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8602 4260 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 8572 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8535 4575 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 8437 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8400 4935 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 8122 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8085 5025 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 8572 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8535 3937 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 7447 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7372 3900 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 7492 4837 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7417 4890 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 7807 4972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7770 5025 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 8347 3622 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8310 3675 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 7312 4117 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7237 4170 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 8010 3532 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7972 3585 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 7695 3577 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7620 3630 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 7961 3026 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +% Polyline +n 7979 2966 m + 7942 3087 l gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +7734 3072 m +gs 1 -1 sc (Q) col0 sh gr +% Ellipse +n 7331 4498 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7256 4551 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 7697 4348 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7622 4401 m +gs 1 -1 sc (12) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + -140 2644 a + currentpoint currentpoint translate 1 0.9 div 1 0.9 div scale neg +exch neg exch translate + -140 2644 a 1536 3033 a Fy(Figure)56 b(4:)74 +b(Ordering)56 b(step)f(for)g(a)h(graph)f(with)h(16)f(v)-5 +b(ertices)55 b(and)h(14)f(edges.)p -169 3437 9 103 v +-169 3343 103 9 v -66 3343 8027 9 v 7961 3343 103 9 v +8056 3437 9 103 v -169 3594 9 150 v 8055 3594 V -72 3549 +a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)82 b Fu(S)6 +b(e)g(a)g(r)g(c)g(h)g(i)g(n)g(g)92 b(\()16 b Fk(G)32 +b Fu(,)83 b Fk(G)1993 3566 y Fj(cr)s(it)2243 3549 y Fu(,)g +Fk(G)2489 3566 y Fj(ncr)s(it)2815 3549 y Fu(,)g Fk(g)15 +b Fu(\))p -169 3751 V 8055 3751 V 180 3706 a(C)8 b(r)g(i)g(t)g(i)g(c)g +(a)g(l)g(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e) +g(n)g(t)99 b(\()16 b Fk(G)32 b Fu(,)83 b Fk(G)2784 3723 +y Fj(cr)s(it)3034 3706 y Fu(,)g Fk(g)38 b Fu(,)85 b(A)s(s)s(s)s(i)s(g)s +(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b(\))i(;)p -169 3908 +V 8055 3908 V 177 3863 a(N)6 b(o)g(n)g(C)g(r)g(i)g(t)g(i)g(c)g(a)g(l)g +(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t) +95 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(G)3022 3880 y Fj(ncr)s(it)3348 +3863 y Fu(,)i(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)20 +b(,)94 b Fk(g)24 b Fu(\))19 b(;)p -169 4011 9 103 v -168 +4011 103 9 v -66 4011 8027 9 v 7961 4011 103 9 v 8056 +4011 9 103 v 2098 4433 a Fy(Figure)56 b(5:)74 b(Pseudo)56 +b(co)5 b(de)55 b(for)g(the)g(searc)-5 b(hing)57 b(algorithm.)1352 +6119 y + currentpoint currentpoint translate 0.9 0.9 scale neg exch neg exch +translate + 1352 6119 a 1352 4503 a + 22760488 6380830 0 0 22760488 6380830 startTexFig + 1352 4503 a +%%BeginDocument: figs/grafsearching.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearching.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Thu Sep 16 08:20:14 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 346 97 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.827 0.827 0.827 srgb} bind def + +end +save +newpath 0 97 moveto 0 0 lineto 346 0 lineto 346 97 lineto closepath clip newpath +-21.7 275.9 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n 194.4 6671.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 1190.7 4333.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 1561.4 1948.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 1339.5 4812.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 665.5 2429.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 838.2 4008.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 1079.1 3336.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 916.4 3866.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 1544.4 6668.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 2540.7 4330.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 2911.4 1945.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 2689.5 4809.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 2015.5 2426.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 2188.2 4005.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 2429.1 3333.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 2266.4 3863.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 2984.4 6668.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 3980.7 4330.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 4351.4 1945.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 4129.5 4809.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 3455.5 2426.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 3628.2 4005.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 3869.1 3333.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 3706.4 3863.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +% Arc +n 4424.4 6668.6 3106.8 -79.8849 -70.0581 arc +gs col0 s gr + +% Arc +n 5420.7 4330.8 515.7 -82.9474 -161.3614 arcn +gs col0 s gr + +% Arc +n 5791.4 1945.5 1523.8 122.6173 101.6375 arcn +gs col0 s gr + +% Arc +n 5569.5 4809.3 1690.2 -110.7749 -95.1769 arc +gs col0 s gr + +% Arc +n 4895.5 2426.9 1187.9 84.8566 58.3400 arcn +gs col0 s gr + +% Arc +n 5068.2 4005.6 216.0 117.0512 14.8508 arcn +gs col0 s gr + +% Arc +n 5309.1 3333.9 234.3 26.3681 -62.5756 arcn +gs col0 s gr + +% Arc +n 5146.4 3863.7 295.7 62.0596 -20.7416 arcn +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +360 3105 m +gs 1 -1 sc (a\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +398 3647 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +2660 3801 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +1748 3644 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +2250 3780 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 142.88 scf sf +2250 3555 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 142.88 scf sf +2745 3465 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +1710 3102 m +gs 1 -1 sc (b\)) col0 sh gr +/Times-Roman ff 174.63 scf sf +3150 3102 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +4100 3801 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3188 3644 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 3780 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 3555 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 142.88 scf sf +3195 4275 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 142.88 scf sf +3915 4320 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4050 4050 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 4365 m +gs 1 -1 sc (7) col0 sh gr +/Times-Roman ff 142.88 scf sf +3465 4005 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +4185 3465 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 174.63 scf sf +4590 3102 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 142.88 scf sf +5610 3496 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 142.88 scf sf +5540 3801 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 142.88 scf sf +4628 3644 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5130 3780 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 142.88 scf sf +5130 3555 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 142.88 scf sf +4635 4275 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 142.88 scf sf +5355 4320 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +5490 4050 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 142.88 scf sf +5130 4365 m +gs 1 -1 sc (7) col0 sh gr +/Times-Roman ff 142.88 scf sf +4905 4005 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +5580 3330 m +gs 1 -1 sc (8) col0 sh gr +/Times-Roman ff 142.88 scf sf +5310 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +4635 3285 m +gs 1 -1 sc (g:7) col0 sh gr +/Times-Roman ff 142.88 scf sf +5085 3105 m +gs 1 -1 sc (13) col0 sh gr +/Times-Roman ff 142.88 scf sf +5265 3330 m +gs 1 -1 sc (9) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 735 3220 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +698 3273 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 735 3580 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +698 3633 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 1253 3445 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1215 3498 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 1185 3760 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1148 3813 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 1050 4120 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1013 4173 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 735 4210 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +698 4263 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 1185 3122 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1148 3175 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 2085 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2048 3270 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 2085 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2048 3630 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 2603 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2565 3495 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 2535 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2498 3810 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 2400 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2363 4170 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 2085 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2048 4260 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 2535 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2498 3172 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 3525 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3488 3270 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 3525 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3488 3630 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 4043 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4005 3495 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 3975 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3938 3810 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 3840 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3803 4170 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 3525 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3488 4260 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3975 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3938 3172 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 4965 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4928 3270 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 4965 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4928 3630 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 5483 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5445 3495 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 5415 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5378 3810 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 5280 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5243 4170 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 4965 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4928 4260 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5415 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5378 3172 m +gs 1 -1 sc (2) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + 1352 6119 a + currentpoint currentpoint translate 1 0.9 div 1 0.9 div scale neg +exch neg exch translate + 1352 6119 a 2001 6509 a Fy(Figure)f(6:)74 +b(Example)56 b(of)f(the)g(critical)g(v)-5 b(ertices)55 +b(assignmen)-5 b(t.)-161 7039 y(in)63 b Ft(G)171 7064 +y Fr(cr)t(it)464 7039 y Fy(is)g(presen)-5 b(ted)63 b(in)g(Figure)h(6.) +96 b(Initially)-14 b(,)65 b(a)d(v)-5 b(ertex)62 b Ft(v)-161 +7238 y Fy(is)52 b(c)-5 b(hosen)52 b(c)-5 b(hosen)52 b(and)f(the)g +(assignmen)-5 b(t)52 b Ft(g)6 b Fy(\()p Ft(v)g Fy(\))46 +b(=)g(0)51 b(is)h(made.)-161 7438 y(F)-14 b(or)69 b(example,)j(supp)5 +b(ose)69 b(that)f(v)-5 b(ertex)67 b(5)h(in)g(Figure)h(6\(a\))f(is)-161 +7637 y(c)-5 b(hosen)64 b(and)e(the)g(assignmen)-5 b(t)64 +b Ft(g)6 b Fy(\(5\))57 b(=)h(0)k(is)h(made.)95 b(In)62 +b(Fig-)-161 7836 y(ure)51 b(6\(b\),)h(follo)-5 b(wing)51 +b(the)g(adjacen)-5 b(t)50 b(list)h(of)g(v)-5 b(ertex)50 +b(5,)h Ft(g)6 b Fy(\(6\))51 b(is)-161 8035 y(set)65 b(to)f(1)h(and)g +Ft(g)6 b Fy(\(4\))64 b(is)i(set)e(to)h(2,)i(implying)e(that)g +(addresses)-161 8235 y(1)70 b(and)g(2)g(m)-5 b(ust)70 +b(b)5 b(e)70 b(assigned)h(to)e(edges)h Fx(f)p Fy(5)p +Ft(;)28 b Fy(6)p Fx(g)69 b Fy(and)h Fx(f)p Fy(5)p Ft(;)28 +b Fy(4)p Fx(g)p Fy(,)-161 8434 y(resp)5 b(ectiv)-5 b(ely)-14 +b(.)85 b(A)-5 b(t)59 b(the)f(same)i(time,)g(addresses)h(1)f(and)f(2)g +(are)-161 8633 y(added)48 b(to)e(the)g(list)h(of)g(AssignedEdges.)72 +b(In)47 b(Figure)h(6\(c\),)f(fol-)-161 8832 y(lo)-5 b(wing)49 +b(the)d(adjacen)-5 b(t)48 b(list)f(of)g(v)-5 b(ertex)47 +b(6,)i Ft(g)6 b Fy(\(7\))46 b(is)i(set)f(to)g(3)h(and)-161 +9032 y Ft(g)6 b Fy(\(8\))41 b(is)g(set)g(to)g(4,)j(implying)e(that)e +(addresses)j(4,)h(5)d(and)g(7)g(m)-5 b(ust)-161 9231 +y(b)5 b(e)66 b(assigned)h(to)e(edges)h Fx(f)p Fy(6)p +Ft(;)28 b Fy(7)p Fx(g)p Fy(,)68 b Fx(f)p Fy(6)p Ft(;)28 +b Fy(8)p Fx(g)65 b Fy(and)h Fx(f)p Fy(7)p Ft(;)28 b Fy(8)p +Fx(g)p Fy(,)68 b(resp)5 b(ec-)-161 9430 y(tiv)-5 b(ely)-14 +b(.)104 b(Finally)-14 b(,)68 b(in)e(Figure)g(6\(d\),)h(follo)-5 +b(wing)66 b(the)f(adjacen)-5 b(t)-161 9629 y(list)64 +b(of)g(v)-5 b(ertex)62 b(4,)k Ft(g)6 b Fy(\(2\))63 b(cannot)g(b)5 +b(e)63 b(assigned)i(to)f(5)f(b)5 b(ecause)-161 9829 y(the)61 +b(sum)h Ft(g)6 b Fy(\(2\))40 b(+)g Ft(g)6 b Fy(\(4\))60 +b(w)-5 b(ould)62 b(cause)f(a)g(reassignmen)-5 b(t)62 +b(with)-161 10028 y(the)70 b(already)g(assigned)h(address)h(7)e(to)f +(edge)h Fx(f)p Fy(7)p Ft(;)28 b Fy(8)p Fx(g)p Fy(,)74 +b(so)d(the)-161 10227 y(next)76 b Ft(g)83 b Fy(v)-9 b(alue)77 +b(6)g(is)g(used)h(instead,)k(and)c(the)e(assignmen)-5 +b(ts)4136 7039 y Ft(g)6 b Fy(\(2\))74 b(=)h(6)d(and)h +Ft(g)6 b Fy(\(3\))74 b(=)h(7)e(are)f(made,)77 b(implying)d(that)e(ad-) +4136 7238 y(dresses)67 b(8,)h(9)d(and)h(13)f(m)-5 b(ust)67 +b(b)5 b(e)65 b(assigned)i(to)d(edges)i Fx(f)p Fy(4)p +Ft(;)28 b Fy(2)p Fx(g)p Fy(,)4136 7438 y Fx(f)p Fy(4)p +Ft(;)g Fy(3)p Fx(g)63 b Fy(and)h Fx(f)p Fy(2)p Ft(;)28 +b Fy(3)p Fx(g)p Fy(,)65 b(resp)5 b(ectiv)-5 b(ely)-14 +b(.)97 b(This)64 b(\014nishes)h(the)e(algo-)4136 7637 +y(rithm)56 b(with)f(AssignedEdges)48 b(=)e Fx(f)p Fy(1)p +Ft(;)28 b Fy(2)p Ft(;)g Fy(4)p Ft(;)g Fy(5)p Ft(;)g Fy(7)p +Ft(;)g Fy(8)p Ft(;)g Fy(9)p Ft(;)g Fy(13)p Fx(g)p Fy(.)4302 +7847 y(A)61 b(pseudo)g(co)5 b(de)61 b(for)f(the)h(assignmen)-5 +b(t)62 b(of)f(v)-9 b(alues)61 b(to)f(crit-)4136 8047 +y(ical)80 b(v)-5 b(ertices)79 b(is)h(presen)-5 b(ted)80 +b(in)g(Figure)g(7.)146 b(F)-14 b(or)80 b(all)g(edges)4136 +8246 y Ft(e)61 b Fy(=)g Fx(f)p Ft(u;)28 b(w)t Fx(g)62 +b(2)e Ft(E)10 b Fy(,)66 b Ft(g)6 b Fy(\()p Ft(u)p Fy(\))42 +b(+)h Ft(g)6 b Fy(\()p Ft(w)t Fy(\))64 b(m)-5 b(ust)65 +b(b)5 b(e)64 b(unique.)101 b(If)64 b(this)4136 8445 y(constrain)-5 +b(t)73 b(is)f(not)g(forced)f(then)h(t)-5 b(w)g(o)72 b(di\013eren)-5 +b(t)72 b(k)-5 b(eys)72 b(from)4136 8644 y Ft(S)94 b Fy(will)84 +b(b)5 b(e)84 b(mapp)5 b(ed)85 b(in)f(the)g(same)g(hash)i(table)d(lo)5 +b(cation.)4136 8844 y(Th)-5 b(us,)80 b(the)73 b(AssignedEdges)i(arra)-5 +b(y)74 b(is)g(used)h(to)e(force)g(that)4136 9043 y Ft(g)6 +b Fy(\()p Ft(u)p Fy(\))17 b(+)g Ft(g)6 b Fy(\()p Ft(w)t +Fy(\))46 b(will)g(b)5 b(e)45 b(distinct)h(for)f(all)h(edges)g(in)g +Ft(E)10 b Fy(,)47 b(as)f(sho)-5 b(wn)4136 9242 y(in)64 +b(line)h(18)f(of)f(Figure)i(7.)99 b(The)64 b(v)-9 b(ariable)64 +b(Nextg)e(represen)-5 b(ts)4136 9441 y Ft(g)6 b Fy(\()p +Ft(u)p Fy(\).)4302 9652 y(No)-5 b(w)91 b(w)-5 b(e)92 +b(de\014ne)g(certain)f(complexit)-5 b(y)91 b(measures)h(used)4136 +9851 y(hereinafter:)4256 10216 y(1.)83 b(Let)62 b Ft(I)13 +b Fy(\()p Ft(u)p Fy(\))63 b(b)5 b(e)62 b(the)h(n)-5 b(um)g(b)5 +b(er)64 b(of)f(iterations)g(o)5 b(ccurred)63 b(in)4468 +10415 y(the)79 b(rep)5 b(eat-un)-5 b(til)78 b(lo)5 b(op)79 +b(from)g(line)g(13)g(un)-5 b(til)79 b(line)g(19,)4468 +10615 y(when)56 b(v)-5 b(ertex)54 b Ft(u)h Fy(is)h(assigned.)3906 +10913 y(7)p eop end +%%Page: 8 8 +TeXDict begin 8 7 bop -169 626 9 103 v -169 532 103 9 +v -66 532 8027 9 v 7961 532 103 9 v 8056 626 9 103 v +-169 783 9 150 v 8055 783 V -72 738 a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g +(r)g(e)84 b Fu(C)8 b(r)g(i)g(t)g(i)g(c)g(a)g(l)g(V)g(e)g(r)g(t)g(i)g(c) +g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t)27 b(\()9 +b Fk(G)33 b Fu(,)83 b Fk(G)3259 755 y Fj(cr)s(it)3508 +738 y Fu(,)g Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d) +s(g)s(e)s(s)8 b(\))p -169 940 V 8055 940 V -56 895 a(1)314 +b Fl(f)5 b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)1003 912 +y Fj(cr)s(it)1290 895 y Fl(d)-9 b(o)69 b Fk(g)5 b Fu(\()p +Fk(v)g Fu(\))72 b(:)10 b(=)73 b Ff(\0001)18 b Fu(;)p +-169 1097 V 8055 1097 V -56 1052 a(2)314 b Fl(f)5 b(o)g(r)104 +b Fu(i)92 b(:)12 b(=)75 b(0)g Fl(to)80 b Fk(m)34 b Ff(\000)h +Fu(1)69 b Fl(d)-9 b(o)73 b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s +(g)s(e)s(s)16 b([)37 b(i)28 b(])71 b(=)82 b Fl(f)9 b(a)g(l)g(s)g(e)29 +b Fu(;)p -169 1246 V 8055 1246 V -56 1201 a(3)314 b Fl(f)5 +b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)1003 1218 y Fj(cr)s(it)1290 +1201 y Fl(d)-9 b(o)p -169 1403 V 8055 1403 V -56 1358 +a Fu(4)564 b Fl(i)18 b(f)98 b Fk(g)5 b Fu(\()p Fk(v)g +Fu(\))59 b(=)g Ff(\0001)73 b Fl(t)-6 b(h)g(e)g(n)84 b +Fu(t)10 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s)91 b(\()15 +b Fk(G)33 b Fu(,)83 b Fk(v)37 b Fu(,)83 b Fk(G)3732 1375 +y Fj(cr)s(it)3981 1358 y Fu(,)g Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s +(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b(\))i(;)p -169 1553 +V 8055 1553 V -169 1710 V 8055 1710 V -72 1665 a Fl(p)-6 +b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)86 b Fu(t)10 b(r)g(a)g(v)g(e)g(r)g(s)g +(e)g(B)g(f)g(s)91 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(v)37 +b Fu(,)83 b Fk(G)2390 1682 y Fj(cr)s(it)2639 1665 y Fu(,)g +Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)8 +b(\))p -169 1859 V 8055 1859 V -56 1814 a(5)387 b(N)o(e)o(x)o(t)o(g)76 +b(:)13 b(=)77 b(0)13 b(;)p -169 2016 V 8055 2016 V -56 +1971 a(6)387 b Fk(g)5 b Fu(\()p Fk(v)g Fu(\))72 b(:)10 +b(=)72 b(N)o(e)o(x)o(t)o(g)18 b(;)p -169 2173 V 8055 +2173 V -56 2128 a(7)380 b(E)-8 b(n)g(Q)g(u)g(e)g(u)g(e)77 +b(\()15 b Fk(v)37 b Fu(,)83 b Fk(Q)19 b Fu(\))g(;)p -169 +2330 V 8055 2330 V -56 2285 a(8)386 b Fl(w)n(h)n(i)n(l)n(e)79 +b Fk(Q)43 b Ff(6)p Fu(=)g Ff(;)69 b Fl(d)-9 b(o)p -169 +2487 V 8055 2487 V -56 2442 a Fu(9)625 b Fk(v)77 b Fu(:)10 +b(=)65 b(D)-7 b(e)g(Q)g(u)g(e)g(u)g(e)76 b(\()15 b Fk(Q)k +Fu(\))g(;)p -169 2644 V 8055 2644 V -58 2599 a(1)8 b(0)547 +b Fl(f)5 b(o)g(r)86 b Fk(u)43 b Ff(2)g Fu(Adj)35 b(\()p +Fk(v)5 b Fu(\))67 b Fl(a)-11 b(n)g(d)68 b Fk(g)5 b Fu(\()p +Fk(u)p Fu(\))59 b(=)g Ff(\0001)70 b Fl(d)-9 b(o)p -169 +2800 V 8055 2800 V -58 2756 a Fu(1)8 b(1)707 b(A)8 b(s)g(s)g(i)g(g)g(n) +g(e)g(d)g(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)72 b(:)10 b(=)73 +b Ff(;)18 b Fu(;)p -169 2957 V 8055 2957 V -58 2913 a(1)8 +b(2)705 b Fl(f)5 b(o)g(r)86 b Fk(w)47 b Ff(2)c Fu(Adj)35 +b(\()p Fk(u)p Fu(\))67 b Fl(a)-11 b(n)g(d)68 b Fk(g)5 +b Fu(\()p Fk(w)t Fu(\))79 b Ff(6)p Fu(=)h Ff(\0001)70 +b Fl(d)-9 b(o)77 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g(t)g +(i)g(c)g(e)g(s)72 b(:)10 b(=)80 b(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g +(e)g(r)g(t)g(i)g(c)g(e)g(s)79 b Ff([)g(f)p Fk(w)t Ff(g)18 +b Fu(;)p -169 3107 V 8055 3107 V -58 3062 a(1)8 b(3)698 +b Fl(r)n(e)n(p)n(e)n(a)n(t)p -169 3256 V 8055 3256 V +-58 3211 a Fu(1)8 b(4)858 b(NoAssignedEdges)76 b(:)10 +b(=)71 b Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 3406 V 8055 +3406 V -58 3361 a(1)8 b(5)857 b(N)o(e)o(x)o(t)o(g)72 +b(:)10 b(=)71 b(N)o(e)o(x)o(t)o(g)e(+)g(1)9 b(;)p -169 +3555 V 8055 3555 V -58 3510 a(1)f(6)864 b Fl(f)5 b(o)g(r)86 +b Fk(w)46 b Ff(2)87 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g +(t)g(i)g(c)g(e)g(s)68 b Fl(a)-11 b(n)g(d)68 b Fu(NoAssignedEdges)62 +b(=)d Fl(t)o(r)o(u)o(e)69 b(d)-9 b(o)p -169 3712 V 8055 +3712 V -58 3667 a Fu(1)8 b(7)1035 b Fl(i)18 b(f)98 b +Fu(\()o(N)o(e)o(x)o(t)o(g)58 b(+)h Fk(g)5 b Fu(\()p Fk(w)t +Fu(\)\))43 b Ff(\025)g Fk(m)73 b Fl(t)-6 b(h)g(e)g(n)74 +b Fu(restart)50 b(mapping)i(step)18 b(;)p -169 3869 V +8055 3869 V -58 3824 a(1)8 b(8)1035 b Fl(i)18 b(f)100 +b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 +b([)g(N)o(e)o(x)o(t)o(g)58 b(+)i Fk(g)5 b Fu(\()p Fk(w)t +Fu(\))10 b(])72 b(=)f Fl(t)o(r)o(u)o(e)i(t)-6 b(h)g(e)g(n)74 +b Fu(NoAssignedEdges)h(:)10 b(=)81 b Fl(f)9 b(a)g(l)g(s)g(e)29 +b Fu(;)p -169 4018 V 8055 4018 V -58 3974 a(1)8 b(9)705 +b Fl(u)5 b(n)g(t)g(i)g(l)87 b Fu(NoAssignedEdges)62 b(=)c +Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 4175 V 8055 4175 V +-58 4130 a(2)8 b(0)700 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))72 +b(:)10 b(=)72 b(N)o(e)o(x)o(t)o(g)21 b(;)95 b Ff(f)14 +b Fe(s)f(e)g(t)101 b(t)9 b(h)g(e)89 b Fk(g)94 b Fe(v)9 +b(a)g(l)g(u)g(e)98 b(t)10 b(o)99 b(v)10 b(e)g(x)g(t)g(e)g(x)88 +b Fk(u)78 b Fe(a)o(n)o(d)i(c)s(h)s(a)s(n)s(g)s(e)h Fk(g)5 +b Fu(\()p Fk(u)p Fu(\))80 b Fe(from)g Ff(\0001)89 b Fe(t)10 +b(o)92 b(N)s(e)s(x)s(t)s(g)s Ff(g)p -169 4332 V 8055 +4332 V -58 4287 a Fu(2)8 b(1)705 b Fl(f)5 b(o)g(r)86 +b Fk(w)47 b Ff(2)87 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g +(t)g(i)g(c)g(e)g(s)70 b Fl(d)-9 b(o)72 b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s +(d)s(E)s(d)s(g)s(e)s(s)17 b([)g(N)o(e)o(x)o(t)o(g)58 +b(+)i Fk(g)5 b Fu(\()p Fk(w)t Fu(\))15 b(])80 b(:)15 +b(=)79 b Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 4489 V 8055 +4489 V -58 4444 a(2)8 b(2)692 b(E)-8 b(n)g(Q)g(u)g(e)g(u)g(e)77 +b(\()16 b Fk(u)32 b Fu(,)83 b Fk(Q)19 b Fu(\))g(;)p -169 +4592 9 103 v -168 4592 103 9 v -66 4592 8027 9 v 7961 +4592 103 9 v 8056 4592 9 103 v 2034 5014 a Fy(Figure)56 +b(7:)74 b(The)55 b(critical)g(v)-5 b(ertices)55 b(assignmen)-5 +b(t)58 b(algorithm.)-41 5544 y(2.)83 b(Let)196 b Ft(N)743 +5569 y Fr(t)999 5544 y Fy(b)5 b(e)196 b(the)g(n)-5 b(um)g(b)5 +b(er)198 b(of)e(times)h(that)171 5743 y(AssignedEdges[)p +Ft(g)6 b Fy(\()p Ft(u)p Fy(\))110 b(+)g Ft(g)6 b Fy(\()p +Ft(w)t Fy(\)])163 b(is)h(true)f(in)h(the)171 5943 y(pro)5 +b(cedure)56 b(CriticalV)-14 b(erticesAssignmen)-5 b(t.)74 +b(Th)-5 b(us,)1045 6511 y Ft(N)1178 6536 y Fr(t)1283 +6511 y Fy(=)1458 6289 y Fo(j)p Fr(V)1575 6306 y Fm(cr)s(it)1788 +6289 y Fo(j)1523 6353 y Fp(X)1519 6705 y Fr(u)p Fn(=1)1827 +6511 y Fy(\()p Ft(I)13 b Fy(\()p Ft(u)p Fy(\))36 b Fx(\000)h +Fy(1\))993 b(\(5\))-161 7141 y Fq(Maximal)64 b(V)-16 +b(alue)63 b(Assigned)i(to)g(An)f(Edge)-161 7473 y Fy(In)56 +b(this)g(section)f(w)-5 b(e)56 b(presen)-5 b(t)55 b(the)g(follo)-5 +b(wing)57 b(conjecture.)-161 7953 y Fq(Conjecture)64 +b(1)83 b Fy(F)-14 b(or)64 b(a)f(random)h(graph)g Ft(G)e +Fy(with)h Fx(j)p Ft(E)3294 7978 y Fr(cr)t(it)3524 7953 +y Fx(j)c Fy(=)-161 8153 y(0)p Ft(:)p Fy(5)p Ft(n)54 b +Fy(and)f Fx(j)p Ft(V)37 b Fx(j)46 b Fy(=)h(1)p Ft(:)p +Fy(15)p Ft(n)p Fy(,)53 b(it)g(is)h(alw)-5 b(a)g(ys)55 +b(p)5 b(ossible)54 b(to)f(generate)-161 8352 y(a)e(MPHF)g(b)5 +b(ecause)50 b(the)h(maximal)g(v)-9 b(alue)50 b Ft(A)2635 +8377 y Fr(max)2959 8352 y Fy(assigned)i(to)-161 8551 +y(an)j(edge)f Ft(e)46 b Fx(2)g Ft(E)849 8576 y Fr(cr)t(it)1132 +8551 y Fy(is)55 b(at)f(most)g Ft(m)34 b Fx(\000)h Fy(1)54 +b(\()p Ft(A)2576 8576 y Fr(max)2902 8551 y Fy(corresp)5 +b(onds)-161 8750 y(to)63 b(the)f(maximal)i(v)-9 b(alue)63 +b(generated)f(b)-5 b(y)63 b(the)g(assignmen)-5 b(t)65 +b(of)-161 8950 y(v)-9 b(alues)56 b(to)f(critical)g(v)-5 +b(ertices)55 b(in)g(Eq.)h(\(3\).\))5 9337 y(Next,)79 +b(w)-5 b(e)75 b(presen)-5 b(t)76 b(t)-5 b(w)g(o)75 b(auxiliary)g +(theorems)h(that)e(will)-161 9536 y(help)56 b(us)g(in)g(the)f +(discussion)j(of)d(Conjecture)f(1.)-161 10017 y Fq(Theorem)63 +b(1)84 b Fy(The)71 b(n)-5 b(um)g(b)5 b(er)72 b(of)f(bac)-5 +b(k)71 b(edges)g Ft(N)3006 10042 y Fr(bedg)t(es)3471 +10017 y Fy(of)f(a)-161 10216 y(random)40 b(graph)g Ft(G)46 +b Fy(=)g Ft(G)1370 10241 y Fr(cr)t(it)1604 10216 y Fx([)t +Ft(G)1850 10241 y Fr(ncr)t(it)2201 10216 y Fy(is)40 b(giv)-5 +b(en)39 b(b)-5 b(y:)66 b Ft(N)3189 10241 y Fr(bedg)t(es)3629 +10216 y Fy(=)-161 10415 y Fx(j)p Ft(E)8 10440 y Fr(cr)t(it)238 +10415 y Fx(j)37 b(\000)g(j)p Ft(V)630 10440 y Fr(cr)t(it)860 +10415 y Fx(j)g Fy(+)g(1.)4136 5544 y Fq(Pro)5 b(of:)86 +b Fy(In)61 b(an)g(undirected)g(graph)h Ft(G)p Fy(,)g(ev)-5 +b(ery)60 b(edge)g(of)h Ft(G)g Fy(is)4136 5743 y(either)77 +b(a)h(tree)f(edge)h(or)f(a)h(bac)-5 b(k)78 b(edge.)140 +b(In)78 b(the)g(subgraph)4136 5943 y Ft(G)4267 5968 y +Fr(ncr)t(it)4634 5943 y Fy(there)54 b(are)h(no)g(bac)-5 +b(k)55 b(edges)g(b)5 b(ecause)55 b(it)f(is)i(an)f(acyclic)4136 +6142 y(graph.)91 b(As)61 b(sho)-5 b(wn)63 b(b)-5 b(y)61 +b(Erd\177)-83 b(os)62 b(and)f(A.)g(R)-5 b(\023)-78 b(en)-5 +b(yi)61 b([4,)g(5],)i(when)4136 6341 y Ft(n)73 b Fy(tends)h(to)f +(in\014nit)-5 b(y)74 b(the)f(random)h(graph)g Ft(G)f +Fy(forms,)78 b(with)4136 6540 y(probabilit)-5 b(y)45 +b(tending)g(to)e(1,)k(a)d(gian)-5 b(t)45 b(comp)5 b(onen)-5 +b(t)44 b(con)-5 b(taining)4136 6740 y(all)52 b(cycles)f(of)f +Ft(G)p Fy(.)73 b(So)51 b(considering)h(that)f Ft(G)6846 +6765 y Fr(cr)t(it)7127 6740 y Fy(is)g(connected,)4136 +6939 y(the)81 b(n)-5 b(um)g(b)5 b(er)83 b(of)e(tree)g(edges)g(is)h +Fx(j)p Ft(V)6458 6964 y Fr(cr)t(it)6688 6939 y Fx(j)55 +b(\000)f Fy(1.)152 b(It)81 b(happ)5 b(ens)4136 7138 y(b)g(ecause)64 +b(w)-5 b(e)64 b(ha)-5 b(v)g(e)65 b(only)f(one)g(tree)f(connecting)h +(all)g(v)-5 b(ertices)4136 7338 y(in)45 b Ft(V)4416 7363 +y Fr(cr)t(it)4646 7338 y Fy(.)71 b(As)45 b(the)f(total)g(n)-5 +b(um)g(b)5 b(er)46 b(of)f(edges)g(in)g Ft(G)7179 7363 +y Fr(cr)t(it)7454 7338 y Fy(is)g Fx(j)p Ft(E)7779 7363 +y Fr(cr)t(it)8009 7338 y Fx(j)4136 7537 y Fy(then)55 +b Ft(N)4647 7562 y Fr(bedg)t(es)5078 7537 y Fy(+)37 b(\()p +Fx(j)p Ft(V)5452 7562 y Fr(cr)t(it)5682 7537 y Fx(j)g(\000)g +Fy(1\))46 b(=)g Fx(j)p Ft(E)6469 7562 y Fr(cr)t(it)6699 +7537 y Fx(j)p Fy(.)74 b(Th)-5 b(us,)4942 7896 y Ft(N)5075 +7921 y Fr(bedg)t(es)5515 7896 y Fy(=)46 b Fx(j)p Ft(E)5859 +7921 y Fr(cr)t(it)6089 7896 y Fx(j)37 b(\000)g(j)p Ft(V)6481 +7921 y Fr(cr)t(it)6711 7896 y Fx(j)g Fy(+)g(1)p Ft(:)g +Fd(2)4136 8292 y Fq(Theorem)63 b(2)84 b Fy(The)54 b(maximal)h(v)-9 +b(alue)53 b Ft(A)6695 8317 y Fr(max)7022 8292 y Fy(assigned)j(to)e(an) +4136 8491 y(edge)67 b Ft(e)f Fx(2)f Ft(E)4968 8516 y +Fr(cr)t(it)5265 8491 y Fy(in)i(the)g(assignmen)-5 b(t)69 +b(of)e(v)-9 b(alues)67 b(to)g(critical)4136 8690 y(v)-5 +b(ertices)55 b(is:)75 b Ft(A)5094 8715 y Fr(max)5413 +8690 y Fx(\024)46 b Fy(2)p Fx(j)p Ft(V)5814 8715 y Fr(cr)t(it)6044 +8690 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)6795 8715 +y Fr(t)6854 8690 y Fy(.)4136 9020 y Fq(Pro)5 b(of:)134 +b Fy(W)-14 b(e)84 b(start)h(the)f(assignmen)-5 b(t)87 +b(of)e(v)-9 b(alues)85 b(to)f(criti-)4136 9220 y(cal)48 +b(v)-5 b(ertices)48 b(using)i(the)e(sequence)g Fx(f)p +Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f Fy(Nextg)q +Fx(g)48 b Fy(so)h(that)4136 9419 y(eac)-5 b(h)38 b(edge)f(receiv)-5 +b(es)37 b(the)g(sum)h(of)f(the)g(v)-9 b(alues)37 b(asso)5 +b(ciated)37 b(with)4136 9618 y(its)54 b(endp)5 b(oin)-5 +b(ts.)75 b(The)54 b Ft(g)60 b Fy(v)-9 b(alue)53 b(for)h(eac)-5 +b(h)54 b(v)-5 b(ertex)53 b Ft(u)h Fy(in)h Ft(V)7660 9643 +y Fr(cr)t(it)7944 9618 y Fy(is)4136 9817 y(assigned)50 +b(only)e(once.)71 b(It)47 b(happ)5 b(ens)49 b(b)5 b(ecause)48 +b(a)g Ft(g)54 b Fy(v)-9 b(alue)48 b(is)g(as-)4136 10017 +y(signed)39 b(to)e(a)h(v)-5 b(ertex)37 b Ft(u)h Fy(if)f(and)i(only)f +(if)f Ft(g)6 b Fy(\()p Ft(u)p Fy(\))46 b(=)g Fx(\0001)p +Fy(.)68 b(Th)-5 b(us,)43 b(af-)4136 10216 y(ter)j Ft(g)6 +b Fy(\()p Ft(u)p Fy(\))46 b(c)-5 b(hange)47 b(from)g +Fx(\0001)g Fy(to)f(the)g(v)-9 b(alue)47 b(stored)f(in)h(Nextg,)4136 +10415 y(the)59 b(condition)h Ft(g)6 b Fy(\()p Ft(u)p +Fy(\))52 b(=)h Fx(\0001)60 b Fy(b)5 b(ecomes)60 b(false)f(and)h +Ft(g)6 b Fy(\()p Ft(u)p Fy(\))59 b(will)3906 10913 y(8)p +eop end +%%Page: 9 9 +TeXDict begin 9 8 bop -161 620 a Fy(not)55 b(b)5 b(e)55 +b(assigned)h(again.)74 b(Consider)56 b(no)-5 b(w)55 b(t)-5 +b(w)g(o)56 b(p)5 b(ossibilities:)-161 819 y(\(i\))55 +b(If)f Ft(N)368 844 y Fr(t)473 819 y Fy(=)46 b(0)55 b(then)g(the)g +Ft(g)61 b Fy(v)-9 b(alues)55 b(will)g(b)5 b(e)54 b(assigned)j(to)d(v)-5 +b(er-)-161 1018 y(tices)58 b(in)g Ft(V)514 1043 y Fr(cr)t(it)802 +1018 y Fy(sequen)-5 b(tially)-14 b(.)81 b(Therefore,)58 +b(the)g(greatest)f(and)-161 1218 y(the)d(second)g(greatest)f(v)-9 +b(alues)54 b(assigned)i(to)d Ft(u)h Fy(and)g Ft(w)d Fx(2)45 +b Ft(V)3528 1243 y Fr(cr)t(it)-161 1417 y Fy(are)67 b +Ft(g)6 b Fy(\()p Ft(u)p Fy(\))65 b(=)h Fx(j)p Ft(V)841 +1442 y Fr(cr)t(it)1071 1417 y Fx(j)44 b(\000)h Fy(1)67 +b(and)h Ft(g)6 b Fy(\()p Ft(w)t Fy(\))65 b(=)h Fx(j)p +Ft(V)2561 1442 y Fr(cr)t(it)2791 1417 y Fx(j)44 b(\000)h +Fy(2,)70 b(resp)5 b(ec-)-161 1616 y(tiv)-5 b(ely)-14 +b(.)68 b(Th)-5 b(us,)45 b Ft(A)921 1641 y Fr(max)1240 +1616 y Fx(\024)h Fy(\()p Fx(j)p Ft(V)1623 1641 y Fr(cr)t(it)1853 +1616 y Fx(j)5 b(\000)g Fy(1\))g(+)g(\()p Fx(j)p Ft(V)2533 +1641 y Fr(cr)t(it)2763 1616 y Fx(j)g(\000)g Fy(2\))41 +b(since)f(the)-161 1815 y(edge)60 b Fx(f)p Ft(u;)28 b(w)t +Fx(g)60 b Fy(ma)-5 b(y)61 b(b)5 b(e)60 b(in)g Ft(E)1657 +1840 y Fr(cr)t(it)1886 1815 y Fy(,)i(in)e(the)g(w)-5 +b(orst)60 b(case.)88 b(\(ii\))60 b(If)-161 2015 y Ft(N)-28 +2040 y Fr(t)77 2015 y Ft(>)47 b Fy(0)e(then)g(Nextg)f(is)i(incremen)-5 +b(ted)46 b(b)-5 b(y)46 b(one)f(for)h(eac)-5 b(h)45 b(time)-161 +2214 y(the)53 b(condition)g(AssignedEdges[Nextg)g(+)32 +b Ft(g)6 b Fy(\()p Ft(w)t Fy(\)])53 b(is)h(true,)f(as)-161 +2413 y(sho)-5 b(wn)57 b(in)f(line)f(15)h(of)f(Figure)h(7.)74 +b(Th)-5 b(us,)57 b(in)e(the)g(w)-5 b(orst)56 b(case,)39 +2781 y Ft(A)164 2806 y Fr(max)603 2781 y Fx(\024)166 +b Fy(\()p Fx(j)p Ft(V)1106 2806 y Fr(cr)t(it)1335 2781 +y Fx(j)38 b(\000)f Fy(1)f(+)i Ft(N)2004 2806 y Fr(t)2062 +2781 y Fy(\))f(+)g(\()p Fx(j)p Ft(V)2538 2806 y Fr(cr)t(it)2767 +2781 y Fx(j)g(\000)h Fy(2)e(+)h Ft(N)3435 2806 y Fr(t)3494 +2781 y Fy(\))39 3031 y Ft(A)164 3056 y Fr(max)603 3031 +y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)1124 3056 y Fr(cr)t(it)1354 +3031 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)2105 3056 +y Fr(t)2164 3031 y Ft(:)g Fd(2)5 3401 y Fy(Let)68 b(us)h(no)-5 +b(w)70 b(resume)f(the)f(discussion)j(of)d(Conjecture)g(1.)-161 +3600 y(Let)h(us)h(consider)h(that)d Ft(N)1546 3625 y +Fr(t)1675 3600 y Fx(\024)i Ft(N)2007 3625 y Fr(bedg)t(es)2470 +3600 y Fy(when)g(the)f(a)-5 b(v)g(erage)-161 3799 y(degree)51 +b(of)g(v)-5 b(ertices)50 b(\()p Ft(d)1284 3824 y Fr(av)t(g)1504 +3799 y Fy(\))h(in)g Ft(G)1940 3824 y Fr(cr)t(it)2221 +3799 y Fy(is)g(a)g(constan)-5 b(t.)73 b(Substi-)-161 +3998 y(tuting)56 b Ft(N)471 4023 y Fr(t)575 3998 y Fx(\024)47 +b Ft(N)884 4023 y Fr(bedg)t(es)1333 3998 y Fy(in)56 b(Theorem)f(2)h +(giv)-5 b(es:)569 4367 y Ft(A)694 4392 y Fr(max)1133 +4367 y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)1654 4392 y Fr(cr)t(it)1884 +4367 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)2635 4392 +y Fr(bedg)t(es)-161 4735 y Fy(Substituting)100 b(the)e(v)-9 +b(alue)99 b(of)f Ft(N)2001 4760 y Fr(bedg)t(es)2494 4735 +y Fy(from)h(Theorem)g(1)-161 4934 y(giv)-5 b(es:)91 5303 +y Ft(A)216 5328 y Fr(max)655 5303 y Fx(\024)166 b Fy(2)p +Fx(j)p Ft(V)1176 5328 y Fr(cr)t(it)1406 5303 y Fx(j)37 +b(\000)g Fy(3)g(+)g(2\()p Fx(j)p Ft(E)2258 5328 y Fr(cr)t(it)2488 +5303 y Fx(j)g(\000)g(j)p Ft(V)2880 5328 y Fr(cr)t(it)3110 +5303 y Fx(j)g Fy(+)g(1\))-161 5671 y(Applying)106 b(De\014nition)g(6)g +(in)g Ft(G)1996 5696 y Fr(cr)t(it)2331 5671 y Fy(w)-5 +b(e)106 b(obtain)g Ft(d)3279 5696 y Fr(av)t(g)3629 5671 +y Fy(=)-161 5900 y(2)p Fx(j)p Ft(E)91 5925 y Fr(cr)t(it)321 +5900 y Fx(j)p Ft(=)p Fx(j)p Ft(V)593 5925 y Fr(cr)t(it)823 +5900 y Fx(j)p Fy(.)84 b(This)59 b(implies)h(that)e Fx(j)p +Ft(E)2480 5925 y Fr(cr)t(it)2709 5900 y Fx(j)52 b Fy(=)3007 +5816 y Fr(d)3076 5833 y Fm(av)s(g)p 3007 5862 266 7 v +3107 5958 a Fn(2)3293 5900 y Fx(j)p Ft(V)3436 5925 y +Fr(cr)t(it)3666 5900 y Fx(j)p Fy(.)-161 6100 y(Th)-5 +b(us,)-154 6559 y Ft(A)-29 6584 y Fr(max)410 6559 y Fx(\024)166 +b Fy(2)p Fx(j)p Ft(V)931 6584 y Fr(cr)t(it)1161 6559 +y Fx(j)37 b(\000)g Fy(3)g(+)g(2)1807 6324 y Fp(\022)1949 +6446 y Ft(d)2035 6471 y Fr(av)t(g)p 1949 6520 307 7 v +2060 6672 a Fy(2)2275 6559 y Fx(j)p Ft(V)2418 6584 y +Fr(cr)t(it)2648 6559 y Fx(j)g(\000)g(j)p Ft(V)3040 6584 +y Fr(cr)t(it)3270 6559 y Fx(j)g Fy(+)g(1)3602 6324 y +Fp(\023)410 6907 y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)931 +6932 y Fr(cr)t(it)1161 6907 y Fx(j)37 b(\000)g Fy(3)g(+)g(\()p +Ft(d)1847 6932 y Fr(av)t(g)2104 6907 y Fx(\000)g Fy(2\))p +Fx(j)p Ft(V)2561 6932 y Fr(cr)t(it)2790 6907 y Fx(j)g +Fy(+)g(2)410 7156 y Fx(\024)166 b Ft(d)791 7181 y Fr(av)t(g)1011 +7156 y Fx(j)p Ft(V)1154 7181 y Fr(cr)t(it)1384 7156 y +Fx(j)37 b(\000)g Fy(1)410 7507 y Fx(\024)725 7395 y Fy(2)p +Fx(j)p Ft(E)977 7420 y Fr(cr)t(it)1207 7395 y Fx(j)p +725 7469 528 7 v 779 7621 a(j)p Ft(V)922 7646 y Fr(cr)t(it)1152 +7621 y Fx(j)1273 7507 y(j)p Ft(V)1416 7532 y Fr(cr)t(it)1646 +7507 y Fx(j)g(\000)g Fy(1)410 7853 y Fx(\024)166 b Fy(2)p +Fx(j)p Ft(E)957 7878 y Fr(cr)t(it)1187 7853 y Fx(j)37 +b(\000)g Fy(1)-161 8222 y(As)69 b Fx(j)p Ft(E)267 8247 +y Fr(cr)t(it)497 8222 y Fx(j)f Fy(=)g(0)p Ft(:)p Fy(5)p +Ft(n)g Fy(and)h Ft(n)f Fy(=)g Ft(m)g Fy(then)h Ft(A)2620 +8247 y Fr(max)2961 8222 y Fx(\024)f Ft(n)45 b Fx(\000)h +Fy(1)68 b Fx(\024)-161 8421 y Ft(m)37 b Fx(\000)g Fy(1.)5 +8622 y(W)-14 b(e)38 b(no)-5 b(w)39 b(sho)-5 b(w)39 b(evidences)g(that)e +Ft(N)2190 8647 y Fr(t)2295 8622 y Fx(\024)46 b Ft(N)2603 +8647 y Fr(bedg)t(es)3036 8622 y Fy(when)38 b Ft(d)3538 +8647 y Fr(av)t(g)-161 8821 y Fy(is)61 b(a)f(constan)-5 +b(t.)88 b(As)60 b(sho)-5 b(wn)62 b(in)e(Section)g(5.1,)i +Fx(j)p Ft(E)2934 8846 y Fr(cr)t(it)3163 8821 y Fx(j)54 +b(\024)g Fy(0)p Ft(:)p Fy(5)p Ft(n)-161 9020 y Fy(with)g(probabilit)-5 +b(y)55 b(tending)f(to)f(1)h(when)h Ft(n)e Fy(increases.)74 +b(So,)55 b(in)-161 9220 y(order)64 b(to)g(obtain)g(the)f(a)-5 +b(v)g(erage)64 b(degree)g Ft(d)2529 9245 y Fr(av)t(g)2813 +9220 y Fy(of)f(v)-5 b(ertices)64 b(in)-161 9419 y Ft(G)-30 +9444 y Fr(cr)t(it)249 9419 y Fy(w)-5 b(e)50 b(empirically)f(determined) +h(that)e Fx(j)p Ft(V)2693 9444 y Fr(cr)t(it)2923 9419 +y Fx(j)f(\024)f Fy(0)p Ft(:)p Fy(35)p Fx(j)p Ft(V)37 +b Fx(j)p Fy(.)-161 9618 y(As)101 b Fx(j)p Ft(V)37 b Fx(j)122 +b Fy(=)g(1)p Ft(:)p Fy(15)p Ft(n)100 b Fy(then)h Fx(j)p +Ft(V)1791 9643 y Fr(cr)t(it)2021 9618 y Fx(j)122 b(\024)f +Fy(0)p Ft(:)p Fy(403)p Ft(n)p Fy(.)210 b(T)-14 b(able)101 +b(2)-161 9817 y(presen)-5 b(ts)66 b(the)e(probabilit)-5 +b(y)65 b Ft(P)1752 9847 y Fo(j)p Fr(V)1869 9864 y Fm(cr)s(it)2082 +9847 y Fo(j)2194 9817 y Fy(that)f Fx(j)p Ft(V)2706 9842 +y Fr(cr)t(it)2936 9817 y Fx(j)e(\024)f Fy(0)p Ft(:)p +Fy(403)p Ft(n)p Fy(.)-161 10017 y(As)70 b Ft(P)206 10047 +y Fo(j)p Fr(V)323 10064 y Fm(cr)s(it)536 10047 y Fo(j)654 +10017 y Fy(tends)g(to)g(1)g(when)g Ft(n)g Fy(increases)h(then,)i +Ft(d)3338 10042 y Fr(av)t(g)3629 10017 y Fy(=)-161 10216 +y(2)42 b Fx(\002)g Fy(0)p Ft(:)p Fy(5)p Ft(n=)p Fy(0)p +Ft(:)p Fy(403)p Ft(n)58 b Fy(=)h(2)p Ft(:)p Fy(48)j(is)i(a)e(constan)-5 +b(t)63 b(v)-9 b(alue.)96 b(W)-14 b(e)62 b(built)-161 +10415 y(10,000)56 b(graphs)g(for)g(eac)-5 b(h)55 b(n)-5 +b(um)g(b)5 b(er)57 b(of)e(k)-5 b(eys.)p 4979 460 2234 +7 v 4976 696 7 236 v 5369 696 a Fk(n)p 5849 696 V 6299 +588 a(P)6397 611 y Fc(j)p Fj(V)6508 632 y Fm(cr)s(it)6720 +611 y Fc(j)p 7209 696 V 5852 702 1361 7 v 4976 878 7 +183 v 5849 878 V 5952 824 a Fu(VLC2)p 6447 878 V 199 +w(T)-13 b(o)t(doBR)p 7209 878 V 4979 885 2234 7 v 4976 +1068 7 183 v 5228 1013 a(1)p Fk(;)25 b Fu(000)p 5849 +1068 V 411 w(0)p Fk(:)p Fu(51)p 6447 1068 V 406 w(0)p +Fk(:)p Fu(52)p 7209 1068 V 4976 1250 V 5189 1196 a(10)p +Fk(;)g Fu(000)p 5849 1250 V 373 w(0)p Fk(:)p Fu(76)p +6447 1250 V 406 w(0)p Fk(:)p Fu(77)p 7209 1250 V 4976 +1433 V 5151 1378 a(100)p Fk(;)g Fu(000)p 5849 1433 V +334 w(0)p Fk(:)p Fu(98)p 6447 1433 V 406 w(0)p Fk(:)p +Fu(98)p 7209 1433 V 4976 1616 V 5078 1561 a(1)p Fk(;)g +Fu(000)p Fk(;)g Fu(000)p 5849 1616 V 262 w(1)p Fk(:)p +Fu(00)p 6447 1616 V 406 w(1)p Fk(:)p Fu(00)p 7209 1616 +V 4979 1622 2234 7 v 4136 1954 a Fy(T)-14 b(able)67 b(2:)97 +b(Probabilit)-5 b(y)67 b Ft(P)5818 1984 y Fo(j)p Fr(V)5935 +2001 y Fm(cr)s(it)6148 1984 y Fo(j)6262 1954 y Fy(that)f +Fx(j)p Ft(V)6776 1979 y Fr(cr)t(it)7006 1954 y Fx(j)f(\024)h +Fy(0)p Ft(:)p Fy(403)p Ft(n)g Fy(for)4136 2153 y(di\013eren)-5 +b(t)56 b(n)-5 b(um)g(b)5 b(er)58 b(of)e(k)-5 b(eys)56 +b(for)g(the)g(collections)g(VLC2)g(and)4136 2352 y(T)-14 +b(o)5 b(doBR.)4302 2852 y(Finally)-14 b(,)64 b(w)-5 b(e)61 +b(sho)-5 b(w)62 b(exp)5 b(erimen)-5 b(tal)61 b(evidences)h(that)e +Ft(N)7811 2877 y Fr(t)7926 2852 y Fx(\024)4136 3051 y +Ft(N)4269 3076 y Fr(bedg)t(es)4663 3051 y Fy(.)73 b(The)51 +b(exp)5 b(ected)50 b(v)-9 b(alues)51 b(for)h Fx(j)p Ft(V)6691 +3076 y Fr(cr)t(it)6921 3051 y Fx(j)f Fy(and)h Fx(j)p +Ft(E)7506 3076 y Fr(cr)t(it)7736 3051 y Fx(j)f Fy(are)4136 +3250 y(0)p Ft(:)p Fy(403)p Ft(n)71 b Fy(and)h(0)p Ft(:)p +Fy(5)p Ft(n)p Fy(,)k(resp)5 b(ectiv)-5 b(ely)-14 b(.)121 +b(Then,)76 b(b)-5 b(y)71 b(Theorem)h(1,)4136 3450 y Ft(N)4269 +3475 y Fr(bedg)t(es)4709 3450 y Fy(=)46 b(0)p Ft(:)p +Fy(5)p Ft(n)10 b Fx(\000)g Fy(0)p Ft(:)p Fy(403)p Ft(n)g +Fy(+)g(1)47 b(=)g(0)p Ft(:)p Fy(097)p Ft(n)10 b Fy(+)g(1.)70 +b(In)42 b(T)-14 b(able)42 b(3)g(w)-5 b(e)4136 3649 y(sho)g(w)58 +b(the)e(maximal)h(v)-9 b(alue)56 b(of)g Ft(N)6268 3674 +y Fr(t)6383 3649 y Fy(obtained)h(during)g(10,000)4136 +3848 y(executions)70 b(of)f(the)g(new)h(algorithm)g(for)f(di\013eren)-5 +b(t)70 b(sizes)g(of)4136 4047 y Ft(S)10 b Fy(.)110 b(As)68 +b(sho)-5 b(wn)69 b(in)f(T)-14 b(able)68 b(3,)j(the)c(maximal)h(v)-9 +b(alue)68 b(of)f Ft(N)7817 4072 y Fr(t)7943 4047 y Fy(is)4136 +4247 y(smaller)52 b(than)e Ft(N)5220 4272 y Fr(bedg)t(es)5660 +4247 y Fy(=)c(0)p Ft(:)p Fy(097)p Ft(n)27 b Fy(+)g(1.)73 +b(So,)51 b(Conjecture)f(1)g(is)4136 4446 y(correct)55 +b(for)g Ft(c)46 b Fy(=)g(1)p Ft(:)p Fy(15.)p 4864 4653 +2463 7 v 4861 4888 7 236 v 5255 4888 a Fk(n)p 5734 4888 +V 5837 4781 a Fu(Maximal)k(v)-9 b(alue)52 b(of)f Fk(N)7172 +4798 y Fj(t)p 7324 4888 V 5738 4895 1590 7 v 4861 5071 +7 183 v 5734 5071 V 5859 5016 a Fu(VLC2)p 6376 5071 V +314 w(T)-13 b(o)t(doBR)p 7324 5071 V 4864 5078 2463 7 +v 4861 5260 7 183 v 5113 5206 a(1)p Fk(;)25 b Fu(000)p +5734 5260 V 348 w(0)p Fk(:)p Fu(085)p Fk(n)p 6376 5260 +V 351 w Fu(0)p Fk(:)p Fu(093)p Fk(n)p 7324 5260 V 4861 +5443 V 5075 5388 a Fu(10)p Fk(;)g Fu(000)p 5734 5443 +V 309 w(0)p Fk(:)p Fu(067)p Fk(n)p 6376 5443 V 351 w +Fu(0)p Fk(:)p Fu(069)p Fk(n)p 7324 5443 V 4861 5626 V +5036 5571 a Fu(100)p Fk(;)g Fu(000)p 5734 5626 V 271 +w(0)p Fk(:)p Fu(061)p Fk(n)p 6376 5626 V 351 w Fu(0)p +Fk(:)p Fu(061)p Fk(n)p 7324 5626 V 4861 5808 V 4964 5754 +a Fu(1)p Fk(;)g Fu(000)p Fk(;)g Fu(000)p 5734 5808 V +198 w(0)p Fk(:)p Fu(059)p Fk(n)p 6376 5808 V 351 w Fu(0)p +Fk(:)p Fu(059)p Fk(n)p 7324 5808 V 4864 5815 2463 7 v +4136 6137 a Fy(T)-14 b(able)51 b(3:)71 b(The)50 b(maximal)h(v)-9 +b(alue)50 b(of)g Ft(N)6538 6162 y Fr(t)6647 6137 y Fy(for)g(di\013eren) +-5 b(t)50 b(sizes)h(of)4136 6336 y Ft(S)65 b Fy(for)55 +b(the)g(collections)h(VLC2)e(and)i(T)-14 b(o)5 b(doBR.)4136 +6972 y Fq(Complexit)-5 b(y)64 b(Analysis)4136 7280 y +Fy(W)-14 b(e)59 b(no)-5 b(w)60 b(sho)-5 b(w)60 b(that)e(the)h(time)g +(complexit)-5 b(y)59 b(of)f(the)h(pseudo)4136 7479 y(co)5 +b(de)44 b(presen)-5 b(ted)45 b(in)g(Figure)g(7)g(is)g +Ft(O)5 b Fy(\()p Fx(j)p Ft(V)6561 7504 y Fr(cr)t(it)6790 +7479 y Fx(j)p Fy(\).)70 b(F)-14 b(or)45 b(eac)-5 b(h)45 +b(unas-)4136 7679 y(signed)40 b(v)-5 b(ertex)37 b Ft(u)p +Fy(,)42 b(Adj\()p Ft(u)p Fy(\))c(m)-5 b(ust)39 b(b)5 +b(e)39 b(scanned)g(with)g(complex-)4136 7878 y(it)-5 +b(y)76 b Fx(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)f Fy(in)h(order)g(to)f +(obtain)h(\(in)g(AssignedV)-14 b(ertices\))4136 8077 +y(the)63 b(adjacencies)g(of)g Ft(u)g Fy(that)f(ha)-5 +b(v)g(e)64 b(already)f(b)5 b(een)63 b(assigned,)4136 +8276 y(as)c(sho)-5 b(wn)60 b(in)f(lines)h(11)f(and)g(12.)84 +b(F)-14 b(or)59 b(eac)-5 b(h)59 b(iteration)f(of)h(the)4136 +8476 y(rep)5 b(eat-un)-5 b(til)67 b(lo)5 b(op,)69 b Fx(j)p +Fy(AssignedV)-14 b(ertices)p Fx(j)66 b Fy(v)-5 b(ertices)66 +b(m)-5 b(ust)67 b(b)5 b(e)4136 8675 y(scanned,)65 b(as)e(sho)-5 +b(wn)64 b(from)e(lines)h(13)g(to)e(19.)95 b(As)63 b(eac)-5 +b(h)62 b(criti-)4136 8874 y(cal)50 b(v)-5 b(ertex)48 +b(is)i(assigned)h(only)f(once)f(and)i Fx(j)p Fy(AssignedV)-14 +b(ertices)p Fx(j)4136 9073 y Fy(v)-5 b(ertices)46 b(m)-5 +b(ust)47 b(b)5 b(e)46 b(scanned)h(to)e(up)5 b(date)46 +b(the)g(AssignedEdges)4136 9273 y(arra)-5 b(y)37 b(\(as)g(sho)-5 +b(wn)39 b(in)e(line)g(21\),)j(the)d(time)g(complexit)-5 +b(y)36 b(is)i(giv)-5 b(en)4136 9472 y(b)g(y)5563 10014 +y Ft(C)12 b Fy(\()p Fx(j)p Ft(V)5902 10039 y Fr(cr)t(it)6131 +10014 y Fx(j)p Fy(\))46 b(=)6463 9792 y Fo(j)p Fr(V)6580 +9809 y Fm(cr)s(it)6793 9792 y Fo(j)6528 9856 y Fp(X)6524 +10208 y Fr(u)p Fn(=1)6832 10014 y Fy([)37 b Fx(j)p Fy(Adj\()p +Ft(u)p Fy(\))p Fx(j)f Fy(+)4157 10415 y(\()p Ft(I)13 +b Fy(\()p Ft(u)p Fy(\))36 b Fx(\002)h(j)p Fy(AssignedV)-14 +b(ertices)p Fx(j)p Fy(\))37 b(+)g Fx(j)p Fy(AssignedV)-14 +b(ertices)p Fx(j)37 b Fy(])3906 10913 y(9)p eop end +%%Page: 10 10 +TeXDict begin 10 9 bop -69 2469 a + currentpoint currentpoint translate 0.87 0.87 scale neg exch neg exch +translate + -69 2469 a -69 153 +a + 36443095 9143664 0 0 36443095 9143664 startTexFig + -69 153 a +%%BeginDocument: figs/grafsearchingncv.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearchingncv.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 20 10:41:58 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 554 139 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.827 0.827 0.827 srgb} bind def + +end +save +newpath 0 139 moveto 0 0 lineto 554 0 lineto 554 139 lineto closepath clip newpath +-21.7 306.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +0 slc +n 7825.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 7687.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 8017.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 8004.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 8472.3 3841.4 304.1 100.8563 5.4037 arcn +gs col0 s gr + +% Arc +n 8407.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8685 4185 m +gs 1 -1 sc (11) col0 sh gr +/Times-Roman ff 142.88 scf sf +7650 4185 m +gs 1 -1 sc (12) col0 sh gr +% Arc +n 715.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 577.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 907.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 894.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 1362.3 3841.4 304.1 100.8565 5.4037 arcn +gs col0 s gr + +% Arc +n 1297.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +% Ellipse +n 8190 4590 71 71 0 360 DrawEllipse gs col0 s gr + +% Polyline +0 slj +n 8258 4522 m + 8122 4658 l gs col0 s gr +% Arc +n 2470.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 2332.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 2662.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 2649.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 3117.3 3841.4 304.1 100.8565 5.4037 arcn +gs col0 s gr + +% Arc +n 3052.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +1935 2835 m +gs 1 -1 sc (b\)) col0 sh gr +% Arc +n 4225.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 4087.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 4417.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 4404.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 4872.3 3841.4 304.1 100.8563 5.4037 arcn +gs col0 s gr + +% Arc +n 4807.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +3690 2835 m +gs 1 -1 sc (c\)) col0 sh gr +% Arc +n 5980.5 3352.5 247.5 152.9691 -88.9584 arc +gs col0 s gr + +% Arc +n 5842.1 2921.0 550.1 98.5785 5.1071 arcn +gs col0 s gr + +% Arc +n 6172.9 3250.6 450.2 144.8147 61.1744 arcn +gs col0 s gr + +% Arc +n 6159.4 3827.8 312.2 172.2347 88.9678 arcn +gs col0 s gr + +% Arc +n 6627.3 3841.4 304.1 100.8563 5.4037 arcn +gs col0 s gr + +% Arc +n 6562.5 3472.5 412.6 -62.9691 -1.0416 arc +gs col0 s gr + +/Times-Roman ff 174.63 scf sf +5445 2835 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 174.63 scf sf +7200 2835 m +gs 1 -1 sc (e\)) col0 sh gr +/Times-Roman ff 174.63 scf sf +360 2835 m +gs 1 -1 sc (a\)) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 8411 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8336 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 8006 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7931 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 7601 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7526 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 8771 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8733 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 7682 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7607 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 7826 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +7751 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 8231 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8156 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 8591 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8554 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 8816 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8779 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 8231 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +8194 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +8370 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7920 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7290 3510 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7515 3240 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 142.88 scf sf +7740 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +8145 2835 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +7965 3330 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 142.88 scf sf +8505 2970 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8730 3690 m +gs 1 -1 sc (g:10) col0 sh gr +/Times-Roman ff 142.88 scf sf +8595 3375 m +gs 1 -1 sc (10) col0 sh gr +/Times-Roman ff 142.88 scf sf +8910 3915 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +8280 4365 m +gs 1 -1 sc (g:11) col0 sh gr +/Times-Roman ff 142.88 scf sf +7920 4365 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7290 3915 m +gs 1 -1 sc (g:12) col0 sh gr +% Ellipse +n 1301 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1226 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 896 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +821 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 491 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +416 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 1661 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1623 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 572 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +497 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 716 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +641 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 1121 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1046 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 1481 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1444 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 1706 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1669 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 1121 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +1084 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +1260 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +7695 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Polyline +0 slj +0 slc +n 585 4500 m 765 4500 l 765 4680 l 585 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +637 4642 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 765 4500 m 945 4500 l 945 4680 l 765 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +817 4642 m +gs 1 -1 sc (3) col0 sh gr +% Polyline +n 945 4500 m 1125 4500 l 1125 4680 l 945 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +997 4642 m +gs 1 -1 sc (6) col0 sh gr +% Polyline +n 1125 4500 m 1305 4500 l 1305 4680 l 1125 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1140 4642 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 1305 4500 m 1485 4500 l 1485 4680 l 1305 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1320 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 1485 4500 m 1665 4500 l 1665 4680 l 1485 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +1500 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +585 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Ellipse +n 3056 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2981 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 2651 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2576 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 2246 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2171 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 3416 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3378 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 2327 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2252 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 2471 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2396 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 2876 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2801 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 3236 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3199 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 3461 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3424 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 2876 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +2839 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +3015 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +2565 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +1935 3510 m +gs 1 -1 sc (g:0) col0 sh gr +% Polyline +n 2385 4500 m 2565 4500 l 2565 4680 l 2385 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2437 4642 m +gs 1 -1 sc (3) col0 sh gr +% Polyline +n 2565 4500 m 2745 4500 l 2745 4680 l 2565 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2617 4642 m +gs 1 -1 sc (6) col0 sh gr +% Polyline +n 2745 4500 m 2925 4500 l 2925 4680 l 2745 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2760 4642 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 2925 4500 m 3105 4500 l 3105 4680 l 2925 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +2940 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 3105 4500 m 3285 4500 l 3285 4680 l 3105 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +3120 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +2295 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Ellipse +n 4811 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4736 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 4406 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4331 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 4001 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +3926 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 5171 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5133 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 4082 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4007 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 4226 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4151 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 4631 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4556 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 4991 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4954 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5216 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5179 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 4631 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +4594 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +4770 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +4320 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3690 3510 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +3915 3240 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 142.88 scf sf +4140 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +4545 2835 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +4365 3330 m +gs 1 -1 sc (3) col0 sh gr +% Polyline +n 4320 4500 m 4500 4500 l 4500 4680 l 4320 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4335 4642 m +gs 1 -1 sc (10) col0 sh gr +% Polyline +n 4500 4500 m 4680 4500 l 4680 4680 l 4500 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4515 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 4680 4500 m 4860 4500 l 4860 4680 l 4680 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +4695 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +4095 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Polyline +n 6165 4500 m 6345 4500 l 6345 4680 l 6165 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6180 4642 m +gs 1 -1 sc (11) col0 sh gr +% Polyline +n 6345 4500 m 6525 4500 l 6525 4680 l 6345 4680 l + cp gs col32 1.00 tnt ef gr gs col0 s gr +/Times-Roman ff 142.88 scf sf +6360 4642 m +gs 1 -1 sc (12) col0 sh gr +/Times-Roman ff 142.88 scf sf +5850 4815 m +gs 1 -1 sc (UnAssignedEdges) col0 sh gr +% Ellipse +n 6566 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6491 4191 m +gs 1 -1 sc (10) col0 sh gr +% Ellipse +n 6161 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6086 4191 m +gs 1 -1 sc (11) col0 sh gr +% Ellipse +n 5756 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5681 3516 m +gs 1 -1 sc (13) col0 sh gr +% Ellipse +n 6926 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6888 3920 m +gs 1 -1 sc (9) col0 sh gr +% Ellipse +n 5837 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5762 3928 m +gs 1 -1 sc (12) col0 sh gr +% Ellipse +n 5981 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +5906 3160 m +gs 1 -1 sc (14) col0 sh gr +% Ellipse +n 6386 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6311 3024 m +gs 1 -1 sc (15) col0 sh gr +% Ellipse +n 6746 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6709 3160 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 6971 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6934 3520 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 6386 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 142.88 scf sf +6349 3651 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 142.88 scf sf +6525 3645 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +6075 3645 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5445 3510 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +5670 3240 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 142.88 scf sf +5895 2970 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 142.88 scf sf +6300 2835 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6120 3330 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 142.88 scf sf +6660 2970 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 142.88 scf sf +6885 3690 m +gs 1 -1 sc (g:10) col0 sh gr +/Times-Roman ff 142.88 scf sf +6750 3375 m +gs 1 -1 sc (10) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + + endTexFig + -69 2469 a + currentpoint currentpoint translate 1 0.87 div 1 0.87 div scale neg +exch neg exch translate + -69 2469 a 1840 2859 a Fy(Figure)56 b(8:)74 +b(Example)55 b(of)g(the)g(non)h(critical)f(v)-5 b(ertices)55 +b(assignmen)-5 b(t.)p -169 3263 9 103 v -169 3168 103 +9 v -66 3168 8027 9 v 7961 3168 103 9 v 8056 3263 9 103 +v -169 3420 9 150 v 8055 3420 V -72 3375 a Fl(p)f(r)g(o)g(c)g(e)g(d)g +(u)g(r)g(e)82 b Fu(N)6 b(o)g(n)g(C)g(r)g(i)g(t)g(i)g(c)g(a)g(l)g(V)g(e) +g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t)94 +b(\()16 b Fk(G)32 b Fu(,)83 b Fk(G)3575 3392 y Fj(ncr)s(it)3901 +3375 y Fu(,)j(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)20 +b(,)94 b Fk(g)15 b Fu(\))p -169 3569 V 8055 3569 V 256 +3524 a Fl(f)5 b(o)g(r)104 b Fu(i)92 b(:)12 b(=)75 b(0)g +Fl(to)80 b Fk(m)34 b Ff(\000)h Fu(1)69 b Fl(d)-9 b(o)p +-169 3726 V 8055 3726 V 427 3681 a(i)18 b(f)100 b Fu(A)s(s)s(s)s(i)s(g) +s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b([)36 b(i)29 b(])71 +b(=)82 b Fl(f)9 b(a)g(l)g(s)g(e)83 b(t)-6 b(h)g(e)g(n)73 +b Fu(UnAssignedEdges)68 b(:)10 b(=)72 b(UnAssignedEdges)j +Ff([)80 b(f)p Fu(i)p Ff(g)18 b Fu(;)p -169 3883 V 8055 +3883 V 256 3838 a Fl(f)5 b(o)g(r)86 b Fk(v)47 b Ff(2)95 +b Fk(V)976 3855 y Fj(scr)s(it)1320 3838 y Fl(d)-9 b(o)79 +b Fu(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)93 b(\()16 +b Fk(G)32 b Fu(,)83 b Fk(v)38 b Fu(,)83 b Fk(G)3232 3855 +y Fj(ncr)s(it)3558 3838 y Fu(,)g Fk(g)5 b Fu(\()p Fk(v)g +Fu(\))32 b(,)83 b Fk(g)38 b Fu(,)82 b(UnAssignedEdges)15 +b(\))k(;)p -169 4040 V 8055 4040 V 256 3995 a Fl(f)5 +b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)924 4012 y Fj(ncr)s(it)1285 +3995 y Fl(a)-11 b(n)g(d)147 b Fk(g)5 b Fu(\()p Fk(v)g +Fu(\))59 b(=)g Ff(\0001)70 b Fl(d)-9 b(o)79 b Fu(t)9 +b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)94 b(\()15 b +Fk(G)33 b Fu(,)83 b Fk(v)37 b Fu(,)83 b Fk(G)4462 4012 +y Fj(ncr)s(it)4788 3995 y Fu(,)g(0)32 b(,)83 b Fk(g)38 +b Fu(,)82 b(UnAssignedEdges)15 b(\))k(;)p -169 4189 V +8055 4189 V -169 4346 V 8055 4346 V -72 4301 a Fl(p)-6 +b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)85 b Fu(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g +(e)g(D)g(f)g(s)94 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(v)37 +b Fu(,)83 b Fk(G)2390 4318 y Fj(ncr)s(it)2716 4301 y +Fu(,)g Fk(g)5 b Fu(V)-13 b(alue)33 b(,)83 b Fk(g)38 b +Fu(,)84 b(u)r(n)r(A)r(s)r(s)r(i)r(g)r(n)r(e)r(d)r(E)r(d)r(g)r(e)r(s)6 +b(\))p -169 4503 V 8055 4503 V 250 4458 a Fk(g)f Fu(\()p +Fk(v)g Fu(\))72 b(:)10 b(=)73 b Fk(g)5 b Fu(V)-13 b(alue)18 +b(;)p -169 4660 V 8055 4660 V 256 4615 a Fl(f)5 b(o)g(r)86 +b Fk(u)43 b Ff(2)g Fu(Adj)34 b(\()p Fk(v)5 b Fu(\))68 +b Fl(a)-11 b(n)g(d)67 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))60 +b(=)f Ff(\0001)70 b Fl(d)-9 b(o)p -169 4817 V 8055 4817 +V 488 4772 a Fk(g)5 b Fu(V)-13 b(alue)73 b(:)10 b(=)71 +b(N)o(e)o(x)o(t)o(U)o(n)o(u)o(s)o(e)o(d)o(A)o(d)o(d)o(r)o(e)o(s)o(s)13 +b(\()d(UnAssignedEdges)q(\))68 b Ff(\000)c Fk(g)5 b Fu(\()p +Fk(v)g Fu(\))18 b(;)p -169 4974 V 8055 4974 V 497 4929 +a(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)93 b(\()16 +b Fk(G)32 b Fu(,)83 b Fk(u)33 b Fu(,)83 b Fk(G)2161 4946 +y Fj(ncr)s(it)2487 4929 y Fu(,)g Fk(g)5 b Fu(V)-13 b(alue)33 +b(,)83 b Fk(g)38 b Fu(,)83 b(UnAssignedEdges)14 b(\))19 +b(;)p -169 5077 9 103 v -168 5077 103 9 v -66 5077 8027 +9 v 7961 5077 103 9 v 8056 5077 9 103 v 1605 5499 a Fy(Figure)56 +b(9:)74 b(The)55 b(algorithm)h(to)f(assign)i(v)-9 b(alues)55 +b(to)g(non)h(critical)f(v)-5 b(ertices.)5 6029 y(Considering)144 +b(that)e Fx(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)f Fy(=)i +Ft(d)2538 6054 y Fr(av)t(g)2900 6029 y Fy(on)g(a)-5 b(v)g(erage)-161 +6228 y(and)162 b(that)f Fx(j)p Fy(AssignedV)-14 b(ertices)p +Fx(j)223 b(\024)g(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)p +Fy(,)187 b(then)-161 6427 y Fx(j)p Fy(AssignedV)-14 b(ertices)q +Fx(j)46 b(\024)g Ft(d)1455 6452 y Fr(av)t(g)1676 6427 +y Fy(.)73 b(Th)-5 b(us,)-50 6924 y Ft(C)12 b Fy(\()p +Fx(j)p Ft(V)289 6949 y Fr(cr)t(it)518 6924 y Fx(j)p Fy(\))46 +b Fx(\024)850 6702 y Fo(j)p Fr(V)967 6719 y Fm(cr)s(it)1180 +6702 y Fo(j)915 6766 y Fp(X)911 7118 y Fr(u)p Fn(=1)1219 +6924 y Fy(\()p Ft(d)1370 6949 y Fr(av)t(g)1627 6924 y +Fy(+)37 b(\()p Ft(I)13 b Fy(\()p Ft(u)p Fy(\))36 b Fx(\002)h +Ft(d)2457 6949 y Fr(av)t(g)2677 6924 y Fy(\))g(+)g Ft(d)3031 +6949 y Fr(av)t(g)3251 6924 y Fy(\))230 b(\(6\))5 7374 +y(As)75 b(presen)-5 b(ted)76 b(b)5 b(efore,)78 b Ft(d)1688 +7399 y Fr(av)t(g)1983 7374 y Fy(is)e(a)f(constan)-5 b(t)75 +b(and)g Ft(N)3492 7399 y Fr(t)3629 7374 y Fx(\024)-161 +7573 y Ft(N)-28 7598 y Fr(bedg)t(es)366 7573 y Fy(.)88 +b(Therefore,)60 b(applying)h Ft(d)2073 7598 y Fr(av)t(g)2347 +7573 y Fy(=)54 b(2)p Fx(j)p Ft(E)2782 7598 y Fr(cr)t(it)3012 +7573 y Fx(j)p Ft(=)p Fx(j)p Ft(V)3284 7598 y Fr(cr)t(it)3514 +7573 y Fx(j)60 b Fy(in)-161 7772 y(Theorem)c(1)f(giv)-5 +b(es:)636 8078 y Ft(N)769 8103 y Fr(t)994 8078 y Fx(\024)166 +b(j)p Ft(E)1458 8103 y Fr(cr)t(it)1687 8078 y Fx(j)37 +b(\000)h(j)p Ft(V)2080 8103 y Fr(cr)t(it)2309 8078 y +Fx(j)g Fy(+)f(1)994 8414 y Fx(\024)1309 8302 y Ft(d)1395 +8327 y Fr(av)t(g)p 1309 8376 307 7 v 1420 8528 a Fy(2)1635 +8414 y Fx(j)p Ft(V)1778 8439 y Fr(cr)t(it)2008 8414 y +Fx(j)g(\000)g(j)p Ft(V)2400 8439 y Fr(cr)t(it)2630 8414 +y Fx(j)g Fy(+)g(1)994 8835 y Fx(\024)1289 8601 y Fp(\022)1431 +8723 y Ft(d)1517 8748 y Fr(av)t(g)p 1431 8797 V 1543 +8949 a Fy(2)1794 8835 y Fx(\000)g Fy(1)2043 8601 y Fp(\023)2193 +8835 y Fx(j)p Ft(V)2336 8860 y Fr(cr)t(it)2566 8835 y +Fx(j)g Fy(+)g(1)-161 9241 y(Since)78 b Ft(d)381 9266 +y Fr(av)t(g)679 9241 y Fy(is)g(a)f(constan)-5 b(t)78 +b(then)f Ft(N)2253 9266 y Fr(t)2395 9241 y Fy(=)83 b +Ft(O)5 b Fy(\()p Fx(j)p Ft(V)2947 9266 y Fr(cr)t(it)3176 +9241 y Fx(j)p Fy(\).)139 b(The)-161 9440 y(n)-5 b(um)g(b)5 +b(er)58 b(of)e(times)h(that)f(AssignedEdges[Nextg)40 +b(+)e Ft(g)6 b Fy(\()p Ft(w)t Fy(\)])47 b(=)-161 9639 +y Ft(tr)5 b(ue)42 b Fy(is)h(giv)-5 b(en)42 b(b)-5 b(y)42 +b(Eq.)g(\(5\).)68 b(Th)-5 b(us,)46 b Ft(I)13 b Fy(\()p +Ft(u)p Fy(\))41 b(m)-5 b(ust)43 b(b)5 b(e)42 b(a)g(constan)-5 +b(t)-161 9839 y(b)5 b(ecause)571 10066 y Fo(j)p Fr(V)688 +10083 y Fm(cr)s(it)901 10066 y Fo(j)636 10130 y Fp(X)633 +10482 y Fr(u)p Fn(=1)941 10288 y Fy(\()p Ft(I)13 b Fy(\()p +Ft(u)p Fy(\))35 b Fx(\000)i Fy(1\))46 b(=)g Ft(N)2020 +10313 y Fr(t)2125 10288 y Fy(=)h Ft(O)5 b Fy(\()p Fx(j)p +Ft(V)2641 10313 y Fr(cr)t(it)2869 10288 y Fx(j)p Fy(\))p +Ft(:)4136 6029 y Fy(Since)57 b Ft(I)13 b Fy(\()p Ft(u)p +Fy(\))55 b(and)i Ft(d)5347 6054 y Fr(a)5428 6029 y Ft(v)6 +b(g)63 b Fy(in)56 b(Eq.)g(\(6\))g(are)g(constan)-5 b(ts,)57 +b(w)-5 b(e)57 b(ha)-5 b(v)g(e)4136 6228 y(that)48 b Ft(C)12 +b Fy(\()p Fx(j)p Ft(V)4828 6253 y Fr(cr)t(it)5057 6228 +y Fx(j)p Fy(\))46 b(=)g Ft(O)5 b Fy(\()p Fx(j)p Ft(V)5729 +6253 y Fr(cr)t(it)5958 6228 y Fx(j)p Fy(\).)71 b(As)48 +b Fx(j)p Ft(V)6567 6253 y Fr(cr)t(it)6797 6228 y Fx(j)e(\024)g(j)p +Ft(V)37 b Fx(j)48 b Fy(and)h Fx(j)p Ft(V)37 b Fx(j)46 +b Fy(=)4136 6427 y Ft(cn)p Fy(,)53 b(the)f(time)h(complexit)-5 +b(y)52 b(of)h(the)f(assignmen)-5 b(t)54 b(of)f(v)-9 b(alues)53 +b(to)4136 6627 y(critical)i(v)-5 b(ertices)55 b(is)h +Ft(O)5 b Fy(\()p Ft(n)p Fy(\).)4136 7098 y Fq(5.3.2)193 +b(Assignmen)-5 b(t)105 b(of)f(V)-16 b(alues)104 b(to)h(Non)f(Critical) +4720 7298 y(V)-16 b(ertices)4136 7618 y Fy(The)139 b(pro)5 +b(cedure)139 b(NonCriticalV)-14 b(erticesAssignmen)-5 +b(t)139 b(\()p Ft(G)p Fy(,)4136 7817 y Fs(G)4264 7842 +y Fb(ncrit)4571 7817 y Fy(,)73 b(AssignedEdges,)h(g\))69 +b(receiv)-5 b(es)69 b Ft(G)p Fy(,)j Fs(G)7097 7842 y +Fb(ncrit)7473 7817 y Fy(and)e(As-)4136 8017 y(signedEdges)63 +b(as)f(input)f(and)h(pro)5 b(duces)62 b(the)e(assignmen)-5 +b(t)63 b(of)4136 8216 y(v)-9 b(alues)46 b(to)g(v)-5 b(ertices)45 +b(in)i Ft(G)5722 8241 y Fr(ncr)t(it)6033 8216 y Fy(,)h(represen)-5 +b(ted)47 b(b)-5 b(y)46 b(the)g(arra)-5 b(y)46 b Ft(g)6 +b Fy(.)4136 8415 y(This)69 b(\014nishes)g(the)e(p)5 b(erfect)66 +b(assignmen)-5 b(t)70 b(of)d(v)-9 b(alues)68 b(to)f(v)-5 +b(er-)4136 8614 y(tices)71 b(of)f Ft(G)p Fy(.)119 b(W)-14 +b(e)70 b(use)h(a)g(depth-\014rst)g(searc)-5 b(h)71 b(algorithm)h(to) +4136 8814 y(assign)57 b(v)-9 b(alues)55 b(to)g(v)-5 b(ertices)55 +b(in)h Ft(G)6250 8839 y Fr(ncr)t(it)6562 8814 y Fy(.)4302 +9020 y(As)87 b Ft(G)4710 9045 y Fr(ncr)t(it)5108 9020 +y Fy(is)h(acyclic,)94 b(w)-5 b(e)86 b(can)h(imp)5 b(ose)88 +b(the)e(order)h(in)4136 9220 y(whic)-5 b(h)76 b(addresses)h(are)e(asso) +5 b(ciated)76 b(with)f(edges)h(in)f Ft(G)7697 9245 y +Fr(ncr)t(it)8009 9220 y Fy(.)4136 9419 y(Therefore,)k(in)c(the)g +(assignmen)-5 b(t)76 b(of)e(v)-9 b(alues)75 b(to)f(v)-5 +b(ertices)75 b(in)4136 9618 y Ft(G)4267 9643 y Fr(ncr)t(it)4643 +9618 y Fy(w)-5 b(e)65 b(place)f(the)g(un)-5 b(used)66 +b(addresses)g(in)f(the)f(gaps)h(left)4136 9817 y(b)-5 +b(y)69 b(the)f(assignmen)-5 b(t)70 b(of)e(v)-9 b(alues)68 +b(to)g(v)-5 b(ertices)68 b(in)h Ft(G)7424 9842 y Fr(cr)t(it)7654 +9817 y Fy(.)113 b(F)-14 b(or)4136 10017 y(that,)62 b(w)-5 +b(e)62 b(start)e(the)h(deph)-5 b(t-\014rst)63 b(searc)-5 +b(h)61 b(from)h(the)e(v)-5 b(ertices)4136 10216 y(in)80 +b Ft(V)4451 10241 y Fr(scr)t(it)4824 10216 y Fy(b)5 b(ecause)80 +b(these)f(critical)h(v)-5 b(ertices)79 b(w)-5 b(ere)80 +b(already)4136 10415 y(assigned,)57 b(so)f(their)f Ft(g)62 +b Fy(v)-9 b(alues)55 b(can)g(not)h(b)5 b(e)55 b(c)-5 +b(hanged.)3864 10913 y(10)p eop end +%%Page: 11 11 +TeXDict begin 11 10 bop 5 620 a Fy(Considering)75 b(the)d(subgraph)i +Ft(G)2110 645 y Fr(ncr)t(it)2495 620 y Fy(in)f(Figure)h(4\(d\),)i(a) +-161 819 y(step)f(b)-5 b(y)75 b(step)g(example)f(of)h(the)f(assignmen) +-5 b(t)77 b(of)d(v)-9 b(alues)75 b(to)-161 1018 y(v)-5 +b(ertices)52 b(in)h Ft(G)759 1043 y Fr(ncr)t(it)1123 +1018 y Fy(is)g(presen)-5 b(ted)53 b(in)g(Figure)g(8.)73 +b(Figure)53 b(8\(a\))-161 1218 y(presen)-5 b(ts)52 b(the)f(initial)g +(state)f(of)h(the)f(algorithm.)73 b(The)51 b(critical)-161 +1417 y(v)-5 b(ertex)62 b(5)h(is)h(the)f(only)g(one)g(that)g(has)g(non)h +(critical)f(v)-5 b(ertices)-161 1616 y(as)52 b(adjacen)-5 +b(t.)72 b(In)52 b(the)e(example)i(presen)-5 b(ted)51 +b(in)h(Figure)g(6,)g(the)-161 1815 y(addresses)k Fx(f)p +Fy(0)p Ft(;)28 b Fy(3)p Ft(;)g Fy(6)p Ft(;)g Fy(10)p +Ft(;)g Fy(11)p Ft(;)g Fy(12)p Fx(g)54 b Fy(w)-5 b(ere)54 +b(not)g(used.)74 b(So,)55 b(taking)-161 2015 y(the)77 +b(\014rst)g(un)-5 b(used)79 b(address)g(0)e(and)g(the)g(v)-5 +b(ertex)76 b(13,)83 b(whic)-5 b(h)-161 2214 y(is)62 b(reac)-5 +b(hed)62 b(from)f(the)g(v)-5 b(ertex)61 b(5,)i(the)e +Ft(g)67 b Fy(v)-9 b(alue)61 b(of)g(v)-5 b(ertex)60 b(13)-161 +2413 y(is)75 b(set)f(to)g(0)49 b Fx(\000)h Ft(g)6 b Fy(\(5\))77 +b(=)g(0,)i(as)c(sho)-5 b(wn)75 b(in)g(Figure)f(8\(b\).)130 +b(In)-161 2612 y(Figure)54 b(8\(c\),)f(using)h(the)f(un)-5 +b(used)55 b(addresses)g(3)e(and)h(6,)f(the)g Ft(g)-161 +2812 y Fy(v)-9 b(alues)63 b(for)f(v)-5 b(ertices)61 b(15)i(and)f(14)h +(are)f(set)g(to)g(3)41 b Fx(\000)h Ft(g)6 b Fy(\(13\))57 +b(=)g(3)-161 3011 y(and)c(to)g(6)31 b Fx(\000)g Ft(g)6 +b Fy(\(13\))46 b(=)g(6,)53 b(resp)5 b(ectiv)-5 b(ely)-14 +b(.)72 b(V)-14 b(ertices)52 b(0,)i(1,)f(9,)g(10,)-161 +3210 y(11)46 b(and)g(12)f(w)-5 b(ere)46 b(not)f(assigned)i(y)-5 +b(et,)47 b(so)f(w)-5 b(e)45 b(con)-5 b(tin)g(ue)46 b(the)f(as-)-161 +3409 y(signmen)-5 b(t)58 b(of)e(v)-9 b(alues)56 b(to)g(non)h(critical)f +(v)-5 b(ertices)56 b(from)g(v)-5 b(ertex)-161 3609 y(0.)106 +b(In)67 b(Figure)f(8\(d\),)i(w)-5 b(e)67 b(set)e Ft(g)6 +b Fy(\(0\))66 b(to)f(0.)106 b(The)66 b(only)g(v)-5 b(ertex)-161 +3808 y(that)51 b(is)g(reac)-5 b(hed)52 b(from)f(v)-5 +b(ertex)49 b(0)i(is)h(v)-5 b(ertex)50 b(1,)i(so)f(taking)g(the)-161 +4007 y(un)-5 b(used)56 b(address)g(10)f(w)-5 b(e)54 b(set)g +Ft(g)6 b Fy(\(1\))54 b(to)g(10)35 b Fx(\000)g Ft(g)6 +b Fy(\(0\))46 b(=)g(10.)73 b(This)-161 4206 y(pro)5 b(cess)52 +b(is)g(rep)5 b(eated)50 b(un)-5 b(til)52 b(the)e(UnAssignedEdges)j +(list)e(b)5 b(e-)-161 4406 y(comes)54 b(empt)-5 b(y)-14 +b(.)73 b(The)52 b(\014nal)i(result)f(is)g(sho)-5 b(wn)54 +b(in)f(Figure)g(8\(e\).)5 4624 y(A)65 b(pseudo)h(co)5 +b(de)64 b(for)h(the)g(assignmen)-5 b(t)66 b(of)f(v)-9 +b(alues)65 b(to)g(non)-161 4824 y(critical)55 b(v)-5 +b(ertices)55 b(is)h(presen)-5 b(ted)56 b(in)g(Figure)g(9.)-161 +5359 y Fq(Complexit)-5 b(y)64 b(Analysis)-161 5702 y +Fy(The)88 b(assignmen)-5 b(t)90 b(of)e(v)-9 b(alues)88 +b(to)f(v)-5 b(ertices)88 b(in)g Ft(G)3076 5727 y Fr(ncr)t(it)3476 +5702 y Fy(is)g(a)-161 5902 y(depth-\014rst)61 b(searc)-5 +b(h)61 b(algorithm.)90 b(Then,)61 b(its)g(time)f(complex-)-161 +6101 y(it)-5 b(y)54 b(is)h Ft(O)5 b Fy(\()p Fx(j)p Ft(V)593 +6126 y Fr(scr)t(it)885 6101 y Fx(j)35 b Fy(+)f Fx(j)p +Ft(V)1272 6126 y Fr(ncr)t(it)1585 6101 y Fx(j)g Fy(+)h +Fx(j)p Ft(E)1998 6126 y Fr(ncr)t(it)2310 6101 y Fx(j)p +Fy(\).)73 b(Considering)56 b(that)-161 6300 y Fx(j)p +Ft(V)-18 6325 y Fr(ncr)t(it)294 6300 y Fx(j)47 b(\024)f(j)p +Ft(V)37 b Fx(j)p Fy(,)44 b Fx(j)p Ft(V)1021 6325 y Fr(scr)t(it)1313 +6300 y Fx(j)j(\024)f(j)p Ft(V)37 b Fx(j)p Fy(,)44 b Fx(j)p +Ft(V)36 b Fx(j)47 b Fy(=)f Ft(cn)40 b Fy(and)h Fx(j)p +Ft(E)3033 6325 y Fr(ncr)t(it)3345 6300 y Fx(j)46 b(\024)g +Ft(n)p Fy(,)-161 6499 y(the)j(complexit)-5 b(y)49 b(of)g(the)g +(assignmen)-5 b(t)51 b(of)e(v)-9 b(alues)49 b(to)g(non)g(crit-)-161 +6699 y(ical)56 b(v)-5 b(ertices)55 b(is)h Ft(O)5 b Fy(\()p +Ft(n)p Fy(\).)-161 7352 y Fv(6)270 b(MPHF)90 b(Ev)-15 +b(aluation)-161 7752 y Fy(Figure)103 b(10)e(presen)-5 +b(ts)103 b(a)f(pseudo)h(co)5 b(de)101 b(to)g(ev)-9 b(aluate)101 +b(the)-161 7951 y(MPHF)71 b(generated)g(b)-5 b(y)71 b(the)g(new)f +(algorithm.)122 b(The)70 b(pro)5 b(ce-)-161 8150 y(dure)51 +b(h)g(\()p Ft(x)p Fy(,)g Ft(g)6 b Fy(,)52 b Ft(h)892 +8175 y Fn(1)966 8150 y Fy(,)g Ft(h)1160 8175 y Fn(2)1234 +8150 y Fy(\))e(receiv)-5 b(es)51 b(as)g(input)g(a)g(k)-5 +b(ey)50 b Ft(x)c Fx(2)g Ft(S)10 b Fy(,)51 b(the)-161 +8350 y Ft(g)71 b Fy(function,)66 b(the)e(tables)g(used)h(b)-5 +b(y)65 b Ft(h)2204 8375 y Fn(1)2342 8350 y Fy(and)g Ft(h)2770 +8375 y Fn(2)2908 8350 y Fy(and)g(returns)-161 8549 y(the)55 +b(hash)i(table)e(address)h(assigned)h(to)e Ft(x)p Fy(.)p +-169 8992 9 103 v -169 8898 103 9 v -66 8898 3730 9 v +3664 8898 103 9 v 3759 8992 9 103 v -169 9149 9 150 v +3758 9149 V -72 9104 a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)73 +b Fu(h)80 b(\()15 b Fk(x)32 b Fu(,)83 b Fk(g)38 b Fu(,)83 +b Fk(h)1532 9121 y Fa(1)1634 9104 y Fu(,)g Fk(h)1848 +9121 y Fa(2)1927 9104 y Fu(\))p -169 9306 V 3758 9306 +V 171 9261 a Fk(u)72 b Fu(:)10 b(=)73 b Fk(h)664 9278 +y Fa(1)734 9261 y Fu(\()p Fk(x)p Fu(\))18 b(;)p -169 +9463 V 3758 9463 V 171 9418 a Fk(v)77 b Fu(:)10 b(=)73 +b Fk(h)656 9435 y Fa(2)725 9418 y Fu(\()p Fk(x)p Fu(\))18 +b(;)p -169 9620 V 3758 9620 V 171 9575 a Fl(return)83 +b Fu(\()16 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))34 b(+)h Fk(g)5 +b Fu(\()p Fk(v)g Fu(\))19 b(\))g(;)p -169 9723 9 103 +v -168 9723 103 9 v -66 9723 3730 9 v 3664 9723 103 9 +v 3759 9723 9 103 v 560 10144 a Fy(Figure)56 b(10:)74 +b(Ev)-9 b(aluating)55 b(the)g(MPHF.)4136 620 y Fv(7)270 +b(Exp)7 b(erimen)-7 b(tal)88 b(Results)4136 983 y Fy(In)47 +b(this)g(section)g(w)-5 b(e)47 b(presen)-5 b(t)48 b(exp)5 +b(erimen)-5 b(tal)46 b(results)i(to)e(sho)-5 b(w)4136 +1183 y(the)41 b(e\016ciency)g(of)g(the)f(new)i(algorithm.)69 +b(Also,)45 b(a)c(comparison)4136 1382 y(with)62 b(algorithm)g(CHM)g +(\(prop)5 b(osed)62 b(b)-5 b(y)62 b(Czec)-5 b(h,)63 b(Ha)-5 +b(v)c(as)62 b(and)4136 1581 y(Ma)9 b(jewski)56 b([1]\))f(is)h(made.) +4302 1780 y(The)d(t)-5 b(w)g(o)53 b(algorithms)g(w)-5 +b(ere)53 b(implemen)-5 b(ted)54 b(in)f(the)f(C)g(lan-)4136 +1980 y(guage.)70 b(All)41 b(exp)5 b(erimen)-5 b(ts)41 +b(w)-5 b(ere)42 b(carried)f(out)h(on)g(a)f(computer)4136 +2179 y(running)97 b(the)e(Lin)-5 b(ux)96 b(op)5 b(erating)95 +b(system,)106 b(v)-5 b(ersion)96 b(2.6.7,)4136 2378 y(with)63 +b(a)h(2.2)f(gigahertz)g(A)-5 b(thlon)64 b(pro)5 b(cessor)64 +b(and)g(1)f(gigab)-5 b(yte)4136 2577 y(of)55 b(main)h(memory)-14 +b(.)p 4596 2790 3000 7 v 4593 2972 7 183 v 4695 2918 +a Fu(Collection)p 5466 2972 V 502 w Fk(n)p 6365 2972 +V 503 w Fu(Key)52 b(Size)f(\(Avg\))p 7592 2972 V 4596 +2979 3000 7 v 4593 3162 7 183 v 4751 3107 a(T)-13 b(o)t(doBR)p +5466 3162 V 293 w(3,541,615)p 6365 3162 V 652 w(8.3)p +7592 3162 V 4593 3344 V 4750 3290 a(Random)p 5466 3344 +V 254 w(10,000,000)p 6365 3344 V 574 w(20.0)p 7592 3344 +V 4593 3527 V 4833 3472 a(VLC2)p 5466 3527 V 337 w(10,935,900)p +6365 3527 V 613 w(8.6)p 7592 3527 V 4593 3710 V 4840 +3655 a(URLs)p 5466 3710 V 344 w(20,000,000)p 6365 3710 +V 574 w(57.4)p 7592 3710 V 4596 3716 3000 7 v 4452 4039 +a Fy(T)f(able)56 b(4:)74 b(Collections)55 b(used)h(in)g(the)f(exp)5 +b(erimen)-5 b(ts.)4302 4411 y(W)-14 b(e)145 b(used)h(four)f +(collections)h(in)f(the)g(exp)5 b(erimen)-5 b(ts:)4136 +4610 y(\(i\))119 b(the)g(v)-5 b(o)5 b(cabulary)119 b(of)g(the)g(T)-14 +b(o)5 b(doBR)120 b(searc)-5 b(h)120 b(engine)4136 4810 +y(\(h)-5 b(ttp://www.to)5 b(dobr.com.br\);)77 b(\(ii\))69 +b(a)h(collection)g(of)f(k)-5 b(eys)4136 5009 y(generated)38 +b(randomly)h(\(Random\);)44 b(\(iii\))38 b(the)f(v)-5 +b(o)5 b(cabulary)38 b(ex-)4136 5208 y(tracted)55 b(from)h(the)f +(TREC-VLC2)g(\(V)-14 b(ery)54 b(Large)h(Collection)4136 +5407 y(2\))i(collection)f([11];)i(\(iv\))d(a)i(set)f(of)h(URLs)g(cra)-5 +b(wled)57 b(from)g(the)4136 5607 y(W)-14 b(eb.)99 b(T)-14 +b(able)63 b(4)h(presen)-5 b(ts)65 b(some)f(details)g(ab)5 +b(out)63 b(the)g(collec-)4136 5806 y(tions.)4302 6005 +y(T)-14 b(able)55 b(5)g(presen)-5 b(ts)55 b(the)f(main)i(c)-5 +b(haracteristics)54 b(of)h(the)f(t)-5 b(w)g(o)4136 6204 +y(algorithms.)75 b(The)55 b(n)-5 b(um)g(b)5 b(er)57 b(of)e(edges)h(of)f +(graph)h Ft(G)46 b Fy(=)g(\()p Ft(V)9 b(;)28 b(E)10 b +Fy(\))4136 6404 y(is)63 b(equal)g(to)f(the)g(size)h Ft(n)f +Fy(of)h(the)f(set)g Ft(S)72 b Fy(of)63 b(k)-5 b(eys)62 +b(for)h(the)f(t)-5 b(w)g(o)4136 6603 y(algorithms.)121 +b(The)71 b(n)-5 b(um)g(b)5 b(er)72 b(of)e(v)-5 b(ertices)70 +b(of)h Ft(G)f Fy(is)h(equal)g(to)4136 6802 y(1)p Ft(:)p +Fy(15)p Ft(n)61 b Fy(and)h(2)p Ft(:)p Fy(09)p Ft(n)f +Fy(for)g(the)f(new)h(algorithm)h(and)g(the)e(CHM)4136 +7001 y(algorithm,)53 b(resp)5 b(ectiv)-5 b(ely)-14 b(.)72 +b(This)53 b(measure)g(is)f(related)g(to)g(the)4136 7201 +y(amoun)-5 b(t)62 b(of)f(space)g(to)f(store)h(the)g(arra)-5 +b(y)61 b Ft(g)6 b Fy(.)90 b(The)61 b(n)-5 b(um)g(b)5 +b(er)62 b(of)4136 7400 y(critical)74 b(edges)g(is)h(0)p +Ft(:)p Fy(5)p Fx(j)p Ft(E)10 b Fx(j)73 b Fy(and)i(0,)j(for)c(the)g(new) +g(algorithm)4136 7599 y(and)56 b(the)f(CHM)g(algorithm,)h(resp)5 +b(ectiv)-5 b(ely)-14 b(.)p 4509 7811 3174 7 v 4506 8047 +7 236 v 4675 8047 a Fu(Characteristics)p 5838 8047 V +6388 7939 a(Algorithms)p 7679 8047 V 5841 8053 1841 7 +v 4506 8229 7 183 v 5838 8229 V 5941 8175 a(New)52 b(algorithm)p +7032 8229 V 238 w(CHM)p 7679 8229 V 4509 8236 3174 7 +v 4506 8419 7 183 v 5072 8364 a Ff(j)p Fk(E)9 b Ff(j)p +5838 8419 V 1112 w Fk(n)p 7032 8419 V 827 w(n)p 7679 +8419 V 4506 8601 V 5071 8546 a Ff(j)p Fk(V)33 b Ff(j)p +5838 8601 V 1079 w Fk(cn)p 7032 8601 V 761 w(cn)p 7679 +8601 V 4506 8784 V 5142 8729 a(c)p 5838 8784 V 1094 w +Fu(1.15)p 7032 8784 V 646 w(2.09)p 7679 8784 V 4506 8967 +V 5093 8912 a Ff(j)p Fk(g)5 b Ff(j)p 5838 8967 V 998 +w Fu(1)p Fk(:)p Fu(15)p Fk(n)p 7032 8967 V 554 w Fu(2)p +Fk(:)p Fu(09)p Fk(n)p 7679 8967 V 4506 9149 V 4968 9094 +a Ff(j)p Fk(E)5124 9111 y Fj(cr)s(it)5340 9094 y Ff(j)p +5838 9149 V 854 w Fu(0)p Fk(:)p Fu(5)p Ff(j)p Fk(E)k +Ff(j)p 7032 9149 V 678 w Fu(0)p 7679 9149 V 4506 9332 +V 5115 9277 a Fk(G)p 5838 9332 V 1018 w Fu(cyclic)p 7032 +9332 V 511 w(acyclic)p 7679 9332 V 4506 9515 V 4609 9460 +a(Order)52 b(preserving)p 5838 9515 V 616 w(no)p 7032 +9515 V 737 w(y)l(es)p 7679 9515 V 4509 9521 3174 7 v +4364 9843 a Fy(T)-14 b(able)56 b(5:)74 b(Main)55 b(c)-5 +b(haracteristics)56 b(of)f(the)g(algorithms.)4302 10216 +y(T)-14 b(able)132 b(6)g(presen)-5 b(ts)133 b(time)e(results)i(for)e +(constructing)4136 10415 y(MPHFs)72 b(using)h(the)e(t)-5 +b(w)g(o)72 b(algorithms.)124 b(The)71 b(table)h(en)-5 +b(tries)3864 10913 y(11)p eop end +%%Page: 12 12 +TeXDict begin 12 11 bop -121 460 8138 7 v 1753 635 a +Fu(New)51 b(algorithm,)f Fk(c)43 b Fu(=)g(1)p Fk(:)p +Fu(15)2386 b(CHM,)51 b Fk(c)43 b Fu(=)g(2)p Fk(:)p Fu(09)p +803 718 3532 7 v 4534 718 3482 7 v 29 887 a(Collection)248 +b Fk(N)1075 904 y Fj(i)1375 887 y Fu(Mapping)199 b(Ordering)i(Searc)l +(hing)236 b(T)-13 b(otal)483 b Fk(N)4806 904 y Fj(i)5106 +887 y Fu(Mapping)51 b(+)h(Ordering)200 b(Searc)l(hing)g(T)-13 +b(otal)p -121 970 8138 7 v 59 1186 a(T)g(o)t(doBR)281 +b(1.92)320 b(11.33)482 b(1.93)547 b(0.97)422 b(14.23)436 +b(2.63)730 b(19.51)915 b(3.03)386 b(22.54)58 1368 y(Random)280 +b(1.77)320 b(41.90)482 b(7.17)547 b(3.70)422 b(52.77)436 +b(2.96)730 b(59.92)877 b(10.31)347 b(70.23)142 1551 y(VLC2)362 +b(2.24)320 b(44.69)482 b(7.00)547 b(3.59)422 b(55.28)436 +b(2.94)730 b(78.77)877 b(11.09)347 b(89.86)149 1734 y(URLs)369 +b(2.18)281 b(153.23)406 b(14.62)508 b(7.52)384 b(175.37)508 +b(-)991 b(-)1177 b(-)648 b(-)p -121 1842 V 1667 2165 +a Fy(T)-14 b(able)56 b(6:)74 b(Time)55 b(to)g(generate)g(the)g(MPHFs)h +(for)f(the)g(new)g(algorithms.)-161 2695 y(represen)-5 +b(t)55 b(a)-5 b(v)g(erages)55 b(o)-5 b(v)g(er)55 b(50)f(trials.)74 +b(The)54 b(column)h(lab)5 b(elled)-161 2894 y(as)63 b +Ft(N)183 2919 y Fr(i)302 2894 y Fy(represen)-5 b(ts)63 +b(the)f(n)-5 b(um)g(b)5 b(er)64 b(of)e(iterations)h(to)f(generate)-161 +3094 y(the)c(random)h(graph)g Ft(G)e Fy(in)i(the)f(mapping)h(step)f(of) +g(the)g(algo-)-161 3293 y(rithms.)73 b(The)49 b(other)g(columns)i +(represen)-5 b(t)49 b(the)g(run)h(times)f(for)-161 3492 +y(eac)-5 b(h)56 b(step)f(of)h(the)e(algorithms.)75 b(All)56 +b(times)f(are)g(in)h(seconds.)5 3716 y(The)i(CHM)e(algorithm)i(p)5 +b(erforms)58 b(the)e(ordering)i(step)f(to-)-161 3915 +y(gether)65 b(the)f(mapping)i(step.)102 b(In)65 b(the)f(CHM)g +(algorithm)i(the)-161 4115 y(ordering)c(step)g(is)g(just)g(the)f +(assignmen)-5 b(t)63 b(of)f(hash)g(v)-9 b(alues)62 b(to)-161 +4314 y(the)55 b(edges)h(of)f Ft(G)p Fy(.)5 4538 y(The)c(mapping)g(step) +f(of)g(the)g(new)g(algorithm)h(is)f(faster)g(b)5 b(e-)-161 +4737 y(cause)57 b(the)f(n)-5 b(um)g(b)5 b(er)58 b(of)f(iterations)f(to) +g(generate)g Ft(G)g Fy(is)h(lo)-5 b(w)g(er,)-161 4936 +y(since)78 b Ft(G)e Fy(has)i(1)p Ft(:)p Fy(15)p Ft(n)e +Fy(v)-5 b(ertices)77 b(and)g(m)-5 b(ust)78 b(not)e(b)5 +b(e)77 b(acyclic.)-161 5136 y(This)68 b(result)e(fully)g(bac)-5 +b(ks)67 b(the)f(theoretical)g(considerations.)-161 5335 +y(Using)78 b(Eq.)e(\(4\),)82 b(the)76 b(exp)5 b(ected)76 +b(n)-5 b(um)g(b)5 b(er)78 b(of)f(iterations)g(to)-161 +5534 y(generate)h Ft(G)h Fy(for)f(the)h(new)f(algorithm)i(is)f(2)p +Ft(:)p Fy(13)g(and)g(using)-161 5733 y(Eq.)65 b(\(2\),)h(the)e(same)h +(measure)g(is)g(2)p Ft(:)p Fy(92)g(for)f(the)h(CHM)f(algo-)-161 +5933 y(rithm.)73 b(The)49 b(CHM)f(algorithm)i(also)g(needs)g(to)e(v)-5 +b(erify)49 b(if)g Ft(G)g Fy(is)-161 6132 y(acyclic)63 +b(during)i(the)e(mapping)i(step,)h(whic)-5 b(h)65 b(has)f(the)g(same) +-161 6331 y(complexit)-5 b(y)55 b(of)h(the)e(ordering)i(step)g(of)f +(the)g(new)g(algorithm.)5 6555 y(The)47 b(random)h(graph)f +Ft(G)f Fy(generated)g(in)h(the)f(mapping)i(step)-161 +6754 y(of)71 b(the)g(new)g(algorithm)g(has)h(1)p Ft(:)p +Fy(15)p Ft(n)f Fy(v)-5 b(ertices)70 b(and)i(the)e(one)-161 +6954 y(generated)58 b(in)g(the)f(mapping)i(step)f(of)g(the)f(CHM)h +(algorithm)-161 7153 y(has)64 b(2)p Ft(:)p Fy(09)p Ft(n)e +Fy(v)-5 b(ertices.)95 b(That)62 b(is)h(wh)-5 b(y)62 b(the)g(searc)-5 +b(hing)64 b(step)f(of)-161 7352 y(new)68 b(algorithm)g(is)g(faster,)j +(since)d(the)f(time)g(complexit)-5 b(y)68 b(of)-161 7551 +y(the)75 b(searc)-5 b(hing)76 b(step)f(of)f(the)g(algorithms)i(dep)5 +b(ends)76 b(on)f(the)-161 7751 y(n)-5 b(um)g(b)5 b(er)57 +b(of)e(v)-5 b(ertices)55 b(in)h Ft(G)p Fy(.)5 7975 y(W)-14 +b(e)99 b(w)-5 b(ere)99 b(not)g(able)g(to)g(generate)f(a)i(MPHF)f(for)g +(the)-161 8174 y(CHM)66 b(algorithm)h(using)g(the)f(URLs)g(collection.) +106 b(The)66 b(rea-)-161 8373 y(son)77 b(w)-5 b(as)78 +b(that)d(its)i(random)g(graph)g Ft(G)f Fy(has)h(more)g(v)-5 +b(ertices)-161 8572 y(\()p Fx(j)p Ft(V)37 b Fx(j)85 b +Fy(=)h(2)p Ft(:)p Fy(09)p Ft(n)p Fy(\))78 b(and)h(could)h(not)e(b)5 +b(e)79 b(stored)g(in)g(the)g(main)-161 8772 y(memory)56 +b(of)f(the)g(mac)-5 b(hine)56 b(used)g(for)g(the)f(exp)5 +b(erimen)-5 b(ts.)5 8996 y(The)109 b(MPHF)g(generated)g(b)-5 +b(y)109 b(the)f(new)h(algorithm)h(is)-161 9195 y(sligh)-5 +b(tly)55 b(faster)f(than)h(the)f(one)g(generated)g(b)-5 +b(y)55 b(the)f(CHM)g(al-)-161 9394 y(gorithm.)99 b(It)64 +b(happ)5 b(ens)64 b(b)5 b(ecause)64 b(w)-5 b(e)63 b(sa)-5 +b(v)g(e)65 b(a)e(mo)5 b(dule)64 b(op)5 b(er-)-161 9593 +y(ation,)61 b(as)f(sho)-5 b(wn)61 b(in)f(Eq.)f(\(3\).)86 +b(T)-14 b(able)60 b(7)g(presen)-5 b(ts)60 b(the)g(ev)-9 +b(al-)-161 9793 y(uation)63 b(times,)i(whic)-5 b(h)63 +b(are)g(a)-5 b(v)g(erages)63 b(o)-5 b(v)g(er)63 b(50)g(trials.)96 +b(Eac)-5 b(h)-161 9992 y(en)g(try)41 b(in)g(T)-14 b(able)41 +b(7)g(represen)-5 b(ts)42 b(the)f(time)g(to)f(ev)-9 b(aluate)40 +b(all)h(k)-5 b(eys)-161 10191 y(of)55 b(eac)-5 b(h)56 +b(collection.)5 10415 y(Finally)-14 b(,)57 b(Figure)g(11)f(presen)-5 +b(ts)57 b(the)e(time)h(to)f(generate)h(the)p 4779 2536 +2634 7 v 4776 2771 7 236 v 4879 2771 a Fu(Collection)p +5649 2771 V 6158 2664 a(Algorithms)p 7409 2771 V 5652 +2778 1760 7 v 4776 2954 7 183 v 5649 2954 V 5752 2899 +a(New)c(algorithm)p 6843 2954 V 198 w(CHM)p 7409 2954 +V 4779 2960 2634 7 v 4776 3143 7 183 v 4934 3088 a(T)-13 +b(o)t(doBR)p 5649 3143 V 616 w(3)p Fk(:)p Fu(33)p 6843 +3143 V 606 w(3)p Fk(:)p Fu(59)p 7409 3143 V 4776 3326 +V 4933 3271 a(Random)p 5649 3326 V 576 w(12)p Fk(:)p +Fu(29)p 6843 3326 V 529 w(13)p Fk(:)p Fu(70)p 7409 3326 +V 4776 3508 V 5016 3454 a(VLC2)p 5649 3508 V 659 w(12)p +Fk(:)p Fu(41)p 6843 3508 V 529 w(13)p Fk(:)p Fu(81)p +7409 3508 V 4776 3691 V 5023 3636 a(URLs)p 5649 3691 +V 666 w(60)p Fk(:)p Fu(03)p 6843 3691 V 679 w(-)p 7409 +3691 V 4779 3698 2634 7 v 4136 4020 a Fy(T)f(able)64 +b(7:)90 b(Time)64 b(to)f(compute)g(a)h(hash)g(table)f(en)-5 +b(try)63 b(for)h(the)4136 4219 y(algorithms)57 b(considered.)74 +b(All)55 b(times)h(are)f(in)h(seconds.)4136 4777 y(MPHF)69 +b(b)-5 b(y)68 b(the)g(new)g(algorithm)h(for)f(di\013eren)-5 +b(t)68 b(n)-5 b(um)g(b)5 b(er)69 b(of)4136 4976 y(k)-5 +b(eys)69 b(of)g(the)g(TREC-VLC2)g(collection.)115 b(As)69 +b(claimed,)74 b(the)4136 5176 y(time)83 b(to)f(generate)g(a)g(MPHF)h +(using)h(the)e(new)h(algorithm)4136 5375 y(gro)-5 b(ws)56 +b(linearly)g(with)f Ft(n)p Fy(.)4146 8364 y + currentpoint currentpoint translate 0.65 0.65 scale neg exch neg exch +translate + 4146 8364 +a 4146 4164 a + 23681433 16577003 3289088 3289088 26970521 19866091 startTexFig + 4146 4164 a +%%BeginDocument: figs/graftrec.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: graftrec.ps +%%Creator: gnuplot 4.0 patchlevel 0 +%%CreationDate: Thu Sep 16 16:27:26 2004 +%%DocumentFonts: (atend) +%%BoundingBox: 50 50 410 302 +%%Orientation: Portrait +%%EndComments +/gnudict 256 dict def +gnudict begin +/Color false def +/Solid false def +/gnulinewidth 5.000 def +/userlinewidth gnulinewidth def +/vshift -80 def +/dl {10.0 mul} def +/hpt_ 31.5 def +/vpt_ 31.5 def +/hpt hpt_ def +/vpt vpt_ def +/Rounded false def +/reencodeISO { +dup dup findfont dup length dict begin +{ 1 index /FID ne { def }{ pop pop } ifelse } forall +currentdict /CharStrings known { + CharStrings /Idieresis known { + /Encoding ISOLatin1Encoding def } if +} if +currentdict end definefont +} def +/ISOLatin1Encoding [ +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright +/parenleft/parenright/asterisk/plus/comma/minus/period/slash +/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon +/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N +/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright +/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m +/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve +/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut +/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar +/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot +/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown +/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute +/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave +/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex +/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis +/yacute/thorn/ydieresis +] def +/M {moveto} bind def +/L {lineto} bind def +/R {rmoveto} bind def +/V {rlineto} bind def +/N {newpath moveto} bind def +/C {setrgbcolor} bind def +/f {rlineto fill} bind def +/vpt2 vpt 2 mul def +/hpt2 hpt 2 mul def +/Lshow { currentpoint stroke M + 0 vshift R show } def +/Rshow { currentpoint stroke M + dup stringwidth pop neg vshift R show } def +/Cshow { currentpoint stroke M + dup stringwidth pop -2 div vshift R show } def +/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def + /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def +/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } + {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def +/BL { stroke userlinewidth 2 mul setlinewidth + Rounded { 1 setlinejoin 1 setlinecap } if } def +/AL { stroke userlinewidth 2 div setlinewidth + Rounded { 1 setlinejoin 1 setlinecap } if } def +/UL { dup gnulinewidth mul /userlinewidth exch def + dup 1 lt {pop 1} if 10 mul /udl exch def } def +/PL { stroke userlinewidth setlinewidth + Rounded { 1 setlinejoin 1 setlinecap } if } def +/LTw { PL [] 1 setgray } def +/LTb { BL [] 0 0 0 DL } def +/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def +/LT0 { PL [] 1 0 0 DL } def +/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def +/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def +/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def +/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def +/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def +/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def +/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def +/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def +/Pnt { stroke [] 0 setdash + gsave 1 setlinecap M 0 0 V stroke grestore } def +/Dia { stroke [] 0 setdash 2 copy vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke + Pnt } def +/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V + currentpoint stroke M + hpt neg vpt neg R hpt2 0 V stroke + } def +/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke + Pnt } def +/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M + hpt2 vpt2 neg V currentpoint stroke M + hpt2 neg 0 R hpt2 vpt2 V stroke } def +/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke + Pnt } def +/Star { 2 copy Pls Crs } def +/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath fill } def +/TriUF { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath fill } def +/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke + Pnt } def +/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath fill} def +/DiaF { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath fill } def +/Pent { stroke [] 0 setdash 2 copy gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore Pnt } def +/PentF { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath fill grestore } def +/Circle { stroke [] 0 setdash 2 copy + hpt 0 360 arc stroke Pnt } def +/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def +/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def +/C1 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + vpt 0 360 arc closepath } bind def +/C2 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C3 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C4 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C5 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc + 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc } bind def +/C6 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C7 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C8 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C9 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 450 arc closepath fill + vpt 0 360 arc closepath } bind def +/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill + 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C11 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C12 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C13 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C14 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 360 arc closepath fill + vpt 0 360 arc } bind def +/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } bind def +/Square { dup Rec } bind def +/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def +/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def +/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def +/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def +/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill + exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill + 2 copy vpt Square fill + Bsquare } bind def +/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def +/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill + Bsquare } bind def +/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill + Bsquare } bind def +/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def +/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy vpt Square fill Bsquare } bind def +/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def +/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def +/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def +/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def +/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def +/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def +/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def +/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def +/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def +/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def +/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def +/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def +/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def +/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def +/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def +/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def +/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def +/DiaE { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke } def +/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke } def +/TriUE { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke } def +/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke } def +/PentE { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore } def +/CircE { stroke [] 0 setdash + hpt 0 360 arc stroke } def +/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def +/DiaW { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V Opaque stroke } def +/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V Opaque stroke } def +/TriUW { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V Opaque stroke } def +/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V Opaque stroke } def +/PentW { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + Opaque stroke grestore } def +/CircW { stroke [] 0 setdash + hpt 0 360 arc Opaque stroke } def +/BoxFill { gsave Rec 1 setgray fill grestore } def +/BoxColFill { + gsave Rec + /Fillden exch def + currentrgbcolor + /ColB exch def /ColG exch def /ColR exch def + /ColR ColR Fillden mul Fillden sub 1 add def + /ColG ColG Fillden mul Fillden sub 1 add def + /ColB ColB Fillden mul Fillden sub 1 add def + ColR ColG ColB setrgbcolor + fill grestore } def +% +% PostScript Level 1 Pattern Fill routine +% Usage: x y w h s a XX PatternFill +% x,y = lower left corner of box to be filled +% w,h = width and height of box +% a = angle in degrees between lines and x-axis +% XX = 0/1 for no/yes cross-hatch +% +/PatternFill { gsave /PFa [ 9 2 roll ] def + PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate + PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec + gsave 1 setgray fill grestore clip + currentlinewidth 0.5 mul setlinewidth + /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def + 0 0 M PFa 5 get rotate PFs -2 div dup translate + 0 1 PFs PFa 4 get div 1 add floor cvi + { PFa 4 get mul 0 M 0 PFs V } for + 0 PFa 6 get ne { + 0 1 PFs PFa 4 get div 1 add floor cvi + { PFa 4 get mul 0 2 1 roll M PFs 0 V } for + } if + stroke grestore } def +% +/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont +dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall +currentdict end definefont pop +/Times-Roman reencodeISO def +end +%%EndProlog +gnudict begin +gsave +50 50 translate +0.050 0.050 scale +0 setgray +newpath +(Times-Roman) findfont 240 scalefont setfont +1.000 UL +LTb +1080 720 M +63 0 V +5649 0 R +-63 0 V +936 720 M +gsave 0 setgray +( 0) Rshow +grestore +1.000 UL +LTb +1080 1047 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 5) Rshow +grestore +1.000 UL +LTb +1080 1375 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 10) Rshow +grestore +1.000 UL +LTb +1080 1702 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 15) Rshow +grestore +1.000 UL +LTb +1080 2029 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 20) Rshow +grestore +1.000 UL +LTb +1080 2356 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 25) Rshow +grestore +1.000 UL +LTb +1080 2684 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 30) Rshow +grestore +1.000 UL +LTb +1080 3011 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 35) Rshow +grestore +1.000 UL +LTb +1080 3338 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 40) Rshow +grestore +1.000 UL +LTb +1080 3665 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 45) Rshow +grestore +1.000 UL +LTb +1080 3993 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 50) Rshow +grestore +1.000 UL +LTb +1080 4320 M +63 0 V +5649 0 R +-63 0 V +-5793 0 R +gsave 0 setgray +( 55) Rshow +grestore +1.000 UL +LTb +1080 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 0) Cshow +grestore +1.000 UL +LTb +1794 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 1000) Cshow +grestore +1.000 UL +LTb +2508 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 2000) Cshow +grestore +1.000 UL +LTb +3222 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 3000) Cshow +grestore +1.000 UL +LTb +3936 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 4000) Cshow +grestore +1.000 UL +LTb +4650 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 5000) Cshow +grestore +1.000 UL +LTb +5364 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 6000) Cshow +grestore +1.000 UL +LTb +6078 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 7000) Cshow +grestore +1.000 UL +LTb +6792 720 M +0 63 V +0 3537 R +0 -63 V +0 -3777 R +gsave 0 setgray +( 8000) Cshow +grestore +1.000 UL +LTb +1.000 UL +LTb +1080 720 M +5712 0 V +0 3600 V +-5712 0 V +0 -3600 V +LTb +240 2520 M +gsave 0 setgray +currentpoint gsave translate 90 rotate 0 0 M +(Time \(s\)) Cshow +grestore +grestore +LTb +3936 120 M +gsave 0 setgray +(n/1000) Cshow +grestore +LTb +3936 4680 M +gsave 0 setgray +(TREC-VLC2) Cshow +grestore +1.000 UP +1.000 UP +1.000 UL +LT0 +LTb +1800 4137 M +gsave 0 setgray +(MPHF) Rshow +grestore +LT0 +1944 4137 M +639 0 V +1258 784 M +179 130 V +357 181 V +714 451 V +1428 849 V +6792 4025 L +1258 784 Pls +1437 914 Pls +1794 1095 Pls +2508 1546 Pls +3936 2395 Pls +6792 4025 Pls +2263 4137 Pls +1.000 UL +LTb +1080 720 M +5712 0 V +0 3600 V +-5712 0 V +0 -3600 V +1.000 UP +stroke +grestore +end +showpage +%%Trailer +%%DocumentFonts: Times-Roman + +%%EndDocument + + endTexFig + 4146 8364 a + currentpoint currentpoint translate 1 0.65 div 1 0.65 div scale neg +exch neg exch translate + 4146 8364 a 4136 8792 a Fy(Figure)f(11:)72 +b(V)-14 b(eri\014cation)53 b(of)f(the)h Ft(O)5 b Fy(\()p +Ft(n)p Fy(\))51 b(complexit)-5 b(y)52 b(to)h(gen-)4136 +8991 y(erate)i(a)g(MPHF)h(b)-5 b(y)55 b(the)g(new)h(algorithm.)4136 +9827 y Fv(8)270 b(Conclusions)4136 10216 y Fy(A)52 b(new)f(algorithm)i +(for)e(generating)h(MPHFs)g(has)h(b)5 b(een)51 b(pro-)4136 +10415 y(p)5 b(osed.)101 b(Its)65 b(exp)5 b(ected)62 b(time)i(complexit) +-5 b(y)64 b(is)h Ft(O)5 b Fy(\()p Ft(n)p Fy(\),)65 b(so)g(that)3864 +10913 y(12)p eop end +%%Page: 13 13 +TeXDict begin 13 12 bop -161 620 a Fy(the)61 b(new)f(algorithm)h(is)g +(time)g(optimal.)90 b(The)60 b(time)g(to)h(ev)-9 b(al-)-161 +819 y(uate)56 b(the)g(generated)g(function)g(is)h(v)-5 +b(ery)56 b(fast)g(and)h(the)f(space)-161 1018 y(needed)i(to)f(store)h +(it)f(is)i Ft(O)5 b Fy(\()p Ft(n)28 b Fy(log)g Ft(n)p +Fy(\))57 b(bits.)81 b(Exp)5 b(erimen)-5 b(tal)58 b(re-)-161 +1218 y(sults)d(sho)-5 b(w)55 b(that)e(the)g(times)h(to)f(b)5 +b(oth)54 b(generate)f(the)g(MPHF)-161 1417 y(and)i(compute)f(a)g(hash)h +(table)e(en)-5 b(try)54 b(b)-5 b(y)54 b(the)g(new)g(algorithm)-161 +1616 y(are)59 b(b)5 b(etter)57 b(than)i(the)f(times)h(obtained)g(b)-5 +b(y)58 b(the)h(CHM)f(algo-)-161 1815 y(rithm,)e(one)g(of)f(the)g +(fastest)g(kno)-5 b(wn)56 b(algorithm.)-161 2425 y Fv(References)-78 +2810 y Fy([1])84 b(Z.J.)e(Czec)-5 b(h,)88 b(G.)81 b(Ha)-5 +b(v)c(as,)88 b(and)81 b(B.S.)h(Ma)9 b(jewski.)150 b(An)181 +3009 y(optimal)56 b(algorithm)g(for)f(generating)h(minimal)h(p)5 +b(erfect)181 3208 y(hash)78 b(functions.)140 b Fs(Information)80 +b(Pr)-8 b(o)g(c)g(essing)78 b(L)-8 b(etters)p Fy(,)181 +3408 y(43\(5\):257{264,)55 b(1992.)-78 3786 y([2])84 +b(Z.J.)49 b(Czec)-5 b(h,)50 b(G.)g(Ha)-5 b(v)c(as,)50 +b(and)f(B.S.)g(Ma)9 b(jewski.)63 b(F)-14 b(unda-)181 +3985 y(men)-5 b(tal)68 b(study)h(p)5 b(erfect)67 b(hashing.)113 +b Fs(The)-8 b(or)g(etic)g(al)71 b(Com-)181 4184 y(puter)60 +b(Scienc)-8 b(e)p Fy(,)57 b(182:1{143,)f(1997.)-78 4562 +y([3])84 b(P)-14 b(.)61 b(Erdos)h(and)g(A.)e(R)-5 b(\023)-78 +b(en)-5 b(yi.)92 b(On)61 b(random)h(graphs.)92 b Fs(Pu-)181 +4761 y(bic)-8 b(ationes)60 b(Mathematic)-8 b(ae)p Fy(,)55 +b(6:290{297,)h(1959.)-78 5139 y([4])84 b(P)-14 b(.)60 +b(Erd\177)-83 b(os)61 b(and)f(A.)f(R)-5 b(\023)-78 b(en)-5 +b(yi.)88 b(On)60 b(the)g(ev)-5 b(olution)60 b(of)g(ran-)181 +5338 y(dom)90 b(graphs.)176 b Fs(Public)-8 b(ations)91 +b(of)f(the)h(Mathematic)-8 b(al)181 5537 y(Institute)71 +b(of)f(the)h(Hungarian)h(A)-8 b(c)g(ademy)69 b(of)i(Scienc)-8 +b(es)p Fy(,)181 5737 y(56:17{61,)55 b(1960.)-78 6114 +y([5])84 b(P)-14 b(.)65 b(Erd\177)-83 b(os)65 b(and)h(A.)e(R)-5 +b(\023)-78 b(en)-5 b(yi.)103 b(On)65 b(the)f(strength)h(of)g(con-)181 +6314 y(nectedness)50 b(of)f(a)h(random)g(graph.)65 b +Fs(A)-8 b(cta)55 b(Mathematic)-8 b(a)181 6513 y(Scientia)60 +b(Hungary)p Fy(,)d(12:261{267,)e(1961.)-78 6891 y([6])84 +b(P)-14 b(.)88 b(Fla)9 b(jolet,)97 b(D.)88 b(E.)g(Kn)-5 +b(uth,)98 b(and)88 b(B.)g(Pittel.)171 b(The)181 7090 +y(\014rst)64 b(cycles)g(in)h(an)f(ev)-5 b(olving)65 b(graph.)101 +b Fs(Discr)-8 b(ete)68 b(Math)p Fy(,)181 7289 y(75:167{215,)55 +b(1989.)-78 7667 y([7])84 b(E.)66 b(A.)g(F)-14 b(o)-5 +b(x,)70 b(Q.)d(F.)g(Chen,)i(A.)d(M.)h(Daoud,)j(and)d(L.)f(S.)181 +7866 y(Heath.)161 b(Order)85 b(preserving)g(minimal)i(p)5 +b(erfect)83 b(hash)181 8066 y(functions)57 b(and)h(information)g +(retriev)-9 b(al.)78 b Fs(A)l(CM)61 b(T)-13 b(r)-8 b(ans.)181 +8265 y(Inform.)59 b(Systems)p Fy(,)d(9\(3\):281{308,)e(July)i(1991.)-78 +8643 y([8])84 b(E.A.)70 b(F)-14 b(o)-5 b(x,)75 b(Q.F.)c(Chen,)k(and)c +(L.S.)g(Heath.)118 b(A)70 b(faster)181 8842 y(algorithm)i(for)g +(constructing)g(minimal)h(p)5 b(erfect)70 b(hash)181 +9041 y(functions.)96 b(In)63 b Fs(Pr)-8 b(o)g(c)g(e)g(e)g(dings)65 +b(of)h(the)h(15th)f(A)l(nnual)h(In-)181 9240 y(ternational)e(A)l(CM)e +(SIGIR)i(Confer)-8 b(enc)g(e)64 b(on)g(R)-8 b(ese)g(ar)g(ch)181 +9440 y(and)58 b(Development)i(in)e(Information)g(R)-8 +b(etrieval)p Fy(,)56 b(pages)181 9639 y(266{273,)f(1992.)-78 +10017 y([9])84 b(E.A.)125 b(F)-14 b(o)-5 b(x,)144 b(L.)126 +b(S.)g(Heath,)142 b(Q.Chen,)i(and)126 b(A.M.)181 10216 +y(Daoud.)86 b(Practical)59 b(minimal)h(p)5 b(erfect)58 +b(hash)j(functions)181 10415 y(for)42 b(large)g(databases.)54 +b Fs(Communic)-8 b(ations)47 b(of)g(the)h(A)l(CM)p Fy(,)181 +10615 y(35\(1\):105{121,)55 b(1992.)4136 620 y([10])84 +b(G.)41 b(Ha)-5 b(v)c(as,)44 b(B.S.)d(Ma)9 b(jewski,)44 +b(N.C.)c(W)-14 b(ormald,)45 b(and)c(Z.J.)4478 819 y(Czec)-5 +b(h.)171 b(Graphs,)98 b(h)-5 b(yp)5 b(ergraphs)89 b(and)g(hashing.)173 +b(In)4478 1018 y Fs(19th)59 b(International)j(Workshop)e(on)g(Gr)-8 +b(aph-The)g(or)g(etic)4478 1218 y(Conc)g(epts)91 b(in)h(Computer)f +(Scienc)-8 b(e)p Fy(,)101 b(pages)91 b(153{165.)4478 +1417 y(Springer)60 b(Lecture)f(Notes)g(in)h(Computer)f(Science)h(v)-5 +b(ol.)4478 1616 y(790,)55 b(1993.)4136 1948 y([11])84 +b(D.)52 b(Ha)-5 b(wking.)70 b(Ov)-5 b(erview)52 b(of)h(trec-7)f(v)-5 +b(ery)52 b(large)h(collec-)4478 2147 y(tion)i(trac)-5 +b(k)55 b(\(draft)f(for)h(noteb)5 b(o)g(ok\),)54 b(1998.)4136 +2479 y([12])84 b(D.)44 b(E.)g(Kn)-5 b(uth.)57 b Fs(The)50 +b(A)l(rt)f(of)g(Computer)h(Pr)-8 b(o)g(gr)g(amming:)4478 +2679 y(Sorting)46 b(and)f(Se)-8 b(ar)g(ching)p Fy(,)44 +b(v)-5 b(olume)40 b(3.)49 b(Addison-W)-14 b(esley)g(,)4478 +2878 y(second)55 b(edition,)h(1973.)4136 3210 y([13])84 +b(B.S.)41 b(Ma)9 b(jewski,)44 b(N.C.)c(W)-14 b(ormald,)45 +b(G.)c(Ha)-5 b(v)c(as,)44 b(and)d(Z.J.)4478 3409 y(Czec)-5 +b(h.)68 b(A)52 b(family)g(of)g(p)5 b(erfect)51 b(hashing)j(metho)5 +b(ds.)69 b Fs(The)4478 3609 y(Computer)59 b(Journal)p +Fy(,)d(39\(6\):547{554,)f(1996.)4136 3941 y([14])84 b(K.)58 +b(Mehlhorn.)83 b Fs(Data)63 b(Structur)-8 b(es)63 b(and)f(A)l +(lgorithms)g(1:)4478 4140 y(Sorting)e(and)f(Se)-8 b(ar)g(ching)p +Fy(.)75 b(Springer-V)-14 b(erlag,)56 b(1984.)4136 4472 +y([15])84 b(E.)51 b(M.)g(P)-5 b(almer.)68 b Fs(Gr)-8 +b(aphic)g(al)56 b(Evolution:)75 b(A)l(n)56 b(Intr)-8 +b(o)g(duc-)4478 4671 y(tion)45 b(to)h(the)g(The)-8 b(ory)44 +b(of)h(R)-8 b(andom)45 b(Gr)-8 b(aphs)p Fy(.)49 b(John)41 +b(Wiley)4478 4871 y(&)55 b(Sons,)i(New)d(Y)-14 b(ork,)55 +b(1985.)3864 10913 y(13)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/papers/bmz_wea2005.ps b/papers/bmz_wea2005.ps new file mode 100755 index 0000000..8153a5b --- /dev/null +++ b/papers/bmz_wea2005.ps @@ -0,0 +1,8159 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software +%%Title: llncs.dvi +%%Pages: 13 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentFonts: CMBX12 CMR10 CMR7 CMR6 CMR9 CMSY9 CMTT9 CMBX9 CMMI9 +%%+ CMMI10 CMTI10 CMSY10 CMMI7 CMEX10 MSBM10 CMBX10 CMSY7 CMMI5 CMR5 +%%+ CMMI6 CMTT10 CMTI9 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips llncs.dvi -o wea2005.ps +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 2005.01.27:1436 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: f7b6d320.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10 +% cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8 +% cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10 +% cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10 +% +/TeXf7b6d320Encoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve +/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash +/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand +/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen +/period /slash /zero /one /two /three /four /five /six /seven /eight +/nine /colon /semicolon /exclamdown /equal /questiondown /question /at +/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X +/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent +/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u +/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef +/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute +/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE +/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: bbad153f.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9 +% +/TeXbbad153fEncoding [ +/minus /periodcentered /multiply /asteriskmath /divide /diamondmath +/plusminus /minusplus /circleplus /circleminus /circlemultiply +/circledivide /circledot /circlecopyrt /openbullet /bullet +/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal +/greaterequal /precedesequal /followsequal /similar /approxequal +/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows +/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast +/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup +/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional +/prime /infinity /element /owner /triangle /triangleinv /negationslash +/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur +/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K +/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection +/unionmulti /logicaland /logicalor /turnstileleft /turnstileright +/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright +/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv +/backslash /wreathproduct /radical /coproduct /nabla /integral +/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section +/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/minus /periodcentered /multiply /asteriskmath /divide /diamondmath +/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef +/circlemultiply /circledivide /circledot /circlecopyrt /openbullet +/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset +/lessequal /greaterequal /precedesequal /followsequal /similar +/approxequal /propersubset /propersuperset /lessmuch /greatermuch +/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: 09fbbfac.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9 +/TeX09fbbfacEncoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi +/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown +/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla +/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam +/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft +/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon /less +/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N +/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright +/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l +/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright +/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi +/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown +/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute +/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE +/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: aae443f0.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmmi10 cmmi12 cmmi5 cmmi6 cmmi7 cmmi8 cmmi9 cmmib10 +% +/TeXaae443f0Encoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa +/lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi +/omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf +/arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft +/arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle +/twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle +/sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash +/greater /star /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N +/O /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbelow +/slurabove /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p +/q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass /vector +/tie /psi /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi +/.notdef /.notdef /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta +/theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon +/phi /chi /psi /tie /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: 74afc74c.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10 +% +/TeX74afc74cEncoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve +/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash +/suppress /exclam /quotedblright /numbersign /sterling /percent +/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma +/hyphen /period /slash /zero /one /two /three /four /five /six /seven +/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question +/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W +/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent +/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u +/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef +/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute +/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE +/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: 0ef0afca.enc +% Thomas Esser, Dec 2002. public domain +% +% Encoding for: +% cmr5 +% +/TeX0ef0afcaEncoding [ +/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega +/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi +/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls +/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright +/numbersign /dollar /percent /ampersand /quoteright /parenleft +/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K +/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft +/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h +/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash +/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda +/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup +/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj +/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe +/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +] def + +%%EndProcSet +%%BeginProcSet: texps.pro +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginProcSet: special.pro +%! +TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N +/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N +/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N +/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ +/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho +X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B +/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ +/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known +{userdict/md get type/dicttype eq{userdict begin md length 10 add md +maxlength ge{/md md dup length 20 add dict copy def}if end md begin +/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S +atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ +itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll +transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll +curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf +pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} +if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 +-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip +yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub +neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ +noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop +90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get +neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr +1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr +2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 +-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S +TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ +Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale +}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState +save N userdict maxlength dict begin/magscale true def normalscale +currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts +/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x +psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx +psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub +TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def +@MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll +newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto +closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N +/@beginspecial{SDict begin/SpecialSave save N gsave normalscale +currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} +N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs +neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate +rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse +scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg +lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx +ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N +/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ +pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave +restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B +/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 +setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY +moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix +matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc +savematrix setmatrix}N end + +%%EndProcSet +%%BeginFont: CMTI9 +%!PS-AdobeFont-1.1: CMTI9 1.0 +%%CreationDate: 1991 Aug 18 21:08:07 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMTI9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-35 -250 1148 750}readonly def +/UniqueID 5000827 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496 +4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D +DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A +F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458 +8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6 +03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9 +211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3 +E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B +D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1 +6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9 +0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC +1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2 +298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D +C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574 +4266FD34C25C8025FD7DD45F44301DCF03F51335198F9EE71CBD72BB906F445D +EE6AFBA2FA06A0A045D56CDE98A6F0DE807D81F26D017B74D1C7A5AE254B7705 +7D96CFB3C342DD38DB5730ED913639C2BF3CEBFA6F3D493DCE5F8218F8BD8035 +9E6CDFB95628F7198CFA2EBDE1905F051BFC4F835C5A787E3B43EAD947EC893D +9D1B04A9A7EE7CF3E02A58BB0867AA7C77F30CFEBCB4B3E6EC68F6B234FB6B26 +7A9D88A3CBF7A2992911727C7CCA3FAF58CE22B8415AB1CC18E36AF58C244DC6 +919CBF1D30FE86392DEFB8090198AF2FD9A6D09CB3EB44F63E0FFC788865E3C4 +2C17538C6E3EAF2E64BFAB4F43F854D36A1C1C4244A7AEB3BCFA0D47454EE5BB +D8728299B08541A91434397FB9C7F38560279992CB4735C8EA89FF668535E018 +97236DDB1E66877886364DE65B594E2AA980D150F95B83A22014AEC85DC7C115 +629ACC128F0D5206DE41356DA0E6A427A14DD1885417D807433BB60CE4AB2C38 +A3B9D83FED4CCF33CC3F6122E91148B3C5753DF5C5E250CA1A3B06C2227C84AC +DFC7F75A81E52312963909C9014BFA81BC243F80280BA2284CD5C4960C65E22E +996D004E4001CD5CD47DD6FEE8D3C7724B9BA322D2BCF4041D3A3615FDDFE98F +EA64DCB0F364EC526A8F684B49F8FE70CCF213451243C88415BE5726AEC092F0 +B15E451B962BF8E6554657B8B4A5827F935C6C904B1BA87C6CD0077C3BA38BD2 +C9683E2014833EC1E44B17088190D0601F58E9FE1AE55F26BD726194146F821C +0736FAC661BE135F6EB80AC4F26EED161B984E1A9F63B1FF84B916B5AD274CEB +54A354CC055FE535A686A8D7F9D8E8B79C6EA92E624CFEDB5660EE4598433A21 +80C619666A2FF206E56138C5B50D1702E30AECF527B32FB02932597C7A4A1D7C +0973FBAC52758041D3A0DD321F82A110EE7C5437139840FADA313267F223BFB7 +1CE6334C0265B87C6ABEBFC3E99E49654A5D759AB87C740ACBAF704338A38559 +6C71FE0DDF9558FA25EF49626CDDAE60EB5B06C9449F3E99E676DC60CB122A87 +484B82C1777ED6F2E4E81E1540F8E054F9ED998142B08F0DCFBF19D40DF8073F +525CC4A13633B4330BE85D475DB607B51D1A411E1EEAC6A357C1B1504C6CC96B +8412F6D1ED6D34FC652259E639646B7C8E00E84BD0947D974F3E9119E1A688D1 +6B6C86F4A72F94B02BE58740B578F3C5F85FC7C79B980A0C33DF5EE57C70642B +4DD704359CCB8CAC26800AFC870CE776FF20C06E15C54DEDE696F2ABEF45CAAE +71A7A3F6293EFA5710382CDD6105938212DCD1CB7AA32A2FF8868E74EEB71D0A +0D98F5F64F34C6491E0874D7D1F2B42946CC33ABB8817A9D3F097EF8FD1619E6 +5C761355B65ABB32D62A2D202C715A44BE3A70BDBF061C34A9919AD7620DD909 +BD87E5596EE0EFA36F9B6590CFD393CC302A367E4F8D87D7BBF1A490778E4A5C +9670D52AE00ED5A64D0183C9DB2F9B0A501F11536641B5B9E510DA713DC37822 +37BA5A3C012F1AA9299E685526040B3513A848A93F88BBD99A4B61C0C25A95F4 +6EE37352C8EF98858896C25172B4BE4399A3AFE5F13A34E758F3108097D2859E +1F56EFD515985C2C69EE658CE0916F152E7837BC3844E8FFE8DE860744DF6CD3 +7289E7EB15087DFC58064B014779C58A3F7DFA0F9C8E6EAA7519D6C0F67C56D5 +A5A1D7BF785AE79547ED658A97E15B090EFF213E81F21F46B13BF2C33DADF7B4 +91467A3E8532AA75BD182034664DF4B6387015F5ED0ED78C4A8AB3DA6A962F4B +E7FFA763BD400086275856FA2A043BF7B445F86AC50316F5BFA185DF591E62EA +6FFF46169879C51AA4CDB182035C065B49D9DF4DF9E98F373C184D9A912044D4 +80D069815F90D0496096799DFF55B59C594DCD376F0787991976ECF4BEE62ADC +33AE747D4B783012E8B04324E97F4088A5470805AE5A2B2DF96019C4630E8E58 +F9489964588DD9E6852D7A6E4BB4FF1A0A8A04896542FDE5984CE71028ACDF91 +9E11196C21010C80983E0973B5CE6C680B0F17C50BDED2840565E1C24AC88B3B +E9E32F12AAFE2C456408E0F8867690D1882688C886D45D8BFA646C48EA7BD5B0 +16E77C7318D8A19AAAE15E9B66AC4DA366F068618F54900956E8632A268515D4 +3167BE687283300BE63F27E23BAA59E5403E4C5EB5D310F0377D590BD0531C14 +3FA6CE8BF2E7F5B7EC06E52C657EBFC89F6D6DC559A721AE2D9E5890A5B7A9B7 +936973CD42FCB72E160416FCF3902EAE90DA05E907CCEC36620D1612DD91744A +CC3129A087BB4BBE809375ED33B0BB7D5FDB24DC20FAD79BE36C2CA46D341798 +F63588A6A0D5AF09C7FDC254A178578B8B12B8F114C5832724CF90431B615C20 +695A70BDEB475CCF7BF84FA0F2238FDF7EF39434BAA390C330A8397518B9A4FB +99870DEE82314AED358530E6425B4FD0877411D0105A2C9DB467D953D09FC81B +70C88E7DDDBDE20FF5D63475E452F94785986ABD72D27FA140A85F112DF2F668 +4EDE46B2CF92782B92E87885AE2F4858612D61CDFFFFA9770538782405372993 +2A7332D05DC16910C05499043D11E9D40A564DA04237A64BA42A117BE7B1C34B +D3E73D4F2820625A0B63C9598D4CB48270F10F1060AA7839C5F052206F0AFFA6 +E716B359CF7797A52199D71D1A1CFB01944EFCBCB0EDC2440BF4F6F4E72C2C35 +A2877A335D8123B6492C3C5CA7F0BF77C3261CD35E277BC5F63BF56EE522085E +7B9E6634BE2D9F2B5B4364A5AFE315AE362BFA7AE7BC4E06E6FD310408096E27 +259930456FD8CF122A44D2629B63F1FDB37ACF5550E070E150F89755A5902498 +1E11E5FC336D729EDD17C961981C4BA1568A09B89681A5CD9DCDBB2422E2C043 +C487A50D6C5103953FB469820187CD66E44BDA480C22B8568B0D3AF2CA51DC15 +39416DFFAAEBA324898D8610385CF88EC2405FC31DFE91D297D3324B55D2E629 +0593679FD696BF09DA5AF139275A01C6D398569ED7D65408A2000591AF39B565 +601EA37E1C4112FE1B1F9085751154A06F5154F86730999372CF866B655D1E35 +B143938170C17990F9495964F2DC4B09CA0F71F9521CDBE73FD2E3D8DA42ADFA +509FCE4BDEC8FA6906359C20D1D32DCD231E19531E19A00C74E9A930C5331AEE +6067AE314E6BD7015ACD432604F7D0D633C953A168FC26707BF11AFE3DCE3CE4 +2ADB46DDB1E3F8755F05E96E4CAD0F48BB044FAED17F18E600A298F788D70835 +7E9AB83850C9A7BFA02BB6A07EFB10C14407D8AB559A09542D2F7831212E7EE1 +8C2A6EE894BB95900A498D2752897022182633C447D29E4CCA623F8016D5F5BE +87D3C8C198E4049FA65C3642A575D4CCA8AA0F58D8A3306C56BD44CB80AD2E68 +D58765B75FC07EAD4697264D44A00687011DC045D86D38F4AB470CA3A4A8049D +F3FD2EE79992A4764AF2CF873A1ABC8C3FCB6D8E7B137DEB0F6E856CA42688AE +8061631B9BA9AA9B87ADA522DA0E35B83FC0977EDD8F17C0BC15AB1292C2CD27 +B1D30252E662CCB82EE240D5DBCC738DD2F9D8B741D35A6ADB08B8E63684E7A8 +BA1886D8C457D8EA031B3F36B2986AB3B12291519ED42B7BF33DD135BE5383AF +0BF37979158307494101C4D073F9C75D45BA2F45FD407CC7FC84C995E158F1ED +B47DCFD478B343618975466511548153A358B7AA04AE814A196DDD22A68766C1 +640C22E53671F2BA7C464046A41DFD73CD499F29D0A9903DE69618C0889CD92B +58ED3E875C8232D5C268B47D8A159A4D9C36615F905206472715B7A749F32ECC +C6A8B0035355F02D41CFB081F1FB0B3879C4AC62B13A1AF69ED747DFEC8DF995 +1ABF074464F258556D71E057B4F28534601EBFED899CB7CE198A2CE70E329B51 +B8F4B48A706E1D31C306DB01A8DC899A7DDA46AD3B521E2321297587B5AF52C0 +54CCB128A005D55C920B1FEC88C480DE717A372EF9FC653C77F637511ABE7F7A +A7A0550B5E5FA423E0BFB07F7A8CA2447FD183BAABA4250ECC80CF717C3FE877 +D8887F195E0F323677640DA0D1B94C10A1942EA3BE2EFE17B12AC4336CE5562A +B8FCC91D181D4669CE63BCB67F090825685C99D298C546873229AFE047D72627 +A90AC47BDC1243CD072CEE8ADEFA0ABEF79554D3468BC6BF536C89BC380FF6D0 +4DBE812BCFA7731D344511BF920C4F4227F640DEC098FED393351959B82B7AA4 +6FE2D05CE5A01022E53BEBE01070D66F6EA7D6103EFC1CCC3F371E7E4798CA7D +2469DFB5109B15BBF577F53F9753FFAC44A98D2DD196D40A3A19054D6E4410E7 +C340515C2F6F64AEC3CBF80C2D9B81C1920D1061A13D4292ECAFFEB3BF980B53 +3BE1BD78F69F277C9F4BBF4E471E740240DB18C98BED973A064095BB0DBFE49E +E4889BE98F7C09F4021A06756EA453C8C55B5B2B27EE64441030019A15E953D2 +EF772765313BD75548142F538EB03A72847B30F12E40A4D7DA343FCD027AF899 +6B210503CC1B0BC9DF0EC64154296C8D291FE2583080744C7D483C3EB7EE5762 +9A73F99213021A648213C54A9BF5EDF9F473D635C9E7ED8C3400ED20D9C4F6C7 +7AB72ADA535CDBA8B0981C9D4C2B61D55A6590100F7C9A5D7EE642815FD4B8AA +4FFBAB11392D70CC2FD4F0465BC6A9F90C250D5F25BA2369AEACD727865F2BF0 +DEE2F9284509000FE8D9D22219D638BC4D1B277105CF6C2B37C381597FF69162 +26DB880B3CD6DCD1D560AD52DF7F3A7ACBDD5BCFFE6D0A9CB8008A72B5F0419A +4ED2415D436F3A317072E36953170C2D91BCB53E4C7C734C17F37021245B8E9B +453F7CCE86107E4ECBF687B5C2C2A10E68885D992599119E50D05EA37698BFFE +1BBDD0479BEA7002EE41FD92992F5C0933AA4242076236A21D92295E8FF636C1 +52F4D829675411D71F82EFB625F6A8A812B5D57D0A51370BBF586E694CB412D5 +2BCFA7F6E12FBAEEE507F8122AADF8A6157AB5D5BE2AD187F0A480F12D92037C +B6DEFBEC68291D84E02B72C2C98AF0A6EB65F5D1FF6F7E6CA33477241125C2B8 +87124A3DB54536EBDF628B751C4474F72FB30E52C2FB061FF9FA49E1DE68D264 +90F0D2AA4BAD8199A702401750B384948705C7F19E8902C6CA1E98E6D7E8AA17 +828FD54ABC0CA1CAA86FE2D56D952A742D89585958E954C631D4A1A4157A9DE6 +89B452CD4739E5D25923028958232E689C286E9BD82BABAEA01464D37F86D6BF +01993AB9DC6A5D94DDB0FAFF83038DD8C28F408C70D3D13DA8473C81314BB0D3 +643033FE7A107635601AB4FDF623491CABAB2BB63C4AB52B54AF849CA52E3F7C +2DC86304E9AAC823320951D084B4C724E49A9444B3DC90428EDE3BCBB8594F9A +5ACFBD97356C96C509C6F8F65C853CC8DF1B9D8B1F934DBABBA4E7431C38C853 +66A3B754F7C24B37E2F5892CCF335EA1A6056005C3AE0C889E867A0DB9FC130A +FA99617AAB0C5FFCE9B3888201C5CF665712E4232AD1B23A3724B25A4643F6EE +87AEA1A408D084B6C642989A4CE37329DB67CC0B0C9B7D5C5505B837E1EAEA19 +8F9386C34CC7DA69EDD1DA81A61CF8DD55AE65C72FED0C937F0E91998F860429 +DCA1335598EE07E926347AFD8FE701C331780901AE73AE9F3B53F6C9FE26519E +B5B3750E293A92DE03658315AB60D91E53DF40E5AB7CB96C57E6CD0A29F5D039 +EE88010206977FF26EF6D3E4D2784E1869608904B411D2704A42E58DEBB13C15 +B5EC1BC78E1CC89633969FC89F9E9F7FEE05971089E466C51BE8F978D5E8ACBB +EE98555EBC9E1065B18A764394F2E7C6A6B883E43B005293FE878A1C21FDE04B +B5CAAD894D429E1899F805A8115498153812F4065CD4285D0E3C015A24E088EB +EA9827365E6720709BEEC612A6A256B4AB26046726023090F9FFC287A5633028 +A193F92632B6B7E971CEB38864830F11B044C2A51ABDDD25E31B4AA8DAAE1D94 +E9D5B79BCFE5FE617A8774FBFF15A3118711D744869CB575C98DF73C5628DC9B +F4C72877483735930A103C58F3592DBF526135EB927E0C0B71846AB4BCE3014E +090B81D3D3ADD395134A55954139E51C39B167641F0FA3675798F4E340553A74 +E08321BD6A783248EC8770AF75BA7971B8F831CE56320BB8105ABBF535D663CC +409D8D66FB0D5843E4006E222442B18B7B2153298A9F80CB97A8FD0F924AA363 +B4DF9A0538DD628A5FC9D9974EAABD1E9BE974C09B008D54BFE0F6E023C58977 +3F96B508FD104BF2055677CEB939782F7911DE3D2C07C137DC07EC2C358FBC37 +159964F91D35B5F8FEF768F40225B803767E9841760678F57CE9FC89E1FFCC3A +4F1F42060843B2E9FA65FABD577BFAED183667727F247AAE9D461432712307B7 +0BB13E46C497BFEB5D4D24AA2580448FF42F7125E06E8C10E390D9E7313CE319 +B0F873A68033DEA81684BD5DEEBC48E7731068B4C59FB5FE020DFB232F425D6A +E0E8BB6DF1056A603E37934E425A9C340733EF5AC8FC57C3E5E90DD567839471 +9869044CA4E7DC277A55DCD8C7EA871C555951A3B61FDDD5E7B1C59A0B1A199A +AA1D7F98721534FE26D90DE5D00F74C5EF107FD2EFE291503932C4FC65CB7B83 +2EAA2FFEB4AC08C46BC10123FDC88F3EDD1C8BC31B7406115C7E806EFE7E1F61 +001E60C6025DAA8E248290FA4D96B33FC12353B630646D677BC579DC54BC4A65 +1C6BE9694C30D3679887E0D5C4800FE2C1B90D40B20AF0879E11610B56D26C6A +4AFCDC5A175CC53C5C4E5A8FF51F8D3ECA0DCB0E049D44A3065E122E7D3371DD +8F2C8AE28369D0E7BCE916870D9FDD8A72F06A91C783B6A2161FEB04C4221796 +3A1384ACA274AB0BEB24EB4EED3E5AFC3DC86BE6AD4AC60653BF5FAF4B0A575B +140A3406695520E56FA4C2BFD6CEC7A2BDDB92F8E0BD3156036F917C4DECABD1 +E61CE3E529894997A52D4DC9E02CED5A53F9D953A47B83718158F314A17C8905 +A8210741B45AF51648947466C1CF8852F2489D960885A800948BD3789DD59DBE +946F8AC3A70AC8AF92E40FE4B95CEBE749F1D01BF72008FD74C2ACA8E2EB8362 +4EA7647A61C02F6EC7EFA9116D9A370DC663BC72226E031D1DBBA4E2A16296F8 +C4E0CA09072A6B86885D06750509126B540840E2DB1613FFC94A33BDFBF96215 +56EFC948975E82B19577F796BECED8BD7F856EEAEFC6D7F2BB5506963801C064 +5D95D26D31CAC82A704936A46D3644FFEB731B1C89674920888C4E6C21BC249F +08CAC84D2C828632F2A32586167AF2D235BDF41B0BC4FE1541B7FAF793B4BB1D +673E6AA735C0AD02C77EBDA2D48462A3539E6B6CC7136D3983123AB0FFD6F245 +BCCF19F1A37C9753AAD93033AAA722EABADA04FD8908C0CC439E434D335EDA23 +359DD9A8386088632DE391418A6821BC6E4513D10503BAAE8543B054A8552852 +AF1281AF701967AD01463AA1D2AC5B9026C7C54A77825FE92260C6B50C874D6B +F80F2345F95D6744C36E7EDBE79F7D80AC975F0820038DB69947327CC2CA1C72 +609A476553D7063BF67B9C733C025B572369605B9FC14EA25EA98F9F206E90A0 +97CE741B8D2A8ADFC68E2623668439990378689715A85606286095C90C98E337 +E218238590E26FE4AC2ECD7D65EB3B4E9A11A1A437E597D2F3C7B15D92F560B7 +964FBA80373D185DA250A0CC2B48AB4404B458A484FCB960E68E54780052A17B +2B6F7BC4A76FFD0F17EA7F91356125C60A5324BEBB5E8E2C2E87D18A0FF5AA79 +0E7D2EA138824EF6383F8A637BCE5F41E5F42064F0C04A6F23DC5DAB94CCB6DF +D1316F075FC67441B0D00794D9FEC668130E2E4504E6E018B8FC05C5CDFCEDF6 +83E50FF8334F38896455D3C8AEB09583F3A40A4422D02A76C91E53A53E351A51 +DFA8BCCF5D712D1E2ED20531E5C4A3C6CEAA6267FC20E24681F33AE7184FC9A4 +21FB7E2069FE79D37CA40A344F88282805B9456FA329A58EDDD2C1BD0B1A8D51 +3BEFE0488063057FDE6ADD8EC86C37422425349BE218F26C39019398E72B6074 +134DA59F37BC293D35AA8C57658AE747FA765301BAB640A73451FFF96A8975FC +F0BCC31A5026C7E1E56D9C313D9E80C24C5D503DF3ED44952D38F4D2184EB079 +6E8654A0E98525D70140A5B607CAE5C54A3E3DFFA594686202D14236A5AE7232 +49BB50214243C1A20822FB7C567C663304E33F7FA344C6A52460DEF1D9EFE581 +0C671B0C7380AA1863557AF29872A2C9579175EC33BD39EC04D93533DB577CBE +50E338F3A6933AD40DA0E84A7840335B931BCD6F54157743C48CD4CD0D568BB2 +CB70B168198C3B1A2D742A37DAD1063682C5DC7C9B30E8D4625EAD1BEE938BE5 +CB34CD787E365ED88D9B3864B43B7A8B3FA873CF7C1B889DA6F7B870C551908C +DCD98A1805F14995A2CF9413C42B48E49EBD26217C3F300FD279460267C96C5F +85F085C52BF7E8F75C240BB14B012A0E3AD81AF500AAAE22691DD2E294CF7EF6 +82F985949BC557F17815341DEF046E0AC7CDCA817A4C109C82CC81DF0A8E501F +B19ED88D8E468A11DB3B78C673644CBDCFE2ABA18422475169E5E574D8A275FF +CD49CE39B29080A7A4903B1B88C0169EFB1790DDA75877D91FAF70BA50BFFD1A +20692CD75BC8BECEBA0612C3FC71566038D505369CB0F51F62B98350FFA8BBFD +1AE2C4A500C91EE5B7536388E529EE9AB4FC6418D37F8322E577A6501B7AFBA0 +923F3C58581DBE12FBF6B0AEE248501F38EF37A96C1E3334FBC60107FAE832E6 +F4BAD26E7AA39E032A302CCF1A87D3E3C6208CCD182A35E5C194929F5837F2DA +F722C9CCFE6B54A6805B5FEA20123BFD69A9406EB5A036391CDBC93A20B0D6B3 +D48D732C817DC468A2AE5F093B3DCD2828FFC9DE8E9466C4F2E8A5DC2BDB8A5F +F86686A7EF9CA4537E4B3D24E35D773B06B79F32C31C446BCACCD11FA3BAFA0D +C7A47C73390C098F4D2E168E122094EDF6299A2A8D1CFB1FC733F1541918D329 +02BFE2233BA898BC2E8F0E342866C08E7D48C4E393CC01A8F498D76010A7C4A7 +7AED770609432BB5B64C66CFAE1AFDFB1EA04349D3AE4A410B3A1025BAC377EF +5193451877876166AEE7315D5A9C0B9AA9AFE4DFC6B471656C39614B955C4717 +866EC07D16E387976B11B0F3043E6A2FEF66316E0FB428CBA5748607E867AE8B +19AD0832106F4A810D99DE3E0D19F678041FDF0719A99558D222EC3042CFE87C +EEAA828430FC4866A9B3550CDA1E6DD62471BC5E148065167ED7E3E081436416 +229656801B5A5431136F963772DB3D3FAAC65DD14B87F83D73220B2F705BDB0D +3DEA16ECDF4F9D0AC4A636C5F79F24E9186FEF2FA5F5E40246FEA2D2BC08DAFC +391003233C89C325A61EA0BD2F10F5C0897BC3A792FDB7C1C002A56C77D1EA2C +D7E2D3E545C8CA4D6A40F960874C233C44C589A3A3FEDF600927993FD12C01DF +BDC8225BF134C451849A437972FDA64249F488D239EE119E4D0C8440A03BED29 +42CE9250B1308313CEB944E65BF502FAA726CB256D452F2E70C5C69E553DBD34 +BA267D1F0A2C1A6A373F3BC047265C7454557AC9FD6FFA67F9FA95FEC1A8F19B +A5157C9067876212A77766D085F46CB145428F8AFA59CB503C8440A70AE46E0A +FA1AB94666CF3F564ECC261F3ADFDB68D3FBC81F68EA4AF6C433B64C93C51FE5 +1F7F7F768BB127F5DE5FC4E366DB1BE11CDF3A23E85D41BB7BFC9C2422CAE91B +921F9DCE34FA8CA5A384BD6BA0C5875313C5086F56B2EF1434926DD32A0CBAC6 +C6A16841F2376E508AD2A78AE0A1610C6E8DDDA361134B7408DE69006A0746A7 +E29093D183D1BF5133E64C936C5332C23AECA55E68D9CD2B297054342636FE6D +133675E36A0461B5DE9BB3E38CA4630ACF1A523A66A4083D1829468DACCDE523 +32EC01C4271E578037E0FCE03D6CC81EA1BA1FA6F7530E8C86F9E3A3B16935A6 +B335A1A84DB1EDEFD240E9E2612F92FEC7B5EFFF5BCE948592CA3A92427405BC +DC8124FB3E4652E175526A702D1DACFADF4AA4D6C955A4622993302386B0F013 +18937559A5D46A8EB69D1AD0E67CB37E07458EAC8E0264081EC9BD88034D4490 +8FACFCF8AD718E44A4978248A2358EF2D314410B082A51D810CF75D9524BC0C3 +535E83720C1C1C917352429ED012E54306FFC8B18E0B111441F3820A85704EDC +7236E6988548A7D3E519901267271E22629ED13AA808317A8D5AD76301061B46 +6F6916EEA211766BCF623EF3F9B954A93ED913C59EBD6B296757642EF14AA1D1 +2FE5F1EC093BEE4DF8F39BFEC44CF3F93E999AFDEF9EB4D833EB4B7C6BD72F85 +B12FDF12B4BC712B743488DED164DA77ADD9E141061E2CB4BCD04379BEC2A168 +BB5D9A7538CDBB4E93A66D0EC4CE19C5CA5AF495B2927083B88C5C4EACC310A6 +3DA837FE9CAEF8287A6C699136F6AEBC21D0E24101B8F03188E308004320990C +ACF225BCA45EDC764EC456377BEFD5707DA30047821A9E85222947595F31338E +0C4109721951CCE8CF3D69B493814EF1835B235F305FFB1C381E4D48A4B62EE1 +5819F320373C509744C0F0C80A7C3FE248333668BA49998FFF690B60CB8263E0 +D29B35DE57433746CFF1419A1D433068DEC12F8944713F9C41388C9DF4FA6EA7 +305A78254A1E9929614A9D005F14EB017A43BF85C8A0D4B45332BEF0C952CBB5 +F243A2FB06C0269F12AA673E4D6AC0286D149DD592B953F42B82333580D5AE74 +EB77939E2E621D842BC200D564F8ED9C08781469BB33C6B92BA28B9B4BDC19C4 +DBDB68DD5F33050424F767773FB8E0765FDCB39203B7DF875A843F9A1497FD9A +041FB08A677F76422B1C45C2DAF5AB07315BF3465847610136DE36C5E6312509 +DD497813BFB58FE95F9BF0135387BFEC0D4AF7A86475E670CF33F87AFDE61BDA +19F7737E82433D3AA22D2A90767B17D79F7DCD0555181C82FC8F45872A165A41 +8370039AB2CEAE46F80F5C36239ED2512199AC612F16BDE22BCF383561D0C2C8 +266DE5F8EA100C6B4583BD88607910D175FC0EAF01E8DB8EA6C2F09865519276 +78F857B3771B96C1280FF69D20519542A1AFC6BEFBFC438971E9851B265B7A57 +5E7F4A5315554C24F7A761C4C93C068D652A11C143EC67BC55EB4AF3FB0B0FAD +735ED54D721CEADA654D65D45A4407D6D8653DF27ABD9FA8EB3B18FE539553EC +C1139AFA9FA57D82776C6AD8F58F5927200FB1629765668024C2268D4719524D +F029F36C1F3BFB6DBBBA871854BDA3D9AF0A2198DF4E552A820C5A246B7C9706 +03993E5CA71A894F84DFC687532EC02F4BD9E94C0917927521768F8E8C2C8E22 +73A84F5E1EBB42C51A28BC0E1D093F765FB8C7F40E229264FE1D25E12C93F51C +24BF872FE994C4A0486306C20CA2EB9DA8CD61BEA019855C7F028E14D5191F24 +B09D799C049D7A30E3A99C32DD93174A9E98DA08716372596ECE1E33608024BF +6C4EFDE0CEC9C0BB632D0CC64EF18543F4E97F4FE1EB3DF7D60C8169B9CCBBBF +74678AEED67E53B921790C9756F08D52E0E29A50BCFD3A5E9335096723ADCECE +B0E57176D02B8E085EC89CB589CAA8D082E4051D1A4B32C6DB0C8FF1FD195886 +F5AADFDB7D067BD999C3C8FFA5F982E166042D6DFC90C0FBE45B3184B4398929 +D3B6083EF9EDCD9B8E36E830FE608D97325B9B37CAB848409FD1359458F43784 +D1E584D1265994D1E4D44E8FA8EFFA8E6681996D87CD75040FA9531828D5EEEF +39763D1687DDCA41D9AB4F1B8B79D929B82B389046A2D114F60D3E96A7E78A87 +556108B7E6A2A828D40F6BF88E3991C1255139B796BAA15F1496710E8995B41C +79679B308685C35389B436AC154518CD95C0DA922B71E29A448042E582F86C1A +E81EF68322CFDDF7202F5FD856159DF2A285CE6466C740625BF9A47DEA1F018D +EBDE2923550DEE0207F1880465E72000F391968F9FD97FC222A1F1FEE7090AC7 +BC6EE7EAD1A8A8AAB7F6C61AAC38E40C766F883DE3DA09D0D9D3CB55CF81A5C5 +15FB317AE6C574D56480ABAB29037F8D86C91DE45794A42535F575CD74CBF264 +265A6710795DBFF60A15E9B3F3ED7B5468462BF4B0CBDBF52BF8B8274D239C2C +E99EA3E38E03C804277B5E94A54CAE43B15E9EAD3815E08A48F9E377CAAD9148 +D9C3C281E920DBC1CD4D870E74494992857909AFCEBBCC78FF9461F364DB1BBA +9DF6976F91BF88313451212E904319EB35C75A5A8D5C8A091AFF41942DD44655 +8B5532727516FC57B78EA5CB254593464AEBB02D68BE2193BA93ECE9B24E8BAA +5B6114D30A450F1CDE69793B9120228E6DEB24B74E84DCC76DE64377B2E0EE36 +4781D9F1E1BE324BA87A3B7460B026B7207A2B04CE39D788197FAC87DEA33F57 +3CBAEB2EA1CA6255B78EA54DAFACC48546354CE4E41B6FAD29973496148BFA1E +23113B3B90EED5429E53835FFF0C02EDF26F5347014D5E580190273620231360 +2EC0AE9155BCC8DC97E68E1DC7988D06CDC85C03221A66FE8C4DE943CA31C5BB +97A0CCB49D3FEC98BEF7ECC358A1F92B79A8BF29383382B8AD07F2641A3459B7 +D4CDDF153EA877EEC1F6D3DE914C9E832E27380742774E3207B7C2C7890DBD7B +560F5C52E7E8D830C7800AA43F4B1BBA5C9A24D5E094CF8BBA01168F19ED28D4 +7835431F71FE315FF8625096961E3B99A8AC9C5956833AB8C6E7B2344305D98A +12289DFE3CB87FB0E34AE19090058006481F53DF2EB45297D9D790E5DDAA2363 +71E93CE60A0187D4229924329D001794DDB698A6128EE8A394535CAC9F3A902E +7477384A550C5A9500A291AC0D44C2809311C3CD91A743ACB89900E8B134F8AC +BB7F2AF4760D379055ED18C257D3621153D77962E6A8A68C08A0F3FDA1FAD441 +6D6279284C7DC6D062827DDE58A322FA10E60FDDE2E72E461047300A17B71B2C +6A70FF5A750B2D66E680C3102C0E956A31FF4E873F67A8419290192A88BE75DF +827A67E0D6CA9C024EA5E0FAF61466748CF190811AC329CCB9ECD496BA95ACA1 +77869C7F0358039DCE0237B2FF8BF5E4DA24A734B8E5B95E6FCA5E67508CFF86 +29478D58CBE297B1BB6ACCCF2B697D58F78EBA7A1067B9236AB8FD516487C25D +5394EE58B933AE6639CA04C94112E6F891635391DDE83CE22BD02F28EC4DED11 +F594E94B7BC4C57A22E2D616A7434342BDB83CE5EA4CCDEDE0FEA01BA640C5F8 +0B40D67A5D413B4D6FA74EE5136C9B7EBCF95F3F4E6A061BB75C2B3B7BD78337 +5BFEC11CF6E5EB79EB30F7A4BEE88FA5EC858A28C65BF5A14155FA4D15763B36 +B911FBD33C1C35F9B4EC14F774591EF4A8C03F60E530786D245DEBB6C90BD7BF +4BA6D364B7FBC4E6A351DBD555B204136C87DA44AA6B585F3B91072147538C37 +C7AF64A3418D61803A994F89ACE132AD4AB1CE1A7235665050260B9EB689B2A3 +65C34F0AC6E144DE0600172EFBE79B5E62F444B54CB456E86A160940DA578FA1 +1960176C16E2CBC1DEAC8D65E488E9597E0A6BC71F6D328B0C431E52E48200B8 +DE8ECFCC15993E459B9797779B98673BC7B5BDA1C78781BEBFB6ACCEAA9DEF67 +CA973CADD5D63DB8FC3F7E9E6F92E10C957F4AFB015F7923C777B21B94191413 +A2ED8D01E9C84368150D21A2093021D53E83F5AE1E07D49C2D4CF556CB6D5E4C +FE6D4CAE2F50A6E0931F402C647040E1DF3AEC1D91D9471E0E3B227F682036B6 +7B5F8719CF0B383B45F19BC24FE33F60D93A544F391A861FC02F01D95C24B4DC +8A8D1A7018A4063C996F1A64AA073C893F2F304C12314EF95DBE8F045C88B690 +FF286A177D22297F6D436690E4348ED8C129C36411DD6ADB81CD2131E9252C3A +5CEE756AD095339DB020E4F69FA65C2FF1CB26B3BFF8AC3F0494E57D919D2969 +6B6BB197C74CBB466E3A7A377AFBE37DF54EF03EAE840C01248C72736EAA809B +AA000B0B905701F5D0CA92F1EF69C07FAE91F981900AB16F64E1833650580460 +5367EC930C0BEA90F2F90D6CC20E1DE52776A24FB203EBB78AED63FD105875C9 +521B35A4D1EBC591E2129DA5D37FA36CC3A4FBF9C719F790D690353C4290CC92 +448FD0BE083B9475177499341D7FDE5E7E9B9E6957539AAD4AB3A47E9BDB2EB7 +7F6271537D8BEDCE20EA5B998B71B3468A11F9A80F0B735BA456020077DA04E6 +10F8EC9434A772E7C2DC73C5CEB422CD58E4FD88D8167920ACAF93A1BB67E957 +558CF70B29BFF01F5BEA677C93A664A6CD72B553D4B6F0B1E22981EA9AA9FA32 +6E031DE7ECDFAAF0D5546326DAA50DC1F1CB3920DE3B309013A508F0BEB91DB7 +CC6513198443419E8F01FAC3C3818AF9C3595443A6CD2250857C5904E88F842D +C04F77DA9EE1908B15E1AE30220FD840270D8168F2588164C186A72284172BCD +77D76A413875F070C062B8150BC405C507DE0F691D13E483AC2063E2E596B46A +4BCB0F57AA892E7561EC2B7C6359A1732ADF9E7815FBBDC2C1DDE15BAA28F401 +9B14E98639CD9ABA350467D219902A549A84C26FC6B75092179AD22229F36020 +B1AAB7C870643D2537D72D3368C2533542DCA53F9AA5BC8EDCA0C01BC82C4896 +3C4B554E3F591A8310E6320220130115F292B70676C9CF67A28D7D3EA4A43116 +2B43C14C5922AC910D9D137DA5DB99BB7767EA3C92DD0B13C2BF46D403478F9F +40BEEE284AD7C303170833A48FD18FAF0D266E072AD80508DEE8F565C39B4F97 +D3CEF046FB9003ED7DF8C5E2D087296CE6B1326A10821CEE7ACAA22BE4012196 +E42321BCAE6CBB86878B9997AC715C96FAC75B7D4EA7009EAE101A05B7A39E9C +0DBDB48525C9DD7346E574F09576492D3DB1A9BE2ABE94E99B33C674C1A119A5 +B6C113E982CDB45DA3C7D349E59C099491A77D506AB28B14BFCDB8F5EFA0AF1E +B8B1EBC5BB92C27A331CD414826CEB91E1515B27B0DFD46282901A676EFC91B2 +FFD85F3BBCF5424BF28E0E6864AA9919 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.1: CMTT10 1.00B +%%CreationDate: 1992 Apr 26 10:42:42 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-4 -235 731 800}readonly def +/UniqueID 5000832 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 +38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF +D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 +EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 +A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 +F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 +4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA +6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E +A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B +E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F +1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 +452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF +8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 +5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA +DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 +BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 +741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 +E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 +E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 +D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE +C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DC +FF798F2ABFC4F3539392985C4CB324B0007229586D1E0321559F67C057FD7902 +194490A4C133DA790FF3BF23A13C2B1B69EEB75950F9106F2BA1E3CA65C90FF5 +931DADF03DA48AFB8561FC2E710087251BFC42B80B297A3DB0DA138A7622A931 +DA293B0C740987ACE9F2A8EC2DB98F85783C01623FD3612C7E4A84FD93446770 +C3DD7431F955A5F3734F6931BD790F0A45B8D17CB74BDAA4BFF6DAB5380CBF61 +72F37CB67A909E2842E0AC5D9D07D01A4BABBDE2AC70FE5753460D7E1A708B7D +0EFB2B5FF55F9E4571C466AF1F91E545585845B09D855C3A01F713C1BF081EB2 +7E2A0E5980B63AC736D73305BE7C76A6D637A543047CB1FEA0D5EA576DC9E9AB +838AFEECEED5B387AD84597B8F1B645C5CFE109AC7A355699319C74C3F859B9D +48E5EA693BC7EFAC5BEB1B6698741148B6DA46240B5C72EE4A00BE80A631FEBE +8FFA5A9BB55B46CB602E0B0062B6B6B0B09378100F6F37AFB159DC12654EF3FA +2D2446A2E1FA7E54D5E2E6CF1037F536EA71D20090E5442E93BE52E14C9EAEE7 +AA8CFE7898B336B201E774592CC4038AFE9CA1B6E1AF4FC42E722573B1CD6230 +6165C05E58057567BC6AF2154FE303195268BE490C9AC4EE2A3B087FE717F12E +0B8A344A6612A504ADF5A4ABFF40C1DDDBFAF9624F3EA0CD030B9556D0CD81AC +DD096252E9B3055B8E9D4D6C22487BACF1FA85AB65FDBC927CEC788CAAD96571 +272E7FCC619B62F343ADEEAFD4CAC2C2878F2BEECAA47CE87D9D4C72AF75C181 +8F6A1EEB1CF455FD9E1D543BF717612F5E0BFFF37B860814F03A858CBDD46BCA +47762C1A267CFB70881408130515A2FF469FADA3632435894604EF91C74E0751 +C852985269CB64CEBD3A82AF5B55C077102EFBE8F2F4FA6EA4BEDF475DF8B7DA +4964DA00D37959BFBB42F91DBFC072A10D254C10D27A6AC5028D66E59BE54C10 +D6402203AD432AE8DA538812D029484B3E657651A6896611A71B3D70820B9D77 +D961D5B5E458E8CDD13D2515D0BB48545D7101881FA8EB59A671F73604B56B9E +4483619D0225FE2FB0207DBD70B182CED1A33B5A6A8DDE2FF56BD497D6AB2767 +A2E4164B94EF19EBE4B205795558D96B6C7D9543AF4F4196E795F879E2C9F1AB +BA7FBEF668CCD05ED502286C77CCFC0E72BAA640C6EFADF5BCDD60963D794778 +2C668D8D273D981F352D7EEAA39D283EBC92E6EF26C7D5EC3C9C7338AD307B4A +73A8FD605AF48E66FE2185EF7FF789474BAB73969099E7A0E23618D9EDBBFB1D +121B58A03C76B9006B9681A1041D54692637DA827C6CD46417D6BEBD91068066 +6464FE5CB3056A5622DFDFED0B627A0FD6E5FF5DDBEBAEBBF3819DF1936390A1 +1B091A46EF914C51CB22C0EDC63F91D701F3EFCE09595A13E19CAE7B05441249 +B5A9320A5FDADDC1B676039C0FE722F86CB07FFFB8A3F5947D613D10044F8A26 +35037EA869423FA3C93D9074958D862A04EAEA4AC8E074094DC99F276803B272 +C208734565064423C89A030B789462B87A4893258F7BC1A1821D206308301835 +75B5F34A9BF3B115CC07A4C11A8DC97B75A7C8D12017EBF4EC2E0C14B01AA2C1 +3122D3FC389CF5CB4A3AEC20820169D33A36DBEB7335EB89963A737EE724085D +EC60F6F1FC4C27592DE09C93B2BACFAAF6ED88BE0F3DF3F7C9259691421E8F8C +6893A53228C5F43EC0C1FA4CFC27F401DB480A9AD5680A9B9D0723753D547102 +8FE445B22346FD199B2ACF11240470BC55E385F2CEAB834D1E4CFF410F6EF698 +BD61D3E8B859BFDF83BE0DE4A9E34810FC668A16608AF72C441B54081C696B25 +FB47B7381767DEF64E938A05F7DEC802E54F4FBB664D0200A70E829D8E54020B +3A6A166A3EFA16B9F75B6760B3B038C2CBE326BFA92D0A440A5B4C33859A418E +AE2C28F86CE586D37A510DB00D9F6B34F1AC1E84047FBC031DB55C1D83A2B14E +E6F9EC275907BDF37DA4FE10C832AA10054CBC0E361AF655D01072CE98531E39 +FC682E6692F9B9BDEBB9D3DF8ABC6F736CEEBC5B605D7AF839F84C62E26BA5EC +16F3755BE630318694757F2603E90420FDC2833DDB77970A68CA4008D65C5AE6 +49C8463B79340679E8D5763A76B08D102E1D2F2D65DCDA4D4B6C79025E0433C6 +FBD79620A7BD67B45FDC3658FEFD5624171253A317FFF5B4C6A881F056BAB784 +A8CCADDA2DDE3E856EBCCE52994A38578931533114F2E73A5D4397B5AF0D9006 +F22E95AD076530BF6F1BC37584B3EDF0218DCF552EA48A5564605F847CDE6555 +1BA5C4D857E437B4B3A9CAC6E40A206B4EA64AE96C803FC3424AA873CBC53129 +E0233BB7F7CECBEF84465FFFFBA0C7C26012198D95455CB0D250C4BFB55FE070 +131794B894EE8C3E7460713BB9DD1122AB2DC11DB395E073D212F3392F0D5F86 +9FAA01DA02651A1FF5CE2EC9FD03C7A5AF58DB34194FD0B11D8A733DBFC25D8E +8C9533FCD66B5C34C68F66821CA57E8B311BFC09C674787E5BA6017B51A68B58 +B1EE871F72DAAD471A29E3BEA3C8E00A6C62BAB5B4A3D1760DE29EC3F4FA6656 +C316680DB82EC6440D64A1375028826D7C469D2FF749622D15FF2D7B412AC115 +67998AF826F70F239F6D2084633A357A5298B0953A9812CFE5DB96FB885E43F0 +D96FFD568D79BCE6D7CD430C92044173D7E9EAD929DBC860912048705BB3D196 +D94B12506B86070FC586681F1934F8E95FF0BDD975205AD1F824FA7368B8743F +DE5958FCF2C078D926446839F35055027271066C49D89ECE5A9C1BF3BE7DBC5A +14FB7AEB42BE571FF41DDE323354001A58BD6392A8C812610CE1602F7A28EBED +178C31C2BBB4185E0A91A6D47C1746E96C7454F13AB5E7C84AB1F1657594EE8F +59CB0E2CC943B794A6AF897B2A39026A1F70AF7769EBB70B4ECD991A053CFB18 +CF9BE99EAA15CCC7F0E3E745574AD1F1BADC199FD814B839DFF3852775E1AF0C +792723AB5E30CE94F238719EB82A596AC2B45819C9B5DCE0E3A15E65925622B4 +7798282B4DE63A27666143FC96222F0B3A81A4841C706F1ED049371069FB70D2 +9E38394D0E536044C3D73C78D8FC0C0DC15BB790E7169D620C949A5A4A33D784 +1F0511BC23129A523C6B6522F4E9C4AB802318FA150B90087DCD7B515DC2791E +684472BC2A3B106E56B5AF96B47DAD225EA9FA3AE70049D0A342CD32744EFBA5 +D68A2DE641556EBCB76631F00990E0E7606CE0D3E59FA79D5854827232EA835E +34ED89C642B449D3E9D3C84E9D73ED3C2ABEFC3AA8DF61A6D2882D6B5B0B6873 +6A5278DC54255CE995E0A6B59CAE17BF099F2605197C5929BF0E5E7A7C17BE56 +9ED4AC830B49C1BCC1C70776DD735703F7267AB67B9B197818D5C9AB9418A3E3 +E7608743D6772B48F465F433BA191B850B6D7CAF6CA04D5CD5C14545232D52D0 +C48A9A1C436528A58E925EDA37E610A2E9D20DFC44F3F74793E76C9D3C24F87E +B0BDF8CD9C7B18FE85F9AE852336B26A4F98A5A37C127EC32CC36172E8DFE871 +D006CFCFEE86B9EE2A5BD64F721DE18E94B2E55E21E6E32F90E2369415BBFBA5 +F18859D4449AF87A8F7ECA45B88CA5554041101ADDFE7037A1DD4DE9E0BAD755 +CB38C3CC1D63368EDFA1F03B27F80482FADDAA9D6325A2F7FC3DDD7F9D748E46 +EB30E2D4E846616B16B3AEB27F899238CF93DFCA244BD9EADA0F5C833582F2C0 +A77D346A2A062D2ECEA939C45F5E6A721411BA94066F24D34D5792B6E86F14F0 +F51E156C70D8ECB8EFD0CACB8DAA7784B94821CFCC2515D6FB408EDB80698F85 +5D3028A6A06A4AEDEBE47DFE21D43C26C93C8CFB3ABD91C6F5C286886E0B4ECE +B606079BB5B4980E60CAA5B46DECA0004CC7B044D8ED1A73D5A66CA67FC2668E +452F4E63088469DF7D7A5FA0ADCC7887BD71D643F6E4ED41E3C7E283362AF622 +096DB300D8EE6B43B5A7690F3BEE30B0C8D178BD99ED61CE61DA463AD08F8817 +37EF2D3913D40F5CF32B0AE17F62FE66EC8D130843C2448FAC16556E2E77DB61 +3ECE99407079823358E6010D89491B242365D3D1B68A837002097EF1B3E4CABA +D6B0D2059FB7CE0B7FF876458CAC4CAE467268E9A8EA52821A9218A21CD27749 +F072B517A8ED63649AA3680178A0B718197AA3E08BBED26B42CB1CF66DB9A832 +7066961B75C300FC846D42E915269E7C565B0326A07E4A1FAED2FBA3AB02E0F7 +2083B95FFEBFA3508980BDCA24E660F6171122D9DB6B738196C8D4CB95F5412F +F9F3024EFA76D53D9A6FEAD1B72B6ED674724D28D2E4A2A9A02FC7B914540B31 +4B938DB4A83BB14CAB4EB7CE37915F58F9CEAF88E099571D7FA87F46E79FA816 +839B98AE55B866B2D1D78AFED64878DF83CFED739E57D95B911FDE0E35E9CC28 +0DDBE1B0C055B551BD46F9949A172B317FB239E069AA46A9208FEE5939250675 +0C5241835D891930D12CC95D921C614AA2EA7949C5BC9E5A70C776DD628F16D8 +8B44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI6 +%!PS-AdobeFont-1.1: CMMI6 1.100 +%%CreationDate: 1996 Jul 23 07:53:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI6) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI6 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{11 -250 1241 750}readonly def +/UniqueID 5087381 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 +5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC +4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583 +6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1 +8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283 +9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9 +387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E +6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7 +A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169 +70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE +EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927 +BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F +3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3 +3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF +9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46 +D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93 +FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5 +79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69 +C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508 +0797B87C774354F518712BED10630585E99E1C29B15CC9903566677AC2C11EFC +B05A1E85DBB81302C8B2522B3F37C43A981F585A2F5C936F177E7EEC5C9BC111 +14B1C1840E434B6CC5D7108077AF385722ECE0EDB6EAFA0F3A9F9AAA7AF8E9AC +FFBA85E594BD3D2063DB703957BF7B54463226A39FE7712527B4BCF871AB9DD1 +479BA2D10E2F18BB1CC30AFEC7D5E797FE4AF06EADAC0F9A0F7209CE8D2290E6 +14DB62B4139FA1F10339E0713FF9EC0A57CA17226831B2AC9A692E0B73B18DDB +60B30C162D2E5150D6D4373CB0D8C650045366E786BB1B893D3FF2B439210940 +919A897A85EF50079A5B1339EBC7B70EBC474B4024B8FD2628BF1A7391C483A6 +441F40200ABDB7FBB7C832C85CDAC232B21798BCCB07DFBF9A132DE2FDFC3E0F +2E7D15FF013768F2AA10E55BA400BE4746ED1DB739DD8323C46E3302E47902C6 +887D34F86CC79696BA1A4608CDDB93DB67C171C6D72D8609D8103F54E7CF71C2 +905E50DA46947B0546A0528CBC9D2D25865FE40659312238224CA5DB942AB9F5 +87439504A1B78D31DF95F433F396AD8BD1726EB76E0FF8FCBFF9A24C922C1FE1 +44EBDAFDFF9FDAAEC3D49A1260AA4A048645E19895A3EE24CEBB1431D7F57832 +3881085D5AEA699C75D2A02501D4326A9D18A623189CB39D0897A9EF7173AACA +EFB555438EC77986DB06DB75CD8B6C8A64A14C04124301089E9C8F340D90904A +80C2EDCA1C0D22AF66597073D49656DE4F3709CC91A39E8BADA180393D0B4333 +AF9887BB3D28F8648326563F0E3F6B66F9142CE64F2E2DBE18902DD22C1629A2 +1795530B2DF626D8864BE932BDDDE493BDEBA2D0B2B6A9A435826D2BF592B5F6 +84AC439F99BA54875FA0AEB39DF6878DC6A7E097D3466A41B882C9612AAD8C77 +539C1EADCDC357234B103FFB14DDF49081EACA5A63C6942AC803F513353E4A40 +19E68985A6095660EF71347719794EC6AEDE40325AAA33C657C9F3CA431DC25F +07C478A4C0D83A1E02D526305E5D62933CBC8AF7050640B46AC403BB1075F495 +E5511DADC464B83C73799B395B7DC9866B677C2E96AD044D913222CAB3931E62 +8CD4B8FBE6BD9D05A714F8531A061A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR5 +%!PS-AdobeFont-1.1: CMR5 1.00B +%%CreationDate: 1992 Feb 19 19:55:02 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR5) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR5 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-341 -250 1304 965}readonly def +/UniqueID 5000788 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA1F9B0FF4CFF25B8E64D0747A3 +7CAD14E0DBA3E3CA95F10F24B7D5D75451845F1FB7221D7794A860756CFBB3E7 +704A52A22448C34812C3DBEDD41892577AABA7D555E9298C1A0F7DA638078167 +F56E29672683C51CF1C003764A8E7AD9D8ADE77B4983F56FE2D12723AAD8BF36 +682CFBB71B1D12210144D39DD841A971F71DB82AC6CD815987CDCF29ABC3CC96 +5EEBD5D661F452C6E0C74F9ED8D0C5B3755551A172E0FE31EA02344176E32666 +14B6853A1C303A5E818C2E455A6CF8FC9A66DC6E279101D61C523BD9DB8EB82F +EAF4D7FDF6372383C0794C4568D079648689A199D4B65BA646CF95B7647E4BEC +83856C27A8EF177B3A686EDA6354FE9573E123C12EC4BA56A7E8BFB8F9B75147 +9DD79A743968F36F7D0D479FA610F0816E6267E5CE327686A5485AB72201525C +FB3B7CA10E1BF26E44C24E1696CB089CB0055BD692C89B237CF269F77A31DC81 +0F4B75C8400ABCFDCEC6443CD0E81871CD71AA3064ABDE882C4C52322C27FA8B +41C689F827FB0F8AAF8022CF3C1F41C0B45601190C1328831857CBF9B1E7D1AA +246117E56D6B7938488055F4E63E2A1C8D57C17D213729C68349FEC2C3466F41 +171E00413D39DF1F67BC15912F30775AFDF7FB3312587E20A68CF77AD3906040 +842D63C45E19278622DD228C18ABDD024DD9613CDC0B109095DB0ADC3A3C0CB5 +AB597D490189EA81239E39202CBC7A829EB9B313A8F962F7879D374ADF529BD0 +5533EF977142F647AD2F5975BA7E340419116099B19ACCCC37C5512091CC7138 +9F339C66B2C9B87906DD509D3C01FE58D1FCFFD900A965E5DE1AD282FDDE85FA +92FF0A3C9AE2D5AF98449E9A315B39D2024575CA40F9A2F3D5339E648D3126C0 +8E8807EA0B7D89271E7B8B288D4A61362CA05ED34687FC601A562EB8767863CF +EA5E8364E134C69AD711B84A8FBDFA17E798BA9EBF776CB15300E78753129E97 +FE41E3EAB189A507611DE0CCD44047139B8DE5EFC51809FD209EEF4DBDF0FE49 +1BAD5967440B83B33CF3CEC522A63DAEE6A4762C51FC06B875AC12CEED8FACF6 +4C3DF66B8B88610E4F65E3BFCDBF85EC246DC435C0175547DE2008B998D35CE9 +A14B892B4D401B37E75B60C1D637786A9C92DEC415BE87DF0925DE83EAEA370F +B9E6424D5DEB2C4DF85BEDE87DA923DD949BA072FE674B15400F528241752E52 +40BAA7A214763602750E37EDD462CC3EC41F6A280F86D08C6E1A3F2FA1D88A03 +38F94E8DA7CB48A4C61CBE327501F01EC7C18822553C5979DB6179655504E1FA +CA594F7B0E30C3F0670DA9CED7D0BD2165141819C4E98860BC925EA6A8438ABE +B53D6ED683F391003C2A020C1344D0EC3C40A6A59570577F4F8CC186067520BB +EF87D573B8519A38B54A162E4B48ACA19E4DBFBFA1599008F140676E677FE204 +D3F0F112D625005CAA745D0494B3F0203F4F1C2F65DA974B7271E74402A5E4A2 +09E3586CA443E56E074B83031CAD5F6F305151E6006B9961FCADD21B114ED14B +F7C6AD7F299722EB731A12AC6C9809AAC897D09327BD4BC03BCEB77B77EE5AD1 +1CA151B2070E0641C8CED49EB796A202559D3582C03082BBEA6E67F64B58F46B +98909D79975EEAEF24A4AB41C8DCA05C32E8547B0259AB5D85CAAEF36CC1942D +00122D76F29EA30FAEB17F91EBF7B1544209FAA74BB6638FE12B94E10583EE2E +AC0CB24998945610BCF401F004CF55288979B7A9E8E7B584CC36BE7683327912 +E388619E2C8280BCD60AA8F5B2D0A06DC88F7B011009DC5EBF40AEFE96EBD536 +3526537702686F575ADA2CCC98D3C393B046BAE30C833A6BFD12251BB3B5DA36 +B63EB502A3693C94C87B26BA40DADDE1162DC60FFF11DE6FF88E1ADE26300B6E +AFA3B4E884CBFD5745951839A3ED75436B022326888EF1546263EDD8FF7CACC4 +D569 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI5 +%!PS-AdobeFont-1.1: CMMI5 1.100 +%%CreationDate: 1996 Aug 02 08:21:10 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI5) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI5 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{37 -250 1349 750}readonly def +/UniqueID 5087380 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 +89DE8BB201D5DB4627484A80A431B6AFDBBBF23D4157D4AFE17E6B1C853DD417 +25F84CD55402AB88AB7EEFDEDBF2C2C731BD25567C53B474CCF739188A930039 +098A197F9C4BE7594D79442B2C8A67447DE44698321145D7689B91EF235EA80E +B600AA8E238064F154284096C4C2554EFE8DDF13AFF8D3CE30E0999375C0FEE6 +F992DEA5FC3897E2CC8B7A90238E61E41622DE80F438DD994C73275CC52249D9 +F6686F87F394FB7BB668138B210BEC9E46415A1B58C990B81E7D7DD301143517 +4C2A259D2A0A1E200F8101469C10D7D537B0D4D39296A9AB3F132DA9A3B459B0 +F850E2B3A03BDCB35AEF82285D19C38F474FB414F8EC971B994D1C7DD753B271 +2B71549DF497C665DF0F266988209D9EB616E4D9BA229FF984E7A886DB01FD21 +48ED2E4859FD6416C2CE52537464EA884C8C9C2D1083E2B83BE4B766474C23B6 +6E8EC5003200AB10514BB44D14CA700416AB6B2683E80862E7D5B49A05526A32 +554BB23AB8B0824BBA198E3825CE82380CC0FECF46651E3E5D77F09465E73164 +20342822F29572BC7F73F2C3BF95ED3BB6FDEADC20C6AC866C4F2C679594D7E8 +8D944704A3C5D771DC39503BECAB89F34D8CDB8FDB91AFE21F3F0260D05E90C5 +73E2C13DFA022C4522E5918EE25038A0498FBB530DA33B0AE238B1C6ED03FC04 +2BFED8236E07820C5BAB411EAE1B31D93A2FA7C374B1725FEC359ABCB88E2C89 +214529A263D795AACB0B95A3AB2F4E08EF350C282CE521716DBB06E5B8291B3F +5D4ACA230FA192F64BC902A4C8842C0F916F92FBD002ADD408BF0401D0284FBB +F05D4C6DB631420747CC902C5E1617E6573612FB26C8378DF41FFB5048D3CF06 +4893DBA48EF4B043D760F60C75712169D16C83EE020C45369E443E853E1809DD +F395B812067D6FDBD26111B34F42C21036AF952D0D767FD17F6959D9FDD46005 +D64FFF54772B50BB9B173AE79702981F58F9F235C591F476A31852174DF0619C +A470359153DC32610E782B204E7945515464DACE9099B81EEECC7EBD4B5126AF +C3FD9DDFB329AF1C95C41FA4A5F6958869509A23BD7210386329771FA46FF926 +0E54AC35106253EE140449425A8670E1F92B178A02A58EB57540F4BD8110E548 +BB584EA6D625C5F5FE0124A98E49915F1A1B95D2125874360EED1C4379FEF3C6 +90E5780C20309F11F2F23FAD635C44BA030B39EFF083A3ECCDD2641DCD35B24D +59A1A8D05205EE919E493B61A71A62AE54025BC2FA041DD31791DC50A6088531 +8A4298B24F0C7824DC95C61D21092BB72A0DC49686D01506FD8459F39B9EB3C3 +9078094DEF5CEDEC660B806755F07BD335F8C46EB490845C09117F269B8D026B +27F8E7EE30E9E4A8BAA238D99D4CDC7F11081AF46CEAC2652D2799A8EE83DB12 +7EE15C3B3FB94A79EE922782E30C67366520B46054DEAF1CAC3473C273526355 +602217963063FE21FD6668AB42FE800B671CA15852C234F3C3EDEE2943E2D2FB +4BF572ED711361114F7F561C369360846BACB94DE283126D03C25BF4DBD4DEE3 +FD1C3C68793F5C45111A1D4257AC2A3D60CA6C311D84ED467D67D786E386D2E3 +28C8946B7C6A6A2D204621A7BBD2A725F6369318C7543266396CF58EBEEFB7BD +6386DE57D69CC461543AAB4916FED65EC5E75724C00562DD4B1822137856BEF1 +1D607E17CB0233FC2DBA916FD3FF9A858AA0DF0B334AAF4C0A10BA981792D8E4 +ECF71B964C177F880320498F9695F946351CBC0FADF24E378954FBE11C736443 +1BD54FFE1EEF7A688B47592A66C3942C406C128A12153999D0E85F3047A41614 +31C745F690D51D386374A187BDAE2F9565DF40CF1159292BEF9E54FB51091029 +DF8037FBF92BAED7961B0961696FB6FA75A588A203D8D30D38E42450FAEE8843 +457B35D3B9BA2FEC5C9401563BED3E4A6CB4CAACAB06EC35745C7960E46546AD +7D79279A6ED963E5D90AFFA820A2F5BCA875BD068F1B06564C826B99C6AD400B + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY7 +%!PS-AdobeFont-1.1: CMSY7 1.0 +%%CreationDate: 1991 Aug 15 07:21:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-15 -951 1252 782}readonly def +/UniqueID 5000817 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 +8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D +F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 +E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 +424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 +E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C +C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 +868AEA25DA3D5413467B76D2F02F8097D2841804B020B210C0470066F33B37E2 +05805CEE76C91696F62E34EA09B7B7D6D5A4009030F0FB377D84497D56557DF4 +9B39A8B5B98BFC07D37F77324AE22B7B9C462D17C175A20B9F5E818796D45700 +1B13FC4967F4CC16F5D3F3DF2BA71BD6A7CCE57468EB1FCFA70BB7CF6C14895B +85983599407B165E91DF43A63851698377CD3960EF0072CD577FB2F55F71DBF2 +D631A6A627BDB80F7ED0A86EEF1D7BA8509CB8E6809CB7D5746CF0779BFEEA58 +FF4796DB9ABCCDB70849348CB10A029249191BAD99384BCB88F30AC35FF916AF +8264A9D8F0159E5EE474F8FF31CBFDD149A7526CDD58B9DB4792FD6852EC0BD5 +C31A9E80C325CC721EB76743DAD0F36A5AFCC5786B8940FD8CF0FACC37F18FBF +DC3EF3C8F6122B56446FDDCEF6DFFB61993726670B06A19274595B1AB448322D +EB9E686190CB0572AB53F2E189D13F0781C39DB4F7EAD7F39FEF4C08338C99B3 +0D2BABE688958EB49410A43E3BAB1803FA276AD49E649EFD52CAB808E599F306 +17CF39FAB736447ABA2BCE7A5DD82554A6A895C6C5DC9A957044B54FE048951B +6FE24C0C6C3F514A23E3C13365A8569B073E5386D65DAF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX10 +%!PS-AdobeFont-1.1: CMBX10 1.00B +%%CreationDate: 1992 Feb 19 19:54:06 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-301 -250 1164 946}readonly def +/UniqueID 5000768 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 +7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 +77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 +2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 +FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F +DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 +7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 +9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 +CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D +6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 +E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E +8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E +3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 +EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 +0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 +4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF +1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 +757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E +0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 +6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED +E067598E1B8B781EB59569E3D0D54D8EFAE0F3EDE26279776ABA15341E42E636 +6E02817082BE6FE0B04249A4840C11F95F8ADEFF72173E9A5F2AB2F62C427E5B +DC010E18641EAC906A5EF0F9BC2108062134A7F10956219C5847C0D82F0E8663 +12D963E012DF0DD899911EC5D8096F80B49CA3444CF1294FBFAB57DFACC9D01C +46F3BA2F3D1C14EC30CBF83E5729F1C074D4F1665405C9AAFADB8BE41EEE43AA +16966E2C0CCC853C4C09F245ABFD4603C4AA55EADC0A59AA6E9F5895FAF3D3FA +83EDC6E2540417530AE7DDA8EF33DEB81444316FB3F93EF944D9FB06745BACE4 +848398BEB747E58310BBA39C64E341185C82CB77E9D4439EC15BEFF1335F22F8 +F036517C436225F4125ED67ACA7A84230D4E2B6CA713FD6B3CA54BEB540D4604 +D58A8335BC20052440C4903786FE3E335E331CCE36A13F05F71126F680077AAD +ECAE10CB7C057C2D55F384723D5C30D20FD1358CBB61AA05EF45403C3B8019EC +6350ECB240F696BCDDD1A9F0465CB43B824457852CEE14CB39164B65A06C6F60 +2FF3A2A62E9567386DA80C4AD7651D44FE76DBF369706318E0C38215CE324932 +7625B5924F5370E9C13F0A66881FC91A4FF6F1AD4CABA49269C8F547DCD6E7B1 +47D53DB0D8DB88F2B7D435B16704B69FB1932CAE7E189DBCE941CC7A968A8CF0 +A5B18680C9C1CF25413ADC7FED11BDA308A61F2B9B688FBE6F35592A7A80E7F8 +36315FEDBD2A86FEAC9A2436E9827F2D291EBE20C9AF3B6EEDE26157BA188623 +EEFD088E3003970F5406023034921BE2CB71FD2FF3A8097881277AD8FB61E2F1 +78234A1900D0E11B18F1FC53B65F62F8F20B22A7C0584A3DEDCE17A045F366A7 +2452F46F213B0EA52186A9693599344A739F6DD15AA4EAE18AC229C7C70E12A2 +475B7821C941EC9B149BE9B6AF9A887A21D59350EAED951E317DD3AF21767FDA +40A19CF746A59B4B32287762B6D2F9850A4A87122E1D509E77B7E20D38903764 +AFCD068B8A76AC6C24DE414BCF255B58E09F4896A0145E57B37C25B3A3B4F806 +6B7213EB4B15F2817F7B535D00FE9C056045D271F2CC490173D436C77A4D1B5C +F3915DBB226CCF227260EEC9FEFF583E0EF338913221F95D86779420A47DC6D0 +A505EC936CC08C50C7134EA025ED7E4BF5CB3929DC1FBE8198FE1253B9CE7463 +6E26F2455E3ED9FCA0037C5AA7B354A4F30488FE344D2174328A2C70F36C94D7 +BC5CD9AF69AA2FC3527FA61243B6485A78107B760CCBBAA33C6B6C58FC8391A0 +29F7CF8E6AD0FFE0BE9FE0B7EAD3952210FA0FFFDAECD21A07D93B8C0D596E10 +998EE096534EFDDE0F14C2FA1749E0ADF8A0CA30DA9357A8702770B82AD521D0 +FB46033DFB7D2B2F19E587308DA70065D910943A34F7D5F2090FB4AA42ED70CE +D9C73192DD9C1EAE1F49708EE0350FB9DDF1C9011C12CBC10853B76A886F331E +4BC14C95C484B176D6D4CE41047A4B1BC0EB04C7D76EF2A99B455CC71AC485C7 +5B8CCD592792059D48A3DA35FD0496D6D68235191F28DBC1BDF12071767C40BC +F05C6E1385F0C09A42C6CF44B3AFAE963C89B348FA0CEE452DBAB4A8AADC47F0 +3B0A4798A24518FBA8777C66F815382539015CB24FB960E8C0022F065DB2A124 +FEF55B69DFC24E093B4E6D8AC8537B93A75CF925796BA8BB95C761C8720E1BBC +F9A52B5E6754A39F61786DCEC8CFB966B04EF14E3BC6A17C4217AF3ECA869E1A +0B71DB080CC86C6E1050684F4E707DBCA2CC21EF8BEE0E5366A1EEC4F83BB82C +A3E6AA5E2632C1D8E47DCC62F4513E2C95E97D643024556E8018F2EF2A19B322 +3D50C962AD7D5169EFA32FE34A42319C137AA1E69CAAA48C0C66BDF5C0CC3702 +F7D3CD98D0CD83A74F808102FC5E55FCA90EA2ADEB12ED6656C370D2A05ABABD +1C394D15612CA6CBA6CD65777449832B7518242032C7CAA693B4A0DA3FD9D7F7 +BC33C3FFD8C31E7344ED06B6724DC2AD2877048A83EA1E710ECEDB5AAA6C9B9B +FD4009573E89AAF88AE0F8C87B7405908BC2352FC91A4FDDB84F6B8128519B72 +2A137FFB5228F90B92D907D18FD21054E9570374DCF22D235DE401FB8354E93E +A9C6153F76FFF89B17B007DD29CEC22DA2F245F329788E5DE6CCE26CB62AB9D5 +1E33CA61DEE88ED42091AC856C05DBE92CE77DCBB280015DBCF1F22A45F94EDE +BE85D30E93A0F0D79B0CF42E5B7013B04F739DDF771C5D3D94349FD99D9A37CA +C2DB864D8777EDAD939B911563D62E177B4A8D57850AA69CACE4D33C3E523DAE +2015A914C0B6ECE0FF52CECDEE842E40D34E00D0F312F80266A9A6CF2D1603A0 +C8C05C989BE54C874666331579A630603F86563BEF52363A47C8AC964E874E01 +54B85E2EACE5381C8283ED0A342D3BA22D35124DCFC2C55369275B4AD7379EE5 +30A148DAAEB28AC63EFF71C7832DB81178F1D9BD3B9188E23268255EFA1E1EA8 +D9535862FE48B69FCFE9D3EA7907F64071B6785D93459B8625BF4315D528732B +42C116CE3E6DB56606B9768C8856F7E66A4A6FDA088BAF64E54B4D58B90EB1A2 +212891B52351C5681DF1C7A6721DA59BC390E7CC26164EE3156A9254FCA4418A +D6EB3EF5C8F5F682F678F5E4FBCB9ECA95682DEB0E8D658A5A822B6C44876F44 +7685B55CBB20BF1E95171AC47EBB67D654C6AA6CB8AE0CCC995734169E557438 +9FF6B6ED4D5D99FBBE15EA2663CECFBEC7B935C4D45F1FBDF84FA05660AFF8A3 +E7453212B2E0D5DE06B967A703ABBD0DA549258759B6F9F51E539E0AB27683E5 +E5C0C5672A8AE3B2C6D384C3FF203DCF2289F5FDD782D469EB5B8A08C94B2255 +129E4D41EFB639E3FC8F2ED20447A07AE629EC35AF255AA4371A3644E022732F +8608020B6FFC6B9347220F113F88065173EC136CAFFA32A7203AC79F1BA848F9 +8E173C318D0561A1EFE854BEE4FB174795F644A97EC2DA2EB0FA5C2CE650168E +918E2B2D163A8DFA316EF602551C64A82632F038F1A2A590C0DB2A25C03E9E7A +8F9E3AD1AEDF165A29CF474E06F241E95E5D5D3BF6946AF64A3EBD2BD7117E91 +F4F39637F2F4CCB69A7679EF69A3E1F5B3B56D37D2F7C8FF21A8428A8B7D3C81 +3508E542F3D699D65357E846A746349473A01F170267DC4D58A043A41E179079 +AB0EE76C2B8AC302E1AA94EFC58ABA22B752D747AC00B702E61CE5DF2C942F79 +DA65DE2128D60014028F5B0E27E26262073F11FD2CDCD392778348CB30939B83 +A91D5B77D31A0F687EFD17E0B01001AD7B2B4415A44B73469FC1A1672CB0236D +D41BE85BAA4C9A229D84D8FC1C48CA295264BAD407A0F6F9229B5370BBBC0FF3 +752343D66988E0CFAF5102C18F418322BD7A5AE815CE7C80732A8E6E9304CACD +2D0D26A7B373DADFC1A1D122FA9BD045F80B7F046501A6175CB550DD08FE1FA7 +2ED432EC37BDDF999D64C0B2D4A91EB0497575BF88D7E706AB126474E0834D81 +6A7E64C9D6B622C48EC2A0263E4615C4E067474984C7895572DA9A452028FE76 +FE30641FE01845BC5957E7DBD34A9A1CC6A0E5588AFA36BF2D5774577BBDAF2B +69700645AD306974597460959A0BC940FF5F9F97CAC04049874E7CACB989412C +06AB8B0E4FB46E32A8F08388592EDB25E6E1FD8F9735D37E36F09F9459FAFF06 +6263D9BD0720C73D698032BD353FC6029DA7F84D12174324D2D085A0EE6FB2BD +F476AF9C467313AAF0CED041400180A984233D0A3661444AB24D940B6229D0E2 +6090646BAFCD916C7914C1E631C7259901313CB7DFC0D6E31B3FC2F18BBCF494 +06267FCA861EDD35B5AA899963D20DBA33D380C30BA8677D9E8AF65A5D1D8593 +ECFE9329A49CC626679DEF50CACAF4AB2BB08E89445CE70D7E7132732259EFAE +DA2109D0938F660888569E7048F4484C76F73B4F6415F7F1AB89D5FFE85CB3CD +197141BAEB704BED6F26F590086CBC6E484F56AA34CFB1420D3982E2DF873C09 +949B8EC98D9E1E6FB07B72D11D3AACB4CC1DAF846F1B55E80C80C9EE41B9CB5E +76B5984826E45D0F5F813F3E57F8F526DE87570EAB2F625E6F795BE4087B056F +9DC65C370FD020C21D87D0EA3361E3F1097B3DA2A323813CF42F533F4E784E3B +AB0378421234F4EB875F9AACDF23EFFBC3F8D2198F15BE7A245B8AFF167EDED9 +F3474D8F900185C7DAE57C09E82B1B4C820CDF74EBF521A93DF0C09A38806F04 +5CD48F923556779B1BB04538E2C00F3CB0D0F9D51BF71074E13881D5EC2B26E2 +4F576AC8F20B2B361EA4625717FE75256F5817DCB433DBC857860D58447A53CE +702E3DAEBE6D0BEF0FA8A3391EE73A1B3E27B95DC7E62B21910108B1DD0BED02 +ACCF61D4EFC3A4CDD0F78FBA08273F5C1CC3C44B0E480C0180BC172C73CE9081 +BBB1AEA8040EE52EE5F9D8FA930CC262FC4BBFB743733A76ED66C5447EF285D5 +C38AAE72439C296BD4E2B34C6697F967622B0823E8F87601D8764475BE597B89 +D55FBEE64419B42E8444ED55608A7C5D3737D76A1AB8550E086EFB6897FD9464 +2E954E13E07564CF0232DB671E9DD49CA62266631BC04E14B7722FD9DBC344BB +B33147C021E2976DC79994D3F7988080FF20D4AEC571538D1B8A690B43A323F4 +77BAB2AF9B62B2670829EAB9A844A3F6F4154996B8DF77BDEE946E92C4838DC2 +05DF6A2611750B2DECF50871598AE66E93EBDAC680D5785D90935F358EAFB2E9 +1A509601B91CBA764AEA990B9196CB813789F57F826C0088B2CF58E1AD5F5FA8 +7F306859F0F9FF75B750420C99FB3B7087282C22CA4DDFF1A3C4CF7A0A822861 +07762AC3C82372F7D1F5B8D0A6BC6C86067BD33143B0290C589F06297A8492B1 +9F22E18671D013E720E49379F9B2F723115FC4E43DD6CEC243756814952ADBAE +3687B7E1AE94FE7D84DFB62560592CD46C7960E7C60556BDAE8509C5F44F3CA5 +1647D8691F8EB8BFB02A78983F33C00A8736EDAD2408800684F19D5AA88680E3 +287B0219E9448CB59DA5593EB876E21CEE2B26FA8F025C833CB12292B5114BDD +B67E6802A026C90F3D58367C5DD91349CE4C958F10F62D113DA6430B6B40B8E7 +5075C65CDAE22E37320457AB6A64976629A0D236EEBCAA925B7C0BD33F129D8A +4C30CEF7851BCA9A87B54F3508DF652C93B3090548900CF5F641AAA4A9973835 +1923B8D0B9C634C42DDBC5C4324AE647E78DCACE5050DE1F7C3491214C3E4B01 +E756A3DD17BFB2A1B246608CF9C44D7B000C53512CC2CBACAD3969D9562B7757 +000C25F5BE8BDE3761DCA3B734010F414A4BB19BB4FBBB9CD48D5B92EEA28344 +3F0D2B426C181DD9461D821FEA82CAB6E1D8EDFE9EEA62D787465776CBB8B861 +76DE00E9BF499F9055B0C0B949AFE2C9DF25D53D9A0E7E82AA96B2C21B63E1E8 +B43C8D12BC5FB938DC01C2301FB6D263E25A788B3C25E3A170CEBEF8B46AF354 +5C5DE01BDAB24C925091E22070EC94F30A455B81CFB77BFBACF3684E61F06F61 +F406AD832A222A6AB99565CF97CED48122DD13AFE2C97355039A14845270DBE3 +BEBC88E3C496F75D84B9D12F1228FEFDA1E0B564A542078BCC91C993336144E9 +493B035DEC81E85CCE073142825B62958C431642853CE997E5AA3650908550F5 +CEFAE56703E6ADBE419B1C25088E6339D94B0178C9CB665BB0803EAF74B26A6D +BD229AACC723EE690A1466B2BDA816F3A3232D842E8FEDAB517DF6E874EBBE89 +FEF64C8F5F83EBD7773047136DC45E2CEF9E2B830B0128567702C60577833CF3 +6FA02C29F9AE822B52FEFF76A4122CA5ABCC1169D05D4F39D060B8E21CD5685C +FB833A0D3BD63BB522E910ADCF566AEA21ADC095C66E17F8A70749FEBAD5A4DC +ED922180944267CD04657BAD6DF1E76CE541CE33AF2382A4FD6809C42E8AC241 +57BE07F7213FD5AACBA8B20EBBEB6052FD996C4AA2DF8F8145DA1513612CF19B +4D5D41EA4DF39BE49AC43B29965DF72FD921DFE8E66D0AF813D51884C68C64B5 +3DD366FE4754ACD855CF6D45F2AFEC3D4ECBC8BA4EDC2CB737E9489544F165D3 +C8C537687831E094EEF4ABFC041D67DEC56E057E8F3493DF83E3CC3C9C6E0276 +4B0E15A1B35457660B4D801407D1C25B0A74B7DA3DDC35588D6F3F8698706F4B +D677B0A95B3DE04CDFD800FD766A49D3CA34A5CB481F7CBFCFD5945BE1B60205 +02C920B7B921679A7F9B03102A060453F5E37B29F5BCEEAA311C6CB814BDF4C2 +353D6A60A64FE510719C8772C0B64EA6F05D9479A0E2EA80DD16B55CB78EBBE5 +BBA4F4D1F4DE3FB4B8163BAFA9E1F58E6584D66D654CD1C5D177AABD53F72C0A +13DBECD06103139081613D28B0F44D9B9728D56BEF9FCE2C59FF30387AABED4A +F58657358736B2E4E8F57E9A64AAADD9292137EAC12EE4AE504A67E8992DE106 +45A90F4375EF885B3E9ECF28A633E34EBEE00977BDEB37138190CB050CA8A46D +E7567F12DE2AE7CBE4D4DF46F1A85D7BC003FDC784379FDC015D1275F10557C9 +A684F99B70966792924B4848AC0BA3D6E26918EC5932A7CAC4203AE378D6F1B6 +DAD4364645CF50731DFFCF8988EA2ADAAFC22BFC7B39DDB629B38B2B1BA96133 +D9AC19D620B8FC9C2BEE43043783BC7DD402A18661BE996E0EF5CA6EE8FEBB14 +B32A0025361FC72C2E71CDCB7E638DF53FA6D7ABA9C8DDD9D215C4DCD234B546 +7B4D77D9D9704A296A634ED4805633CACD34D72BC8958F1BC87B237A2C0D1C07 +D49999297BA5BA190A91FB86CF34C6AE48AA6B3ED190583AEDAFED3434BF67C6 +C87CF20A50BCF59BFE4DBDEA8D1564640C284D9DCDA15130796B757BC08F7F75 +3E0A7C21BB4A231AEE58E6677B2CB7A5BF0FB7E8351EC52869088AFE2C29C1CB +A68FE10EE76B7FE4159A93A8FE5E062FF39716C221C57459143E8CB4B4E11899 +D3C8A90FF5E2B2900789AB5E801FD7A88ECF7066DE9AA220AF555C0BAB934DFE +17C47DC99E85352211F2D5F03C55F6C7E99154A08061CC9424FD175186803546 +CF729670C5A6ADD03C69870BA9FB07B41AAC602FE0425723A45D8E9AEE7951CF +76C8E160D688E75900FCEE6040AE62E6D7E4A69F8D2433374B3215DB8463A525 +37043B54F7E6ED61421F092481883FE50AEB448979E60B7E4EB705CC61C75881 +5544D9A9FE4F8423FA46C1DBFFB1C61C89CE39D68C03A966440C41DC69FAE04C +20ABC514A5697FFEB571A8CABDDC2204127D6EA2B3F7908BE39262FFAED12514 +CBDE582EEED28646AD4D4A5ACC52CEC2B56D580D5FAE598D15BB389F9FCC524E +6F2EF1AD5EFCB7DD9A355DDCCB99EE9CEF784C5A2AEC2212B3F3C0FEE8BE873C +D8B9651FAFAAD61830779ACC9DD16B4B569365CA71FCEDF27FF937C174360460 +1A07EF06CAC3EA28D076D04805D7C18E1B6D527187ED8E4CFAB9C66DCF05E6E7 +19D2FF5229507277DE3B2753235EDAE820AF349C25D4998A2A5A0837103F0256 +4AD59B7C777F6EFA5D4AC8CC87B7FE5C4E876D888E0F44D2F858EAD4DA625126 +34B6339D8F81585DD2630951CAAA31167B3AC0D60C40B90C8F5A4BBCE71251DB +153CC5A830E657DB2AD6CBACFD41A3B9D49ABBF928F7D92E058325348A801BC6 +FFECB6572882B92AF0C0D4412072A36F8BFF6906FE164ED28F4FE2095DB1FA7E +2FBC71ECF2F5675231713E83175862F917A506A295E3D72DEB3BA08614CE9283 +906C4E75C60EAF7AE104F7BF61A441F0B33C9B8B84B40898648F17503C4187F1 +E52C866044F5AA80C1544122F0721EDE7B27AB507407F1A66584222BA7FFFB8E +70AE115F25F2A68D51D7AD57046227808252DCE5C16D657858136EF2AFDF33CD +AA82D43FA786D45C397D6FF62C03718225A77A269B5A54E5B5BA6485154F7489 +7F8C7DE75D2F6CA2D7CBFE3005D41123104C390113070C9C7DB9463F0B688974 +0576196661EF18643D40CED04AF24BF6C497722A256D24757508E560254C831D +4C78932D9E6EFDD6D83D713B1DDDDAF7F6054249AB9ED32B747E77A19E0398E0 +EFF75B0ED8C76B05C5F16214A7FEF9E143661A310D3F4E6E819198419E796C2B +528F84256F86B0A1136154F38B528CBF8B63D7F00925F76EE22721EA27E0D9CE +BFEDBD29A337189C92DE8DB858ADC2A0041C002908EBD002DAE524F172D7C2E5 +B0A16E5F7E5F380612F63D942D4FC2D174FB501CD2B2B98F80FBF348D49F81DB +95F5C283CF7D4025CCD5482B6A679085A384CF6738AAF3080AA5C80C3D8B1DB8 +A945C857852E2D0ED7846F25264682A2B8695C2C2464A31BF3F1D47E7963F9EA +8CAFA1477A0FBF400A3F3E772B471A2DEA720E5709A8433CC5E9EA317D7F5CF0 +EAD516D39B8CD3336D64F46C7EB0FF8CF1489A17791D6C3DD6491DC0512825CD +711802007ADE103B74CF24B54D5B46411F3D7AB68A1110FF7E8456789A35D120 +364F9DC0863CA4E2F2C1A1E3EA285E80E45924FEA1D8F3ADF74BBB986BEFFD6C +40B4C93C35178D91E6488DE53F0A6582D4138614F6B0D5DBF4C9DA3B73F81492 +BC4080A34C5FFAA6F3FF89CDB45C0717E507246FB23063967100D1B7D0D33A5C +7EFBE283904A8BDC81F55CAF9967F15FD26B4A2067BFE077DE75C1F9C218532A +808BEEE852EE6321C5C53930B05326026CDE9983CD35596DA45E0A1C41BFF020 +8AD260493D9E6AF2884C8D431E7877973D0C75A88B5159488CA2DB21753ABB70 +55DD2C5754CE36C46A2F7A9BC90A6B514C1D427E864CA6C12AABD3CBF9729F43 +67E9179D599233118CC7B7985F943C013DA0724533008123E0444C87B5911645 +D9368120AEA0F341DA657D54FA2E3E00ED4101A89757F3EA768832B52F77F7AE +1573825439917061CF86DD78585AF7987BCD2BA930C485F9DB70CD5F2199BE0C +4283DD29C111346D2D52EF03300F7D82819C88426C11EAD54CA60980115FE9CF +AAB3C968F6D7EE5C465322D4377BDAC86623C51F685DC0AD2E379847B33D739D +659A514B4BCD9E18BB7AA643B8793992BFD144266A8836BE450DE2E64D36C4B8 +5EEB39800BD772834D7A6CC887A9940D0EFFA5E2D2F9C2A90E57814D11160718 +6DB783F53C1A8632269FD613D90C207158DCF2D7B4B42136CFA9820AB8055C64 +89CF236059574D4E9427C71CACF877835C8D85ADF68A07D988C833E195D2E4E3 +466C7B2FBE2638BFF8B5E7B0D1B96584C8376EDE8FF80E744D2CDEBE241D8179 +4BAF497177BC50EDBD1742409292B0E9BB526063D036C61EB76950289D509219 +1AA3CC7ECD18750D499103CC926AE7DBC745786B0ED1A66E96C18491AA3176EA +5D04B45824781DE1D0F1B24C468C8FE8FD8BDEEF244C179671FC63EA5ED515F8 +3F608DF242D494FD4AD005A56C7527F06B03E5062A673B64889DBD56FF1BE27E +70C6479FBF70C5BC6CD92C8087CBAEE7278F4EBF0256E476682F357E13CBA011 +1333F560DE8C794A9D51629B7C0BBFB4EB2F2EB8D526C72B9007294CA6172111 +81EB77BC0B1DA002C41CFDF99CF5B14AE14613E522F7324DF6F12317D6C29730 +194DA8E2F2A6D04684F8B1AE003661F4C5BEB31CF5786B122346AC00DB397484 +657B61132ADC3164AB0D1790770D6A974590BBB4AE4036FD648440F925EC7147 +6F76F2DEDB3006EBA5ED407FEFF05B133531C7055E6B83FAF388CF243B68B371 +5D03F8143AB5B815627E81D8B1165BCCADEEDF58F80728CE799569A5882E75A7 +AB69654CE87842FAAB7E675F4E097F8B32C15F3D42ED59682007BD55DA4F07B1 +FC1304078275E4C87646DC525210F7866B6B4494ED403ABB841B8724D7AF553A +5A7C0CF4752805190CF9A28E0427210FF1E34AFE7D6553C09FFD81AA35252D9C +C722FE0E7C2B74D185A6695ADAD14488F2F8F690AAA8BE78B34DE07898D8499C +EBDF1ED1B67E0FA61B6F8AEA72940AC02B21E652C9B7A084F7A151F61F6A22A0 +97A6968499307D2B97C08A7C6E31BD8D200E5CCFC603443A8CE96D90C48AA373 +26CF6AFF62852C8245634B6E9DFAC8BEF8BD5B6A4F234FF84D245A3120D470FE +6601C337E0BBB7137B7FED1BB6DA8B824905F6315C9A21BABB6C5DE40875DA9E +AA29A1508DF7ECD0774C93D30015CED377221362D92DEB871FC9D839EA6F8E60 +A466BED6E3D2CD1C27683E19BA3CD7777E2A1B34C9536935E0F5A34A5DFDE326 +97888761EF268A08332A5CDD1ACFA1ABE3B583167BC833E69E418345A862337B +D9863A0FB4458F8D6C9F70522B8CDA8B3D44CE974BD546576BC0A1EF7B4A9E8F +1BE5FD39102FA256749404297272007ECA644986CCCF8852F2491DADD34D7DB7 +B6C4D46CAFC5941E934A13828D00C6672206A95D06053A94D94F87834E906E90 +80073C543E0251C753F935988A4C1EBF4A67D1C2A1931188F0C0FDEDFA582F93 +417801910B6B4E236C6EF7164C66ABB35F9A516CAB9C30359878A89BAEF04E08 +B2DA81BE9272C2241F95D7554AD6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: MSBM10 +%!PS-AdobeFont-1.1: MSBM10 2.1 +%%CreationDate: 1993 Sep 17 11:10:37 +% Math Symbol fonts were designed by the American Mathematical Society. +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (2.1) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (MSBM10) readonly def +/FamilyName (Euler) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /MSBM10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 90 /Z put +readonly def +/FontBBox{-55 -420 2343 920}readonly def +/UniqueID 5031982 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6A66A4000A13D5F68BFF326D +1D432B0D064B56C598F4338C319309181D78E1629A31ECA5DD8536379B03C383 +D10F04E2C2822D3E73F25B81C424627D3D9A158EAB554233A25D3C6849ABA86F +1F25C1667CB57D2E79B7803083CB7CC0616467F68450D9A3FEAB534EB9721003 +DBFEEFD050F3AC3492F5C74162A9A531ECEC0F47610B4940E946D21CAA771D30 +A6C27ECBA11708CC46C62396BF9D1990D579D0C394899D24FE7A4382EA18E7E1 +160E7283AF5BE17254790628E79FCC206F28B5566075B3A5697D5209062544FF +D85FD89D6F43D6588B242AB2666B5D2861CD38A8CE676503EDFAE84D12A71E77 +8405E468FE391F4F3F50D2C57ED55512036B0DB8E76A7EF413ED08673E56DE2C +16A3B65CD478433C0D2F9FEC4E662D54DAA43CFA6957D2A9AF8979BE06F70B68 +ED4C8C493D6DAC4971A3F1D010A7726D084EC1074FECD7D12D72AE16C26194AF +21AF5774D9B860EEE8608D34F150092F09C19959BAA670022B9A9F263CD391E3 +74DD1D1B4CD4D75273CAA4E37F68C631723E08FA35AD34C0AFB4621AE6689861 +854D16CE1C375FD159A337E221A6FF1CFFB5693A0623E7EBB58C2969F590D081 +AD92DD9E5322E26D6A15023664AC73A355998BCC48ADD0E7A4BC79790519606F +A1FEF6075033BCD422EE8233B83D1E7C20043280D531223D5AD4D5B41669F884 +95CE4D6DDE819B588742B930C579EDF743F2C74C95F717FAA6154FADC3FE2975 +F59CFB1C1A29059487E75C48505BAEAD7145667D4E18E46E610C868A257173ED +0D30EAA4C090854DD8378E92D0A376226EA7DA63798F247BAC770FE26D70E72F +90CCFAADF118304646955B0310C65F6CA51BEEEF87AFFE294D08C4435C7BA92A +C61A14854278FD1DA6A516B7F548F5723C06ED9B2605882EC330DBAC2B1DC25B +BF4D62183F791DCA7486F9BDA94D14606280661A8B29C2E9F3B2C6FF071BB961 +845C6C8CE222FE9265CB970A11001BD5A058C8749D63B505685E2940A75895B1 +A7F64342914194484DC57FCE15451C4C82A545725124706DDF1C44252F79196A +365EF95562D6BC17232202E625A9E9056A62B78476AD0A9F5E67AA9400A884D6 +930902D6D6C402500B379F3361FB95AD380F5FEB987F5908A52C886B852DA265 +995C9C28C46992E0ED09C64BC6D3ED90899BDA8C346743FD32253C51D14D77BD +52250D3676F52CCE7C1B9CA28B5A8BE6FBB0F2121E448169198FFA7D3CD089C2 +F6C025F1E7E973EFF8308A2FCABD144EF513EC81A30AF3A261093A5ABCF1B82D +5975A92162231A68773F8687E37048DFB892B46F19550454D55FED2F1E522EE6 +903A710DD64E07B7255D2D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMEX10 +%!PS-AdobeFont-1.1: CMEX10 1.00 +%%CreationDate: 1992 Jul 23 21:22:48 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMEX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMEX10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /parenleftbig put +dup 1 /parenrightbig put +dup 2 /bracketleftbig put +dup 3 /bracketrightbig put +dup 8 /braceleftbig put +dup 9 /bracerightbig put +dup 16 /parenleftBig put +dup 17 /parenrightBig put +dup 80 /summationtext put +dup 88 /summationdisplay put +dup 112 /radicalbig put +readonly def +/FontBBox{-24 -2960 1454 772}readonly def +/UniqueID 5000774 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF5B8CAC6A7BEB5D02276E511FFAF2AE11910 +DE076F24311D94D07CACC323F360887F1EA11BDDA7927FF3325986FDB0ABDFC8 +8E4B40E7988921D551EC0867EBCA44C05657F0DC913E7B3004A5F3E1337B6987 +FEBC45F989C8DC6DC0AD577E903F05D0D54208A0AE7F28C734F130C133B48422 +BED48639A2B74E4C08F2E710E24A99F347E0F4394CE64EACB549576E89044E52 +EABE595BC964156D9D8C2BAB0F49664E951D7C1A3D1789C47F03C7051A63D5E8 +DF04FAAC47351E82CAE0794AA9692C6452688A74A7A6A7AD09B8A9783C235EC1 +EA2156261B8FB331827145DE315B6EC1B3D8B67B3323F761EAF4C223BB214C4C +6B062D1B281F5041D068319F4911058376D8EFBA59884BA3318C5BC95684F281 +E0591BC0D1B2A4592A137FF301610019B8AC46AE6E48BC091E888E4487688350 +E9AD5074EE4848271CE4ACC38D8CBC8F3DB32813DDD5B341AF9A6601281ABA38 +4A978B98483A63FCC458D0E3BCE6FD830E7E09B0DB987A6B63B74638FC9F21A5 +8C68479E1A85225670D79CDDE5AC0B77F5A994CA700B5F0FF1F97FC63EFDE023 +8135F04A9D20C31998B12AE06676C362141AAAA395CDEF0A49E0141D335965F2 +FB4198499799CECCC8AA5D255264784CD30A3E8295888EFBC2060ADDD7BAC45A +EEEECDFF7A47A88E69D84C9E572616C1AC69A34B5F0D0DE8EE4EDF9F4ADE0387 +680924D8D5B73EF04EAD7F45977CA8AD73D4DD45DE1966A3B8251C0386164C35 +5880DD2609C80E96D1AB861C9259748E98F6711D4E241A269ED51FF328344664 +3AF9F18DCE671611DB2F5D3EA77EE734D2BED623F973E6840B8DAD1E2C3C2666 +DD4DD1C1CBB1ACCDE9DBAEDA5FE0BED42D4517BDB3FA340A29777AA8D4FBA6AD +EF1A2593BE17D2A688023BD4E12768E88E2384C5B5141B8079A12636E1B26138 +083CBDEA78AA36184B5B7650855B6438A501201CCE4C8582678A5A0F842FB4EF +E8480151CFAF845F42FFB0D8B71804A0517E161826A44B37A5E93E1F494EDFD9 +F03F689DA1887C3A03C8AB76AE2DD553F81C433511C4122C0281C24EBC57BDC2 +98E97C3B672131CD33359F7892FAEFAAFBFA949E2B5EEB08B03D19F7C298A1E4 +E0993E0D61260231B45BE22EEC582659AF39C34BBDBA945A85F8983F873AB131 +30EDE0566778E56C8E7D411D88D5DCC5E11FDE47DEC962E1C86744A99198C6B4 +6F1DE5E3D819C35522637A0898F5A04139C7E2A8AEFD04A3F0F4872CB20537A0 +0422FC2FEBC04DF2CD88088B1B5EDB500EF71F4B1D458563377F39732D532338 +8FDFEB66A8143A5D1A33E34C83B6C6BD5E584EF886715D6ACF7372A562C6CEDF +9FD639D92952F34447F2E7BAE044CC4B9E1A4A688B4B28DF59C3848356842A54 +1DBD149A6EDC08C4637CB9C41046F8DE207FF8706AC76AF15FCE7508D6955520 +C222E4AB31FE4A67F29DC7FE9B0D090669DAD1C6570DEFF0EA051AB9640D2E9A +B315A34EB067BF96DF2FB2CF7B52AE8F4A8BA0B4182DF1D4EA185C41E83942F7 +96101E6D10D2066F69CC170A9069AB00FCE0C6D09B72973460262B7BF4E83497 +4D5FC963D2820EFBC724DE414C40F1581FF7836CE48A78F3D5529C2CE5176B21 +6B7FE44131F6C0AB60B4C16F2FFCCDEF9CBF1CB9A9DABF4C91E259114DC5864C +C6B22BF85C533DD21B131D618D290588A9D72BF3FC1C2E3DBA14E2CBD98D540A +152DEDFCAFF62E6C7C4BCFD96B547565C964B6BE0B2A44CFECDC489390FFD751 +527189E1554E1F6E658BAAACD02A570A523361ADDBC8D1DADC17E164F74BFB2D +CD9B989B9DF448337F2518F57FD85C36438C9D9DE5D944C8DF9BFF0F09F768E7 +A7A5DF7AA3DCFC5A59168C98CBC6DDF875441729045B5F37F0702A2108904DC8 +3B7C3E39D043D275F5DA0AEB08DF5DA8141DB0EF577597E54D422059CEE19284 +7701AC80907A83FBED770711BCF07C633C11CC003207D3575BE6E5B4EE275DA8 +5E19B9D2E37D1D1A3C117EA7A0EBC6B895F60E25A4EFD6A10D55B13F6D8717C4 +4DE8DA8A723D525A951AC4CEC024B03E4C1E522D09BB350773F82BADCC8BBD39 +14580CCEE24DBA2717A38FB6F2FF549951DC14178B4FEDCCC619B8678AD2A554 +7BA184C4F24D4CA25FF6A23F0DC2482665881C69CA85864C342A428541509453 +6191918CB50C51502A9276E4F0F8275FA58D3F15E550CBA679EE732BD3E3CDA7 +2A4BA3E749C536D2F8ACC03364AB3C83C4A64570310A3705096708B9735FDD28 +78424457BED3EC1F6E501D9886A1FFE807A3D0D7EBC6A15A5084FE15A77835E0 +D726B1C6A99CCB1182CBB6FE8D3C1B09397C0E659314DD018B7704D8C7B9EE5A +D9C2D4F46637586A8072AC7422DB1BA052DA5F4351FFDBD9C4F099B5709483D6 +7774551B2BCA377B51190112DE7A19BBE27A7EAD663A646949C970697D0B72E8 +89DDF93C65EE2848217493DF4B071AABC0F1A0F335A5EC1E83771110DEB40F03 +FA3E725135E0B0713374665141E37724FD153AAFB1D49F4A6B3D98AF8B2D95D2 +24BBC61C7534BB129086766E104B84F968211820512140EBF90E83E583198342 +32750BF96D18E6F613BF15B317E6F7E69F28535062AE46BD1AFC0825D81B6223 +B1ECE5B8F2018355CE7A7DF91ECAF71F3F86D7AA981491D295D67ED51F58C075 +9FC729F03903470FEE0C47999B5BA3120C9817447DF02FC685B597AE3A8DB7CA +C5B25BEE2270D44AE40792AADEC389F6DD41B95366C4E18169ED118BE50838AE +83D7D4590CA6095C7D4A56144DDAB11909443E04D286587F15401DCD3F792E86 +7B29EEA3DA7A33DDD62BC5EBB80270B98B1B5EB230B56C8148F12959A596F254 +D56F21DD6B8A1EA362D59BFF5847FC4A7F27CFF140A1B6AE549421CA57A90EC8 +EC5A5603F5109B8C3D8307B48E2326749E0E532DEF6E2538ACF1A63B3E299B21 +3A10C2F13D6BAAC8833E4236DC6ADEFBE3E0FA4193F054DCA7AD839EBE376BF4 +CDE36B2F34CD6255C6762C6D5B31CBA953F6BE62DC72CAAE3BE6C2616E587814 +96D8E602E351A56FD0BA1E4AC969EBDABDC6A1A05F02A9831BBFABBFC82C4888 +666A04E71264FE2CBE8BCB52ECBB3369DE4139C0387F78B4A8F98653547C31CB +45AA7B1107D5C3FF1F62C0CAB865E8CB844EF5B39B48E341F15458F279E95611 +6C4F02AF2186BBA5366B76E65A1CDCC63597B4A6FCFEB74A7CE0B41A83E9A86C +C7D144CD32988339CC8ECFBB46CC3DD5FB15071E7CCCA8A6CA5B4388E2D346A2 +FF583E0FAD181E66AEE9D0018F4ACD612BAC372E4E094C740B86A39619028BAD +DB6FDA2B2F174467721E2A95A192F9426B09297D19BFF69084A61F0AC860E323 +8B8EEE67DDC69B420AEF3EB062A40EDCC5090AF7BFFD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI7 +%!PS-AdobeFont-1.1: CMMI7 1.100 +%%CreationDate: 1996 Jul 23 07:53:53 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{0 -250 1171 750}readonly def +/UniqueID 5087382 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F +C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B +B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 +DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 +4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 +FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB +76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 +123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 +012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 +A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 +44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC +4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 +01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 +D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 +914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 +261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 +24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 +A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 +9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C +889787CDC2B7473D4BEE78E00E265ADB7C0CEA8499FFD61EB3664747E10CDCD2 +4C4CD8B6E1BF43E47F2C095B3AEBBF83DA83054E20DD03B85D9240595447BFC3 +C78A3A1B96AD63DC9738603A2A6B44553BFDE018D6538D7D37BB98BAAEBE7287 +336E81AFC2764ED0C485237D6875761D847CF5DC96D302C88830BACF471C4FCA +8784636828BA44630299A45A72EFAC13B6941F43F7E3DABA8B45ED2A4F6DE096 +DED341AF8BC1AF12E79740055EEB64B872243E908CDFB7D3D9E0D89E556F959F +708FA201A68B0D2A1DECFC8CF792C31AF8132F17E6371B24EC9E835A9CB11F0D +27F13B62E3181A6C67763F4195212790189D95F7CF50F05ADCAC0B4E9E859D8B +E7A02844F66B8A3EA384AB5D65D96549CDCE00E7CFF1BDCB0CE3ED0BC2F3A72B +F1D62E3F45A7289BC9434DF8E709FCA8EA66BA661B3632ED15D5E1B9F915F460 +1E82DBA230492566DF9329C8B8CD2DBCFBB6813F14851FCDFFA6279F39B0727C +E60F5177D9EF0AD4A52B2043D14DF18C6DD26532DABD77A57FF371FBE2690E09 +1EDD535D2B2B4681369A0CB716BA61A9A5AD4BF1C629BEB047E1A3E96210F00E +B81CD57EF40C06CCFDB56061E9751705F81D8086F00657D4BA65604239CDE406 +7F6A607261FE7AD2CB9F24A7EAE10920E2EA30902DCD7C8A29DD7D4B7750BBBC +E1F9A1EE82129D4A81B4B1B62C02538D86A98D0E475CDBE884BE7C3F24BE9891 +7BDABD2ED1089FC7AEAEF7AFC8551125FA741EB33CD39A291A66D498D70CD647 +39E5E50F4DCE1292553F92C6BEF96A7209500280BABDE4984D638C6ED413524F +2CB1C5C1A388C9354DC5F7F6038781797384415CE912EE766C01550A6212969F +701F445EAA9444F085C92749D6612CE0E5642CDC1ADA9CB13507A33C59D0A7F6 +AB0FCB8E3AA3590A0B1905C5934B0D2469E4D311B5838ECB0E154D6BDE574C24 +1DFEDC436B6D023D68EF5FDF845347A7EF9E701573D66E219602E2B266FA95A1 +2475EDC3C6D5A7E7E961DF1A8109E977A70540CB6B4B9D9FBB8403B127A8FC57 +15B100F35A9862ADF9A3587078403FB0F2E5C16158CC507C5689BCB217C6E9DB +5BA0524AD8FDECF129B37A4E6853B968247080470AECD9423C6DE89B2787390E +F7054F87D836FFA1815F6892F56334BA6C7E3BB8396C4540CBCF725F63C3BD67 +8CAD749DC3CAAAAC9C23C9370478C8532031E2E4878194DFC9ADD6E9271D100A +5560EBD32D236507B948FFA59DAB8FAF083FDEB01BA19DB1097DA0509F23B903 +B1B394C6DD239F1D61D337555A856B1C9D316EB9A50C61FF297D1500F835CDA4 +7006F3F3F694AAB5935F0827E74D2649CEB948835163A131269DA357910F9186 +DDA9C3C20257D251F74AA50D8F16F744C29923C98D944CD11FCD39551CDE3D7A +82783E1AF83EDE4C658CA8C2DBD10D70233D30D559F7449CADE9339FC5B5B02D +1D9FCB2FE344395A498B6D9A5F5B5BB39FE0C14A67EBD9630F810D08AA2DB838 +BE425BEF89149214346AC2DCA5194B8450B12B8789CDE3438EB2DC2BC4B90077 +C3537778D71803DCB7D6A01340FCAFC9910ED014A35FA43DC0F0512C924ED96D +110F38B587E74CAB89D394F7AEA374D32CC9EE5ADF055102208A9D23A85DE08F +389A4CDED358A3F8ABD5D78005DC4A64170B673A313477B0510604B40C50922E +75DA4FA75D860534E96EC0467A7996C57BA4DEB2FB4A1BABE4250B13224025E2 +9D922BA59D8971F6C77BBD79F087B1251086E05738D7E7634AC2B2EB8D0F996F +75CA0EDA110653DC68F926EFADFC29710ECB41B71409543727B6EE97E6805B70 +50043860E86AD3D4C5091215231A696018FCE311A4D6824E079A0696A390A14F +B57E72B20FD8E4392059036D9E2F1A62F72EF887FB22AD76618BCAA7570CEE12 +9490045BC0AB90A6B15587505FC5C111F4BAF25E6715C177AB483125A3C339AB +3466F81A8EC54E5A9203ACBF6BAE0FCDBAB7AC8FD9E95C9951F0D410BBA0253B +70758E9B90A8592355F091D28E7A0DDF856CD747FB664791B81C682771461503 +19089C771A6CAA0CFEF3DB3A82DC4CFDC3CCF0FE01992CA1024E81CF3C1BDDC3 +0A58CD5BC1EC0D4C6D10888C778F7F5CC57BADA6EAEBFF35BA84E0288481ED98 +7CA98511FA50D68C43D4E66D6199FF99C610638CD409ABAD4E5C3AD166083264 +0A69AD6CEEEE1127106AF08848E49139D0BFF10A2CDACCC4CC2ACFD6595ECACB +106AB8FBD46EA8DEC53648789EA59FAE6F91D54531BCD615165074B33F78FD5F +B1594009A38746BFE9A692B95F4860DC87D6A9BDCE4A51C72B312C112E7DAD5D +7946B9A37B16356B1FA4241755A25BAB484027BBE1ACEE1BF85F412FF2C0BFB0 +E3F35E73B0EF286E5EFB25104139BF0B32CC1464372E0486C6F00E50C856145F +98DD4EBFD7FBB8D4C1CE211522B99879C8779B4A26FAE4AE2033DCFEC809E255 +911876B8B0308FAB5E3AB6546D2094576FA56A8E710369BBE4CF6674259864E6 +61DA77A1DC223A8E495FCC4BCFC7E72F064C08986C607765B5CE7F9BB4E56451 +A721AE5DC7AA084BAC157FF01B9339EA18561E7716F367E4091A92DFCD1535A5 +1B8150E04F700981B8A6B57AB90079B3366ECCFE1FD4599739E387A7DE21131A +F4D6AEF19071B86F801153D2AF33BADEADCFAA00667928EFC01C7381FE5A17A6 +EE85374CA54EE965A94CC2CC5567A7FC309A6C9F5C46E1115BF3A3A9F1E75B25 +D9E0134BAB49C7DD7C1CCAA9470B9BA92E5D5020088397A35FE0DF12C0541AA3 +7BEBC0A47B683B5465B88644DAEA1C41B567D8F0FF216C6800DFA7ADDCE0B381 +42B580FA364B55B50C0208E80D32DF587F21227FA3BAC5B5C5A27B83D6FC46FD +0AE0E336A0BA1974F702785FC4B9DF4EF669BE7EEDD8B1D4068D10D8496940D4 +5BD046B0349879B489B81DF714F42D06DAD62E104E95DF0790198DFDDD886775 +E4BFD75587598A3081910F603C06D641CBB733ED41544BCB8F49436CB86E2FF7 +A992BD1D2177A30DEA721C750DA91999C0EDB016AF96BC093F8F30A1270306AC +E7675A3B2F478EEE65343A11FAAEBFF12CA9939F6776058C23CA5E09D7139D2B +D39F0159DB7FAE91646FEE624F7F87E5450353A50DDD9015ECAA10D21D86FDB5 +21532B88440EC03FF12D6EE5F2C6543F569C9681CB7090143B35707EE517516D +5951A6FA27855CB86499A2F06473152C4F4DEC1B9ADBF25CFEE0B7C4C135EEDC +83EB2147E1592FF50AC12DDB268C5253DE6BDCF7D57BC71845EFC29C8D20F856 +F925E06D7AD1514AC100B268204FE9AF5223EA85CE9F33950258FA2CB7CA0C7F +4A5B449352B32DBB39FDDC41827DCDB2E84513196A17CC8234BCE974DC6ACDE5 +F2E53353B145958868584AD58AF98CD765E2F286FEC1F2FBA4BA09D2F0908E29 +9EA169086F194A068A696DCFD8B53D3036597205FA6DE247530A2209CC210B83 +D7BAC7CF8F5542F80B43FC1FEC6C1E35A4055DF8C156D407520078D307F2100A +F31F94DD69538043A1FC82633F60887890AC80C529B7CAEC670D734E88EF4232 +B361182687F45924A7E9BCFFA6F6C41296A1FBD539E416008D2F35CFB3E0D662 +FADC2243CB8947AEF917E1C02FBA2050BB432840C71F986A7466D3391F0AD1FA +283EE9BAC0F8C2D283D33FC02D96C690D0D4E45A471BE4432935B095B8436A5C +77D6A8E69EE39388D151B833A52EDEFDF3D4475B0F2B14468B543DFB009A760C +1656FC0B9FE61334C8AAD10CC4A3FD4096BDDE932997DB92875BF73A488F01BA +7BE3C50E5C731894B7F1458D88025D9EC7B69B05267A2AF3DCDC57739D6A5B34 +5515080A4E91B20DBA5953537D3005EB2FC84B78839380BC93DFEC1050E1F19D +6FBB416E3E9147C3D7F3C6C1B42ABFB865808154FE03A9F087C5B7AA5355739C +364D3AF430C29E7251CBDAF40F60BDC1D24325FF33DCC6AF829BAAC7F9145587 +AAD8075A151B1F506EAD68134BA7B3F60F711DE62391AC50A8681E114578BB5D +F4A8CFE1106D14E80131C07E25F753A56FE4A84748D9310DE22148D987704AD6 +FC7558C143A75BA9BC0C2B19D76D7F7F604432D3658EB9A521A3ED79CAC7E4ED +4E774A832D92CB6937CEFF69E32076A25FBC4406261B0C8A2C9AFF74D424E520 +8E70DE6BC93CCA560FE3147758B980085239C961547DDF35A6D20FA016E1B37D +F4837A65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +/UniqueID 5000820 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF +5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 +0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 +DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A +71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 +4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C +515DB70A8D4F6146FE068DC1E5DE8BC5703701F77F50FBBE021F4761B08ACA96 +DB5561981607A8BBEAB3F49FD8F059018A95D2C836A793C947AEE5EAB45815FF +7A18A4A453C1E8C10EC5E6020462A92A0AEE570E81752D6F6E82A1A002E55B6D +14234E5F0E23B2A08F5815EB86DDCFC9AD9650B988398BD3EB373A536CEA1452 +C6A865C30F6C348E29A2526DD001E54B4C7317C3DFF498C3BBBF51F8EBD5457E +58A4B0EA67193BB53BDA67F7602FF381B5DFA732D40A0DDFFBCED6134005A9D0 +ADC4BAEB7FB51956B5B6A359D3F2D497ED2E8C0F9660448329AAD5F9A8D4B92C +BF4E49E2D06588171644D0BA6E7FEEB29B075ABE770ED9B7C3744009152FEDCA +3803C6452E8E23724AE2003D20B464FE0E69EE14C6DEE26210D66FA08E997261 +B5A88A3F3BBF889F4F49B7B9D71CAD2F16FD79CBC6CBA8E5330A5457B17D49C0 +493FEB1F00D059041B489FAF99A524F561E40DDD6D090A2FA31E74A5AB5A6ED2 +E175963983374F201846B26F0D77C8AAC841C042B8DD78DC5C47E9C4B464220D +9969B5F3560C5EAE70856DC99533F559DF96BBABD4BA85A775BB15F5A6722B45 +A7623635963C994DD7B58C0B10B05433530EEDEE033093DBCC6FE81397DF6B72 +BBD0E897F9628F3C275750B38586BA7225C1907CE545C3BDB87710CBD305E1A7 +E5D453BFE1F85FE9205EEDFEE6F7EF6872F1442BAD15D918E0EC836BE5924046 +F44F52CF048BB3FBD0573F1EFBF8D34D1C53270B919EFF5FB1F6BFF8BF024F43 +9B0B55D56CBFFF9FE57D356640284199C65C882EF2FCDA54C0E9F111467DA670 +821C3BD88D43E8C66861C4853E8C18566A59DCF4CDE47031714D24B5FF66DDFA +8E675C31EAB63790BE5F34B15B2545D2F4DCCC6A92D65239AE42A54B5CD59885 +E8D5CF346B931F0A89631BFF94FEBCB167DC8999E2407C96D075172865288C70 +0031C522E1392DECD858506CF4F8773331A46C5F6BDB8E0CB39716B91BF3F7BE +D21414259B13228051FD8F56D58F37F0E4AB5B9D1D200320F078D19C755BA127 +2E60F134C204E3EBE66D0029D5FABAC54B00F899F62F6B7164E365D9DFAEC6EC +A4E9F372C2247DEDE433C550BEF87F9C67B4B2B2EB6963BC9A255609E908F19F +1890287623ECFD9C914DA4BED3C7DB8B178A85F42FC9A81AF7EFAC471CF407A9 +C28DCEDD8EE8BB2134C2B911AAA9946941723BEEBF462618EC2B2B16AB4EFC9A +8359373610ADF6E7B98239F90705B8A4441A7BE15A9E6E9AC8DB4ABA1F753C96 +2D9DBBB9AB88FC33E8D6DAE1DCB8BF625DB1E24744B92B5D0F31D508ED41EA50 +7EEE872CC7F2C849282D96F150109FEA36C618285552C0891ACC63EC64A7187F +502AC995F693270400F6202AD3CC4F6B28845CD7C092398137CEFB5410F65D79 +7705890F10002F7E1BE61D1DD1EE3C0C6555417EDFAD16432EF5212C27020E37 +B327FFF75B06BF6CD236B18B7543180F67FD6C6EC6F9E57F517CDBDD263FA29A +4DE7C7666701F5DAA1255FAC000DD7CBF1EA0213565CA7598C8D4492B8FC5656 +9E7934B57E216661FD5769BF80A8E895851868EB88E508998A549AAD99C6A3E6 +45F313B4E9C37C84B90AE99DEF7D92AB383770F891CC3831D5924A069470209F +55506738ADFD757FE3D7D13D60C8BDB8550B951D7AC1A5458197CC992D372709 +603CF9EF5589BF5DFAA67B505C57046DC272B47B4CBD2B0B369C654DD279CA2E +51F325BDA71D4CBACA68AA14BD6E2F4715AF488F30B90A54ECE3A3BCC6FEBB30 +A5490B558BF240748398A237604E194CBA89B82333C39573A3E797D875CA95BE +B35E247E1C0C39F571871957220C15F0F5FCA5FB9D4C39E9C7B0C119B003D283 +8CCCFB48D2A3340F50E275EEBF21611336796D9F9062A0AC07F6B3BFEAD6117E +BD7B72D389506CDF553D42B7DE59514DC2C97A85761AC21F3A6315ADBAEBFAFF +E3272955F459FEBACA7387D697FD12D8C81AFABADB7AF87A65E5F34939D80FE8 +9DB0C001ADD40FD8106E8EE9D79E20DF186BCC42BB34B3F2585312D391D7B272 +D401714CB16C8BBA024DCB86B9460C8FA84C414232FCB4C18CA01CCC7937D989 +B021A75ABCF4D82A2A3BC22806657C84AB0E44482F7074BE7B26B40F79C19E85 +3BA9B79888AF196378F26617DB62DAD7BE9116F9903D9D5278ED39D6C2F139C8 +4EE2C95B2D78A8F4BA24C490EF4387EC10CC4EB9B9417DAEF9789C5AF035EFEF +8AC1042E394C93284634141DD328938D7D6C037F97FA13D639598CD3B6ABDF87 +94FAFE71F7CF9F99A8DBCD538E56200C5E4F494D2D8E87340A076E674347D410 +0C3229970431F71DD924F3BDC1C2AE2307DFBE5D304B7CBB3BBA5B657312CD4F +AEBBF7745BBA9E6AC017C4AE890960E5DCD0E678FB5BED824CF3C07F41A998D0 +D581CFFA20BF65127AEB0B2378B54F1568644C8036508E73E2681DF6C4454B12 +76CBC6DA1D02CF476772398299D758FF9E8DCACD07EA20C22DF96B1F4FA821C1 +13677F05CDC5E1D5BDDD185D2D4D7E4D091CDC37F637708D21065616E589F1C6 +17C3337B5F200068A1DC8A2AEB373434EFCC87242B3B734D8D38194F93D7B685 +6EE745BA14B99A76FFA6E0E3067FA53FB22D1EDE34A0E1AE4B3D96137F82E434 +3A129A621A84E1758D467D7A32FE6CAF8F037462EE3C4CE3890E16E171968BE4 +09CE904EA453E8A216E8BC7855AAD4B47941DEED49A2EF0BA97A9291326AC112 +1A5F7240A4857CB546995110462980BB348F73D06F704A2653AEB83EC7475BA8 +1694291E38DD439ED61681DFE9D2F4FB1525AAF260AF20E300FC2556711264E8 +8387DE8C0398B709820040C0E70ADEE2DA024732F2D49D8CB382E8BCFAA0D14D +2D5B19A083D5C384839DC0870F278E1EACEEE77BE5A9808979DDCA8155250E99 +B0320FFB9A7BF4A90F21434613AE94B25E6BA8883943B0C62C8713EC2B309E53 +66E0D4533D20A119294A99CA4FE3F69CFAC9179352ED4AC2A79446425614C3EA +7EA116AFC6B4AA795F4C33BE7BC1282C5B98D429A3AEE7EF769CBC99AA527772 +5A0BE834AF64B4CED9EA564981401534E70454F2BD4509A66C7BC635CD87C51F +5DB29A2F168E3AAF7CBBA9BEC13B342D6084538FF5375C6156A5FF30602509F4 +432EB830908589E035B4AE309A27B1F5EF20FCBEDA6EBD66AFE110B74001BA54 +F8334C774EF2FF84A48EC4D755E48152D257AA89B6FE9D6C737FDDC2F5E5EDD2 +485F9E68A53DD5AAC417DCC3404257639C181FAA6E90742B036A5B38CDCDB9FA +9AFAF14DAFB64ABF82F38BED26493F771548A63B309DCC0D66460AC9E3403B45 +E337C56B18E5279F84880F450036F12835B8EBA49276C15C5240EFC55E8479BA +1969CD205554C23B4081078FF461D9DA489885AE078F37F6235FD7075FBFD32A +091F077E3FA399722AE0CB3FC8CC33808D5EA4EF78F4873FECC4ECAC923D8276 +7DE9817546A7E4E6DAF4DF0CC479CA18E1B856D960ED462CE9FE1FB8111214FE +4232E498F3D17908E7F305FDFB6848E7E8A61A42BA433778E1B879990B0D43EC +8BE4BF788783128B3AAAD62211391B2118DBDFC3D23599D8A80A12697C3EAB24 +09BEA0F03F0B19E34BEE2BAF81F725D88591E22BAF855DCD46072BEC22D8B396 +2767013A03708D147FB58445B018E4F12DB7E09C656CE0F0B65D0E21B02F2116 +483944E2CCA7A24B29F9181FF3FCFB7BA29251821661FF9B450E93E566E1C5DE +41F4EEF6843D35C6A0A333992111E886DEF5BE1983A2DFD0834A1DE39EC62DD7 +F384CA8A60E65D4B69BF04388C67253762AB94D1A0F6516D3088311B483D1C47 +256A0659726C25C83FB334CA8EE22B7563B853F206831EE1F959A48E234EF9A7 +269EB4A50FC7E255A728662BDE7F411A4C14428FEC5AD573AED827A782A57BB5 +912610DD99869F6252743560467D639F2517E67E8DB161A29826797C08DB5842 +DDD4075935E2869956B46C818C7BE799536C0EA57F4F462BDD9AC91B8C8D3079 +E74BB5A23476AB4884E8D855C09C3E3ECB83FF59AA1395401B13701BBF765F8F +A8F28533DD740D42728C7EFE6EB77DE58B01B112AFFB1CDFF08034117C19646A +9B1491B7C829BF580D35236EE8FC4355E7B5B30FB2B440146D5D868EB2D95D81 +1462A9A6C94AA3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTI10 +%!PS-AdobeFont-1.1: CMTI10 1.00B +%%CreationDate: 1992 Feb 19 19:56:16 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMTI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-163 -250 1146 969}readonly def +/UniqueID 5000828 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F +21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 +06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF +55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 +B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 +0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 +1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 +7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A +7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 +356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B +19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 +C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F +244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B +AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 +5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC +D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D +993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 +2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B +E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 +309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 +F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7 +E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66 +AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9 +17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3 +05965AA02B8A67AEB04D915DADC1B84A531A1D60569ECC2EEFB7B6B0263B8B5C +E6EE63CED9FA74FC7C03610F6394D64BAE1BF3B50FB613A39C300CA5F4F16CAE +F9B9F4DACFC69B69AF30E4FE9E41A6DB0FC987A13A3AF3F99127E5A44E7FE781 +399BF303B773BC0096427B18DFD0DEACAE196EB3927A7EEAE0F6DE8434EF0873 +20F134579D9E18D1E0A10DA116F544FD2B6C6917FD8B2BA682D2B27DA99555ED +7C47B44193C623C871703226039460A62C80D6FF14121F46F03F0062E0E83ECD +C37CBF62603F7C3034C2911FEA79C94AE4FFD25484B3E03601E1B002F074E9CC +928E4D2E0597F02095094686EBDFBDE5F655BE53DB132D2FB9A18A88EE0698A9 +13346A3C39C11C26DB801B781E4E5A8462E533F2F07CB7ACBEABBE37F443AE4B +62B55ECF92720389E9F4EFFBD73F170754D342753F759FDB0B98B977F66CA563 +4CB52D24ADAA91150C56338ED28E91FE4E4356E8ECB425E5044378CFA60EB0D7 +E085204481EB71B3240ADCE0F49EFA5571C3E0DD6EB29CAEB5DA6D4BD05CEDF9 +1F077CF8476BCF08AA0F785CCA36AED2F7AF1E66D3DD5AD178F97C20204B83A1 +897F51AA59DA45DF1F815E3B9A41CA8F16263775C7823902BA39A6ABF6CFA3BF +7A45CA7DA334791E05687BAAC35D893C33860E73C7F5223718DA50EA0C5C5AB9 +AFDA68005F20E5FC2EBC57EE358620B300237218CCB1BF49E36F9D710F3973F7 +79C3B753C044D77656EBB2BEE67F424D2997AF3D61FC8974410D5162E1DCEF41 +FAC3711DDF25DA13192705BC5D915AD55532114CF28FF576AC0CE04E6191EEAD +F46ACA1FB5423D13BF154C04C535A9B02A330AE72DF349613B0BF0EE7ECFAE10 +F70F46C24F29524A8198A08288169E70855E9949A79225597B669D5EAD516A1E +8F617A3EC4CB30D3F24526EB12A60D6FE5BCD3760351834CAC50F94522DDE187 +4C22E49980E29FF4147321C62F52EBB5147AC0C7DA2FCCC7F5064FC10160577E +45C6DD9647398AB5B67E286772D9EFA65DCBD279613F9FFE16A802CD3CC153E0 +860458959D7F39BEA772DB33CEB992FB725FB7B52B1D9551913C445D6A88CA6F +51CAEB58168197F0E9DA1C2F9D9F71AFD8938BD4A88FA4A5A287229DB00F1701 +90EA840772A02CBA94B89631D31F733EC5647A1B74D7DE1A6198FDF07C89AC4A +CCFA0DDBA23E98C1E30AD78B9FC165FEA09B3589C7F68F481018352DBF007250 +4EEB2039CFC22E5613665E6C2299CFE67B31DFE436709FDF7FA4677FC9E198DC +D4DD29CFBCF51575277926D4B1D298002D2360B50479DE2AFC52F6708332CC1C +6755EA8D8BF62872E2185D4D23372F8E5149ED31F17CEF8363DC770CE4555998 +81F12E9B0518AF9C313C32F2E32E2297B08A1C1B2606CA4FFDB8C37BFE0180DD +46A8CBCEA8641170807B24EA729851B1C65C1C0D7A04818741643BAB5BD208CA +D2F8E029F86DEF2571476174892C63A85931D9F993990CD0E581848304A00574 +D550EAC3B92D84367D91E7273912089EC98477409B086923EF409EB45FC8D580 +D7682DB4268F21BAF5FCED6A9F0ADE040585C41E2B38A21DDDA7119B4BEF3CBD +8F35C3F869AB8DA098BAD1B2C8424F9597D97BB36CDD3FCC83F29306993DB137 +226145493E9632294CD7AADB7D6C80091159BA3886EAC62D5A25319BC2F0F224 +321F0D9806F456C2D11559CC2D74B006F2EF11788790061E1443CB35238AA390 +790E90C4C9F2FF9503FD3E9FA8951999AF20CA83A8EBA3143C271AF5B062DBA7 +E02F70C4636CFB2458A12C9152C65616885395C69E67D22A092A159228D1CA5B +562594B595C41001474711252C0B6656B5D3FE1A5CC50F6B4D4E54EA7F37BFF3 +C485AE3AAB776E6A354E904E0AD33B00AEC02CBAC24B0B2B60ADEC353372E13B +D1FD01675BD1BB251D85E73684D5364ABCD9AE0004AEB74661F3185EE2D1F18E +CB48B4F275C6408B35358622E1CA0663E115EF4E1846C3018476B5F9BAC90902 +21DB96A25EA60260245FD9172C2407C28643ECFE0B34DD95AF25164A4A289461 +5B9E8319E9DC25D55F8993FA755C0F154937936DC4B8229720BE9B483DF0C971 +0CC6A7E6034434AF7F7164239D5DEC9EEBA4ABA9EC940ADF4100868DAA6B6921 +23CB847BEAA783A07233A3A35F0568C3360A28D59E172FBF6E06A88BE2C07E75 +121029EE403159C5BDF754DF352FAF353616E10DBE0D78F1DC20F24335DF935E +4FD4B1213EC75163509073513C600B5775712A5F13AE90584102F31E1C51DE6C +8F6638CF724287061D7E17A5ED495A10ED93AC67F0A954AC46B77C73D5529D19 +58B8343D2AD3E18091F70B5537691D103EBFAC583ECCBE2DBCA1AA83EFB8D337 +9FD800EC523172E5F192391B44E02450EEFA3180851F902C01A5AA36D6CC4FEF +E04F2232CFD2E0E3A1FD6E38E18CA7DB2291E64B890F4AE3E9000C67B07D5577 +5DD7628A171E82D233FB4632B18B24DF76B908D403BE1316E184E79CDBF17BFA +E1A0BBD93E8D0D11C8121895896150013F6CC4B36A9F9C08CADD20D9476D3BAB +DBAA38C2EEB1DD1E36A82B3BE4ACFD98035BAE636759EAF54BD250F4EC33189A +839C44F9162C2B3A94FC301B9F946E15316A908E296F74B4914AD3EA47923BAE +C973BADD34D301AF9984587CC0C71A540BD6CFAD16DFC9B36B5B1DD471E1F15F +3572D024261CC9F26ED19C01D6BA89C8A07E56BA94BE3E62323F7E80B6EF1163 +B9A9A6D1FA9CDD29DB236BFD3CE06BEAAE793E8204DE8C49F14B8EE0ECD7275A +1EEA069470F50EF23221FDA44DE1AF0352964422C715D522E3C7602622E02D9D +DE384F837B8C1044C97CB2BC36AE67B5DB26066DF4838F8CCB2AA683472FE4F4 +80CDD85297DFD474B67E303D6FDF483DC43FC1204B91992DE2A56F68634DEDF2 +2A33E123565B0FF98FD81A68C45B6F371511F6F10A8B293C59D1F73871AF4A8A +4D5D18254E351F37B3C8C94E47C90B36224916CEA1F16EA695FD967F79AB4AE2 +B97D088F0730EB1DB3D4B0BCC18B119C0FFDC0BF798DBBB380DBE60B82D58B67 +2F6102D8BE28E2F0415024A593205A98D58725303DDD19C710BC398F47A7FB4C +BBB4DDF035C161B40BDEC40142001D8DC1ADCD17EA6C14ED3A03523E5FCFAD61 +9DC2A389EBECDB600E9AE5984BEEE20E3FA619653783E7C8584C5C4689B43350 +541B1BC7E7DCECDD24910ADA330C68CD4CA31765340C0B0533A703B30EFB5A22 +23819ABB37B7A93CD2C2E69C0B2AA0EE0B5E81797B99F6F34A35E8CA75E956F1 +50AD3F2C3015B1B2E9CC261009B1E9FB2366ACDA3B1DAF39F479800D0F81AF0C +046B6A6B710EA2B41CC3B9C61C2CF56E30D21D28ABB596A1FEE0F8A3FD0B0F7C +82FFF39C6C08B3B9332CB68DB902EBD156A7DAF85A621B853C3F215E74915BD3 +8D9A4D93D40BA7DA82FEC0B2AB071E474F77D30A6F644E1C3454BE32A2F53FBD +00ACC0183D84ADF7E6ACE0D8A5AB0F53AB97C8DE412396E09224D76E00CFF1B2 +F508D856647F2E7F7741D1BFEC7A260DE76650C143AFAE619821D46B18A88F65 +A7B5595DF7FAC0924548C7D505C12F98326999A50EEE29EA52FB5ECE0C112A86 +C2D3CD515B09D16498CDDC47EE104DBFB607F086D3C27F0DA30E198A3772CBD2 +BEC842441F6872431CBBEA31D9B8297224AD3AAF94A17C18203CCC4701EE420B +A478354C700C904F6227FFDC118C5C5BA50F9E5F505327D41D6C0FD91AB4E980 +9C3AF3C3CD107A67E684F2926DA1AA76E46FFFED732E28C463CCE4794900BFFC +18F426D52E07CE060A99A4753236CD237756919B069BDCF0D1593AEE8AB23CA9 +685BA6CC198DDD870468E3907F1AAB93F5E88A45BE84EB54F953916EB3582609 +1C7B1CC352000A494D4CFC627D55DEE37832874FD8F229BF480DA17ECA96C43C +876B3A1595B90B19A52819CBB36C884CC236FD220B3D9E28E0B9C3B6A2189C88 +670919A0CA97BC7691FCD5CCDB205A753EE67896828C92ABE59460C47D7587BB +6B1B68A10825CBC070B03E4E264B963742AA0375AEFCF96F0FC39BE2FC8E636D +59B84BAA5CE57AC2A7A62F87562C05050F6D47376F9C3035F151C81C88100752 +69BC996BAC91A08F2BAC8D48AF876EEA2425387B949C6CDE060EA05A6725712A +FAB2B95914E46E7B029B74226465F56F67A68BBC9FB1207A80E24D91A18BF5C1 +10F193488CF71D56D896CC3C5D4BA6A44E28CAB7F1FD314B08B9E5F747D6AE21 +FF9CE225894501CEB001DE09048CFDA36D983A240F6ECBE12688467DEA0DCDFA +D95014A94A4D7137DED6D0A93E3836B9D66E8EC72D542E428BBDCC71AD3A2199 +0C8B4F9812B2CA59C9252DEEAD366EB024FD5D92311286D8F5F6F78BC2521E82 +08BCE4890873FDAD22A04F1300B69A207A691539BE0B3F3BEA80B37955E91412 +B917D7CB638C037A9FC864F52018EF68452E72DE7D8BA3547EDDD8861E9CDBE8 +82A6CC77A368443133D54F330EC6F38616F6EE171380AC8A113A2D0513133513 +8DE061968872373AB68B3420DDA47BC958B6DB27846A5C9A45DADF9091C39F3B +8C21D9CC0E91035C1B5DC7C32203DBA80151E7F9F8342CCCF896B9D899BDF42C +08FD26A8A1EF3C2474C8F00C01CA5E8CA8B81D99EB3B2EFA5A5D0F8FBB889E3F +B2B98B654B88A10583776607F29889457BD9B7BC896A5AFF37761520E6FDC92C +37A26EAE1398750700064EC3C20C5FBD50407C74283DD8D7CEB4078A9BAAA65F +2214CCF4BEB603A8D71CD314F59B85DB8291A7C04E3054724EEA023BF26AC53E +2BE95B5AD4F47A7FD58F146B2F4F8414921D87E2EEAC7EDDC2954A56687B60B5 +88C279D31CDA09CE2036E99FAF6EE3942A91DFC67E13D0C7D411C47FA269F1D4 +7B8980452BD3F1DD13CA59FD9EE2D4C9B0E6605F50E37736F0DDAAE4042B93BD +AD33E692EBBC3232F2631DC33E793499BEB79861064885C48280553396E9CF9A +C2147B4DB2274EEF735F855D4DFD07051278552D0741EABA6F200AA88956543A +0A0E8102B6AF79820534FBA62E0C0AB44EBE9FBC8E3EA81370FFC49CE72D1EAF +E2EEDD7A2F4A3DE7FAE68B990543E17CFE13480950AC5211C8CDDEE1B4E00E07 +F3FE17424907EDDC18B0B7C7286D6E7E1F6432AEDCFD46DFB434B725A8E417B0 +A09460633F717DA670821C375191CE2F3D5495B7B9F50BA7FF38E976AC9DCB9F +2DF6F34A55EE724E26D576A7ACDA834218CFE64854756E03825ABA5AC3C2C33D +407A726A69A9E1D497E60D8F2687F9718571BF5FC56378F08AB85983DAE2CDDC +E2AC6524D328E27B93331EE180092241679276D24F3AAF65D098AB43A26AD06B +99B8DBB205396055D16D0D43A4B17FE309A5AD3AF1A41ADB31B88C847554A99A +AD34138AA4A95542D22243468D4CE9D258D8304939E2F3EFC2184E8A1CBE6D5B +52C61F45CDFF88ECDAF14BAE3FCD2E0FB9A3D914BA78685EE9E57B2CDEBEB496 +7C0AEF869E1DE32D97F5C481020494A505E14C39B04CF13F30FC440F47800C3E +6424B86610A65E27E5F55C2AACA141B8E5014991DBFBE760033356FB6515CD74 +407899F6DD9512FD5DB8431B24EC6B3BA7A3E3ED1CDC151CEF16331CA60F9766 +23FA945094AE304EBB0321D6F0E6B954BB371E1AE64FA290B737A39EA528FC4D +3DBD0584CDC5DB2975EC16AE8AEDF18401DADC376F3C8A7C0650EED78C27ED84 +99AE1C43A89A8A850CEC768ACFB0F5AF00ED9AA77E9D1B7BE6C50D75CEA06D1E +D171F0FC8A595935BE2897F40165A417C69522623147C4C0314CFB1DAE2D61BE +9F4DAAF0CA69950AEBCB2E2924454772B2B486B8F72A0E54E5AFA140BA2860A4 +79F20AF9947AD5D571E1E5507EFCD26943429E5481128F30044A7A53520934AD +3B814B661CF82442C611FF3D21F698D46B3F8B4F67D7BE6162B3358F2358B0F8 +C11AEC7785ABE92F4DDCFA00B9A6724A4DA91996C7C3C04D597D27A78254A1C3 +002E540D3FD978CFE44AFDF20B83F30B8E388FB0C0551D7620A94F96CB3B9A1B +5A8395C04EA2E3CC46F0930FE758F67969BEC9355CB815A18B9EB1AF56B4D8E5 +2258CA467410941871C6FEDB7FD1680F40BF5B0C9526565DAB344E23B1989DD1 +FE4ACA04C5C6FBD692253DBCF21164BAF4CBFBE65ECA78FED100B4C8D7AF2595 +0AFCE2B1E67E2864860A0637915F9ECD1DBAA6C81D81B14C3BBFF6B499E364EA +B95B3F7773B28A4AA3402DBDAF5946BAB4892150393202A0E6B2F7AB8FD18CC3 +17C6F3D012FEE23A796FD42F78F8A44D9A7DF3FD4565DDC3766CC7AD303DDD71 +1F3853EAC8ED79EE90135E048BED4BD966910BB03BC162A8A64C4765EA4BAAA4 +F1F0161BA6ABDE194560EFEAA5E883CE46E4BE59B26328E104AC7BDECF40F10D +B9A19A7DF4042F70488D231A3502E582E06587A4BC75317C369D04F4077C67A2 +560C4C03B6FCFEC65ED92068E423D65350321B7279D4DCFEA9079649CFF26B07 +94B8D561D57732034C459F5C7F8B0C57D29F73C3F2E098AC6E496A7316B8C5BF +CFC6A8BFF03E44C404F7E910CCA9C519A977587C755E39FC3E4327B7800A6292 +863C6A2DC759D4B539362573B4394A29FC36137D2B4AFAC9B24B4A06527A2CCA +3BA45F10B2DED3165FD215F0A87D30BAA5D5D7C005C6D052360C4A957CE22FE4 +4B8EEC8855752782D8AE10FBAE11A00330F83107A846EDA0B8260AA7212CDFC9 +3BABB3F264237B712FD63FB2F47A57E038626EB0A3106C01772E358B25099966 +6763C6A5A3DBC43D41C9FBEDF36DA8539946BC7BA6F8C9D9508BE7536F92E1C4 +E691D0A8BEBAB1C98C1E8BE4CD734155E96E55658CA8B45C688C835E16621CA6 +123C51C9E076771CAC75AFEDB7EE5066CD8CFA29128B767DE87992B0D9F03D48 +9A5BB623DF241D563E7A74F24BEF1747A1659EC01023BB881B07DCE0E56CDE58 +F33D0A333653680142E0A85982482A59EC34D885471D45F93AC68D75386309AB +71B92E6C425C70B9D7BB47B50AE7746A63B7CA1D97AE22C4767E15F8B7C34C8E +11C737ACDA7DEEE2BC17DDA7F6DE3B780F2F2A935D8A2DC1622A1D899E8ED900 +41A66B43E5B287C105FB19F1B483E148D6533DD40257399678583B55DA40DD88 +9171EBC0C9AEE860C80DE482FECB699D47DE45FC9837716E80A2BC96A1DA86FA +01F0E8C5879F9E183B59DEDB6A02EAD7E9656241368D171784FBBB294933B5A9 +4F443997BEADFAF4825F05061125C30B6FDD07AEFB064451C75401B9D1E4DBDC +650DFAC548B31C16E912BDD3D9154A5AB383CD8684CA1AA9E584F086D2CC4647 +FE26791D74EDC051BB9E832701B0392254FB45C89659D68926F173A9558E30CB +BD5B4FAE4974BB93A294BEB097FD1BA8A717EB778437C11F93F596B48C94CFAE +0054673A090C7BBD12918D4D641D150D47AAB16ED2484C76622DAE9FFE7D02D6 +B5E490269E563055F9103E871286CA89D81E94852EE55064A66DFAD93FEA0191 +CBCB757A0B5A4475D4C13DC02B47215535A9797F2BB4D88A84661E8D30A45733 +299A0C54E987487E1BBBC30A36C559955414FB563C3B80F6C79159412C324E20 +A84CD748F8627DB1DEDDF19CE676D0C4777CEA8AE6129805B8B8BFA4C83B49E2 +F039A5C91261194917AF44C75450AE38D6934973600F5D9BDB3EF027BC43273C +1134CD4B1194775C5FDBC0ECAD7E9CC1B4272C3BF3557C9A3DFD9EFCD137CBF1 +0DDCE077891D15B83A31FC4AF80FB8585D12BC531B78FBCD558F75FF356D301F +0728345E31C4BFEA6AFA8AAC896DBC0082B9C4454387BDD44E16B82654D2BE79 +3E294D4E1E00F47B70ED79A8C5392D4DFD08490A3226639D8840DAE9115CFCCD +D186DDAB2103C9F206729BC0C3A550D50046F4F9B218FDA76C5C1B85559B96A8 +5E07736E24B6615AEFFC9228A74F7C6B3C07BD9CB8C34E475AF485AC0451228B +742919D2804168E11BB20A314278D9902ADFB08486DFBA43608DED1C89D48EDD +E5A3D4C0605CE4D88F0DA1092BD2D5300EDF0054B07865A526014DBBFB8AB6BD +805AB35220C1A5359B46B89C9452ABE52753EEF8DEF34BE06697A8342509D5B8 +C3D0E6F8004E8F36E0EFCDD728808D69ADDEB6992AD627BBD90B39B140EED01C +129863CCC9FDDAE6A73EB50D84F203342A4BEA2447D45737FA88BB5A09442DFF +2EBF4CB9A246A7561ECFD4C222FDFA38C375040D9C364A3B4A2B0D6EF59A851F +6BB2721A3D161CDE03E59AA2B12A5C43A793C5114190B60A331CD390F8D411DD +6F904318A45D4A550208C5D4464A1CDCF5C1330AB4FEC096E3A58E44F57C48E1 +8C20EABBA8CDF112596ADD29E8FF5797A6AABD9AA6B6D3923A547BC340A49091 +69A6146C1432604CB80E9747F89AC7277645468D98231C14B410DC9EBCAEA62D +482EF687083539167CF7B3410753F16D4E295A44BE9AB8CD250AEACECD322C60 +1DC8D43C949B549C5441CA8C8D4E0F8D0BBBEC44904562F15FEF31C3D81F5660 +14211DEC407891985134F98437C850C93870A4F8AC981B96702076AE5AE6C280 +F984160B2228050D31F09EB34AECCEC0AAA045A62054B7431300BA175B0E28BA +07CCEDC4E9ECD0C806ACBF26AB11E8B6FFE1646B82C7AD8A14998470E5F298D4 +073660D39A9D62F6C4CE4B66C8E5A01DDB74244D443DA84853487FD9F5222218 +F8C2178BB91DF2A64E346FA3000AF4E822F44C1D7CE75742B36C291A5DD29636 +49E6696826C562798501CEA5783696F2744D3EC8D84504C953D60CBBF0806B7C +041422BF6255835CF0DFCD4C254AFDE9F80BEE47159F8E6D10C520B9DBAE3CF2 +474B9F8BCAA2EE2FDCD39A428828E2B8D6DDACD3CB893F62D584D7B17172A7E2 +25059C3A3C8AE4F3E0B9AC31B00101DF87C8F427DB76F39372916FFA9EA419B5 +7303F6C70B99D74872FC7F82E50C1DAFAC912134F188B70546C475BE4F7F0263 +ED51173B68A87F2AD23125034AE1EF677F60980002DDB8F1D76E6BB7C79EBE05 +31B1C2AAEA65747E9FDD4E6B98FF08B2AA39F316D1690D264D5F9F5A264ECE45 +B07F22F2BD5B1E59BF032F5130432AB4E3B08C725B26085C8E1AF9B9D8E58937 +A30E3B10F3B98027FEA116850F1931D8B90D39D16FD755BED2B4AD47B0CC5FE0 +9256123CB74A69073AC40BCA00E964ABA2DD3C1D482868AA65C9A5166AD837AC +8B4B75F9D7C2EA9CA9E3231EBEEFBF7C79F1A5F8FF71B7D436F5FA967C11621F +EDEB02A7A922469CA2EC676A321C342262383045EB4E95B54A16B7B3CE83C90F +A339BDBC64B11867AD874EEAB0D81871AE524E5248ADBA781D773E57BED5A76E +1C01507191B836908344664B21E0F0AD9FD81FD01CB9492C0EB839A300B6A536 +EC1236D38D051AB628D76406DD553F62F5738BC086D281FBB29763938E88C5BD +EEBA0AE1007D8F59FA52070C03B9DA7AFBB75F822DE21FD2077529981CE65FD5 +DB0230EF1F2C1F4F1071D3C10F412D6B3587F5133834453F0195D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +/UniqueID 5087385 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 +990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E +6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB +DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 +59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 +D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF +8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 +6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 +1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE +03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 +95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 +74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 +3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 +47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 +AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 +42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 +40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 +B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 +9560176670870D5FCF426198619576A02FC22BED21AD729EA408C566544FD4DC +8EA5AC194456EA208A00303919DF5DE5F85C566B4C290AAB3282FFBE1D6632D7 +EEE66F159E5247C2FC64160A6A5DB990B374081645B0F31E1347764765F0F9A1 +2072550AFDEC88EB3B0DCBEFFB45BF003CB1DCCF94BB71B00FA2848305D5A411 +3871827F770DEFB850214B505808517A62946CD3C0F48EE2A7C4FB5195C28007 +F11F1F094C8AB55A0C035DD958EF78CF094AC323C0B95CFDB3A68A18C03E8A92 +0234124B9B4B17D25D911FF9D62815E104F59A1E5A0E822C72E8B26E4126F914 +DBE303783BCC2CFF60E9B6B289ADB536F7E033E2DCF32EAC5224A140989CE93B +9D0B25E308823EEE72B44D54C5474A2BB9275B2E850DA8090649B86397EDE8F1 +3D7027209686173CC35004679B5381C37ADFA907FB4F95C7BC547EC171290461 +1A5DDF9745966A669829D269CD99E8561218F3A172420D39EFD3904DAC0A1FCF +C033AB9D4683A5688E0D0D08FB5A16F513E9FB4CE1B3B2A87BC94F7610FB5C4E +E53877706F87834F082C79DB30F0F9FAFE134B6EA0785AA65707734021AA5FF4 +A8F454398AB3442888AB5A59484C82FD5BDACBDEED8D5FB79E436C7D18FBF232 +36ADD97518BCEB22A6D435AAA0A3FB9B0270DA43FAD07746ABDA3DE6CB5E1F7A +517BEFEA98C49F4C1CF7FCC6BCF8C997BC62A5B8A292F1201E6C044A404F1BE3 +9F55B98C5EF235C5F51E7C593A21BA174697E131D2FE4F71CE5AD95D2C421903 +D6B2B0F46B098570F009A3AEED82F87A58B4DA7F1338D2273ED1203F2ECCFDE8 +E961E59E7E5281DE21AA3BEC66F1CA88809092B4E8B578D72E5F2C22B5D70805 +6E945D8FBEC6A78E7824339F3E7C23F9A0ECD6F6DEB8E008F3BC00954DD67593 +ECA7227B717D51D5BA2F98CC1BE96321D52EC5B5D605082D039F37B9CD75CCF8 +69BACCF74363B52BE8D75C5700A1D0FECD874B3BE7B86716F8ABB943670266CE +C49DE85DAC325FA19047416F09FEDD18301F3FF69FB5CA4DE934CCC4403C71D0 +D9689DD010EC1E2AC9F98968C14B6594864779D563CBC61575AF09CD1703FA8F +29189F97FD102A1B2132ABD24D68B51FEEE7253DEF27B0FE00A177F3A26009C2 +610C33CFE54CD261651AC6DFC7A2A7266CA1C6F505F52CE9BE1E943FB2AF8208 +3015EFFC66CDF5D797F01FCE0741BBE9D326AE672D1D7C3AC9CD3F5C627D6683 +455AF2F45A2389F40759305D129AE7F4E0DD79B30F793032BB5B4E79CE589FC0 +81EB9A921423F180C630A7FC61EB600F7F34C6E593A9C1FE2ADC12A8BBD18EFC +16980A08C261E50ACDB172B27181750BBD45C443E03C57BA4D1CA7B09CD3B796 +692E94665F3E34008ED857A473C7DCF0DDF82ED2BFE63DF1DC664FFB3AD55D3A +382A2A40157F957AEC91A0EED9BD0C6435A823805820592357C2531C41FA16C1 +8256D02A1D59C39289B7825096B3A1215E012F8228C33B84BAD01CABFE155343 +44EE59D51C73E9A2D9FF53CC2CC781CD26B2DA71BEDF0AC01C8C48A8A8377E3E +EEC7025D4DE6081D7B25E7AFBD04EC24B7CF3948089CC8151BFB4B8C827190B9 +23DA249903C3BA1DBB1FD0BC996943730A3666ABBEBA62770225B3494D8D6A44 +96E4EA042FE91CA222849E86125E86D2DFDE7D8F85589C13EC83AC634C5257DC +0AC9B9E3297A16BE2FCEDCACF721EF3F8852043C0608956DA3900F34026B4943 +398F5E1056B337C0832CB1EC854B69C342BDD9221D2807B15EB23BF86B3E8055 +903777B876AFC82F24967DD5C217B9E53B7FBD17605FB79C79C349242550D693 +6D2416B59AD3EA5E26C727E79C4A5CA9441134D616BCFBA1C225315BF49F534F +1F00D1EA017ACCB8B888D91C24F5167862432039887347F5918FCF54A591CC0C +54433AE1BDA243262F546FE8E4618B2D5B3A32C518F3454EEE1630C39A18A2A1 +2500E60EBAD5BBA62628C7C55E262DEAA705C438C2596ADB8415B8EAA4A8A99A +CF23AA1B40286CD07D8D2C192312D14665E2D0097933694F784D079ADEDF39B6 +0ED6FA879C524C63B6F6574551B95B076E0BC75986BD3D09E06EBC7E41268E7F +4155AD68276D8F56B029B75B5F4D43BD37E5154A6111EA87C8085BA566293BFC +F3CE019D9AFCC8EEA51E337BB39AEBF7A893BC7B0B58F9B37D086180B4F910CE +3E88A95C05D7E8D4A930F55B621E7547865EB245D418579605E7CBC041CC6956 +6B9A9EFBBFBDDA843C9504D73901192BCF51B1EA6784575A538B6B6C52AA728C +3A91008945D8735668C73BDED1C0859047FD840C1EC67C5CC3EDDC595427BDDF +635890EC296CEBA32CB6E8BC15496006AE018592D881CEE722F807353425D7CB +D286B59EC4F54DC62B674A24DC2F874719FA5E3C3C7325B1C442EE6F82EC9E5D +578FB40E4086BB57FAA52E01D98492203DA0E544D453EE80BDC5A96E039B29CD +0C46B2DFEB3A0BA4A6F296C7A93817640D86B3598D7D0F40105328D8CD2A1DC0 +D98BD24FD7A26B1F5256BF38EFFC69714107EC03110CFC0A3F1984210C383E28 +3838526DA360F9499B75FF6DA024F1E8F023CF13E2B2D12A5801B3ADDCA5692D +D5616131FE19AF576EC7EBA77EDBB85CE3B1E93E008E395358A778ABD6BE1C9A +EF3DA2435EE59440860E0C52D5FF197A7AE17112D060C0A5BF97D5E984835AB3 +38220A1C8E3DA6236641EC089AF2C68EBC0316B48E9D5A90566E89EC9FBC6832 +A0B1D1A500DB0A04E6DC99214A945A1E7758F73D795C47EB112AC71A8A7E50CD +C1B94CF0B96EEE0ACB643F769E9511DEB2A2FAA510A11C69155E77B11AD7E4C9 +EF5A940D26994BE432BA0B0E441402BDA42BCB62D5D14F1248A95A10E0920D27 +6F2BCF04A8580D11464AD44698BA1976CD97A10D7614B798559117C9E00B7EEE +A06E5A3500F38DD58D88640127732EADC4123AF5F1354053B1BD1FEBCD156278 +F7ADC502959A84DE73A76E48FB1F78F7271918DBBDA4574433AC2F9828C5CDAA +17F61524CA0DACAEC9009D30B191985F455BF097C043A2424BCD853194BFF699 +989D8CB11027444775FC7F552B0F15F9395298B48C7E1A8C36BB9F73BC898157 +BBC014C5A11B918834C83D4914E4EAECC8F5C05C2078587B876CD8386D13A6EE +8BBFA80A91926B2DFA5DE0B6A23A5F2925374F77D53B7602F8BDB22E161F44A7 +6E8CD27B06BDB5C14670F64E88E6445CCF72A221544321982861310D95A99C6C +EBA6F82FCEDA1A859D4344C94136E6ECB584C2E51E95D533FB29144C2E29A7AC +2B4D648A04FE2FF86DD0511D09348E235DF54507CFDEB8CDAE3476B6D82E9C8D +DEE266D458E862EB522AB3A07AC012915DFB9DB4DA1F51D18C95C69C1AE47108 +B956AE33224286A0FFD98D7DE43960C21963D5F5320C1ADABDC3DE50FE333740 +FFE70DC5F6DDA28F955E410AD0421B791C9CD906F4BEC994FBD3E27A9D45C263 +F530DCD5BC8428D7F3C0600CA4DEE1467F736E76FA1D91F72A04E73E3566281D +CAD7FAE634D6784BB7FC12BF2337921152FC5F9ACDD61125C70659A6132AD029 +7DAD35116FD1769E036C3BAB715F40B12B5ADB244068EA12F1DA74BA929AF45D +650A0D44CEB7E6BC5860B7059119747FAC8E9E980632CF05E9C9B9548B67C0E8 +A7E17D0B16339A5BF1B0C8CA53A6C805143B4549A29D8A4FFA02B05D51A27749 +4DB5827C38CFC270C939617BB54FEBDF6FD134CAF4FF791D5D061875201449D5 +3C9960D674C739C8A0936FEA517511D9F1D35DB7C1497900D309F68203A3EB57 +C075A590CE82044C060494D480D1C1633D3FC98F42B9ADDA927CC5A91B7F9E70 +A06AA41E653A9E3499902EC1D61076D28A0516B2AAEA2CF5CD91DAF43283BC83 +8CBDDCCF454DD917AEA63A92C82F996A71A0FEEFDCDBACD05505D2C5DAE7BBC8 +CC6167E9C392EDF4636239EFDF4104CE2C2CE70DFC3A1165023D31E6CAC53A1C +7815AD801A75E3C9D8F65461AF86C4054009DD55F0007578F4A447D56578C647 +5707A3D621D244B72A1ACC09C55E8675A2AFE45E6D5B2FBB2A0EF21E6BB1F3D6 +FADEF8EE84EB5567E1F4E0FE35AB4996DD8F8189A9A0D4FBE9B1CFAC0932CC13 +ED4D06669142533D1FBC3C2E6AE781EC26BBF69BBDD8EED6939D6EA6C9DAC635 +F883F7461F4A161B2E12D1FF0670550CA117C1C66D9C95C3BA31ED9C077287EA +202A5E2E9C94F6B77B3910E91FF1C6563AA8CCFB8040817D7E02B144283AFE7F +ABF11312857042E5EBFE4417F9640202B837B74B529B8F047845C017EC3B005A +871F7DE808FBAFE2355D365150586EB6D4CF9170D946CD2594DA53E7EC196273 +9DFBA8FA3CC2C08D3AEE25A6D43FABD897150CF72FC06FF7DE1DCFBD35F1AED7 +06D89FC772A1EDD449DB05CEE8A3093A5D8CFE2546ED87547E40101B57A972B1 +F4CC51098ED7B1AAC7E95D752369651145C6F0A77F7329AEA885A21720F46D70 +C48ABFAE74ACF95E6FC9C310644F59E69EBDF818FD9D6BF53CC4A1F36C0106A7 +22B8FAEC934FA0C6C17BC3F0C56E39457D0636CFC1F6E966018B9EEC6B278329 +482BDF7BC65641174457CCDC0EC7FD5F1BE549F80AC51CD55E3437C185BE232E +F9B2B4CEFF5999772946F6567070AB8A996FCF02CE81973C30D793A15DBC8DAA +2B93F019A58931C42A73E686C3F85910D18C5DE49550841388FF38F253AEF5D4 +6B00557409B607532C694E76D74B186D6311BB88BC7C2CF7D77526D176DE0001 +BE55A30187C62977221CE8409C96CE65B9F97F2FE7A4BBF837573611324ADB82 +B90C74D9B7E9D0FC96BDE0D8759EA0ED433349D00FFC8E2A4DAEC56AF48F7240 +036BBE64AFF09F08EC61F339AF3FE06733EC9943B53C39FC0FD73BDD72913211 +B6DE2F2B4D21CD3C47584AE818DB1DCE9F5B56D4227F672E628EFA4BC3A99AD7 +19C5BCD60EF653C8FDE4A53786D2DD0613CE0B754DC2051DEC8AA0484EC4B815 +ECD69ADBB71D30639ECBBFF5E351738CC24B113B3666FDBE220208A8AE012328 +B7F948AAA44706B8B4ACF67EB725B448C53E9201A0F380742A47A6533D70493E +1C39D3C10B4455AB6A221FD7E44C2215EFECD391BD2BED15DE1AE1EF73080825 +8F142DFD2E746547E9182C41F0EA0B84002D4ED3A50B4E5998B6DB54BF03EC14 +6682357F886B72E4DE77E8C73AE18739AA3090ADDA8FC432489855B2E10C50BB +FF1F4272587F2BBC05AFE07EE1717BE0DD064BA1A31DD4CAAAC0243CCF30EA5D +C8786FF45E85FDCEBA455FD05F77739DF1A56635B44195C02506F9FB4829760B +AD5649CF106F54542F112310420846BC1540E3379CD9F6E4B3F20984445450A4 +6DFE6279F4816933B548A40651D77C9384060F50F3949C20BEF0E783B6B355FD +5AC07EF6BDF954D0F765109FB76A356E6BFC9F0195C6C80384AAF9BA076EE3FD +384B5BD939A338E06552B687DB3CB92EF538FBB9B6D6ADF73C03029E47FC501A +69B540E1152F8F125AAB3D30CD44241A363F7701884A59D75B7E9CA73CB1CA99 +B914C2F84CA05780B060EA5FABCF3D6604FDEADD2B2E54A6FC5E412DF0CE0B0C +D5FFBC9A1BFFBB7E8293C0C8219CF690339B813F5A6A69D70D4A8154EE710E6C +12EAEA9BCBECE6F1CA23A67B22C48317B275B2BEE95659F57BAD23DBE705FF00 +1A2962A05B6557779A6996F4F586A0E3534C62E6EFA29291F532CE0A4EFD2C64 +CC27AEA2835FEEBA89FD8C3C475EF325D53A38D1EEF1E6B780E305DBF76B01EE +38A9DCB0FB72CDF0A7CDB32F8A008A47A778CF2A692D5DC539814DEF530B3012 +B6521306163CAC65BED2C3403BBF5B7129CAF0FC04BF9F93442CC1B9EFDC83E0 +3BE687EB157596937225EC82B0A2A786EF1A9BEA791E38B7453F160184041685 +0E0E339AA8A39E3A7E4844BDCD7CF6A9ACE21A42C60698FE9BDEEB2CFE3F60A3 +1FB633976F0ADA40EADDBD356D1F53DC268422AE716BB1A1A9ACFD38D7D00B43 +A796D01828E8B18910D0F63430D8ACBB2DB08EA93553FDA44DF19253E99CD939 +8AD0080A67084B56E87616287811FDBCF8C49928F2FC83E8227DC4B9EC72247B +5E0EE55A10FD15DD09DAA0FC267AB18A89E84CC438FFA035F99A7735B96944D8 +91B2789B132D1D7D9B3DF3ECC9ECA166DC357D943D4978124B4AF82E738ED1F0 +F2AFAC10CBACCA9F7D153022D241EFC7D4F3AAC4F73C1B6027F0A029313F63C5 +8C9399CF051978C25B9969480E5724E45DA2DD3CBADC7505BCBF9138CE3382AF +EE218FAC24BA299144775D838E32F7A7B48D3C26A0EA185522A9963EDBD58D7F +6631EAE420D0FEA6E3B88ED8C6515C730A0D60C57C570357B42EBA1A7D963856 +1B16A8F8286E8BA03051879C4DFC7DE30A0DB451A327750EED6754B0377D9887 +3A63F836C0D22B36D7D3D86EF29C86E6DB602409F425882A0314C061540F85AB +118EBBB2C3AAE4BB746A563E3F4DB66B84837A2C54DC15D5DCDDFC6A00536D3A +DD3A3FEC1536111FC3035ECB4A7A7763FF6EB7BD187F0105D11BF84027228A7B +2C8F38C58B4323917FBE1A07F99FE1B99AE65E0CA1088641B658F61134B900C5 +7114FC43B8EFFDD4AB982D092D7E1AF24235978BD82FF8E2F19A7533BB9268F8 +364847FC2ADACAE7170351F8F5FEF4C2F99D68FE66F1C20DD4FC3124D068FD2A +23DCA0C55719F5251835530575CC4874F65C1EA39CF16064CAD59D6DEEF87CE5 +7F54B34BA025100D098E61CB0F84BCFD2E36321A2F524BB140D61200F448D1CB +D53F813213FF06A990441C5EF5B3477E1D939E47579EBAEEC756922DC715D34E +75C5A7C37272AD901C71686F835D123E16FDFE05BB1951067404D9BCD963D251 +673EDB1C578E980FA72C683B3B5E17138605571912609876A335E82BA8FC8FA3 +8CBD9FCBEA83CDC66E50467918172ADFE8A1A954299D40D5471CC58AB970C213 +26EB7247BCD0923A892346C78127C294EAF1FE87FDE8ADE3998627C7712D6847 +4B31805A2892C3A4260ED7E49328B769411DF50B4C11944F87CD4FDE36A53F05 +48BED51ABC0555CCCC6B252817AB27763ECB6FD7F81B744456988EAB853201C9 +2FEF7CBD74144E7F1E8C8C7414554189CEA2C1A7F6EFF2D84E95CDFB931715BE +0CD88F222754319A90865ECA75A895836528A63C243C0BD279123B14C8C7DADD +75B7EA380299580CC3F0CBD148B46C1B1E93F5F3E534B18B5E3C9DD07CB9AF8B +F1C1C572C285A67A040604F5D2492F83C5D270B824DFDF023566A0724EA3C185 +FBE37707F4591D4489AF6BE57BED1EB2A90C5AE15069EDCC16528A73997F9C1A +4A08EBF62E74BF131227937DC18BD49721C09E375ADE15E72A135211A61B989C +D1B1E33F3FD94D89BC9FD0E86C9CC5039E7CD1E73F11B87A55FF888DDBBF3FE0 +203EDE5BB025484D3C46F8253E3F8258828CF833A23BD0C357C80D13EEDE01A6 +72920A5D06A0051EB0C3D88A06AE504AB26172307B023C22078FC3F9CD2E7D05 +E9BFD653EAA689627F8100C21C1C258AEBB869F7FB7F836881D969FBC4D60C5B +03C045EC61E75BF21089E3E96082D0BC91BD2884EC1929CC61D865362F18AB9A +32F32F2FA2138D0CA2FB6E1E2FC4759C49E3D7E7EAAA586672159EAD988079E5 +B9C6FC79FA9293A512BF2F00A3B73461BFB7EEE22A37920FF52F4D3A7D2AFC58 +5925707E7EF20511633D19E5B852DBA05D9514B482F33CA674113AE7149CAECD +AF110C6F932CA52401E7C0FD918221276161997A1233723DDCE063F04AD65A37 +5F90761E015C476CA6B789D2034F1E9A3358AC4328D834E811B819C6FB512F79 +18CE48BE148F1E745B812AFBBECF4251C462FBBB5632015C931043E6486C9A6C +3336E9CC1FDFF496D7CE24EC848840D8238FDC427FE147AE7EB1CDE81BD7727E +4F638AD9A20C854FD7A1E2483FF159096F3395EA90474B04C1EBC14981E450ED +863985CCBD14C084B9DF32F2E9E9557B6809D3714D9093F39E3F8CEB9E20270F +665D79EE67BE7359FA1261B5F61D0D6F03D522B416F4F406828777954FD66CC4 +0EDAFBC8EA36F61AE4BEF7957B952A5CF0EC7C05ACF780C81843A3B4E8EFE348 +DF1E820CBE42FFF1463F20EE9BE45F6C0E5D4C24C312EFDD006C872E8AA78495 +2FA6F783D0431255BDFE40F620E2B6B8CAA2A315A92699C2413E624BCFEC3658 +16438395A08C0EB899A9557C0E317098B595C8315F0B851FA9ECE4CC7D1D61CE +0F537065924308D5AF0B86BC0066AAB953FF040FDB43E7AF345DBFFFE17082AB +10C651DB7B549B6DF4D5BFC4BDA660848234A0F8D010F20A3322163186A0776F +2586727D451E365C143EB897E9E06E90AEA603252E31F4CE321BE730B831DDD1 +14B1FB06FDFF8E2D6BB96E33B0DA33C030667A2E8D91BE903A40FF468EB7E0F7 +D7BF6A02AF5673175D620A1E09B7C1BE88C83CF54C4A40C0A5E0C4C2DD190847 +A3EE682DF347AF0AF18E4582EAB2003CE1DA3991D2E8CCCD2F0E750FE05D6E6E +73A8630EB4F0FF8FAC4FB281B3C5C3A5E95A75D24F9DCEE57AEB6E1FD90C84D8 +DC1B9822613D17A41DBD6E4C0204F7667878950D406700089F155B5985DA3E6A +54C0D7B8AAF5E3F6C413677903A02D677F621E1E3596B78F4969840D689D6311 +76119B928A56323306F7CC663E685FFC91C2E87A1C1D56ED6C93B7D6A5B5B5A6 +BF706EFCFF2E4FEC4E3C10D67B46D0FA29B822991E9906C802BC9AC2F62924D7 +2499ABF07AF44B7DDABED5B2842499ED004167DBC3D074A804B0D2518E683807 +601E10827CD762CEDADD1EBDE0B63AA25C8109CE4CAA870E4D0DE79D831C098F +6B403D7F5217A1C5061829264B252CE10FFAD477A1DBBC68108961D186CC0503 +3368657728675977685ECE236A436408D29FE2D4B7CF8705013B3E29B41D0B75 +E6F81E7D7B6BF9CBB42B83C4330EA36E0FC611DC728A778277E7577C5797B90B +180782F7A5D410F93482910B7DDB40A09D1CD35184F5BE624F09302F9F84EFA5 +A64AFD03166832C46AD4CD8FF4418C65A2D09F69D35FC96AA2541BA1AC1F2CE9 +1B2F5DA6B5BDB49B2ADBD4248E7BC68DE639495023E9BB6C557D0429B89B8A6D +5895850E7D0A3E2958AA5FD4AA32C9D91C54FCD0F65C11AFD312905B9E6EF9AB +30BD0C4BF8B02AB348251C2B30D017FC63377DCC693A91BB7B96689ED2960DC9 +1E5044AFB81812C8F776E33F89C53A2FF7D05D67CBC9BD266854B6419F47F0D3 +35A66EA5D1678C0B8C66FF203D2D933CCB7141A58B858EC72FE95C0A32FAB86C +1C0E13404FAEBE11C1A3118D9FB50B460AC1B258376819E6C93F6CDDE6D51888 +6B290AF346C85BB7C926D595F824D9F83EFD7D1697097DD26163AFD8BC9DD929 +3C6CA68A62FED73D1EB703CF8176862DB849F5D3693F9E3C6471469B4F005EE6 +BBA24651A0DEAFCD033A8FEBA6FB04100B2429572C7B8EC4FD2A93C59A777BCD +1E7CB2EB86002D6ACF21C023971C11F453A92EB0DA48E1372B3D31C1002DDAEB +E51B3F65ACAEECFDEA264DEE945BE242B67A917307C707A05CB1FF864436B6B8 +65406BCF7A3829D280C04A2BEF9C1F2307AF621ED5176378E50086EA73C78971 +954D773D5638630A3444C71E1312A108CA24CE81D7DF6922C843C78620926221 +CC05DA3CF465B836C52CD1C676E6E2F9BFAEA2A477570A8777A8C0897DB6689C +1AD73F0B8E37A9210258838C1F6CF8EF50A9072D6DFB4E37A1E26C64DB65C16D +AB185551214E099551FFC868BCCD67F73D9B810E53E6D25D838A4A8DA6565FB3 +E8968F72103AB70E9E8C2FAC97F84ED01ADB6767D650AD6A28DDC9E79661BC0F +EFD5E7695C7D9E79DDBEC6F8FE0D1BB5589D07992E6BFE9BB9B3FB470F53195F +8C1F678B9921B68A781C129DBFA686945B6871AFD761202F505AD5C8B3750713 +88B3B5FAE3F1B1FC3CED21CC74B281492BCE3A9B4700A926FB281E3EFE501C6A +7D1A4B8A3038DDBB6C5D6D494FE93CC86616B26D0F7B2C65E54863471EFCFBE3 +4C47C6353CF3D5B0816C6BAD2A1AA86ED4514BC703D45D9FB3794DF5BB8BBA3B +473683E24353B9DF7574BFD1470FBDE026C937FD510DC26DCBA456EAECC38F1D +5A2647BBB67B44DA2488F68E267A3078F8DD532132C4FA926FB88DCED15741C4 +05B292C2BEAD1730B2817F438BB5DEB661FBF417C9286069784203BC5E643A70 +13193BEEC55C960846C1F4C5ED6FB3200A8400C50BFB2A1A8ABDA032C2859549 +F1BE68BEE4C3B79DB8A1D42F05C113ACEB76649D118C3472885492640176748D +401ABAADC64099A05C5663E98598E8BA946BF35D7814CEB2BF1B2F019B13BD81 +A4D02CFF954EE0C7A30C3DA2168AC92E4569EA6E65F9AFD1A289058F3E003AB0 +A853A265C696EDAE8856026C0CA2D5B9CE8A71807C06A5948224AB77C7269638 +6DB18BA9E2618A17911C35CFFC690B1A855F5C2A14FC04F45DCE58F86FED4F30 +4740098F46AED65C6E72B97B9515108E90AC625F023F0D1BF11A244A48CCBEE3 +7FA9822FC6AF38F0CEA95F5A732353476AEDA577342E784130D2F40126A05290 +1B9B2F5F8F4970D2B9750E34F08F520CE8895D2B09CC63F631B42804AF420A6B +10410D8BE9385A929407A5B41BC251A156428601EA3D176F4EE3B88690017EDF +D96156C5355F66363DDD7377938BC4FCDC499FA9427C61960FC1781167339AEF +AF7DFB0614809E3E3A073F788DC53CABC628F6F4A4EA603DD5CF9D8BE06BF10C +5BD7341080785ACE30FEF404BDCF40FC1DEFA2AC9640153DA50AFA84F1CC08F9 +C89FDDEED8D449CB050CE7D48B5B13737B747199C72F21F8D702F0FECE0FBEE2 +C99B54AC3D58168F07D42E7CE87CC92BA1DC73410F19106A7F7D6BFA739C9CF1 +67684B7C400598D0AA0AF79F059804537E0021877A4CDC8C5E7F516F22A855C9 +9B906618B6770FB3DF4F2E5D3D11DE724CF512632B9077B4395888AB297A67CA +A25C72036EFCB0F26ECDF6E31136E3B11F515CC329A156D0D4E73C6355882492 +544F32BBA141EB05EFA30954C540FCE415CD3201BAE222BFDF97F87447910C39 +EB68BE6DB21E40D2E483D792C04CB320A2714FF8AB5ECBAC0A85C6B0552CD3C1 +3E0DD51F17B4B8D81B20AD7BAD3E71AF7F6517A7F43464958E8D1A1E11E75EDA +FCD9826C201320143965D2F4E1EFC7A81730188E9B202AD186864C5E5192DB57 +87B5EAC82224BCDD1CC68338B464C5AAF79D0958987EF747E013F414DB35176D +A51973FE65015DEEF2E90286281DF24BAA3758EBC120C8018A5CC57E638FEB81 +DFA40BF350A558103D05A3B20132A204A0D1D550271938F4E660953069541853 +22908D1A78DE88C9D98D79954B36D926E1CCA222004C3D8BD7968728989C0242 +F1BE705FA2629F707CFF050349A3300F14BD1971B545A895B8ACF06AD3BBF830 +451BC3B0AEF51CFDADB6653DBFEF4D5DBECADD23B8E09672D0AC0A227A545506 +818720F0A95E80649EAEEB9AE5BBBCB0D533A681A694DE690EADA90AD2D0F0E2 +7DF4E733D685368475C7C9D3ECA99F70F129EB889AAE13FFDDA6FEC1F098A9C0 +07FC794E6677061602C96753EE4A02569D3466348D250CF0A01865E2739C930E +CC63224DA7309CC969E6822A532535CB3687A3139D46A626D71854531AE64DE2 +7ECAF6A750864CA17876814569FA5E09DA009EBB1654FAAA45CD2DA73FF981F8 +37FA73C5C4CDD0C78847AE1D5156FCB8BC98A3772D7E37F92379122404632C6F +431525D5B8FDE8B6CBE9EFA7E9A4C0FD75D518AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.1: CMBX12 1.0 +%%CreationDate: 1991 Aug 20 16:34:54 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-53 -251 1139 750}readonly def +/UniqueID 5000769 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 +B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 +AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 +7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF +20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 +B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D +68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 +D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E +26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D +F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 +77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 +BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E +C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 +30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 +148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C +E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D +E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 +337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 +0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 +472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E +A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 +35FF2C50073D99A7C52C5A8AC74994B1E6BAC878037AB76B193331DFA00BFBEC +389AF6C476A3F7FD9597D3FA2DEB506EF50FFD5104737FC9761AE3FE4B291D1F +26A91ED73FD4E65E2CE59EE714DC525F9897CBD1D844C4F6C3A9BA5C19B39D6B +F6CD530706E73855CCC9F6CB39680207FC8B27BF8E361E1DA6BB0FF2E4967F96 +A64F1C3F9B80780560266290A039F680A69D5C21630588F2F8C7CB0C42D0FA12 +77033062CD1D025A2A3E0808BDD6F81195D9C4784342507866487390F315DEEF +E353611A3319D136FD42F44F96DC632003E656A4BDAE4A59824F7C4B1A8075D4 +73736A581BFDEA1E77AB84EC7FAE1968C5872AF5B49B5EC8D5BEB3C88C01CC0B +06FFD726ABC7BEC857362066BEAD0151632E48F3F65CED9A5DD2119621409708 +83CD8913717574690B6AB5A56CEC5F49AA256322591942DE60B867C50B562148 +2CFE5CEE8CF32F48042CC30D219F7F02935755EE80DA985068603B762AC9E6D9 +578C329AF955BC8A588DB755D2E34E1D546855C4650C8AD53452B328A34DAA38 +28237FB20FD724D87509D67724FDA891264810BF7CA0FCBB7573D1B2EB9C5FB9 +0A38E0202BDD21744AC650C8A21D5EAA0EEC49ED5248F4FF8E29A43B7B40B10D +AE133FB0A7A4AC58F3DF59A8CAAA567C444AB7D38F44AA6BE56B2DA2F13A975B +B70DDF5B29099B3C7381D8201A41DE108A5518664028766A9FAD0EA13A0705CB +2102035C225B89C17A216CA90D220E9842E3758F9CBA61505B963E84189E9A5C +DBF890A2A45F39F86F67C369DC6F2E76E8FD2369DAEE8418569281A6E6B79950 +FB8DF17491490DC8BA791712E3E314D2FC71F39335EDAFC880873D7A72650703 +E7694961AAF73FE0CC8522468FAF6BB2D544BD49EF065CEBF26FCE1DD09538E3 +CAB281D5CA9FA9A8B31FD97D22D4F76457CAAFCFA9939B1F786C7645A8E04A47 +DA0DC490BE8CEDD23D4C18823D9F8CF0B103DCBBD3216F8EEED81E84BFBEEC93 +0E7D17784E1066605275E754A701AB4F2B331EB67BEF4685A45D388213D21F0A +F0F84193D4C3E91124437326E8E13284706DC37122EC896E2F18D0E0769245EE +25EEC762EA684109BB0EDAF3FD73527B6329567EA8C324C628BECE6B37F33335 +CEA67A1180BF579EE857438DEB64B438A5DDECA92527733490E47A8A12CDBAD5 +1948D633949C11DA71C6854E1A9920B3FED7EAEE6EFDC2ACA606918E5B9D17AD +2FE6B823FFE68EB884052311E2F59341E987E80DE9144E98B6FE3945A5225721 +4A771F03948945177A5B2ACC01539B013E54FD9A7DB151A8FEACB3457E4284D5 +4CE2AC91C8DA738051E34881F2FDC685C0DDD273BEAF8F4E39829EBEC24DB40A +832FE75F89C93E35B846626F5665C18001EED557E9C66D120A5AAC879E69FEDA +05885A892281F5179561F670C63DE8648FE8E7C04B1CE54D2B05DCD31CC7B54B +4415909E0749A50966FFF18E2017F3639CF3CB3D7C84542A0E0591E33D4D15E5 +C9165AB8F3E0FC5A555B98FC2C6AB580BC1D9975CED3898F774FFAF1BF862109 +0AC19E6880A27EDC56373EE479C8B5FDA88AF59FDF0EF849E79AFCE96F82424E +C9D0B24C7A767C984D7C285B199CB0A56A731383EE6A28CEECB9FA656C84019F +9B445873F032E989D55CE131D724875EB035E082BE404BD7F2F9C00792B273F9 +2E94142A6FFE91C98673F92EAC2FDBAC1CF490482C416B3FCC2EEC79D65530EB +5F874B3A5009383C7699FE928BD710C210F35DA23377434F1AAE333D52480487 +3DE7EBF3C574F3C184B9527D651700EE59EEB36BBEAD90163DB8EF1595C4230F +B5366782EE60215AF2F122E22FE40710FBF799B6AA328A24FD8226F8FF266225 +EC1E2ACD0470B4E98F5AB4A4E208283BAE090207A31B21B595F9BCE1E8E9D0B7 +0D637476F25E69DBC5BD581010E50E26C7EACDCF70030B462E042BAB5D7C0188 +362DBB4D943E50DB72619706B6AAD247470612A3DF403D0A880E92D5108A4976 +FC46C9B7594642B2E62926580F136B23098FFA3C3614418E87D0427928202ABF +5FA3E8E5F387FD6D49F194027FF6C9536BA83627EC5A549DE4D107363FA9D1E9 +920E40885554C0EAD0EB5EDE92844B1FA345CE968FBB0BF335494ED48EE8DBF8 +5D1B31E1D83F4C6D559B873510A2F4E4B4DE8A474C200F555E31287C955139B6 +81E5C932D737D58AE4177D82D9DF8E27E7DB12CA995A43E5270B582CAD2E761B +BD4FF0BCABEF271DF881DB68D86DE567D2F3D03B1978322F53B8E15A39E9BA98 +E0E791EFFAE0AE16562BEAF679030F69EB8F905AB9EF18FA12FB20AA51A2859A +180E2EE6356D8ED5A9FF57A915A7435F66E2B74AA4C67B682BDF0D79AF847824 +33C637453D5927B23FDE130D87713EFAF350144BEC2F71ADA6C2CE42D83C808F +9DCB0870B9AA1406F8ECC954683109846D8AFE21A3A7E202261B41CC721E6A11 +1F3C69EEC70E709DDBE3056939D17AB88BC24E5C39ADAF03620E249434F8765D +C1D35DD072AD102983FDEB76473081FB4F3159B5328DB5E559120DD3F9F2CC52 +FC41A9ACBEB2493C5DB98A4400938CDD862432E45D048B5D49E75656F7E95AB6 +C445D9E89260A6F3FAC610D890B475B211D85AD56BEDC3088723C414B1F2F88E +790A1C45CA9A0153432A55454BCCEC669C3BFF7026D3F5A8E9DA2B6FCA873CBA +14664D0736657586909DD32FAAAE9997DCE88B07CDFBCCC723697A8D4863B953 +30A55C5B4F13B0A8C7F9BA0EC72F3230F24E0E78EE768B410898C31D300ED1E0 +1D984636C66AF73CB089F631DA4A7FC122E4149A39DBFCA3AC57ABA5D6A73494 +4225871F313F73BAC597B5AC9E3FEB8BEAC9BEE448E7DB37E6ABF0DE302F1CBB +1FBF360FD9A4EF1D06118332CDB96998D8D26F96910F6A3EC6393AD09DC4AA8A +782DEC5B9FC50281E4DEACBF5B4F47A8EF827F730C7BAD6F224947DCC71D3D62 +A70ED9FC484FA8358548BCDFF1AFF124B00EE1E30286B6CEDB37A0D30C75E86A +A680683A7487F3554CAD50E45F1CBE89DF309ECB522DDB9FB4F4C3D4437172A6 +03D7D20DC053C71D5C12EDF2CA6A3340F25BF50E7452B42218C9B1CA8FA12D5B +2BADC3341CF15FCE1342078BC7387EB5E326C6148716558E983F080EB27E2C30 +B695CFDE2DB100CBD9AF7CFA02E99A91A400357C3AA29B2FE1633636101C603D +4CFB0E52E16AF001FC6C88A94887C36BE39A5BEFACB417449154D51974F6C1C2 +3BFFFC76661FC9C517592D51FF6CBFC77437606808B993E15634AEF0260F4017 +FCF6273E72ABAC97B0809ADAE44003417FEA16AEA3021A269883E4712F040C9B +29F7A534B0DA2796D62FABA6A58D0D272D49C9ADE6C726A23283ED2B0EF8A4A3 +B859B8CB775CE955C52D3493A1723CFC519FEC1C6DEB7427A42AA2AFFD429303 +BAD265B458B6282609B0B302DEF2CEBDEF7CC4AA2646895A916B620801B7AF1E +711DBD4660DE5EB12CE5550FB040D35C345F1336DE173F97AC8004989916806A +AAE89E4226CEF51836EAD16E84C25D6A94167832F6385555E950C59BE07C4106 +BD61D92A30CBEB49AC390C85F0DF83B78B60B31635AA39EDA6E788C17645C715 +DA2DFBCB09BAD7FEFBF14CC4FB34501FA727BC84BE574A2A41CC87DEFCDBC67F +8EC499896E01845C2EFC5AD6F46085FE6AD723311552FF27233050E044A70269 +ACB3CC6D2D24804DCDB9FEE91EBF08983C05C479AA642F466945037BC361420A +48FB3B335E3B4C6C5790CAFCF6A0AFEB27010AFCE9676DDA871C2C9B5F1A7935 +0D5508B7B36560DF7A4683A4D6BF39A205206EDE0A40F2FD6DB1C7CE9BA7C777 +1620C2F88D2E607623AC150E2500175358B0B52F51101CD2F052EFB6FB61FB80 +981AF8BC99A5A50DFBF3FE7E4FB054E082DAD488AAA3B194DFFAD38842B4B7CC +FA49E430082980182D3B8F70363912EA1C8A742FA7CE38634172D2BF3683E6AB +3224477668D6F8BFFDB765E6AAA73FD52296E1E145E9BD9EF188F952D0C421D7 +BC47FDC6F314F6DABB6747A0478E826931A527EE40FCBA09C5CB475FF25867BD +0CEDD4110E079A823E60C8F66CD9EE1CA449EF7F1DDB24C0253D0376531DEB9D +32D0F4CE9F654FF5ABD881A4280801D1FE53EBEADC5417F9BB493D0E96AC11D9 +AB7679B12C4A8AF81A6708684D0F89A02F1FF17DB818422C2CB9A53AB0D22F47 +AE14C4685DCDA30639CD15F5C3ED70D6282CB970E6D2277ECA67DA8985DB3432 +BF2B5CAB0B43EFD41E7EBC8357EF10E05A8056C3587AF2F1888D330D5F5E2DC1 +7C527E00FA27BC105194F167D204D326565D5F0930ACAB12E684FC5A0B737D80 +4D1483984E1EFC6D4D68C80B29E1DE30CA10F5FFE7C93F85F6E3B81AB9218FEC +8B9A840ADF35505F33C89D300DDA928309D01FA5230F608992434E2DAE06B254 +6B80DFE8155DAC4A8847A135F424CC090FED4BF3E9094C5F983B6E04B02DCB3D +B72BC604DD8B5DCB11615D318FA8E19751AB4A01BDB345A91A80F230EE0BAE07 +1490C4F99E8D39E8A08C7B9E10BCAF8D5901B67A4FDCB8E6A2D446151405361D +921D531C0D9AD889780A0788AF5687BF93D9153508E7DE305D8EAD77A7238B63 +B70298F5E69A3CA3994878D84A41CF598F9607E092C2C666CD3C28C60220CFDC +E84B94DD9C1102C47950F0D921B82C07713834356B4C98272E58A89673AB1DEE +29F5CD9FF4B9EBA06CF42C64F2A2B431A76A54E8846C1D2D6C2E4159E55C44F5 +029B21E816B20DFFDDFA80307E69BBF77283B3DA3B2B5ACDD7256178B060AD34 +DE211EA094466DDC8E21B86EE829922FAA4E381CF79AB127A661D2DADCAC2BF7 +34157BED101C99D4B66E79E7EB7B280E0D09B3CE950D05FD4684F25F671428E6 +EF4FAA6C954F3F3BE6211508D517233ABA7D9F3CD20BFE4997BFA1614BC08203 +A8333A675EECBF2532EDEB0B79F31746BC5BB0C9B66547F1AD81727C6F20D4CC +DB92BB5AC94995875DF130CA62DAA08C818DD6C9300E2D55CCE729810495A2A1 +1180876A77F7761DA8E0F0F55D9312698AC47EA798838A4FCD98BD4A565F5196 +66851C3B993D3B772681161A2FE70A2CBB572BFA2240E8E496D1356FE0C00390 +7FE892B9E5DCD5B95FB51FE1BF4D0023F55D90C3EEE911E57E233BF2BA4F798E +313F32696C4CB661E70352CBD4B249A430AAB49FD72750940B270E253850E3DD +7E3A6243DB8DD50867DBA3FB99138CE0DA178ACDB41628D39D84A5615C720BEB +8FDDD9CCAA15D8A258DC0506B40D4A9BC31A813FE3EDF80E02BED2FD23F2CBD3 +D5A884766AF71F1C694D4441E9C8634A985B6CBD5B27E9C53CEFF0C1CD15FDA8 +2B39BE515ABC1641E1ECEC0CB5D00D520C7BAA339BB385BF67D424118E5F1396 +ED4D402FC4CB89E35821E1A7A1324BB2EA509F64179EDEB65BA1F65BCBA55EE0 +993FFC039F22344FB6DC7440B04A570525F3E3E883BC54AD0E9C573A23F19703 +134E79E70E94E4C3D3E1009E81449640E14B68B88FEE047A2CCDE3D544D692AA +6461DA69C9B9E9647A80496FDDE8478095E3E743CCB6B05DDEF9FA18CE462AA3 +F70C77DF7A02C0D484AD69D2D350F6550BD6DBB6C79B0D72AFD126B11E8E4C41 +43F7AB39E8BA462BE6204374C5BDF2E5C63A5021D4F56D150BADDBEA5AAFB721 +E486833943E1B23CDCFF4C9198CE27528FA3CAAB96A925956ECF6E5699BE4B0B +F2F7F0EF414B6FD35549EBB0EF786F47231977DDE4375E954EE10BE17999460D +82194CBD1F796BE5FB270C966829150D9EF64B05D1B00C73A0E19F02D12784A7 +F3224310A981AC4E58BB63368091377084F921B4BFBAB4D077736F4355DDA20C +9F7153BEA30FFEE629A2247C6DB324C9EAD295466ECAF1D91193B31DE2B0714C +10A2401A94CD38734955C9A6D50680E15395F4846F4FDBE5D9D851441882EB6E +83FBE39C7C3EFAE853C70827BCEAD25050CDA3CA6D5C224C471D9DB73BDFC356 +F3E8341C82F6ED38AE9EFD91A430AAE2603E7C9A2B9EE81047129FDF56B75EF1 +143C7D2CD03E601AC2C8C582CF2277B820F99DF901C9F2698D968BA402CED234 +110E24C7E331B1963834D6028DA7F0E1E64C94829888A3F0E54C6456410931F5 +B059CE09E81047956AB8956CBC83B99F9532326E2A1572BFE9B6856042793DC9 +61645952319DA1971BA4DAFF18FACD684A2B3A15BDD559616843B2D5FB68A7CB +712D2A64C78C58BAA63B8DE6307D46436338C6F19B4DC0304A2D017448C2CED6 +A31E5C41F2B4CFBD66B9DDB71684D68E2CFF268946A0D0E3F791920F2FEA7BB8 +517F0E3E9D6F94C6567545F87EC7B24AE36CE3C047078CF60427277FEFBD9368 +2D42E770E3ADB6F95FE9B65DC66EC68F29A386012E812B0A095C3C83305D1F3A +80878B13276E21F3610088E6A19F6CCC4847A68F09A316AC8E46A925CDC0FFD7 +01173189774AB33680B6E593E7E0166ABED14673A3C2B6ADAEB08A292C7E1295 +9EC140C24E363DCFEF929C45844D7DDA5180C54A3B3C791868426C5F0E5640A3 +CBBF8D6C4C5B38E110171B6ED032266D7EA9E29BCF16355AD7A904E231E6BA49 +44FE08439DB307D1FE5BEFCF4ED9E4E9A03247C0DF547A475DBBC3D3A7D0BED0 +8BE7532BD196AEC7F505C33FCC9DDD67981139FB7998DFAEBA1CE865B11DC996 +2AA56E05A0C6ECA43771E0F671C0D5D6BAFD84404F4D3073E29DCB9974E84B1D +40E74751D300AAF6A5767793A07357FAB1B9B64AF6C5DC83A882FD74B01D9857 +7C970FC4C9F1AC956CE0C84F88B1564A515146E9D5DF766C3CA61879115CD20D +BD18DA8509DD7D7ABAEA297CAD1BF9C1058BC1A87C78ABCB76FEBBAAAC6E77CA +8F0E06DA48CB7FF15F15EAC0D0BE75BC89C40F4F265A164AAE406E1621EFAD63 +922993208857EF1022BA53604AD72EAB4708A492C49CB7D1B6DCC820BB583D78 +C3430090A74BD416D8B4E6A9631247383780947D5A0E73E8AB4D835A432F5180 +C311E7405A1EB0CBAB68DCE930D7379693AED1B392A499AFA935C788323D3D14 +678F3000121CC4216EBD0083AA41960736A7E132DA255735652B61152B4DC0C7 +B8718543A30D0B747D287DAA21373543A2A4B0D337B78760E32B7E81CE904E7D +86BF24B8D41E7E9A6B2353220C38C6264F6391E02E63F20EDC21E16446A1EEA5 +D9E52C1E211F7FCFC6055D5E815F42C20891C6EC3900058B021C05F339EA4ACF +2092C8BB5010C09F8AED1448EE20BC15F5C622AF0FE86DF1735F0839BEBE8871 +3938B6C0AEA647EC38353480F6C22A38517DA13E523D95ED2331445E1C2CB254 +AD9BD7A35497A71FCF67E1156EF5BA19AB96E625F093C11079F29461BD822314 +906CF8ED83277FE0805087BB53CAC8B7C62487599DB36CB5D549A3AF360AE184 +F12B03836B62994CD15D66430FC8B5F29334612117BC2D09AF318DE848DE0D0A +60C3C63ED4C10C54BF7647A71B22F81EBFC9F135C96F7C02796E3BA0A0BD6B80 +B64C8406678BCA64F3970F73FD9DBF35D1BE1FA78988C94DF776653508546818 +10BBD62C4FA91C6F5FFC9B4EA5E49DC77D2F42AB31AACA1C7156E76DCF04DC4E +5E0AF91B80C7A23AEC9ED959A683E1CDB8324AB826EBE250547181FDD0CDC49F +9AD4588FDA53A421259535928B9AE8AE8A64C582AD01D74F58FFEC9F2F29FD60 +062FDAA7234193D4BBE40D9DEBFBBB78A7E2DB68E19352DA9E14C5F6CF5B1CE1 +715EA018D81CCA5F66A518210237485F48DA84A158F238E66EC71579F93E5D50 +6D0E3706FD10E97C41DDB7BDBBD9E71043B6E57F39E3E2428B0156F2BD3ED94C +58C91A4C4732446B303548A10F21304AFBB7BC31B4600E56B0AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI9 +%!PS-AdobeFont-1.1: CMMI9 1.100 +%%CreationDate: 1996 Jul 23 07:53:55 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-29 -250 1075 750}readonly def +/UniqueID 5087384 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 +86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 +DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD +67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF +6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 +FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 +22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD +730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F +449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 +97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A +E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C +AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA +A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 +B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B +9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E +759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3 +5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2 +BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680 +3435E9C9444F7FAB46B1A8E628A53CBDC4D4577404624C551B59B22430F1A4B9 +69CE559354AEAED37503ECB297EEC5A6458604C25A48198CC839F9C0B912A303 +DA01579DED7BE963C911C872F196596C93859533742F94A871FF84D43C744927 +09EA781C5DAB38BC501CE7E003927D194E5B94998B5051FA6548B87CDFFF1486 +D1439EEF09B0FF1B3684944B2B2125F6D15DC04B2A458CE5154C929B8C0BB520 +73448B36F03887606C657698508B15850E2206ED56C37A7F2C50AF78A88D58E2 +8E36100305FAAAEEA028C2BFB6E0118B48435FE609B1F02168BB55753F42BF4D +00A3FCC485D8D3431CBE32610EE2720B1221F30C9B08581288C74E7F89E7F8B6 +2C8B55B29AB652180401651FDB807569F5B1270100783E403CB388750F0846CD +3892E34E83B8599E1D33B1D2E402BEBE57C425996AD5DF64F54E17CF46FFA239 +BC689E34B719AAB350F84CA8CA3FC65C008BB74BCF854CE130348204C0C90D94 +A465AD4C8324F1BA659A8F6C683B3230E6558CC4A3842F2AAB6824588822C055 +08563243CBB0E856321D2CA1657B0298CF07117A68276F6A58AE7C2F49B163CE +051AA200A4AA08078369D71FE14E831F820D4852FD64F15A1027C5F981D69DE1 +0E60B8495AEF627BB79EE377216DC3E6577F5C1ED071668C505330CBFA0EF4E3 +9E0492EDF2A386F17722AADBE16D3BC12AE48990184559998A7130FEA6995B7C +A68E4ABA7EF999492B90735C50E3D3457B87F50FF91A96BF6B6BB0931A716B43 +CFD4A74C4CC5F912AA42A943508C3511F1A010E2973AD0C4B047DA3A70A49A3B +233F460BBE213EA49D416E6F011F9AC64DF41126D77A01C9D16F0D241D0FFD5A +F8DBD2A6B166DD12217A796A412E292407837545F0A6AEF44E4961C1645E51B6 +51C6848D63BAE77CE528CEC8FA3AD3F10FE3B5D4A2A0C823AF2917107A68E126 +DDBFE92399D29445C59A43F56A4EEFC8EC7FE4C8950DC0305AEFE3E8C048A870 +25E887A2F1A315BD2E1475F293730E0D855BD07423DBE627BE93EC20853F4ED9 +48FD2E039C35DB25D553629BA31DAC79A0FDF0FD2237B863E1B4A0C0352BB94A +69A579E87E3B58A15E603031BC34E5E345695B16702B2050C944A2023F2AE7C6 +F61B777160EFF3B6258D96D804465CFF754FBD0D32CB70A02D533CB04CDB63C7 +0AEF7EC825C3B87C8DE3856F4B31F3E15AA1422687EB9503AA7CF456589AEF62 +04C2146F16F51856097CAB1C57766899EFA6E54067DA02A2EB0737BBFC5D6A39 +BF87E6EC752DC419AFF10DE77954AF8CE261ABE380DF2A9F6D60443EC06DC617 +1A1B26469EE8F7AD574D39F0954FB681E986FB4C6DCB2A51661E2DB9957E625F +9DD123026E280DDB4E5A22A2AA79104E102DF60E0B3B6CB82B39CF66F7C6561B +AC4EE4C14238F835313445AC11D270EE586ACAA2AEBA80FB084582DCF44764F9 +CB7779EE8C481F264BE98A3C1A68C5B1D251E801FB9E82279CD73E737A2A996C +29D4305F01207A3B97433C149CE58DD65CAAB7D6FD0021F4568EBE4CC3A41FF7 +C11B28FD9CE69BF1A6DB76E15CEF49E7D1464372666CCB04C76C773630CB64EE +A5FF95EF34E7FBE7A284E5302810A108139DAFD7116E5383111CBBC5E3B07BD1 +B0C4B78242879638A679BD50F0FAC02DF84AF5B38FCFF09988D65FA4663683B5 +000DEE3492E0EDF7EDEE28BBF16919F00A08FB362A08E1B4185CA8D280DB56E2 +E153CB81AA33153AA473EBE895AD1A5DCA7503CA0BB8B54FA9510A4715A50BA1 +89E6CA9D119791564524FCE967B08C505C52A6E6453703D8BC35FA1A20FEB162 +4C3A7D4337BB91F9375E9268B915D627372A78F8A84D5ED535AF70EDE8E07917 +CC75C3BE728ADD09E4176B983A3646B2184BCDA8F7FEE5413ABFA9076B76FD93 +153CCB198C68383E361CCEBB82B7E2489D85D0872C050723410524CDB5D04DD2 +C6A573B82C8B110001CAD21386026646FC5DADDA28A54871373EA393A649D169 +CA1F0D37A5E00155E722721903C1A2F235EB14AE87D6ADC39766764759F3F793 +8A8134D96D106C0F37A7F4FAB9450930301E70A062A7739F9D86156D971F96A6 +A19602C63A7E27FB9209EBD090DC20C1EEAB647BAF67DAE9CF17488870A45171 +A1D26FAD81342832C93C8D4EF9BFA33628E86AEC815604AE171473140AB976E0 +9E33A97CEE262DAA8E2C1FA68A23DFB767FDC0836660734C217BF77AE433B156 +3D33CEEA31683EEFC6F89AA916F902A73836F48745E9D412ACAD33382752B16B +260C14BF958BBEAE486D9FB6231A09161EA3F277A8E0A8CC04BF06DE504B100F +BC6C4EFCD60E1CD3BEBF5C64920F7002D59B964ABFF1AAA47EB94C2B6E0E0900 +48417E803F0BF90EB718B2352C78617B3FB43F8E196C489C938C182B3693B487 +34F4C973A7722BD15DD2BCD5AFF82C42F8F2FD44B597D2FD9E104025D396AD03 +2A258B8F96B1D411FE713276BC275A35C3E0418A65EC2E1C8897950F0AEDF822 +7FC99A27508E19E42715B566D784A1CA324A9ED9E015416F6531EA7B3F388CE5 +BEE4BEBD775E63B9E45C6622661A1E360CA636111D4816BA306C50CFA2F9FE30 +1176FFE860279FA8011009DCE19CD9403350DBB7882CE5EBBF7224B42F54BA5F +933145BF03CB8CA6FEB3F3C9E980AE00C917189ECE129075DA7C0AB73DB571D0 +2265C81E099671E109168056FFDE29AACAF12836DDF0F49B67B93586D3DB4845 +94C68F81481E11F97187BF5069061F6D6FB47A8ADA97A59C6999D0B5624CE935 +5D961EC24603A8AC2835BA442AEAE9DE1597CD5F1E1D49DC5111A1C7478C8C8B +8F4AC17F38E0F01881548736EE5237F3CA6E6C7C4B681E4F920764C1AFE032AB +CF5EC6E21947A7EF8A9FD9171D68FDD16B35BFEF9AC87B657D59368904D336AD +F2906B9402E13817D64E485C93030B64E5ECE2D45B58D8EDE1154AFEFCB1625D +F31A7D595B95410B8DE67F896B3F3539F8C0E7D347C938408B44BFEE6B06F84E +F76B092BE82FD89966FF987D6DDD3F2074BD33403B1CF1825DF0B20C31B2C7CA +95E27E8A7E1ECECD6C1D36E6EA498D0F274816E9502B60E22666643BB248B9F3 +E11E4B17950141044B81B25C088955F03130B05C7BDD69302AEF3345231389CE +7C1AB2CE93750C0A61413B198C8811EBE10EA75AC9851E80B7151D5986D7ACA6 +BA90B1104B18796907751C227F383CC9240E4A73675DAE8B78E985561EBC8EE4 +40E10C1E47821937D710161F2149E5CBF2D566E160B4EB59BF962D82F9099D17 +D36C294668FD37207320B30524284DAF4DA1FF83C398FE52155197050912E92B +4BDF9EB12A3C9CBB284978A30E835E5A1D1528E645C3A39C2A37CD3ADA47F19D +B3FD1B48A04C67A72E5CC6C0D4C8F79B823BAEF2D58238C6102E28951F72E945 +1EFAD61B2A661C6D509E2574635A66BED21623DD608A605F0932944CFE7F5D4F +9850C78E57D4F1884707C53FA0AEE12FA80B24697E7FC678ADA36D730BBC484B +AF5BE1F8B225EE0E14E46D9E188F69EBFD96D4AD3C8998E7E407EC93D3373C8B +9B5BB746133A21E58B6780E78D91DEF0AAD36A004197E11E4B1B6E0E8E57E739 +9183363149A1D88E709294D9C3563F5C4A5085527C2DFCD56866E259C757A90D +2FDB17D586297C08DCFC3D13157830AC9879432E314D11FDCE886C7F3D11497F +6572EC548EBAC1A4EB9871BDEF45C6EF0DD12524CB8BF3C5AC58D1D12C4399AE +0D2DE1F7B09A2769A82246A490831D48C63FC521DAB2609DAB921741A5FE006F +75B32F09AD1D554034C9E050A3BE6478A54D19B9DC685EC8802489482CABEADC +449FF21A98FAEBEAACFD9ABF494B499FEE00034B9986F41A43199DB38367CF55 +EA41C0E3E923B5E86BBFB048CBAF05708ACC1DA188426C20B54D1BE2B0A68B82 +3B2019CAAD6676F9BC845B678404B536C30DDA9627F1C40D3BD3A6B8CDF4553E +3CFC13D25077897959488132E8729A47A47917DFA1186AD54C86A6431A4D0894 +899452839DE07EE0FC73568A3FB4A1A8CDA2F7165535F65ADD78DB9397D6CCF3 +A8F054DE0B499237A6E95EE39B3FC1ACF590037E27B88ED867F1E63BDCFB6CAD +324FAA94F2BD5DEBB7EAE6A1002D4AAAE629795719EFA6EE77B7B12007953C33 +8C1BDAE47A6B8A03208301F75335725E5F81BB0C390CC2C12D3C5B83DE9AE79F +403E0F17FCFCD71BC27AD58AC8944405C0BB14788A58CE4D701DAA3993390BA4 +80DBF35F187FCD4C9E72A0FDDB0832A828BF43CF9CFB8D0E9BD8610EE08AA8B7 +97208890C0E7ABB3E54212879E444C9BEC8A4BDED85C87065AD98A0DE2DA7D9F +EE8C5ADE4FF52901F2FEED90A640CBCBA4A1A3D679F7AD52B0C280C5883E36A1 +5E466787009F10AAB413AEEC82CF212A16904467FE5FB855DE45D754C0A49D1C +A8551E9A2C401F1C428BB9F6550AE46A3BBF4473B478E3E9EF81A95320E8E470 +4BDA3F41AEC46E22CFBE73B60EE1603C6F9F778E3D661A502113DAAF4A9DFA60 +0D4212C592DCF82740FAB1EE7A10760D992C0A44BE4A13D2E29684DFA2B8046E +D93E362D093F0890ACB165F9AE7E2EE93AFD90E3D338E2F7C78BD59F00CC8930 +E5F051DD738A602C325EACB05D9079910C784872A3C5C583C2D99E5D6CCBDE01 +147EACF8DB8FEC7C60EA6DF68CE2D00523D779823A94C032A96FC503E17E3327 +2F953A9D94446946D3B269A8A50B539A55FD4C561B6A15714E3440DAA053EDA7 +8A6E214B35FF41807B11ED193C0F446ADA88863EE789AA3408EE7CD14F5330C6 +F1D40D60391E057AFE4A64DBE865255D4C01FB806BFD2E8E3BC08D40E7CBA2C9 +66B1C673A44B140E13738B93EE64B5B137613B2077D66D762E386D3EF47F014F +E3A1B359A993488558B87C8D6208F78ED3E7B281244CDCF51F114E736171BCC3 +345FAADEE2FDE4462A349BD223B1E6295C46DE93ECEEAB0CE43A614099191FEB +6D942578259666CEA8C61B89143172BA4CCA7261D4FD2096BBB245CBA35D7041 +4B799295330F16E80D21D90D8D844476FCDAA76AB9167136CE0823E71F1F5DBE +AD259E79D77F960AB70098B68750D065CB6743B6C06E0122B2999846F8A8075A +69138C54BE8BB7D314928A65AD626E3A749208BEFA7241AB6B5B2319755BDAC7 +1C8BA6992EB2D4F950AD41E181973AB3E0B70DB56844EF47A43D178166FB3AB4 +CD008CC2825E2F4562841C69A0B1BED9625E195366CF7B31816EBB1BB1D8F711 +C94766AFAF56A8F05C50C07EE5DCCB01E350FEF2D3C73E34F7729F449C0EB030 +8D1C13B82A6013074410C88C0C56C01A97E41CD5DCBDBBBF1AE2B59D4550EF0B +E3933838C2E56F233B4F9DFFACBC96BEDDE884BC58FFC3467D32836F3FB7BA6F +0D2DCC23AEA8F8FACE59DFEE51B89E52E40D8E86D2F11BBD1BEAC094260028B4 +C11470D438AA11204256563698787FF010EFA65F0400A4E506F3C66ECA73F2E4 +11D711C750DEA94F1718E0A1E0C805C9E392582E5EDCD0920C0801034F5A123C +D4B073E4EDC89F2798ADD8F5D94E17B8D3185C34B67274262ACAA6B7CCC86CE5 +A8B28182550C7C5A22095AFFCE4960D055C8F69F3EFB7F9EB05FC78423F91B0E +887AFB11F326E04B1E5FB913A024C38419A15F9EFFD5606FD1E597A46457282F +5D9ED13FD0438382B0B3D81E0678462E710B726136EBDEF6909B653B7B03105D +7E904E49E2B42433425F431FF5F1DC45FD4846FBCDA5106409DA78866F285FA8 +E74B8CE093CAB0B0DB0B565D69434F3602B6B2F8CB6AC3C10A92533B5C701B7C +0130AA4188193FCA0E77344272FB7A5D80035E4855CBBA6EDCC46F49BEFA0366 +E8203B2CFDE9C38C7727236064753848BAE8B3FD7972EB7A97FB210716710CE7 +19196CC1FE352CE4D039361B75655ADE041617FF48805E40F18C1A15CCAAF2C7 +9698AA99BE4AFB752D61F0F266CDD50645314BE5EBA28DBA56D5CEB84E4924FB +4D6665BEE676A62E6EE3F5691FEFB5C868B5BA1337C7BD7A9DC487AE843C055C +68E64C43593E7DE85C98999572B7DC49D26418EF5B7B9B26D1A8A6D44A3BA8EC +9655653FE1CDB02376B43AC1FADBD4CDDB51B28BB6428AC2507C589ECEA19EFA +E3874921068C1D44013ED4559919E97E1B1392607B745A0A86ADF47FBC064511 +CAAF33B08178E52CC8F8B97F10876214D367BD2CA0E5C3539D0D7A7929ABA8F9 +9B678421AC3A826766A8398AF1EC211BBB559308660FFAA0412B311D239D57BC +76C1613052FECC826BDD530583D72B624EDEE03940D9EB8E0C3A4B092153BCDF +0850918ABD2F8778B047A4ABFDA3059C2E7D1EF592BE6CB5BDD5C28B279F4C8D +17E2B95F50D544BBE6219AC6C30C971D86D23B2E6955943C1B752D87097A402A +BD2C3B0DF3B321E1FE2A76A709B64EE206821192398D0002E7C3F4BF4B0C2750 +22F9E421BC8F250FF51E581AC57F2F539DD62DE0D578A8003C13F4C444C9FB65 +3B1148A6FFD15EFD3870B3562BA78301D10045CED79BF869DBCEC553FFB25C30 +DD4571498B5C0ACD192B2682A0E07AEF79559DF8BF06D5CA27E8EAFEB51860BB +9EB7A55CA99A058C9CC108E63353D17588CE47AAA026EE7D81C37FB9E8CEEDFA +24AFD525EED8361BAC209FEFC5433C05000D4DE8272EDB3A3F03345928627980 +95BC6FE7CBA537F0C20D4860EBAB5953AE2B3C6D3EA2FEDFEC406B173BA197AD +F1EE8D2C863AE37DDDBA6BF69D703846BFF588B2D0A7D9C377FC5A22C1C6A31D +6FDF4111AA1DE8FDDBD24471741812B50291EB1C8FD18F54E279B5482F0286AB +BCC97B36742DD1CA84BFAB7E6A06CF1F51AF95AA5E2E3528953519CBDE9F8698 +8F63A4C39151836B17ECC8682F4DB8D57FE5291DA744D1AAF3A1FE0256E5A693 +09F0CCCB0F1182A75903ED1BCE4E32A9F0A912027B4CD4421848FF3B90257841 +E0B0A7489BB3C50C81026896E8AE3C16C8D359881FEA962DB8552D3E81C9D563 +DEDE01C2CC94071CCE974A6F14AB42F9DFCE160741D0A8B36A1ECE3B4E468799 +B7F4D0B5DFDF8A935DC9CBACB40DE0B5D1103BCEA9291CE79A25816A8436734F +A00D18EE0D3D54D541C432D2D072D9B6EB634BBE600F02194457EAA787259266 +94134DD491DFAACB2F3372F81164CC03B477412CF4296B4B2C7C40E6B76A8E04 +A02A1A22224CF95FE63C5FA41A3379B819B2B8716AD3A196B4431305A5672E7F +40D698D4F69662C370D894B39CB2CE9D68172A46818D5A950E2609167D9D79D7 +217633C5F8304D1A9A1D4EBBCEF6B47C1BB9ED75BC0F58932CE7F98E77BBEE87 +74F75960FE693E2D7D588D93D5A620377A8214B270D68D7BF9440379FEC9EA2A +B04CBB65D29FFDAC50426BAD1A30E2909A820179F1D4E37833CD780ECAA9DF0F +B54B0AFF2F588D4DB2285C56765A2E360C7537401F4A0F897185B497E81A4F32 +4562AC243AEF8FC7D15D53E4CA42BBF4711FC20C86194F89398AF99B971A6048 +24EF9C0C58AFEFEC63552322 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX9 +%!PS-AdobeFont-1.1: CMBX9 1.0 +%%CreationDate: 1991 Aug 20 16:36:25 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-58 -250 1195 750}readonly def +/UniqueID 5000767 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 +B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 +AEBE70DAAED49EA45AF94F081934AA47894A370D635D93B1823EC35EB8316AA1 +86031FCC99F57CB21E8400E54AA474B57112F0D4754A16BEC19117E9D3638986 +0777A71B135CC18E20E193AE6C2BCD89F4A27516DBD2BFE69FF9920D547796F9 +89E0825B6BD5F492B36AF136EA91B826501ADB1979A4204B2CB5C0517F2B9494 +9B2077F316D2B3DA256C99F7549E6BC4B04FE12072B09B4F5D482A126AE351F3 +97DB85F3026A793B51E6B28B54661FEB087F011F0BFF67272DD1E8825C180723 +22AE77CD6166D2605D0C0F131537417CB60086F08E7197AA916D590944BD801B +DEE8F29FFC516E11396CCB8395CFEC9262E22521882DC0316B0A129DBFA5FB57 +E656890C2471675E0566FE461028FB05532E274E6DF77E7D320D09B2203BBB5A +8B185B66B2F8A18A49589C4EE27596DD56260D0D759D2A12CEF7FC3010BA1B36 +85A2FD45129DC01A0C7570423305C25D957DFF9215102FFF35F428C823D549E5 +014E7F99ACA6C10B3C92805376D0F3F280D65852CEA54F5CC9DEF9EC1347824B +0733D3341B34937316E77E952AD9366D3B2ED045165565F07CB636385E5A5911 +2620E185B105EF6C93890833054E05B6301137338A3F1D6AB2F80095E57AE60D +6E5EE2764624849978C811EC38E014AE4A5823734C5CEB2BC22DDA46BB408D00 +4F25CA8ED287D35E26A4CACA77D2D4B986ED2ADD3BC0C3405741CAD56DE28C7C +68E8944967C022CC55907B3DFACC1EFAFD38D3EDDA1AADB6E2C006ECBEFAC8D7 +18ED3C46C331623D8FAACC6CF9292B8F1B407806A0D4808F51A5BC97FC6D6169 +B4A86870BCF9F4409991CE05CC4FF7B175EAD86267C03413629B6246AE23728F +3301B0EBF252BC91554E82631A5485CAE85464807571069BD7CF36E4836FB529 +B994EBD830525841FEA57EE40E2B223B906EBBA53854571957EC8B9D4AA2ED97 +C0496796C68A41C9A84683D3E77EF80CC6A56B78F273D2F27FC9C932ACF0CE77 +355E0461E818CA0DCE986C5E5BCA9A4826B51516CAC05C6750099F603BD91452 +E36489BFE2919F4B6935F29160C204E778EB9C23944B27A0F9910AA32958234B +FCCBC2409860B371BE52823D22138D5E3E606F3E177EA0EC6158B01343D44B54 +3F14383E782905777F7493D0602F24AE3DD8B698038E0100F6219C59F51784FE +F79259F92A2B13BF8F1053654980089EE7C199912800B107E1DFC93CBEE05185 +19C87C172A224CF569DB7281577D628A98BBE0894362A030596B49161B1449DF +08CFFCA53B81A5F6219C79900FBC1978DF7218B303B8EE24BA647925F7D669C5 +BE81B4C0250935A17BE02A43FDB64A5DE5E8BB679AC0F2096ABD76C9D56555F0 +82FD4FD26DEA254858465FF0C4D2A9BAF8BFA4DB6F703D8B0A6C0060254E379C +077D577620A41A5C9EE29896AE78429079A0633AD5EE31B2CF4EE01760CE8B92 +FB4973C7E59357898A01F147E0FE6FAB5F7682997CA9A80C7837B056D08FEFCA +55F999EA0939DE8B731F9E0D37C7E1C30F5A0720BE13336A3117E8CFE9CD121C +6EEEF68E5CA5BF50F0054B20A58528702E3593F0493DD012E28E0B8DF0EEBA9A +9928887ACC05AE5FBD840FE28E514629E5CCD4C085EE30DED3E4DCEAFA7C7C6A +D4B28BF45FF39F02199E69ED5595D0F236F4385D28B6FC5DC7AD94AB576C881F +6FD2FDC7C0DEB91B855B11A94BAF1DD00817E3BF710420A06CA55639DE37BECB +9EAA94B9222E155606AFED86674AB806791852F43B22540A6A57B2372958B201 +F39C1EF73D55BF1D0D58CB1307FE581E11F785E80A5390354DE7F25EFBA8A8DF +71B55A8A78F9EC136F83EF05B1C596FE68FDE8972F0D585D978959B5E3DBDA01 +0F795D64BC652BF99867F332915B7A7626C58AF5619F01CB251D17E8F7EF90ED +90BB0304907842E48ED402286A8D6C361520A38F631EE09BF9F0595302CAEB7E +E0627AF48F6A51A5B85286C1FF236BE9A8944D4717E576AD7E004F4E76D900EE +F6CEE804B129A45CDF008A9CCE41E5DB4CE00F94A734D487475F36CF35285946 +68879B0109F91A5A851A6A9CC7822450613D7D1C8C2EBD5FD34A859C20209B7C +F45A5E9449F40403FB1B3E8FEA232C0CD08B7046416F629CDBDF7E168ACB8AFD +96764542ABCF127F73D2F9249DFA9DFF428668E74568941093A750C54982E9DD +026672F7FBB3304A97245F6A5178BC7B970FDB1C8E29080585E96D5E87ECAEBB +6E91A0FB31FF33DAA6A0FB5CA2E06D53FB7BB17ED380379991B0BB99614BAD93 +2B9F876B162716E11D4601CB37DF3CDEFC4EDFB1854D233DD0BDAB71B79FEFAE +B3CB8273ABBAACAA0F182622338AC41B0476579E246B3B242F99153BA087976D +1BE003706CF7C852759F80586C262F31EEAD0BC6A74FEFA45D942A683F22ECF4 +5CC66BC062AC52E13F8EDD55DE5C43669950E5E32F439142476F408293C561C4 +C68433BF5A9C922DBEA834FC851D58C2CF8B032E069EA0D84B30737E69E2757E +B56EE741755927FB7EEEF26AD4130B67E02DCFACC8F7A0185C89876D23645468 +683DC2432CA86C0CB13A046179779F2B9862B10E3CBA75072FF46EAF3CEDF266 +CBE36460993CE826FB794BCB487F64416C2F84569BACAEE4E6819718B2A12869 +3146068A6B53F296DB2E9BAC98067877B240CFAF64454DE24A4673B4B8B641A6 +C47C4D0BC68A814F222543A00E3C604ED2D90B02D579EC6FDF3F30A0DF852B4E +EA7CFAA798E0F923797A836BEE58016228B5B618EB225FE6817CA22A4887F603 +E7AA624CF11B3BDAE88FCF29E9EBF1B1469C89C9A7BB84647CCFDE157605041B +A460D4A33E4B035D1DAA01992A70C6A3AB137687DEC810306B0903A250BA77F6 +48C8F7DE22DD376DB2D220BE434D7ADF8F2B6FFC8D05402829501C2A642FCF39 +325B4540A0C3668FD07CBB7524225A3408565737356BD6310DBE6A87543ED33B +3EC0A11B004ED097FA18DD35F1E951A571D5A0952421D3935A523B9A9F1101EF +AF51D2216691BB8D15A45F80C07A1686C6FFABB1DDB7042DFED82EFB0AA85E36 +57C1E8B4D73B357ECEEA0959D408CE4716C801D0084B9B85FF4E483BD65A45BE +0767EE922185E5CCBF337702F686B797A3E0654513FA554AB58A7119730BCEB0 +EED92A68F5CA12D199766205A95F60050DA8D57CE86D840E6EFBF7863A8CFE73 +15C1D4B06BEB5BFAE76AB76E4E4F58DFA94ED65D4404F085187251E1717E011A +09A2C9ABD854AA408597DCF2F1140E89B570E07D970DA68FA8EDE8B693C974AB +D82BCFD4FFE094C555D8A94F50C9223205A87606383B66143D6BA40BD4AD6DDF +057E8581FDB02610ADFCD943B146DF118AB0B8EF5565252C4DE736FF1ED791C5 +2BE84F9305BE1DE1FE4DBBC42A186BCFEAC8E9520CD7A9C4973E4036673090E6 +DD3AD99C216629EC77BA017168E836EA0477BED73D9929D68F5BA24422DA02B9 +607294139B756061200629ECE30DF461D4188C803A1BA7946FF2760CFE604485 +6814F3B63E8289D37B7A3C5D39BF721CE956E8DD0EB44B959F1D984B19547376 +CC167DE2623DCF6B780B1F4F279C0E04C3D3CCB2976D2D724C2A207FABA486CF +BBEBFA67702D3B34625BCD4A5DF6142760667E25D147FDD876B67828154C3585 +1632932739CACE514375F014595B0DAA5005678C2C68EF0BAC45308858F61B60 +CBF43C842C83112A81F5F1DDFFE2100B3FF03417257446A3A81516A8B1465A8F +194E5B3289ECC2888CE70B7B6B63A5F8588F6E8CDB9C76BB7AD89A8C7F193F19 +8845FF21429622C31665F3EF102FAA92D413060A7DF9E1338F4AA98A5641E9FE +E02176BB8F75F75F90CF85731D84F32426264C4F4C0A58953CA3D817951FE0E8 +76FA5031C8C7D7B81D0957637C5947156240A42A9D8BBAD3B40ADFDC457BD16B +916633276982438C952D16EC1BB02EE6563A1CF852A2068733E0411F17BAA698 +AA7F0C06CB894BE37538D1F39A01F8EFAAF01154BA2378F7D3E70C4CAC11CAF4 +152FCAFE5602B9A85C8F39B5BE65E5549ED18F34310C476452696643C0B3EC07 +52596744098B56C35A53E3F6C9961DEB3B07D2BF14D8B4A4C2865D66322F2D69 +92DD062606919F7EC8FB133915F890C0483259E5188042913F09280340748C74 +9D3A7F46B33107DCCBA0CB8D52775074F22B47C9BEE182487366B94EF271072B +05B4CA7A05D0B1F2D425295A416CEB4C9DF5F558DC7A2FE51FB30F9C412433CC +179609ED14F61830B939710D2A7F1451262911D4793B19EF27A29E754092A7A0 +6B5D4D93DA04201EDD5E70834EB82F2F6029B9D8EF4CDDB612FC7DFDF2A66D7D +8596B22480AD301A41D11F38CFC9BA623D11D73036DBBA43241EBD14C19F74A2 +FF55FAF1408743D86399E6F16E329233BF53FB62EACD61AD019C784DF989D1BE +ACC83AC7C9333B2902951D4450746514893546460795B4A0B01986220C0D27B3 +655D2AFB92FBDDC8EB7EF69660CFF5BDA74DD278D3F8E0A89C0D7E04ECE76B13 +EB1B45011A494358AA47B957F061F8F77C2D4355D11526BB354C7C8D41409688 +29D076BDF1CEFA98C7820ABF4B921584C6580117366F0B4ECFD356C160F9D721 +3289771BC99F1F4E354D2149E31E2086DD0AC3E732F8C29D2722582C9FA5FBFE +82CFBE764EEFF153ECDF6D37875D759732B0C484A064D4FC40E6E39591754FC4 +6567554B7023E79AB4213B531E13AD9A3BF73230E76FF60B9996338D22DEF5B0 +0567E574ECA4274463763485A800EA21D5AEA2F0F5A39F08A1C9C1024D0DFD47 +226BCCC4E0FAB0D63648E218060C59B150A7B9B26C2A693480CFE79B0DB25DB4 +7D6C6AD5EFFD91488E33D71A0F71CA5BD57051F2FF81361A1D7A1E44D175C3B1 +4E69D21146622C0E57B9F3413ECB9C92D178C755DE8A28CDFF7BE669ED736BEA +C87BF7A6253D599E1B212D818C7EBE1572D154ABD99A458F1C9D7ED45189F105 +A1ADFDF7132FE1401A4AF8DB8906F47C35A38EF197D51F4E4761163677203DF1 +9E316FAD336626D7D13ACC366B2F9D012DCD490B34CB61EABC193ED88223A756 +E7A676CE44DAE8B17AED0D450F7C5B6C79BA10A143CEAFEF63FB37CA5A4EB062 +255E45F7E64E354E3EC9CCD1BB134B63DBBF65AE4866C44C01EC95162DC337AB +0DAD38C695A7E2A1151CB538B818D39A49DA36C2FDA737AA939A41186E272C34 +D0097ADDCBEF7883F73A7514CBCB7CD5CFB82A8A0F009ACB5D965228DE78AA73 +0276B568F352B471CFD12B2F95CDAD77897EAB87E2D7A477742D275150EDF7C5 +0B8BAE47646E392230ACF70F496722BCC5D299B87AA61990AD65945D28A5E4B6 +426AF16AD6867799CAE607149642EDF375910BC50F82A4E6828B4C3CB7DCA3B6 +5BBF80F2C026174465B84222CC24F39BB593392DE8FE5F2DD1D914386EF717FA +EC2F4D68F789C18F32D5734D0F4128BA97187EF71A14DDD226C2A7A951615071 +0C55A327F58376B030879AF444BC26452235CF18DA50AB8C1042EE01B5BA47A8 +1958E327C872E92ECE4306108C213C3D2063C323F261AB34EBE5C68D49357505 +E54698152BB44B140FCFAED8358E47F1C945EB228EB444EE5551245C52509647 +96BAD302442946A4A4D767C352BEA7E632186CE5F081E3E4AC0F8853F8D40288 +DF0F41ADB9D8687E7034856DF60FC042EB2E46AB3BB95600871793733D6C2B91 +852BE005026D679E53EBB535793727A01E543AC1AE1B91803318716B0E645ABE +16F0410016FCFBFBF83E14E178D51B2A571D7223616EA38DF7F04E3788CA54D6 +05F38159565EC1F747AEAD79F0905137002AA9AD103EE63324859D44FC30BDD8 +07060752F2DD51038F2D3C163306BB391CBD5647E0C28A8C987586733E581D38 +5CFCE67BB5C50954EEFDE4CE7A04AA4BDFE5E2BF4752E183CD1C621632A6AF2C +FFD75332DA70EB2B4B7BFC40B94BB96AC34CCB047F7F7ED8A27F52992267A47E +18FF3AE1015BDFF8F8C698F1C5C294E901741EEA720BD24F42F5B746D42F2551 +6A1C73C66DEED7CD4D4C4FBD671EDA12956EF0EF8384794FA2F33B09B479EDD9 +E12FD0E206689B9FC7331FFE21507073E8FF039C11AFEF9DF0B7A3FEC4C08C94 +014790E407C2CAF95A36438E18C8550D55B5124470CFEF7F2748BBA5D44332CD +C79C6562DB2D2962856701A74B37C9BA85CD441E9EC6938189E46EC43738F84D +49C114FECF37067503D5100B79BCABB83634B9E46AA2CB7E3CBADA3AB46274BA +04E0086D005AF1C940A599036C85C569CD7E77FAC13D34B293920122 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT9 +%!PS-AdobeFont-1.1: CMTT9 1.0 +%%CreationDate: 1991 Aug 20 16:46:24 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-6 -233 542 698}readonly def +/UniqueID 5000831 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E +2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279 +650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35 +F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A +D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E +F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1 +4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A +438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD +BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B +A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641 +AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74 +D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB +CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A +082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980 +9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0 +4BA1EBFAFDBEC531EA13DFBD6700E53818CE04D23886B8AE75DCC36BCD3189B1 +0D55FAE27D0D126E82AEF31D7B5DF27E58C30BB0867D6D7AC1DA9EFB8A2DF095 +B5B934A68EE122DA0A83B36C952431586B957990206194E89339048AA6EE4C53 +703763505ED57C494DD907D0EEA04F6B1D4C8F3BA778F4E7AA832AAB4D75F024 +61E91C6D25FD6823CB24FC863B57C0471CC9FEB22D97D74D9D68C3137ECA842F +01B3014812BA4A3232713DB44F320E99E558DA25AE9F6EA5CA26CAA5E321903A +689B2C0D84EDE3D7371BAC131B97ADA8FC1E9A8E33AFE737CEB6D9D424C43D83 +F8F89FFCADF713C971D8C16C9F402E8292DCA1AAD6507B55AED64B58C386AE71 +1898A8034AF47031B7B1B493336104D028739003FFA0EB6A74607B8327630B24 +C1121AAA68BCBF128B3E68E16E75892EC80221D2EA3F73D8497180E094DF63E5 +2BB6B13CE94E02AF6A0ABFFE06652E8F757447E50152C300A6660F6963731B26 +D0B154A80F2F0CD49F8259BCDF09ECC92D40A9C8EFCDA68035EA3492314DC20D +7AB384D5DF8C55D33A637E15BE0119E46385019CDA55262A52B17FE7525B14AC +1689997AF651710AAD0153A940C04858D2088A195B2451FF531FDE5CBC8DA689 +FAC1B0A5A6A88815BFEC5A0020ADB28093807E5F77C077F86A963D5C78286C90 +3AC85AE7092E03FF01407126BEF328D3F9912A34AB700D9A8FA0E381D24F1674 +4555D2CDF324D0B2910D092266C359C813F1A59E64EBF5C5DEB2F55662EE3051 +91507EF579D4B106C61A3BF41A69211EAC762864B8C9B5D25084BA07B0D303DF +9C35C116A381D891DFA54764E27C55DD38B83576186725D2DFC7229DF662E48A +627BD93E55DE9A7B0BCCCB04909D84DBA3CBA311B777693A8E677085688EFC8E +920C063FB8711FFE4C7A7F07FB7A00A2D39D79178FF438AEA36135A1E671E6C4 +FB38D7C5C0167FD7CE3DF1A2C34EC8F79E85766CD6E0AAA136700D3ADF43A2A8 +20B70130BD7E9D10A1DE05B1E1801456E4D31B3B9A26C6F2D83688B6D1ECC3DF +E8244A5C6BEC60CCFE1FD473FB7E2B08509673FB2B0828A8AD24B53E475445A9 +601FBBE47444903F41CE4101995AE4D9AC903154D4FE50C41581C46607AF76DB +8107BE0296BEC46349BB5D1BACE47C6D0D447B9D7DCA3EF11325108F1DA47DF4 +54E63928F0C5A0680F46F3A83F0C44C44905503D792E2F28FF622E380B660157 +D740508B5782BD278DE45FA2767E9188626AAF99BA99A20C1F0DB9AA508BA183 +85E5A5313BC28B5E7833DADB584123F67A9FC4B444340C58C3A253ADD1679775 +35C02DA8A7CA03468E3D4DC9E4B22EB012894632F1EF1164E756A2D2976776B5 +495E275DB7B98A7DA733BC2B9DF66F983C3A2DD663AF8CDB4FC577F1222C127D +1347179304799F29509201845F2D4EC9EFDD9D826BA8235DCB22F6E0B91C66EC +469F6CA3DEF47A612EF00522E439DD65396852EB4D2BE378F7CABD6B33A27E94 +504E957DB46A48C2228402333E38D454EA259D757A277309574E9E8A2ABCC75C +B47BC9867C09CB27A42B0AAC87F7E15D4A4F0EFE3095E3818CF493C6A2165787 +948321FFBB257B9FB66F57CBE24D9593326525A526AF178D11BE1A4BF8B3CF7D +BB089D49E4E571A357ACB341D5443D2040BBACDD3ED5AB589FAC38E15B849735 +458172E0238E4B8A6672B8328D1F96625EAF110EC280E31378A3E574532A4FB2 +D05ACADDA1E1E7BA140B4961BE966B7657A02873A8FCDF3109FE302E22007587 +EC499AC2C67A421AD8088E5118680A6B8CE517833425A49C5FDC6B65808A4857 +F1708AE151EAA278E0427A116E161F318B1F647C294558734A8AEC45C4922FB1 +2A4F4CB7E27E5BC2834595D6E94BD0410266876EFFFDD2E166F513CAD3E4CCFD +39A63211BB6BC7558B61567C887016984B0B438AC6FBD20EB1E62F2EABA88501 +6803647BEB836EBE67763D48EB702F88B00A0E6325D19A8A81951AC7B4B1F902 +4D30843B31EC9B4E54B7B03F8B08CE6025D0D648A00AF8F02A55DA7140ECCE3F +8D0862B647758E6DACE4987E7EFE21B1540445C483D01282BFB55328A35B9524 +E8973C067E3CA3188E75508B92691AA4830DA2C198EA3F4B1B262860D6DFDCA1 +0CA0B1A3FA9055C08CD3BC3EDABE170DC551B5FB0D572AF0E70FCACEE8C5DFC2 +899E8C829A47ABF998F455FB51A505AC2065B6471AEC9ECA69262B2661A92C69 +D079790211A7F4F282DAA98FC5204C574A71C23C268B230392710501C18C1E2B +5FB9DEDBF36E8116F378D5FCD99489A6B2FD443A0B2F7DC2CE882263E3E18BB9 +6EB8D58AF98A6675E173A178ADF2369ADB60F5AA821DB0668BAFDF8CBBC243DC +39073721E861714410979DE518E325DFF59D82DACE98505FF15A3B0174F620F9 +48BC344823BC5E22AD39E9C53E41A238A48E06AEA67387B50DE8287EB607205A +8379081519AF6215256BA2C863CB3E75C2F24D34E8C893537F6CEE6EA3E68E23 +59411AE55432CCC74D62E8AAF627262906CC8ADE1CCD2E57140176691B88724E +E9CA95C6B638516118EDF9C055A157447F917517ABDAA93E26287C209E6CB29F +A33703931045F85CE6559255EF992EFCC2E650C986BD0F8A9FD9CCDDF9900EAF +C55A40FC6989D1A3674360BDC396CFF420E15084291241BDE26AC0EC1F9A4C5F +64CF43AFEF81C3FACC5B523322B306CCC173E87E3D9780678820F6F392F808A1 +DC6D29319B630DB469180576BF8E4349EE9586229528A736D2F6A7E3C0168788 +6BE21388723F2FD5FEBC8F835C64B11956EFD5BDE88AB1C2C6359D64DCED8D02 +B0879BB507520EDFD7FA49986483D38DA759D8AF3C49BD1CCAB2B3D15D0C484C +5A55DB3F480D3C4E426C1AF34828D2A615E274E7F90F6032856B0C360FA88EC0 +0EF574487177B5638092261CC72EE47923F7ED93964E2602ECAFC61644C3A0D2 +C9BC3BFF232EE453C5048502E78DD301AAC88CE8C460F51378491E3BDE22BCFF +717A0708D7148BFE16F15D200F5F5E34499F16E75350913F102D9C29E75CBCF8 +CE5393D6D189583927141BDC31720B03E3D2893D0097729093371FD482BE7430 +A671027650CA381DDEE23D03F9D3359C270138EDBDC1965D350504279F08B7E4 +2E3B0EE9B8C571251196979E702B05A23A38AB022FC95041A73A62407E13DD5D +DDA7A0F5D37283D1B4C32E5251244653CB02C425F09AEC201D1D61F76AD5B8D5 +34CB63D3EBE97C6DA6B603FA14255E952354459598EAF65F40602A76EEA1B26D +247749A429CB3644EE33BCDFCF6C6036A2C517F50C92677A538AD4E19F885666 +C9908EDA5561E2E56A8842BFE80EA7917FC27C1D60A68626A6F0194CA7C1E749 +E1EE61D0450341633DB15C545569F893CBFCF1992A0184DFC89CB46E50E8C910 +E12E642949B807A95EA212C763A249194EAB78A37BEEB2DE6CB4EA238C071A42 +375D5CAA12DCF2D9295CF5E0D05D0E7B547367077893B10D9E8957CCAD78151D +FAF08A38C136EC4CB0F1A2924D9FC15192A2C24B6B1E9D508A8A239602C167FC +A2476CB609CF2BAF559140CB9199891D4C5163B9F8C5207D96A78DA7745A09FA +F3D1E55F6FB6A5472157BFF4A9439DAEA98587559E29DB34475A3CAFF79E8814 +3F85735A02208455F01196E6E5F20133CD08C7920FC8741E699143AA7C0E5B94 +12C504D56EE831187CAE53427201A4C2E58E422E5621BCF571FA2AD6458028BF +C1BDED62CE553C6140AB344C72DE39774969E87FF67C05550395F5A2780A09F2 +D3073A68AD8F774C39A503220C091401A2882921E498358E9A53EF58601B469E +FEB9CED8EF20CC17B144B908805D0A94449EBF433D85EF901C1B057B379AF26E +876BC3B30D188DA7C7DBA57F27F26CCC2727B095B601DBCE1283F1E5F9A7E448 +A5782DA29BA339BE01251AEEEAA977C6D037F4BA1B814D3A235FF0E156CEFF95 +F29728B74B63D9F6D4A42E4C86B1C51F66B41DA4EB10D3535BBAC842B3E13463 +7D21ED5371F12F60DCAFFAB7E7BC33E8F414ACE4BCC4E1F11286C1CA7C7C45B6 +A66CA4F330648CAA607815D0E591E4A8D8413F62DF443FC5FBD1AFAACFDD3C64 +2849895138028254C63ED777917DCCDEE9A2861CF201B42C6FDBA23EB58FAEBC +28D7E7F345BEC19711B722F42D94916A2F8390979846D1E2AA1C696DDEAD377F +65C36152436D0BD7480CC2F4C260D4AA5EE5A0913B9CAB88BEDEE30C8C867B36 +F40DA082AE27813721CC1DD529A52A8787C99699FE4FB5040A5C8D125EC010DE +7DCCE118658632B448B73E0C79CC41FBEBA02C6E6E3F7FDE200CD5C94F695A1C +4B43B475A2CEEAF902C22F6E9BFCDB11DB438241BBBBFAEB0EAFCA995C5668AB +E166D344DCAACDE6D2164568019CF39CA33B5BF185B14516DFD11783303A6B39 +AD9A706595F5A506671A15BBFCC0FEF6BA2D0D14A8BF56C2032E7D896A1C917C +86B24C103732B6F5B2BE5E1E03864755544FCBBC7BB8840000505F2FF07A11AF +89A633830544CCF02FAEA5CCC3E5796CC37D3AEFAD3A4B7DA8691DE19C7CC4C6 +7D7D646E6ADDE332F988342E6A312A935648750D78744621CBEF5D20E5151B25 +AA0CDBB5C4C2FDB279651FE7F0E186C77A13FC9B507971484953EF3BFCC92490 +FB4D512D3C90E98934A1A11B2975A44B936C0BADB1711E7FF03FA8B004C73E6B +166F4EC107A3B52BA0E2F56A61BE0C5C1C8CED05F2BCED3F1B213979B90F92FC +EE6D471255075953D20D88619C930F4D60F0A67616091472F28906 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMSY9 +%!PS-AdobeFont-1.1: CMSY9 1.0 +%%CreationDate: 1991 Aug 15 07:22:27 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-30 -958 1146 777}readonly def +/UniqueID 5000819 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC +65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380 +D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C +77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA +15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F +491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F +1A06C514D91C4C937D4E642503392B1CD1BDEC3ACE767A10DBB8285F5EBC6CC1 +AEDFCF3EE7B10512E068EC1C2647FE0C9CD111FBB93B73EEEBF10FEC098ABDC7 +5D495AFB4A8CC66F9C70BEADB84143DBE7E440326556099D2B25A815FB2043CD +C7FD7D8FF33C3EF38924FD112A2DE79C9676062A36317173DC5187DA094BC8EC +01887AC6E35B2C55101152B8A557AD2D45E3EFFB6CA25D88B9F7F1D4E6A3BA50 +9FD5C07C244F14215ED37A8874A28ACCAFDA6EB011D399B502870285978D1A5F +B8D15AAFA43FA59E679214C87A737B0E5E80B25A6D00760801D0DE56A2978496 +A35CB0AC62CAB1F5D1C322FF78DED4073E49651394F9CBB8E2FE079244654CB5 +FBD472C2E89C3E03C9408754E838E292ACFBC43472010FFE4F3F74E0637F52EA +DE71C95CC934F6C9BFDDFC95C588A929DEA13460A8977F220AB1140B459FAAEB +AF908F073050F759E5DFADB5F8EAB5B0E423475133C790D1A00235DEFED09572 +4C1B2470EA21AB475B89372A9494E7605205319CE52E3C1F9ECFA101076CE4A7 +80C33F1CFF0BE6361B2A4788BC74697A83D8A78970F2B4EE92053C4E39CCC624 +391DD58E253FA9F80B946DD257D0EFCCFCB65D77CA4D13BE44C2BDFD5324CB92 +2E9B6737E5D23122908274A542F46EBA4DF88BF17B10C10FE8BD1C1B2DD95627 +B77AC6EFF0DE0BA54A32895E999E0350678F2D87FE97B8529E30ECE578214CEB +37E258026C62741436850346A29852E91611F9CB9155F18AA1154E54683C07BD +ADA1D34E3294D9F094ED3D042FD7AE57F8ED014B61681D07DA7A673E127DE52D +619815D89AF545D74C9906AF9C55AB152A20A7867C5383D32499F868A888B0E0 +9DAF577180995588B42092AF47F3866AF1DFB9983A97CDEE568C38047F2617E8 +4CDADE44797F87318B398AF42E7AB331078F1926AD192389C1A3F79A578887A6 +BCAC4FCEC309F7B2B8A84B85EB602B83FA42A4564BBB4392718C3CC1C439FBDA +793A247590970419E3F5B2B35FC60BA737774C4AFBBA41C4545F3F609037BA6D +DB40DA3FFB5AF515AD1C9666C382EB11B3685B631800C61AE67AC8380CF10FF8 +0AA111D6D22803B793C25A57634DD94B5EC8DDAB76046674B7185CF8A2AFC39F +E6509B3E6BC73ADBFE67B8C0D1593C8FD87074ABA5F0A23359637A6FF8868F42 +1329698A92A9F47AD10E559546903FCF2C683C4C4D611C3F66765FFD48050368 +72F1C2C3B3141BCECCC860FCED11ADC693B6FDDD1E6FCF84923457F7D3781ADD +76F5BFE9CE7C08FD1D773F2581404A4A86D4642D5410A198F2CA42D2E01607BC +759DCE23A1D05877C0DCF4091D5BC52330295579D6D6EDA63F864048569B8D66 +D194625D58062079C47327A78D3E1FC9DC9D8A44496E3777BEF937326FAC3866 +64ED4D0500D99125E97A0DA3E75FC8CB0587F8AA5FAA1623702579E21E53FD4F +EA3393CD34B07D1714A3A3E1E58E392D17EC685186886C35DA5501118A7241B8 +932185F168E825DC774427D6863DBDC5111455131CDC11CEC517CDC41C0A5304 +D5C18DD6AF3ED443869CC51A340544AB4F205ECE28B4A836714916A960C41D4A +8837A72E2CC6205416675839ED07C70325344E89EC13C8AF666BD63B61511AF4 +5DD3DBD96E02F5D9D4C23DB3BEBC41876387242C33733AF63D65D5D28419A3B7 +49BA903A3A9694190D5DB211292774328DC366CBA490A82F09F3BB6C79E5DF34 +17BDF6885F475F24BEB83213C086F517CB0B04ACEC7E5C7DDBB5693A4CC5EE24 +AB555C0F0A419E996B71A8182C7B087631F6AC798437F238B2C99BDC7E85779E +DEE1BAFB95BBD988C8DBBFD50D3D122F782CFF5A7AE88933F98DB96E8D5335E4 +AB284462546FDAEC91BE55CC605DBF6C862F40E53DB31312E45E9EEEAE204CB6 +9322A67325206BB9BB9AE4316E9E2D634DF2291A33ECDEDF9516BD657138E069 +4F9CB0AC0B2C81AD2A011547063B5F33E815BCBBB1C8E67ED61CE53F5E1140BC +D09FADFEF42CEA0D8505B0E8A33F25D8DDA9C0BD37B25FDFC44303349A413A6E +C7D5602DAB0A59097646B1274CA0F3674E483A060342735CCAE91CCA22CB4139 +C399DE4C6802411F91D4B94567A8254E6D08163B9AA2B718A38E16EB9B7223B6 +67CB41A005F7A957258B203CFB243CA78158C15DD23AF8D44EBD1F8F4A330C74 +407DB88CB26BD874FF439F67246ADA0AC33AC7D191807FC9A38D85C1E362F12A +C6D191188DC62EF358FADDA3DDEC9F2871C385248BF1B128CEC1DFEBF4085415 +D1EADFCAF50F7678B2B39729650FBDA3867D96C9CB0F9A8566EDD84C51F844FD +810287E609D9C7170871788520959801C5315F46501CA543899B889634760D20 +9DD5108448D7587C74BD02EDE88750BE21D6B93D8F1C5375BC1E9BADBBF3D667 +C752968E81991561AC6D3C56B2A7C93A853398C4BBE15B16A19537CBEA0C8CB2 +26FE4CA714E6936512E549B9F6450FFE09627AD5471A9FF0A5F64363DA7A89A0 +D91A59FA098D1D7E60768D256AF0D1F7CE0F07185C04ED1ED6CFA69E4C4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR9 +%!PS-AdobeFont-1.1: CMR9 1.0 +%%CreationDate: 1991 Aug 20 16:39:59 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR9) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR9 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-39 -250 1036 750}readonly def +/UniqueID 5000792 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 +92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 +3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 +046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E +C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A +A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 +A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D +731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B +09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 +49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B +5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B +54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C +C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F +11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AC46268691C741B2D4 +48A840F1128D9B2F9CF07D0709FE796B23A836417BF7B5B12D67F74453C82F5F +25F7B30701D6F6D4F4DC623C0C27D6A6FBECC7312A3CD10932FC7C10851C3C52 +24B75DEA8A648B7F34F5711DB0E843C914E25663C510185BC37BDB7593C1C259 +21D8DDAD33982C336BF272BAB2F48E68217403FE9F54877B243614A87E64784D +2796EE4179FBF96123D1BEE3EF89D682B427BA4F12A1318A57F18BE5DD903815 +26191C72DEA47514220D23859E20A186A7EE791E60B1671A293C5D5FCE91064E +BCEA9EB0BFF478261EEDD7601309782B9F9C0B84DD78706262721E56FFBF64BB +A1EE5189438A36119055DAA1D509136D5A00DAD8BB0827D6A8F40E264BE338FC +80D39D8DF9060D82E8C8700DFF48B0AAF9BD6C70362164CC0772E390D6EB1B07 +493E17FDF7F64D57ADAED12CA20AF2D803A185898E4709AE584F412451BF72BE +B9821F2124B0BA27E4603EA6110547C3B65C5945EA007FF01723A59E3F9B1468 +2D8DFB922499D39F7CC7C9241BE759176F948D4BEE933ABAC2381D4D721211C9 +CD240E4A102A02B1DDED5BA476E887B9B2BFE4DDCFB5AD83CA65209CD5D30437 +74BFF7EF09E1A95CDD3E414535592B878EB6356A4F3B6298606EED4BBC65CA25 +72F8D897492DE20D27F8A97A6767AC9A373E4E54445C775FED40E6356F00EAE6 +A2B12AC114FF430082B64A540C07B396A7CB4ED5CCBBD32F21E4D8EFDCE1E538 +37D672E6943908715B7E5842EB69412A3009A7EC6977E9D42C2087E37A4829CC +59450164B05AAFF60A47FE5EF9B83E867F7A94203B34E20414525B1C7D3F89FC +A343972928E58B54F3FD4B1118BE7B17A3D5D2D73C47CA6310DD0A183DE475AA +D1A6374AA5951993E7BF723CF6EE70BA049F955E0A24526D491F1DB841A21CE4 +6D72A98E19A782FC5F5FBE178517992A5DACDA8A3CFA1BC59781A91BB48DE2FC +EAFE8C5A4AC55D29CA819477EE772B7E838059522A950A3C1DBCC422ACCF894A +7997C4EEEAFB2C8D0866524244155BB2AE9CA688FF115B8276A931B7318D53B3 +E30E92ACB720CCA8D4E8F6E2AE6F19FF83F5AC939CFE8A8FED28568E167480CA +07C4EDD53791B4EB1B24440AA1BD22C9A9B21BB6AD13FA4B92AC37495C9BEFD2 +87D03DC1E44F03E37438578DFEB856D3712544DB23CB8E3CE1FEDC61BDD727E5 +8D70A8F07B5A105D9532D7A28343C726D8562D4D1DEAC77C5A757070FF8793DD +6CC888089E1640313FF14BE6C9F20FD56037FA69FDF7895CA0AAFDA22F63AD3A +9A6CE7294DCAE2D731A129B185CCC47CBCC30017B9233A2A9D0AAADAB8384806 +749C741AC8C3A6CB7A3098B5E73506637121129502A5CA050DEC43B822A2E5AC +C30DCCDEA765580C1F6FA8CB9AE217BA5700DD16377C9E0E7BE3704BE745F1CB +7F33C8829D56628E4816B2C4CC6C5F603BAF4FB15119CB7D76FE08EB4429D39D +29973BD0E76EC5A3E89A6822201411BA7988729498AF98E948DD0CF06FACF7D9 +BF874D1DB00008490739C9B13B29EABF8F41A3B569AB8EF09A7DEBBA75789C56 +7DAC4E4B63DD0307653A3FBAC8CC1E2CB6E9D9B727B46CFCE57FEDD71AAF4A02 +C700CCA623726B04CAD85414EB22801FBA3A067A6C9F118BD4C5BC72B002ABB2 +1D94D81D0B14402EA15762DAE23B711FAF209666DDDF5971AD03741A027C1C45 +0E45F9CA6C2D651F1D37F11B7E26D9BC11C1784D04D39E642AA9C0977D443E12 +686B44F7D742B708BEF8C79CB58BC5BB6AC0B077AB7B0BF7E43075D90EFFE739 +79A225E6784AA0269112C4081A520E9EA15212E5F5AD59D1390D1EE66C18D43F +47863A575BA4F282B9B7326C3DE15E8002D7584DA921B2CCCC2C1290C473B286 +566AC94BE08AE6A91289141AEE40E76A7244B0AB75EFE18D3D030C5D5987EC19 +7F628208E1B8F32B2B9E2CE699913315FFD5C2979A6DF57DFC25A426D58951C6 +38ABDED04F33CD5647947B06F26DC9A515E73ACF49C78934C264F142295D141B +862EE8D4C88CB9027C3A3440A2621CFB684ACC47AD148D0876787A991B488816 +62877D7C5B0B548A37DDED844FC2865FD25359C03247DE45E10CC5F4B4D43155 +376D6AFC66B1CB1078E809A44AD41CAC363780BEA157C43046612F5E942AD5BA +CDD63689D13B55EDEF8736D68064672F6C4CFBD8447F7D610A50DAEBFC091D18 +2A28547982617FF21F233852BD7FB12D58A37A0FCAB00A770032CE0DCD3F8D3B +2192B5453F75A43D56610F9F35DFC584B53B6797201FDE2D0E3D5510F78425C9 +0DF6E4183CDD211468A7944F1198DA60EB8C12F98F71F270D6825DB4E5FDA532 +F1D1C552B092ACBA970E8764F8B0406D52A21076A2434A4492E9963AA915E08A +45C78D3E3154FBDF38FF4865B401C82C53D523C1BCA0F2DB3531DE12F0E5ADEA +F83690390764F38B9A247752DDE160C412292C2BC0FE7441CA23FAE402005638 +62E3758988C0DA953894ECBA17356E2BF0EA972BB347A6085081A5963F1E830E +8680BADD9478E1B21AD5CFE45D85EC00376D74798875574F1101559A944FF2CA +A91F3EEE1B0A7F92FB6E8819FC4436825B8C202F448305910EE717C63AE24088 +644CEC64A253C526663062A8AF5F08A1F9E7665E426BE1E34936D110FBC23DC0 +FBCE266736774BF018BAE3BFBE5B442C2F31FE1A102023DADF3FD13D611A48CA +426E9822710F3209B71BA79142AD34D263E44953A4AF35EF1AA3AE6FEFA56F75 +C6439CB64E9EE6D0EA4310A3BF50EF866240E2D343B0DCE2CB6EF721744554A2 +0A53980C0AF9E3C99C0C3A160F846CE55335929564C76A58D1622C47FB1C7C27 +4E7167CA1AD66EABB3EE9F44D0B479DC8E4E38C64438C355B727156F3052682B +5BCA9ABA7FC82E46472585CB643095C9797404C8D6FCF64A0FBD1F3C2FBBEC69 +E5975FEF1CEF76040111C2C26EC6E753ECDADA43D73B06DE583D68F991519F03 +9ED0179A6355BE6BE5FAE4BA6389BAE9C83BD71612810C0378D6A5399C9C0D27 +5C88A642E2C2FE6FE665FFDB58633D2D3429ACF75F71DF124CB55084E36017AB +2C26D489587363A71145B99F244435B7B743C0275AE632E2911F27FCD626E8B9 +6E5FE4D12DDA558D4D52CD45C1F3BDF3BC377C7D31D3B0750633AF68D91EDF64 +3B430C246A7DC76967099BB39F0F98DEC0FC4548C7CD8FDBE428982E74916F73 +75F576EA99E922916AF3AC31C9D0F4B329529ECCE01D3B344846DD193954E5F7 +288DAB43F2F6AA85C83C30136C8C85329716279A3F80ABFB9AEF8B3039EAFE25 +973E7F5B785123B7EE7BE69FED69AA0D66A5B97E40026AD913119B673A642DCA +BA6581F9937A1066304894C42C96F6C97662AF85AECCA1D201E6198D65CF9C15 +241C42973CFC7C8D77DED663E08DD3F9A22FD78246FB72ADB07EC2389F8FB65D +A56BEA777021BA389FC9C64BEC0204ADE954412F82BD35F3F619BF39A809E3CD +35C8C875BB9387216FADF19B027AA84B8BFBD453D89BED8747604DBE8B1985C0 +6AA8A47A3372800FA7DD8BFA6C71CBE578B03C604164EEFE875CE7E6AB256112 +FDD6529D2EE61AFACE973EFFD815C97BEDDFCCBA6AFB59DCEB4FEF51A9105F40 +B05671D263A75D8961A3D524EAEF4ADA3C01C8D9ADC20DB979E993EC83936F45 +A48B44C65D6BA2602A09F56CA3B2E539DD8FADEC6056311B6379AAEA362FBEC5 +C1807019450A23DC07C2856616AA58DB290E89B297C3FBFB23A2FE79D28E0BD3 +DC152026DCC0A649BA7E64CEDBA1F73DBC32D2EA018205863D3AE28C566487B9 +B5AFA5E267396B33E46AD3D1485B77E3D989D7A14DA73A38311861ACE06E7962 +57CD879D38E52FB17AB005055A700777459A66E16075B8F8640C93A8457EBE36 +A8B3F03D1760A61C9E6BB72B87D4CE71DBDBC454C358DFE9D634FEDD54B9666D +CAC47106850E5F7F8C145519B039F9C50A9842E480CA7E0372577819CFD28B14 +0E4741775245D2B424EA401652775671729FFED5122137BD7338C455A071648B +EBE3720E87381BC9CD2DE7A218A12D26C6D7DC0C8C979E6E75E0EFA5CE84E7BA +7C8A7ABFC7857BAA5B2325F9F84028A08C9374B1021C02D9BD9903DEC00B19B0 +2B0733B6984699BC5DD7A58345C050DADE4DD3B2929070989373920CD533FAFF +C6C892DAD202E96D238132E26EBABC21D57BD8F8366FFA7B86F4B5A995EAA930 +3B8F709D418012FDC7293B18568BF0A89BAFAD4409AAB94FCCF93B8EC34FD4C9 +F504F4EE952E55015865B1BF79F9788638BC8AA0093356352B2A52911287AE5E +F5ABB8307274C4416109CC8C8C82456E62F9CD401D555D4BD63790884EE1BDCA +492568ACDA35509F9778AEB41D190456344B36BCF4D638A3EDCD0FE4428D767F +161FBD2831EF30E691E75A9CFB1B41818BC4B87B68A069168057423036B1688B +F1985EF708E0ABF1BED910B4357128723722EC56EB40EE529E11FE1A564D0922 +CD9F3894732FD00DA88537BEBBB75B670764BA1F6C858BBA314183C68A8B345D +510DC21293E91EE1FED2E59029FBE1708FADFAED8FA5D254911A600F218B24A8 +594357CA5E36831857B3882FF49C8EB81103A7160530800CCA6F2220B3AA83C9 +BF8E1D406CDCC9D1CC1E3533D420A77A1BEB80CF3636AD44266EA7F5124B049A +283DF23D8C6133CA2B437537138CC26ADB1903410A5367B8C81727F15F2BBAEB +82046768AB05C85F8DCB6189862C075A8158DCD92723ADE9C08C19DEA25E933D +8B9A57FCCD0E3CA9F19E45C3060CEF001C0E9BED798278733E52D7BD773D702C +4FA9EBD1FCA080CB3A13FC35D414CC7E8228F69696F74FE087D0A0E843558265 +35B3466BF825B237A9819C5E77B24931815EFB347348A3ECF37E853E7D059209 +F076382A8D766ECCFE4374B05CD2B20582353BB18BBA42E9B04C4EF6106207C9 +87B56DBC1BE72E0079FA02F151F35A974E260DED4978E208E492DC97AB3E7C62 +19FFDAB9188F5DB40E6DC9013E0DD19C7FFC86F37FD0179ED91BC2A33E496B2D +8B40170A41EBD0AF91FCAB240B3F8C12E68F9F4CFCB90550655B77F312E92872 +D835730145D73C2380B271447627FB90B4D873C9D81857F7674915024A1683DB +D661A1CC56D49F6E5773DBFF963F407B5EFF2A2543697F475AD9146A5D8DF345 +2C4065B563D9FB12BA853D0F93A46E13DDA588454306AB9983549B519ECBD44D +A452204D35C24F5410230A51089F8183884B28064504459B83D7367E59D9B769 +950454BFE898FC8FFA359261F6BA8427D6A3832AF972BDBDA65479477F441BBA +4EBA0E626641F7540336A108231C56129B0268BFA095798AE8C344B08DCA4E4C +5DF6EF71368A9CBD9E81590EA3591D21977355781501F64062D295F0696B4575 +F2FE01C74629B5BB60A588B2A508605D1E9F554E5EA3601BFF2BB81C97E99575 +423FFF977923775980FC2FB2CEB63333C9F60E62636F95A4005172B2F92674A5 +09EA0A773C046717E35DEF00EE7F4DE0BFC2BD1CAD1F00F49E0228268347EFD2 +ED9812D9C2994D92464446C00B80B90E5DEC5F4E9B30665544C5A527F7506082 +6D03B1C4E33DC7B398258AF95F6FEAEFEFDF63AD4769478A72CF8D93039C6BE4 +BF0E83324B758F26939A1381B44DBAB535DB2C51601C7DE4CC33B2A83D8BD5CF +21C9A334400BDAD74EEC4E029CECFF0D5A8EF1FFEE3FD15F7B53DB2195C42AB2 +6A4F6441731BD5FE2F51341AAF4F5CF280CF4C96DD7C97F5472B60CB30F15159 +FAA4A16E941CB45F05D1B45BD15AC7EF9A97E837902EDE1503DD587678E37EA0 +D5345CAFA77DC7E3D437759B8F00D6ED018889CB2109A2CCD2361969C2716146 +B5D5166C849B2B6937DF9DE38F8439462B63EF3893FB1393AED1A25C08B409BA +0FAB0C73D34FDA3310B0839F0635C05D451B89A39895DC9B239921148D5FC149 +CE4F2B23A1D294D3129A87D47A3D2A8BC4CE8C4D27C495568CE52B1DE8EE5B38 +8508A72097034587491A551D562587BC82FE2A864BA42AEA4F66E9459BEB9027 +B47F4D9A6EB20F032037E8992326115BD3DF419D6669FB4EE075BE5DE7AE09AC +0E51FCEF3516499BB2F95403E918AD479473921A46D648C8F7C756DCBA674510 +34AA13E45FA5DEACE407CEF94B01A42C556AB811EFC7D4DEA581A019D2C06C42 +18DB92A5E94A728FE61565FE825DA5F7BB88227D1CF5F577560AE6A4B36A92C6 +23497775896A472272E651773E4E5955EE6BC1EA8CDBE987279EC7EC2A5D633E +73892F2C576637AFC15F0F3E5FDBFF9B68731D3A9FE3107AF3860E3A80D8133F +4851FC996B9AA54D0AFA7D6BDEAFD81206BCE8DEE8F2A0E9EFD5BA4CE01FEA40 +48CAA82B8CD894EAF7DE1CF1E68B9DCB16821489AE44447FE6521662E051E22E +792149E3EE3E75509ADA59EF35AE1DB8A1BB1C04E3C8ECCCA1C0BC5A24CF356C +3079B2FF45C6CFABCFDC6DA0177B3D1B2C96D8A7B5D1681867438BE593592B8A +64AB9899100258DDE80A7F82A7B29E40221AB1F933579A4D9159880176CAB6BF +D1641DDAFC3E512BDEA139E15914ACA2746CC890435FCB98549005BB382A54C3 +66D5EEF83338B0BCC03C3F0C1426B0CB2D180F1349CA79C642264BFB04A9C315 +04EA4DAE1435AD805621AC4EE58AA768CFEDE17F7786C9C43A7A11C16F1F864C +FBB80A2B134609075D4A6676F1CAC147050EC680DD96D156DB4470F4ECFDA645 +F18116BB189AB0942C67A254F8E7BEE0B70CBD43E65A402A30248E2FE5B8FBC1 +95FD81172CCF469BFFD305C6055B8B1A6DB9A6D285797EC58315246BCBD8890D +BF11A926CE92271B782C78103D01867EDA935877972BA80B3B568D0CF5E6421A +A0F1734E01B194ADCE54FBFE2A0C8413C21FFE48E87BB6E218FD727C212A1EF8 +BEFE2D4A4E4E690F85A78B1BBABC88E5028F7FBD119DBBF224E05152FD8BCF6A +C9E06B50EAECE709F88715BFDB9D8B16F70BE07D707C22F096EB43887F0A4A8B +E0DD51FA1CA98409AE66E2582429C9CAF12606318A19AF10023B64D90A7E0304 +3DDD0BB738C6FB39C8987D2F1BBF4CA2A930E838174426A0E33D50779685C670 +717A5701450317DB9A1BFDDE56D032C264EDD55F31401032C272984358F86059 +1F6447A29F2FAB6F44DDC7E14CDDB0CFCBC1F6941CB4403E5E90518D24740496 +20BB4FEBCD7C7DB307FD559B7167C01EB3D2189B079F99DB9073541C69F86934 +93362B66B4E298F475F067B6427D327DDC996E6FC27FD513C4DDA03837794A1E +A9E63101B19B5E0BC5E1D5A0E28A223FECACC2E79C226FB191BBFB5759C14C05 +FC60DD04AA7400D1ADFF88C619D5C7ED4613EE00F5D45D05F83A64232F8AFB04 +DC1F256C18A15415BA04E85321CAB278BBC72FCD36B32BC70B58D865C75C86CF +EE161325492DF6B943C964F7E38CA3E25A4C6CB5FBCC81E2EB759720622CDEFE +1D8A3C16899B334831CF8E1C5190F0BB64C99D0159E38389E477AF11FFCC11A7 +4E1CB0DD0A128F177386DBDCD42295ABD0A4B586B9AEA32BB1C556387378EFBD +363E6C495C86225C6D49E623CD95CDF45174622BAAAF8902B3A5A3259EDC41AA +32A380C3DF08621DE8DB5F322FC0AC6389468C1A257AD45948923498C785407B +7475E2C9444C8A3E00F205DD1B4BAC255CD03D9EC7800CEE524F25A5C7A80508 +42D7C09BEE4350CE4A58205D797352FFD3ED91C8A9945C8AEB8DC75D63648BCE +D3490B25542295AFC850BD692FE04B2D1602A0992E313BEF49B4700615182941 +83C072D69CD4B56B91D49C4F128B2A48AB9F4014478CDFE0AF440D27C293DC80 +596438EF38BC78B88B63E582BDDF1D19B09FC82C1379F519881CB6AAB42E082A +3AC491B05A709A68AE808602B4FBCD385B26C342338A56523DEF3C1C6B624E56 +7824843D037FC221B4FF3F3A8ECD441DBF285EC5EEA94430D1832AA4CA6FE09A +35CEB0F8B9D811CAA57C8A512C45F057683269F7C1A7C4875B945B8C36ED549F +A5E05717E99DFA20FB3F8A9906F32248C34C734C1F2A56DC2DB5807E0F541D8C +103FD9FCDC4EAB3B0F097978F2B678D3D49D4DA91F93248E10002E57854A5DDF +21AE4453B5792C003E083E8AF877D4F0AEDFCC4429C2D8AB632BCBF030C774EE +64AAF785D6BBE8A3E68C62D82518D1C94C8FA272442D22BAB0F26F1A59F81B69 +D823B55F5A1DB4E2122022294CAB3D6C0B154D3F8775F5B9FC455646AFF2292F +D135F55296ABADA9CB8F484A7C0AE8E8F7F58632884728EA4829659EDBC89675 +B5FECFEFFFEFA18E1DAFB0768BE713EF839995A220AEBF2AC92E363D94B7062F +EF931E5AFDE6538591B0C08E5DCB3B6F7C2627042A1A0ECE84EE8F173BEFEBD7 +A9E1A1539A6AAC92D0822CC5C0C547C46BF9B2BB5F7A90D38DCB019B78A6694D +417652EC6B7F974CDA4792A674813E688C70DFB6302F64FA96F4C57970088D05 +4314EA028EF54013FB629B111FC013EDDBB26745E9FD038CBD7A0B0E1FDE3EA2 +0A5409CE172F1352414A6116D880734902B1920BED0D136EC2BC11B89D8C40F5 +0CE96AA878E4789003C7B5EBE0BEAB9351154532C2914F3425A8670625BFB065 +3C3C5616A64FA233F723D46A69E540F9C5CF0AC5AB3136EDFB261ED4C232EAF0 +844208FBFE2439BBCC6FCA8BF4C201288DB5C9C45A5203CE6DE9D411462E8627 +DF3F50FC24C5FFA7FC5103F43DA056366D9ABAC0FB4F8BD6AC508E9AA6C31833 +764EBB0C764C74ED7799EA5D03EA554C69A5F1C55A70E7D0AB2710475F7C56CF +93D22B1CD8623A17056B174752AEE528E55170199092EE774371A2E6E940A08F +BCF99C22CDC3B11DF30CB51E413D8F1519BABF63521FD56605006037CCB4CFD2 +C41ABD12B28D81E62CCA2C52078B8E2688958912BDC0323FDDF02FAA6DC545F8 +762DDEB51FC01064C19FC2E7AEAF3F1CD7C056540346B69A8406F42408A4F634 +98131B9F662D85A52FB4B07925A5E18DF9161271D72E58E4B308AC2A498D8231 +03572CAF2DFFFEBD22BD4B90618F9E0A9EE2C5B0A09DB6A0651BDE3341BC410E +D7748C7FF02E6595DA0A42627CF7D84A89FE584E5279405B64E0480E2CB5866F +4366169779B3D1B65C08B232EF28D291E3536D03E7D33C83F0D959C7D79106BF +726EF9F9E722654D70BF6F547413A2212A2553132135F1F38632277001309ADA +BE024DB6DD26850CB5A3FF2BE3F7D29A0F55E6297CE1A96653F41E9C7B714452 +0AA1A435D7962BF91A2EC00E159B96C4C9E663E83E43227167DFD731BA675320 +497B3450E0CB4EC4A77479A071664A7AB42F58861190EBE1BDF9C2D8F105A7E1 +C8B13A1A84FC597C3815A273F52D16648E921BAB91FEEBAE0E4032EE2291A21C +B8979B58229CD27439A671FB542D347E26BEB0754984BC7AE7DB7B95388DB8D9 +CA3BCF79A5A4574D3551DFA53039D1A791629B36E35CF8806FA4A66884644F60 +EC67AE95F49FD035770D8780BB42DEBDBEA7D0D1FE121060CC42CF88B2456A39 +18884A8400FB0DD52ECDF005EB69A2E08F70236D6F7D6DE316998FE19F866E0C +BD6267ACB77158558D364033258F6E4339346E37932AC5610C3F65DACDA63C35 +21E9D3D173299FC94D91AA24F135A421E1857DE62095C909BAD7FEEC2D5E6DCE +03F91C1D348E39D8AAFBA39D3DD4A0ABF9D1E6DD988FCC0A5E8E8D14F397B5C8 +F736E9697101CC555C57D072BAF424FAF5AD54244F17D2AC3D13FF8575E029DD +4E94543300D3AE6BB5C8B4E912AD75CE396944C5E0AF941C64DB80887FC9370D +52273F11EF3C5D906F5B0EB61C3817E002839C0DB356F314FEDE1FFD7A3C0B43 +60955A74B77838B0DD408ABA153612C59450A7280BDA427EB313CA73223DB772 +5BBC4F3A84377E04DE37ECA2F73190BAAFC9496437B4900A99826B7912B1554D +F8BA46464CDE70BC4BE0BEA72D6676A3EDBFC16448184CD8962A84DE9759B77A +C4B543BBC7974FEE02A819E9E09BE9FD4E6F5EA27C8D35EB4A8D719CCE4462CA +D70FF8B07F7A873BD4F33285E26914B00D23E3A99B393394230EFD836B28D91A +DCA84B361EE4B8F0B0957889DE770AAA1D3CA9AD9DB950B3B4DCDEDB1EC5AA6D +EE2B274DD66449CA89C05EB43CBDE9033C3DB8D0FF9A86D62C7500E1D87CA71E +F0B443237D5DBACAF84A3CE93243E0A85277AE3BD002C010DCBEC3BC676FDB1E +D3E7E249E2045DB50A35C7AA64CC11F6A10EA9AE519FBB3DB9624D5A3F3042C2 +73A8CB48667D2036E8925F46F17F2180C8D4E251F9006795CF4FA5E9C01C66F2 +5C2E48B077685C6AAC676770D8C0FC496077DCD82EBE27A62E842347DD50053D +ABFA8BB0826B7934262E624BFD3C7E4E8E8558E2DBE3485CFF902770CEE40555 +1F4D736B8DE0832401B1994A5A4F366155E700E596C90645803EF1BB796CABAC +570D03219220F960C93F71CE39346B824B3515EBB427F60123D2EACF6E0A2B8E +B727D66BE4AD6A64EFD56A6B99B6D26C153E5F87B7A1132AC03A4AAA9D249166 +9DB8CBF7702FD445465329B11F8DF87FA561ABC487185FCE7B4311EE0CC75DB7 +E12941AFB33138B204E85AE8CB4072C6D12135036D7D309D79AE0BE3C361C9A0 +90CD8BFCECE8DB37033DD8FAC1351A5D631F1FE375DDA96099832FFCD38A0C75 +DB20BADFBB3163AA92F454B57DBA415181ADFF621EF2C03EAD917CBDE320E508 +DD4E20B0C127E7CA2A5D4F1CF3275877A664F82B1FD89E3B3571E421E028E379 +B0D6AA3F371766E1ED3496931CD0BEA570EE0CFA7FCB18CE9280CDC353B6C0C1 +FC1D7B65D3235C1CA6F888A338D344F43BE1C7747107FDDAA221ADB863059419 +D4707996FEEC7FE188C566A1FBF5CB4B76FB9EF6D22DAB55AB0E1AA69CDCEAF1 +BB9C1B4A86CF96F4CD90BDFECAE059D0969452CDF87C00DE2D314296F2237653 +B5E851FBADEA42B68D86768EC2367D2955B64E19CDE30553A05EB5EB62096840 +012DBE282ED6345D0E7185CA9E2172759BBC4D9DDA65A9AE9535335189D93D32 +23BEAA9FBFA16BA3CF75BF09931B1E486DC4E3732C6CDAA7C813F828DAF18C30 +D380E4478A5BBF4C4DF8A40C3176AEAA9544C7A398586AAC5AEA5289D2C40D46 +631B4737BFF4698D9CBB59A3B2E67F95B5D768E86E4CFD1E3B8582069F25AD69 +BA51815E3F4190E10D3A84D14C40DCEC5ADCCE5F1755B878C46A45E8241FEF77 +35D48F11037A7BF7061941CDA977CBB389766B7BC36CD67EFB60A48259936266 +D2DD283BD35634B3BF5AD5BF353CCCA573A1E69DE0E612F0E36111D6B427E357 +8C8C706705DB97324DA947C3427F95CCEC541972F6F8869B6FB2B8745C26BB2A +E64B711FE6F9BBF035C5C0A6BE50AAB944F9DE90D1898999349021C8ED19A711 +6A95A1F1729C08E77944B81710FB206CFD4D1534FD65CA779DB88BB8F024B502 +DF62D0632FEA1B70FDF7810A83126ABC0C6D0D39D451735B1C5BE28140931412 +B2B98DB689CE5FAF8D1F7B99A3FA3CD8CCB064B91F621BA5787FFD2CC466CE41 +5D77B386756C61BCC9933402915A0CD9EC643C75410CC87722B8E0B11BA695F3 +28038D6BAF9BD1AC64ABBEE98F695CBE983FAA1517EEA952367B87FC31C22D66 +E662889E27AE914EF3562AAFB3E3C8FC7D164D016CA022D130F34C64652B5179 +5D7072F49CC3394E01BB6CD54BCDD6B1BBFE685134814F9175F6D62E189971D3 +EF5A3FD5AD0FDC0FE1F36C2D8A40DCCDC32CC6AF4AB4DB25ADDAC72E2E5622E0 +BB907662D125F8D8FCA0DD26B8A5042596373BC069529A51D9D8CD247B03F273 +B7AA525EE3FB79498D81C5BAA40A533480F57E3E4AA3484355ACE9EDD9F670A9 +FF9395FDC0C408566F605D70E799862BFC667B762F4B71CE0067FDBEA88FE304 +63D7192BE68A180CEC0D23CBE7787962C657EDB83098B20A9D87ECD368700410 +63C5455FA4084764C2F36195C7F92805D7DA1B30E6FC8B0BF34FD908650556F8 +9DB301244CF76A222039C6D0F3D22DEDCCA4E53374D0ED5E6539AFB4371D0FC5 +5BAF5EF6880CFCAD6F2CF1CB3109F1513CA14FA8162666677AE9015FAF28D1A4 +B8488C4EA810B16C86E32BBB479B33DE3158613404168970AE16FCB3EA765806 +B14B1CCA48BF9CBE25423E652BCE38C9769117BC0A84D8555D232207C6E5AFCF +79CA67293737780DFE57A472457501A9F082E09A14D60301648618851B247A2D +EACCA353F4BDAF8E1A4C14EC0A7D2B7B82FAC4F6FC68844DDA31E9D833307716 +FDB106CB7969B7487AE836C410AA907C9E16FA4174E4F840436341714D849D95 +7B3F7A5F6BA1184C4785ADCAD4E4A21FC4E99184A961DFD85A9A4A585794F57E +47BE4239FD179C19E28EA4D6F2A8800549DA3C4510B244723A9D760DC417F6B8 +7D0D4A7F6B651B3F23274ABD647638CE853B3F58105FE78D8EC1033E984510BB +7D01C93A9F13C9843654AB267EE1F8EE41B84B83F065062D348F8F83A0F67682 +D189AA9D99A63CD603A2BC5ABDE0B41562FB2DFCAD5B8EF6502CA6468F77FB5F +C1A817C1131661D89F9F54E61CB09E0FAEDAA0593B2D4B67F25FA96759D5A8B9 +E84CFECED0AB400C755CB82D1DC7C4BC368C4228B4037342ECDF209537992B47 +F3383EF86B2ED8C16617F507CDBDB03623C23B2725136EBD00519E7C73289569 +6DE12563D06363FCC7AEEA5B907CEFAA634920F6EB4A36AB7134BFB79C2CB129 +510D6FA6253E30C1D773A1E9150CB41878B928073657D239A868B7AC365D2340 +7FD4818DA3A23EF773CE5AA6BCE4BE5D54099B3CE734033315F8544E1032F687 +AE61BC7FCED72963024C7C21FA9D0F6827E69986E81AB7D53C4B5C0C681B110A +ACACCE8E6246F135AF75903691CCE03535D9B9228ED12BE2FA9F38F50BD46B5D +3FF54BFAEEF262F299D8F8CE935DC1AADE340DFA0EAA186688146EE3BDA24F22 +35BD0D6A9943BB4649DAB153CEA4BE763A7D086E568B434AF847662C63860976 +19A7BE9DBC44C8F4755AF7A0FA8E0955FDDAB76A2E312E4FEA263FDF9639F710 +82AE3BC40F977F700FD0A4CBF14E112C89059384AE61F5D8AE8AAADF8263EE08 +BBE1508D8BE96088746D126311EBE9E53C3D481B2D05C3915B837CD2EB9246A0 +B45CF349E003A1772619F926D21D974F023984FC9F250C2B047D8BDBE3160D95 +C1EDFB590C07055710EBCD36206C14680DFE7B2FDB815F192E174EE1788E404A +EADB20056A38DF76356E25CBBC243E9F3B0047C1DC2DE4420F096CCF430FACAE +68E6E855FE4F5DB453558F6F9A0863C9BACBEEC0D496E64B4737E4223A847FBB +136F40CA1F924595E4DA72E6DC8FD1FED0312FD6BF642B1F4017A95577A742A1 +6FFDEC605A8C01793FA201E89FB92667654DDB2C79439C17C5D2AAA6755AA742 +F5FD6421E3B92672EF03E78049EAEC7218872D7E8B8053A3306F8CE8C5A1F36F +21B73544EFA441920E62B85B282D09E4B7AC9A0F45F3B4D03EA673471F2D2AED +08F107E9194FA669A7CAA31AAD8A849DDA803CA99DDD4669E616992A4DC47321 +E276C2D21A101807C1CCEF4BF6A6277283D6240AC1AF1CBB10781E1E81D2CDE6 +61EE562214B77ECDD2BCB014B97B9C1ACFE52C6844B6129A2F6EAB95FCF33371 +B941A32B869276DC4BB5F5F9CF132DAA3766692268B0C7BEDA0E3430769A4C7D +390E771245DB1462F052ADF0EF6521028B60806112FB000158DCB1A42A654342 +A09E410F18F27B1CC9836B5EF545D4E5282C6C82F05366F8629F115F6DA28AD2 +DA7C16C6E47B2062457A1523E456D0A8B915BEC0D23A086AB0A0E7CC1A086DE2 +1B2D4EC74C2CD70F2F20620D484E5F3F9E841AB0CDAC1829E7205F0948FC6DC0 +03B7A97141399B48DAFEE845B7354CFF8AAC4D78AEA709AFDD49AF6ADDEA800A +8EA8F5EE64F3E635FBA35BB5EA0A5ACDB731A4735FD75DF0BA4750E212CC986F +DD5719D3EA651AE7FE043CCA93CEC9E00DAEBD09DD641564032E49FD4F1E7ECF +7779B2EBDE7C9968C3926995EC8B782D52E2B587FA2252A665D17F25DCF905DC +4C42CC2AD7D61BCA1778E8BC8DF9D98903776DBA03B2521B39A8092FF149C828 +177A12A99CAC8D5CB5AAF3511458F2AA47A62F0B461CEF4A85EC71F265675164 +FC1ED0EC61E2D58E87A7248987B7D834CE16DAEE376C783C7F27ABF6EB80EF55 +2076F29789877E5C1E8662396EDEE6394380E9939B659913B65CA6156A8B24FC +661A399C1E095D3691DC707EB1537525A73524914FED1783BC6907B7D234D6CC +4362BEA4D960E5B71472BE2B60BD4A46B0B99401D22264AAF66E4E6175A311EC +8C6292110EAB741377448733B44B4FF17148C088FE1EDA17454A9E3318838806 +D0B94DC518769598D93231432987A83D8B3D7737EDCD3BD6767A1F576DE4CE2C +4E174875646E5A7F41A8B9FAABFBDC68A20C790EF1ADB783D3B59CBF50D71146 +EA14DCCAAD8FC203B7A1F9A4D94F682022787E13F9DDB0AE28272539F507F481 +9D994B1C168ADD17330A091236E1A84E8C25048EB760A2CC7A259810F5F47788 +FEDC61D519EC215B40B7CBC786C74827CE77CFAE85B44CE2D3A2ECE63F392DAB +D6A7D12B3762316D9A392500F9BE25DB9B261DCE4D7F0795FD1683B06B5B3CF1 +DB9BB5DEAF0FA7C40D940C1A1B3B8B9308E43CA16C4D20E828D645620A227274 +0E31F04673101CDFBF8BDB8E4A59A47F04ED55E3E2B3D84B3120470BF0DD8808 +BA55FFCA47EDE1F1CCA4045EDB7AB8B8A9811E5AC61BF924168B773724C49F31 +928E591294A7049901A74D6DF0637B8553560CB39811FB4D4135DB152F962930 +D3B6154C22F3D1FEA823F819133CE4E1F9E96DAB170D96608C66F7533FF29CEF +30C963D6D251D397022E3E5B7E75488071F38B0A62BAA792A40D5A1084B325D4 +6A45B150EDB3093FB403789F071D55F4DE904C713F58E24BF4910ABFB439C5C5 +A2109AB701E5CDF261C28065C8ACDCF9BD2113C4EB0A63A2C647E316FA4133DE +174624BA54EF9E40C0FB3CB90E1BC79996623F2FAE472E248D979E15EF053828 +6B0B17422B7C24D44A617B15A7BD519D3D39DA1AC9291E6031E40AAC95D81698 +77BAD918C3DEC8718F9A65F87FE15A5E3671C25B421C5BD410C5FDB7A5E9F7AA +E4A9FF3CC852C30531A9A9D118A428E35730C15BB21DC155E5A7C5604D484B5C +CB4DDBFA441AAA99BD1660CBFC5C5D694BA58B0D458363DA2BAD570908827AEF +457D78779D104D8E0FC94AED87F8719F7CE91B2D035398525141B6AB6277150F +121CB363A18639DC42FA78F79F8574D741C8231DC4DBB74E9749B7EFAAA9B837 +F76605DC431C6C97174DFBE4F994372483B83D0139F0A5677D34F6FDAC340705 +F5B7695B41188AEC9570358450B93EE7B0EEE796A14CA7950C2353682DAA8B91 +7B2053A73C95E479E60A57E484CB9CA5EE58E7FCBBA9FD66590A05BCA4E104FA +A14F8A891164B901D4C905B651B2C0AE52F656043DEA5FE29B2654543CA6E3F2 +1954F482F91B2E619595B6FD6F75CD3893A04B1B403BA037F3E5C61D295B4362 +9047752A4F3887A77C5E972A1BCE4E1B1BBAF8A29AFCA3A7CB003CF9EC366976 +4182CD264AA33AA7741E2591F4D6720DC4E549D8DF7D030C95B6BC01F67F7EF9 +BA290F26EB0817BD34E6479A9F3D64C5576E4FEA55E21F0835258AF43DB8733C +D9AD0380D6FDAA7C3A159909D51F8355AFFF3B4966184F6858F9C8DAB0C4B6AF +DB35DCEB259E2A69DDAFCA463AB8D15BD1D44A5C7DD9301ABA8C5C1BCD2199CF +3C71BB0CC646087C43CB361B63AEFD6166650B00889C8574DE207AAADCE273BE +9D1DF3E239D95EC30F96560BF6267B36452FCC593E212FB3B4E0EB61E1B95C43 +5112AFFDAF357AB079242648813BAB19C789AACFDA18259B6A0A830203298245 +53DD17D806762D0660E949DBFE33B70BFD5F11095043A38F6FADC9DFBD9BB904 +AB245C6EBA2EB8249263BE41C9ABA87BAA5F8302EDE09FFCB6F47766A604B2DF +CE5E291FB8B002FCED8FBFF9AACE083812D855A972705B17CE700C9A1AA25D06 +9C1B102BB109E499E8744C382BAE4083B377FFBDD74CC72FB7D8CC74F831065D +232CD579C4190C5E1E36F1D0FF5D659F936874C3FFAE030BF4CD2A114BC2DA93 +0663FB31D30747B66B8E1DC469425882D2505E66E1324042F54B32F2AC31FAAC +29D3805E5C0DAD5EFB7C0C2A7FDB9B6BF6958BBA3E60E562C4B6CCE5D435C754 +ABCD496309310DFF2A82B1E483A84CD3E739B538333F26ACB66C2ACF6CC9342D +D336965EDFE939B8A3DD70D49999C539753F2476FB0DAC527C189CA7079A7AF4 +7D3B48FAF4B6508EFED01797981457B6BB193EFFD9D2C0CFC3E64E2F2EAB4D41 +8922CEC836AB83D345D7BF96E12D8E33C776AC3EFC542994A6A762C238CC00D5 +641DB281092697CD143B7B83B4B0328BD9534256B54FCCEF03D0F94130E7CB06 +B3B87A10A3DA25AE1ED0D1BBEAC7599B429770FBE7EAB5A1E8F6E275C88538C6 +90854DD863565932D546C940423E032A3C58149A82FCA0F78EA63D52CEBB6B50 +3FD8376DBE6CEAD19824DDFA2ED141116BD46EC68EFFC60CB6EEADFBA6AA76B1 +30B2C6F8F8AE128D1642C786FEA9BCE8993BE302C149BA5B617590CE2771B798 +9B56E6159F41E76EFC0C4DCBA47F93BDA0DBDE3D2B31981DFEF2B3579AE42269 +35BD4A2015165F494A24D7EEC7DBD7819DCB7E00F6579C71FB42B428D9D1B789 +5496CF07595B5F68D77ECB6C75990A0E77EEAA91661FF3E25BFE3DCB5487E921 +C19CB362A92E4513C588DD4C07929F42FF1E0C90A6880D0BD462DB37F967CE66 +E490148F6924DFA124E2167F42BA2B0F631A554EBAD62DBFA71F813EDDA89CAC +AAE93DA7206765F0C157AF6D3DEF80260A39DFBE4EC2EBBC491C89A2BE598BFF +E30297CFBCB06BECDBFC8ADCB86ABEE0FE9A9D03D3B6B132E74B5E7B31EE4D93 +42114BE62CF59162E2F734FE657D71F85501ECD61FB3FC43686F984654AF799A +CCCE53300F3B26DF00D2DA5C7A4C50FFC3581157A188F37DDD81660B5E093440 +F13F2553BB494AA6E237369C26BDC401A1DB277D5F9ABDC4934E1F27845648FA +E581FCCE57AC9BBF805A9BF12735BA6A2451905B3F62220B562E14C62605C17A +9155493C9BC368D4D29F546B5DF43B7268C411C6FA83E287AA4482F4C9C11503 +9FCAF5984B704119DDE016289B699298178C7A8474BC494BFEAB05AD1A65A211 +5BB204C5357F1A9200D487DC291215D41D254756DF4F903E202F45ED97003184 +E7019B98A089DC08F45F67C9CC2C6C1E01D15D77ED6B0896F9990B2E5FA56EED +3833B2CE02D250F25D5F4896BD2977E3F846B6EFD6A21A77922746EB62ADD591 +F29B6B248C211AA3E5DF0947C2D47005835949A89826193C51FFE4D02C3567AC +3E1625BE08DEF17F1233B0F48F58EE531BDC3DF88C449FB05B1294E0524B49C0 +AE4A5FCCD838F1338A7C3B8DAFEF0D2B442D0214A58C8B5E4155A9413D058670 +4D888C902C86C1B7D57C007083523470B4090834D0002C23B0486E7BF45A1E0D +7D801C61A85D2B36B720AE37F410B02223D500BEF9C31F3AC2B37C7A5396C038 +EC5022062C101CC4513ACFBF3EEEE9CB45A25FB9692A4B2216A6933B968C7FED +F4C55F6D4E1D30EE75F46E81F2D4594B0B2D0CF79E09E2668FBC79DCA1020CED +8DB44546A1477093B3F6DD45F0DA3A17A0B14AF9A5BD7AAB93E55837CAC87E23 +BA99FB93B9DBEDE250F66342BFA270648582C7CFC37322D9A2004E39FEE1446A +FFAF9A218267D0971380E743A22C5421359CF6A3ABBCB452BDE51B582ED95772 +E03EDC7CAA15A9BFA33540EA7B87B579DA656D53BAD2359F2C2082D0922CD409 +B3447B94D8647086FE0A4F2EEB85C7B57DB2711A2B1BA0AA764EB567126D37CA +C0ACE9F5355E253542D64C2A06DC3E1A21C9593A4391A5D35F06600975F73FBE +9F9685FBBD72C6B32087168F0DF07DF783AA84EC7E8BC7468D301AF7238FCF28 +A6D37344F512CEE962E6701E0406BF3BED4AEC7AC01EC2B90421135CFC14E519 +A51930EC859887EDC7C9C52D65DE128C07DD40B9AAD7841A43469AC33492779D +1C728B62E743BE3E2575B9853D58F8FA2DB17D98DBF94B68D8DFD5C646CA24F3 +40DA3AC4F4CE8A2FBADDDEFB95F9928EABC113F15F8479D3504CF6B9375634B3 +A451D446DCF6005122DAF1CFA827D44A78D79BA70DAA5B6F3E19597ABA4125EE +6E821E036BBE36B9E49214E46FE20C200BD78A8836F89DA5B79443CFBDDA32B2 +4A0F8D27BBF03FBB2A57CF08186E6EE74BAC19A91FCC27D6F457812B58DBFC1A +77ED677C0473636EE092254D2212FD04A2BA77D242218B5F83E5D4EDAE0A2B0B +DBE2673EDB605203090EFA41DFC3C8C4A6E5233A4C183D18CA6215D2D973D4EA +6793381DE634097C4F6B2C93964C1EC5CF6596ED1813FD562D977CD38856047C +A5EF68331ACAF685D5A1C20DEB8D326CCC983F005F6506E286C37E17BF72F0E5 +85EA373250F302C32BA7D99F7317E919DC580CF9A76324087EAA3272AEA4297C +1366888FEF3A8295802F6A327B524FC47100C9EF5AC2FD422F3C79BCC3364BB5 +589785077E9C279AB0FF0D2F3666DA9F8000AABB42925D2C4D91EC69C618CD33 +3335C63DC2EAE080195C6A31DB2774440A0573F9F4064B24223DC4565B344038 +B50D9F822D368EA7BEE7F138C41CBD3272 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR6 +%!PS-AdobeFont-1.1: CMR6 1.0 +%%CreationDate: 1991 Aug 20 16:39:02 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR6) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR6 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-20 -250 1193 750}readonly def +/UniqueID 5000789 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C +68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 +3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C +BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E +CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A +C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 +D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D +23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 +D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B +93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 +6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 +EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 +CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF +D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE +00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 +B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA +99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 +A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB +11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 +50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB65756D833A +1000B06DDE8802EFBEAB4ABB7F9B3134A80C1E3358DE0BB7C7E51DAC55CE34F6 +949446A64FC4974CE66ED1990963E0BA5A0C4860D57D772F6A93145D522455BF +62226735ECFA0FEA888EB4FF20EA2724635CB53DEF64415865DE5B33A5B292E7 +6A89A7DF53B77CD7653F88027C5B49ED3E6417F973F79241CC971AF0381571C7 +65C21C8767AD7EBF8CFD3594D20BEFA8CDFC74A5B1F848667F1FDD78611060DC +687458B74A7A0E602256ABD17B0E42455C9B127DCEEB61D7B9DFD5641265EDF3 +4B6CB4A8E389E2291614443E011E243EB647E03BD82BAFB2EAC335219A2A149C +379EC531F25C6FCE1A268C166FFB5F259A48026AEFACCA5D6CACB176AB573A3B +199DDF3114E686646D06F09C96CAC26E4339D1DF3DEFE24A4DDED7FCEA5EC354 +6D5FA33BF5ED740D1C27B119BC5A61D764F81A74C845E77735E31B9AA0A1AB63 +E68AE86A42E2DA1BE558C2D122D78BF7E9287EF03F2AD83D288C299C6C6751BD +0025908B7B7B772C0E3B190AE8344948DBC923E16067F089225AE05A75F81907 +7D66B6CF238ACB52200E0149AC348558C2A82B9F52DD1E60FAB0FD30D602D74C +EB395A0B583EA75F2800D7F3246120C7DF7239FA23ADD0360EE46ACF252EA416 +1AAE12243FA42DD5EA9D0C06D2FB29F9B232F5C2654B719EA24760E803C4B32C +61520E1436AF86E1D73D4FD050841C0FD679203072BFB62EC0AC34224A7F208A +3789E0B95490E1AF5BE624CDD20AEFCDEE220EABBC681784CB979EF137A6CC54 +C0F25F713C17AF9D7631F2F6E73D837F360E6411E513382BC0C1070C0994AFC9 +827C4E18D1DBE51C478CEE2F4B9325DF2093E2CE1F3DA2F99DCC3105AC6B0B50 +C0C1C720DEE422045F26FBECBDCE20DE21F8CBA18623D3FAF5CE0BD22DF835DA +DD5C3989FB5769C72A4D877270C2C07C23306CC9F13E5B6CAA6755EF3E3C1979 +87EC0FFC7C81A510AEDE2A19A7F4C8984BC4F2590DE33DC173201CF72ACF1678 +C88A1BD4BC3F4E3AEB63410F85BE805F95F31292ACAF5E1CC0BBA55334B1077C +13DB6883390C9D56BCD47FF9D28E98F280AE13D2E3893397CF07AC86ACB9F358 +633ACEFAFF140FC6F51AA27966B1A3A33328AE6075F7DDE94A14671D1E8F0859 +E7EF0C0B087F60C6034CB15C77B986784EEAA747810907F9420649CD0643CFD3 +8F288531D98CC8C71C6CE026158171866BBEE26AB8F7B184BB20D7541B6AFB6D +4D7D1FFE836C0849C2D647D33DF0AF6C58798D26768658A8A77CEF396B77AABC +F263808E363557AE4D69D4703A970AE16A8BF4236E2CB5CB9E238514BDF55B07 +6E7A0BFC8D864E69D346CFAB4756F82A3507C1F7063B78BFC2D84CDCA1188657 +A085EBF2629B535856E6F3A0EAE57E253CA3DB2BE402F94EE15212F5B9527159 +AA463596A062A32B09BB43B4DA9874D0DC6ED691DC32FEBA6E683BA141D5CEAA +CB5BA60C670AE31AFDC926E1834338B9E0E6AA696CAE53128DE335DA8007C49A +379EEC4C21756DF4C0A04C7B351BD02BEBED75B543BAC59C28F053127DA548A8 +17136B4BD2883E2E3CC3737DF62E7BFAEBEE2E87D038593807B4276C5D690341 +4FD9E323A2CC092147351900B02D65B48464CDFC1A69A5748EADD7BAD497447E +47095C35EA732B0A8AEC160E2FEBF2E7B757A17446C3F00F6DE8E635BDA5D4A6 +20DB01E178F99D944FD7D79D1EFE97F949C1C04C7F04055191C0E49B90CDDA7E +62A8F53D1940F8E05B5C7180D3441B42CFFF159840879830EC3560E8773AFD02 +1452A8B65E86FB40F3C5B854956969070ADC5E4F3B505E480E80EC22C2A8915B +9DA580FA78020FCEB328E3EB2F645F3E46F49E34360522B43B9C03A9D0124819 +02CE7DA97D017E3825EAB17DBA957C4C80018468AD7E0F5EF7D3EB19E62A68B7 +27490F0AC832F43C4D41475625B614B21C6729587686506A509D64E7F0778E1B +008E5049D6AC491D892CF1B5B0157AF10971AAA97708F0796C3DFE53C15539F8 +88D89125EF7EA02F7FBC7CA1CC09079EA47FE2935060FCA3F72FB408E7C79320 +D576363E77DC2C8000538C5536F7D95882766D07121A8A3422C6248A892D2D8F +E33D0AEA73738915D300A0D0471C98C471AE0E3EF4E0111BDD8EDAEEF4D5AD7B +59710D95203B81B53E869954CD0E3F0F870C6C626D272B34EB35E9013BDB894A +29E2F2623171267D4D6099A9B1DD65076C5153DA0858219F0082425BAA6CEEE8 +57305C5C87137461A03C67CF8ACD2A50AE663CEDC34E1D51B281839059B85541 +0FA9C31B4252B7E5E1970828D48A4E3B7F001C3A69C3322203AF8A45A15F5FFD +9EE2D4943B1EADC26A0EFD44C64FDC1971D2A1CDB192D0A1F1BF0C1EF78B5D2D +47ACE7B81BD5F046FD1474C2153B4F06F4A3B886B5CE88F55316F9FBA49BDF52 +67A9762BBB46C68416EF86887C4F3532F92759352D7E95D0C876156BAD209283 +A1A276BC10397D8D54DC4914086ACF8A74C5079B43C63105 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR7 +%!PS-AdobeFont-1.1: CMR7 1.0 +%%CreationDate: 1991 Aug 20 16:39:21 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR7) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR7 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-27 -250 1122 750}readonly def +/UniqueID 5000790 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D +E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 +47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C +8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 +78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 +1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E +01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B +C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 +F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 +8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF +A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 +455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 +9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 +EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B +52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 +563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F +0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB +7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 +0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 +1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A4DF280B37ABC +A1346EEBD0D45ED6FF47288FFB96BE63025656A709BF09B182D8AD3CD8E4CDE6 +825B475CFF0D53651084C45952BBC30175F20866D75F2164BCB4844968F35050 +635AA16A5190F56D09D0CF2EE78C9C9D5BFC9B9972549D51C09213F74722AB5E +1271B144CA8E607210B803466E357CDD5429E52A42A86E1B4D58537E7249983D +992EC29C3E0805FF4872F0A86D615CC413DA7E09FC5019A16F8069CF9C407611 +2D930B0862CFE5E11E7C69A3AC1B6C42A306E58B22D9A19DCFE810511055F295 +9641E8ED2EF901BA42C62CB1D064575BF6DF529277F285114C40E5E2F0B5FAC1 +E419AA0403FD2770E8DB3DA6A3CFF53343E77E47781263979E1AE91789455133 +14C1ED7B50DCF884705B1AA8691FCC1318507DC347074FCBC779BE27BCAF446B +0DAF92EDA7616A69FFE557CC78A42A8B62A39D7CEE3FE7A7548CDD135723BC59 +6930737E53A8539971E3CB959DE44AEA22C90958E70EE1F519279DC062B7FB5F +647538A3AF5EC8030688DBD9592824BBB04682840E27D8ABC8583B1FC23B44D7 +290963D7FDB935CFD6182BD1B896BF0401958D4FD2D667D41CCB247ECA21A289 +A6CBB426C577C25DEC41849A947D78D234C5DE9CAC72CDD8C5A05FE7C81D0155 +81CA471695DDD608AE00B6BE58BF165B29A016126D91944F61D658A1772019C3 +073E366D0187821CAA24F32206C609DDA74347F217B2304588688143F012CBC4 +704B3FB795E6353FEFA63FBCA61CCB0347C0A4820FC888DAE2F8A0230E1F185D +F0E0898FF6405943E615DFDDE82D828931A1B895879C517E21BEAB210B95721A +133E6B7A8C19C93F18CB0C4AA706B406D3EBE34965CD395E194CC4B4A5FA5AEA +B9F9B4B6BE58D47DACB9BE6B61763200E71ED10F44DF35A14E1DBC53E38CBFA2 +2C7293B8457EA0A10DA6172B788A4EF94CF490872326FEECFD94DDB8B064DA64 +6CD5A76FA8937D8D553A8E4A6DC1D4051F53A7EFE7641FD8F5EE5E17F09BF0BB +47F648202D8EFE8090D069F96F92A32ECE5452CFF1F04E73CF5347D9FB201437 +6C4B49ACF3D2B17DD2AC3A2E05A9FAD9611B32784846876B8118485B926406B3 +9C7E1D815622719E60248D7C6ADFE7963AD4391ED465905966C4461EF0711B70 +0ED5B8BC0FC09AB67791967525BABA34711BC395A83A8E8B7C1406503400C7DA +CA074D623E2AF6C3D774D8D6106DA1E3895189C12133226B1FCF89B8D85DCC55 +E9680C3B0DB172B002C3D93BEBFA7E49051E12958809DB86FA6C1E21D6815F27 +75F0FFF85FB29F7680E7E92E3DA4EEA8AFC2BEF096DC560BD55E4BE38D813757 +FA66BB39B4DDC3C266D47AEDD0026E734F11AFEF9DF0F817D3CB591CFAF1E685 +CF1D5C1DC706E93044F09FCC605C0028838C4EEA3DC9DF7E43A890C8A7520CCC +176A4C819542C508B716B1E6C9549C5CB2889E431CB695F998E852EA210492C6 +854FFAA438BF323EF50BA1E1E1AFD76EAF9C1C6185C89E0208DB28E2F8C620FA +DC3D194448A792BED15AD094974C2FCBEB55D475D9D0597661F1420803600A05 +483D4C62B79A0ACDE400212F8FC14CEC42604FBBFC53082AF1A5618A58A35BB6 +5A04BBE58EA1395832FF5F07F5AF7C0340ECA6251A64AC15B5B4DD09CF1810B3 +13CDA6B8424CE3CCF9FF8A707AC94B0C6A3B2A99D0AA662D36E7F28718511184 +EF4F65A1EBEB5E41ECEB4B8D540A0CE74A6A089C99CC8017391466C01E349615 +1D9171A2752DB23673B211DC89444874473ECE4E301DF83757F12E7F9971C52A +85DA98069E6FE751020C0F29ED0D074F36B731B87BB890B3CD205C96C5CB20FC +65E8520309392316AFD815FAA4DEC9BCF8C310F98B917FC7B3E1EF3438F3293B +5DA00C6635B7A3C63A3C114E01FBB3B30AEFC96E9820B6AE47ABF4D6781E67E0 +3A51E4CF5F863FBFB98DFD9A664DCF46DFB79A03180AA7A75C16D5B9DCBFA1E1 +3D956B68E924B692FBE26918D512F55AF48764702159E241D3CFE89EE5E1B4B0 +C4704051915A422B2AD113FFAB8C87ACC9E9A4975301D461A065AB787191B043 +7E1C59D5E06EF46A145E661BADBDBAA562CF3CDE3AC3ECA24CD7273BF3103EEE +FE77F12C77BC2A164A89023193ADB4D1150323F880FB458938551CCD2B503D68 +8503A00FBC1C01F28A5C5B1FB7AE8F5005232BA17DF8B9CD8C31265CB9A4DC55 +BDC946DF10F37F3A0E3F3F4EDD1DBB26FCF7BEDE6C532F421914D605DE0BE1A9 +FA4DF183845AB3C9AB680A378128148EF8C3351BEE01DA3A78A3F3EDB132B8D6 +7E1BA03BAD19DF74F0FC004B39F6975E7B00E4E4D304B6E41C4527222F24829F +143ABF9AE8470B71926C943CF2537B69B5980CF94CB70C5F5B4CA65814727B09 +1498CFC769BFB8899BA7DEF36AE294A2BACA8F19D976FE93A8D88CDBA8FD2757 +44ACC72BA02D78D8B4ACEDD9169F461DEBAFADA2DE66B5686A0952E4A324C04E +1817A5D4DD66272DB75178A7976830048F296296DDA13477B0A15C7DBCF7401B +FB9EB8C2FBF071B6C21B1743850EABAEAD35AF3925A0DCC822EDE9A795F4B2D7 +2AC9A6D369D8E4945DD16C152179BA2557700943EA6DD2578186065E3F106674 +2A5EA5D4BF138FD94A6961BF0DB20F3224EA7DC8AD35B97202AF3FD7C01AC7B1 +0F363772AFD896112BDF2CF73C0E9A3E82034A21550877819BCC7AEF6F7D76F5 +4783D625C168939D53AABA2B013897EEC010580E2A2182AF3C6C16C8CB2A82CB +7DB99A35EA3CCA8F22CB6809986AD920491B3D2E29D79207D90ABFEB31F3498B +6F4D9354D30FB14A62D4E876DD5F53019F61E17BCD7EBFBFC3657D7A34FF60DE +19139A57A103DB356218F50F3DAAE3C0AB266F5C1DFF88A447241FF98FC85A69 +97AEB4D5478065CF4851CB85FEDABB6CA9B82C4594B8D0B6ECD2F99FD529BEB1 +3171A9F3B3BE13B2555B658590F063A23F7DCB1F6C4713E2497FF832D08E07A7 +BC661B538D1B7C56C8AF6C9EE35084DD9BFC0FD6F43793A1C914465E923C5E8A +3A5C65C5B6326AAE9DB3C7C7B0F456F45C707F9CBDD8A2DE9E398333CBD24B17 +18661B279B9B379C298DB6BD99A0E8AA3E815D02ED21A8E6A256D93803E9B896 +ABFD6CD697FDD48121949221ACB5DBD69B36393E3CCED4725C58E4605803C43E +A2D84387B6DE0AEBC42FEDFE5A59475F713A86F4CD974524DD37595F10398C35 +A93253BEA3E823C849D55987EE27D7F06F6F8AFBBEF6F0BCAF90F9042D0B1E0C +678C2A1C23B8A4A0E22F3A9E1A1A5BA8B8919303563B34EE84B7E25B5A491E73 +9D250D3E7D96DB5DD3A04B0AFD30FEE1C68FE53282B0EC7F4D93384693268813 +BA4F68EADE7E8831B1F2C9A5E3FA4A2CF0130E8ED78C5CA4ECDD51BB7B5B1029 +60F68E2757E7AFBF3554419DFE3A745B992BB301AD1FD9F599199FE6C0150CC3 +93EDA1A42488A422B2EF1C9B08DBDD0DC86EA803DB96226C053C92B5A2718F16 +399BE114F43D3F3BA483AA1257D6C69268153F60DAA43FC5F3EDEC24D0428194 +72F1F63669E8DF267A906C116157305208928641625F56082C29635A0228A598 +24DF2016FBE69ACA2F0061A2C982214A6169EC4E7368286C48FBE1F3A8814AFC +E600E66F5B220CEF865C705FBFB8FD4EC4FE233F4F79BFEF379532B5B2FF7DEC +E19CFBF529317434B3F60465513CA2429E995C6D306BBAE8D31C549A92A96F4D +E39753B0FDDDDF2C360C9DF9C6D06EDF592A1120B28DEB2BA9F1B50DDA8BB3FC +DB7C05A2E934129935A493AD65341978D99117D96C687CEEB45F068FB522EB21 +5B4EBF4AC7B60427AD6D1242A3EA568B0708D9C132E691E48E51789B48628E9D +68A877FAA81A7015E32A0472E4C7E720346543E9EC787A32FCBDD6622124888A +94E90B70165CD125C0F760D67AFA0AF889D446126D8748E256B27259D5ABBFE8 +7ED511F7FCEFF0777FE18940E4452EBE3B9693EDA099344C0430BAF0EAF53209 +B2C96CECD28112E185250C9E91ECD9B732D92FA832B48D75EEBEE14B8CA16AD3 +D161DF761C02DAF325EE1EB67AD600C8DE0F353B815EA51E8809FC6F83F6796C +9E3140150CE6A32D5E30D64477AC3EA3D493856439D3078F8796C47C1AD72C43 +DC47F18166A0574FC2DB24FA4E8D7C02AE6C9638EF959DAAC08C89D53D99CE09 +0849FACAE421534F9A5ACFAD14324FA0398F45449CA82A0D30CB043776A11A21 +FBAE3A3A8FCA00CBC0DB95E982F7E447E1CA781DD9589670988929DC88839650 +921CB48C7FF0CB0CD6FE4D94A3C3A0DD031C1B81DF970AE381DC3B26F9284323 +859BE3D71C97AFD615D5A28E1B5B4925EF62EDA3782E7DF2C9D2DE5A360A3B65 +6EDC8CD12EC7CCACB9D92A764C016FC6F5614584D13C7CACC5A518EEA4144BFC +796271F1435158D6D2460A8DCF9F20732FED935EE7CE76979AFE0DC5633AA5A5 +1F4DE934FBCCCA66183E55945811B162F0BA8ABE4CBAE250039DC05CCC1D8D8D +4C3A8511F72B6155A92F7415BCCC0D2C97265D11DD20EB2BBFA35D641DC27ECF +F305D8AA70901987AE12051FAAC4C4B13E93FCA93D0143BD4D013B4055FCEBA0 +4383511AAA6390FA72680638D1B096FF7EDE4A6202F7A910A93430C8DFD39E41 +A758917936CE476F3E47EE3EB9343E122769367571B137B06F36EBC60B6BC495 +2798A6C5F081989C99DF47252B8D9A9D1F46AED045AB7E05 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.1: CMR10 1.00B +%%CreationDate: 1992 Feb 19 19:54:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /.notdef put +readonly def +/FontBBox{-251 -250 1009 969}readonly def +/UniqueID 5000793 def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 +92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C +295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 +409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C +4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF +2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E +0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E +B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 +24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B +43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF +D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 +5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC +96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 +7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 +0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 +B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D +AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 +97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 +FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 +20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 +0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD +F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 +3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 +A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 +5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A +45A24ADAEC63F61C9FD18376D39E0FDDE3FB4FBCDD6A7B66068A99D31CF54CD7 +DF2262DA91CCC72889CAA62B1D6F2155CC8E940A2C35D8CD3EC75326188E2D30 +1090F31AB50F30AC77D2C445BAF7323389406C44641B3A72C26BCDA442504D03 +6C22A3BA1A69E5F87EA400501A3B3231E46F96AC3A6C0E4A4F6F21E0B2BEEF53 +E016F34D7003351FD12436520926C632218410359AF9FF167750D3CE0DAC3B91 +B310C457402E05C316F400246C8C38B98CC8030F71104BC4FA0505B5EFA4F5C5 +9E4FA27C3E790D698690336254D7E34451E692AE23BF5FFBACBDF33E25359BD2 +B0E7A0686602568BC87422F32486CB50776C7EAAE7F1BF78B228CA3254510653 +3D6368A4985C5FF5A48AEF16E1AB71D7CE2C6649F2CF4B2879D4FA042239B504 +F988D2FBE87C3BC784E55B8EE36F1BB5EF14FD5836CA448E139EF8FE221E827D +0608A6B90E08CBF44A30669AF4E20CD5C0C8051E5F86062204AF362DA690B74C +B952C9F4799FB2535E47AC019175950A1F3A0D0937016148222B545B1E00A91B +39D2121462F51F736802C523BCFBA894EC11C3353F9BCDF0892C00EB583A4D62 +247118996064991B816F9F490FA73861FA614FEC7FC23A5D45310527B6559781 +F1C805F0EC931D0C60E70FD5AC55F22E6379D369303F63A0E7069237118DA0A6 +5BB55FC6EA1797BC51C1D053401ACD4E9B5E724F4AEB149C38DB0E2BFEE811A9 +A94A7405422CDC911CDD97EC4976E27F766A9E3F84387C04C6367509157E4D91 +09A1F6DDB59AB9096FC43A6F9773ED9CE3DA6B56D10AEF99FD277F8666E72028 +807AEC6C26E5A142496CD41A80EC051E875DF9F547BEF060B969B197AF97608B +F7A3740B3153621A680DAEAB0454706C65581255CA9B40078FA6D352737F0165 +D834359ABCFDF5C212F8AE9FD50BEE9683E7D5969D183C058E8BDA78F61B61AC +98746B3A1750093A40C17EBD4AEF36BB2DFA1C9AC2A12834DE4623CCC76BF5A7 +92B2B2E368D1DF3471D83495B19154836569D2A30F9CB05C0EC499EA5D3184CD +BAE8D2A2CF80C6359275B3894B4DAD7F92501BA9A6BD215256CF9F35C2BDD40A +D1D949000633FF0B5FC7674BBED71294AD28FF25710E968E85C3FE71046BF0C1 +71EF48F8024C28959FBE6E896BD1AFE579764616672C724959FD66C8398ABB5D +6C02C5619866453708E3FDCAC2754E9C333C1123A5F746DC5B2CA9D430263645 +A88C743EBEF8C82DA0236FB73D3DCDFF874A1A5928406838A81E40F34816EBEA +0D7A89406A6F492E5E5E6C8C4D85A2B9A83B6A4304B05AB541041AE014C845B4 +283CE3F75DA22CB7CD78C67A1F067C79B209BDBA6705D80FBF08CD0FEB9D3293 +D9955BF6730BD59495A1F81B708292B509537089D8AC34A06DAE5E8BBB9B0A0D +F09BA6723DEA964F06C0E1A6541656470E251F5AFC6677043DE7C6D85B60D3EB +B8A4415DBFDE3F29D5FAA0B5CE4BE9559595265FA8BC24A172FBAF9B1AD0A4E1 +1CADABC2B71A43098146DBFDF7E126069259EB490CAAB07D5C9CE3D50CE6FF88 +DA94E6D53F72FA65B5CE18E2EC13A63E7EEEB698898BE82DB5F39F4A43046A8C +074646406D1AD4C76DCC6E059A0ACA869017993CBEF9AAEBA95A1F9412F08F35 +F46906A33C956E6BD717F6EA4E5D88B820F08641BF7DC21B3D394AC413A9FA79 +5A9E2EEBA446169409B76E1EE5342B4ABB36FC6E55419BE0C3AB28B0B7A174B4 +77D651F56C8E6AFD1D4AC9D861176BB8FF4A20678F203789C95A05B03D46E4FD +60A16CA5794C594D057B349E632BA6C801DAD6F5B5DFC418739AF2382F7ED25D +E1A78DACD981ADD73985F2E1060EB0698BAA46D04FAAD21985F518425D9D1E49 +DACECCF7E675A852DC9AFE2B5CC8CF17FE0EB8380E8708E9123594268AFE39CD +B81E15AE823DBC9FCF91A25F9F6EDA4A24319ED6C4CE9ACA0F700D909737642D +4FCA8A8BA29DE7F86490AE6C0448FD3F5B734135329530CEBCC6C254F1601CFF +563B60A21D848A5F84FC8AC6FEF5DB847E1F93DA5015033187E8AD3D3415D85D +3519F0BA6D2D8865E4B5E3213850F9F2511B065C05E44007B7B17352B08C3E09 +EC46A5D390C529D19146C242115FF53244D8AF61DD7DD2440A9835FE27D0AC57 +3214F0B5568CA5A7479091B999F8ADF1BBFB09352C0A37BCBD17C34090B42CD0 +FA55E5E0AF184B4E391F4E553695C46F49156255B847299F9498C1DCC9CE0554 +B2079535D087565BB5D67B23CD55C216C8324A1D122FD95C56D7DDF9E16521A1 +F3BCE428B6713F40844922EC67039562F71AF50C275C8B98BFAC7A87753A59EA +DA419AD61F1BD4E24DEE2EE7F68B4703A888909B06E91BE0444C7AFAD10887B5 +49A96A7EF6AB3D9F5D8DEE4DC84E31A9BF2331E18DEA4D4CEDB9A5DA03F2DF05 +121733C6E89628EF3327C7F6A364B64F0C3080634CCB19B70C402967D68F35D3 +93D75B9BF37B9B928E4AF68200A07638D27D027C07E9302925D0C55355F5CFA5 +FEE8F412CBFE9CB4A2D71CBF17A669DC4B9BC612AF1798A4BE5F9F14DA5C94A2 +D2133561E50A2980D1733C3BC9FB73DF8817A28F11767537C9F69BBE2BC51B07 +502A31B7E6AB831737C2777E927BCD088766922F626DA287C18132E9320C041D +DCCDD7CD4DE51135F0D8B35E8602BA2720C4B3F8C02D769F728E70528F162946 +925D09073C067F55C317EADEB5CEB7E3426667EF27786EFC71A6BE9B7377021F +35347B323FF8FE756837C17A6F73BF822CEA668A41D1C70CC300AB870937044F +5F6B65C3715C2D0F193859C2AFFCA75ABAC45BC7F4670CF52A9665F3A0C3001B +6E468794562D3384CFE7FDB2A534D9CEF93C59AB33566DF02F22C6875C88EA75 +C39443333034C03F9D9E5C868864623A8F95ADA59D04A7B602A347EE9826082A +B38EFFC3B6BEB21B1A204D1FB8FD40131812350240568E7DA02D94B4879BE921 +B59C88C22699A3ECF5B88AE68304F49FDCA8C972D0940F28A8CAAECF0854B6B6 +A620B55C38F898DAE56DD2492F8D355FB9EBEC5C475067ECE5F073DAF59BA508 +DAF5A1C1350A0097DA2589878A943CB5B17C4DFF782ACE06CF7CE566BC837FC9 +2C0272825DC7064C72716D42755B04ECFA994E93952AAA41D4CFA298DCC82B69 +69845F436E28E5BE16AAA5E09FA9A9A76208F316B92C4BA947CC5EE5B6B3D747 +17CA4DEE5AF91CF5FB8388952A4C455F3726404195001A5A2809779B1D57DFC5 +0989179252B8405D42542E5627C9A9FC23AFE1E3A0DDC45587900A99D547B9F1 +88AFB866F7844A05A70CC4E6F5CECE8D2B0F241378816B73DB6103B1F3C3D513 +478A1403589E91401246A875F2B84C185BDE76B210C7E83F5ABEE6F1B8CC4AAD +0A625654B2BF4ED3780414635013B74C99134428177029BB89B71204A6D8810A +9EE00B4CE4FDAB52007D6871A76CE2AF1E4F85BDA68D362F341E1E8E8E86D158 +F7208A57524EA917CBAB094370B9EC277D421DB65ED946B4995A2A6B7BD3198E +9545A97515482C40AF66157D18AE86E5D5FB0789A87C5DA848FEA40D5EE04D29 +BE9D1019C5D8DEF6D3BF7D0F31EA5EC221EDC80D4903DBE46AA9E8EA730AB8BF +968DD705BA6DDE4EADEF7037CC398724F031334B2B61B8116712BF3BAD010082 +3A6293358965A8ACC57FEAFEAD43359D41955B2C9CE8FA73DD25BB409917C13A +D1A6899E726AD30036BED751921C9CF862F1E6D39F128F7A422A3E53CA979060 +E52911A7B25655A053497188EEFB2AEB72F9D788CD621DE5886AAF7875A7F421 +AF246664F101B56B7C9134AE87D25B2C9D536DB7C470C6774AA16C63E627DAC6 +C274E22B894980DE12717A3591AC7CCAB7FBA9542ABFF4123F7E32C134ADC321 +D1EC84AA5AF2D0F6076FE49882BCFBC6AC361E22AA71AE2F502F7106F72121C7 +9F5BB5574E43FE03DC239E799B31A6311F293A5CCD77A11D1E1C800AC9C87C2C +893EF2379FC05E0BB2DC03529D690D236E07EB183C3A71EF5B7E604DA826C373 +2D9AD0620F415CB5215D42088273CEB5406E8FE75214FA0D16B82CC6B9BB13EB +296CE30CA9B82A4B7DFD2210CA69E58047B13D4D659A64BF9C381FF5C473334D +554D66F1084941A6AE2D9E2B0E681927E397D17C3BD7B15C7AED99F18583996A +C260173C9E681F85286C79A9153741F0411B2DE2AC6FD12E3196B8F113A61251 +3A622C54E4218B53689B910336A1B69034F2603AE8DA781879FAB65A4CD57FA4 +2FAD9F5B45C959832EAE4DA27A0644A6853115172CFC60AFC65B0CE186BC5E85 +51A9257A629DD2CEC7AEB534AA9DB4315BC8290A44E718A5FE77F9D8D2A1EA2C +9C759E494DD27091BCF28EDEA3B2A172EBBF2070A51885F4A9ED6534FAF06572 +3D7146606A262FB45E22BA1824950466EA14892715DD46E501E398A6D52135B2 +542147255BACF39FF1CEA5044309A0658182401AFAB0B6F6CAD481E11351DB64 +CC43A7348273F0026665976DD0E5686EC532D8464073E36B1E3CD0F0D11F791B +7D89D29AA8C39C8C075150D54CD57F3986A731C7A1C8C03621B1C92F2007F3B2 +F1A3C6DE4CF954FF6E496CA55DE1C609AF9E328E38B38C388E18C13CDF27D64E +AAD1071A14F2AFA3231869A6CA3FFBF8497F086728E7D752B216805EF4CD8A3C +554E6C6BD4304AC7B6A915C93AB27B300FB1CB040D763005231D2462471264FC +003FBECB4973626AE7740755DA5ABE4009D2E404AF95F8384BF9C93D60CB0B34 +89A14CEB1F6A7513CCF1B5EC6E2ABE0BBC8A87C6F3A701477D72CEEB31DA7CA6 +E50FD5DF9EBEFA43A8F897D38D73271BC41D1EF2CD03AD5C47CE12640AD3D596 +5731B28C892383BD7EB097EBD5E5F812985B8566732F1F7D43D0433668E42067 +A01AA1001BB0A04FA4D8485292FA940A3878856B0B0DB9271447493B1929EEDA +D8BEF4AC5F75E05A2108AE0E7D635DABFCAD1901F0EBE9F12981F2FFBD474CF6 +C38CA418824C1158751F107AC39E367EF486CE57BEF0BF689FC2D283956D741B +39825C44EF7AE35AD2C9383031DD27DFCD2AE38318E2F4C15512B45222B8A3E4 +D2984E5E201EDE0B4CC8D9BC29E026F631C3584541A248E281B5A9E8F4E6B898 +CD1BA8156343F43E7CB00423F6348BE2D71010A1A32B7023C2D03AA02BB328C0 +9D567E14CB2748E07B426BCA5E69F20D327C0EB7642D7F55F6D1C7520EAB2F04 +5291C728BDC11FEE511D45904AA82945F0D532C11589240AE56361EADDB3773B +D97ABF3F77E3358595D9E8C9887B74A203DFF3C00BA8C200B31904A6667F6B9A +F90A6E5089E957BB69178B560010C8320D01BBC705C88E2F4B8F05FBA478D70C +D562AD71827ABCC77C68F54DAC047599B1ADAA0EFC8EADDA9AC1C0DA1E729281 +0840421F25093D20B4B72B264E87ED42834079987BE2AC7536405CE30BD930BB +391A11044C30197BFB452DE4CC9E5EBDF2A07BE5F388D6E9F394EA48D4209DDD +0774F3CE7D1263842078D54E2D4B69C6B6DC76717383437AFE96B4FD08436F9F +E45D3CC5222D53E6BDECBD5F6E18284A8BAB53840DA641B122AA81B8BD7016DF +1ED17A8B16F6122C5DD9EDEB538459B2C5B3B5D7CECC7AC460F694E4C4870089 +805B19FD2C4B18BF8CEBA59292F09EBDDF54428FF80A629B183ACC64E3AEC3EF +149674251C3280107EE5178CEBD14619D53B402A20489F3B64B0DB24FE5A6B0A +04E1D5472799288CE10F8B2BA741B2410AB082A10A129676FA9AB51AAA270EA3 +23A98958D9CA89E1EF4F79F5783F0AA3797F80841E0AA65E6E2EC1FED836FF95 +987B342A2B2720EC8C62BC1ACD34051C8CC269F46FDB64432326CE0F5F430A2F +A0F7024213380EB4104CB823EF574BFBE7154216407B22D0C133D02BF096192B +EED315DC961125FE73E1C7959A3B587EA380B3C02DF38EC6DDCB77A786E4A736 +F83751B4BC8FA79D9F631E72A23341D112927D6CA93DAF4E4B7AAA74A1575DC8 +C2B38659F2BBE4E37FD404D9C8455A4F823A5C8896DDE0DCBD3BF475B80B00B4 +BAA900E7260F4E08D1BFF308DDCAB302F49B515FD338DCD466BCC358E8D8872F +459DF610D01AF32532EEA6C9BEC8BC63BE6CB223242A7D206E61016CA09400E9 +9E67132FE45B344B3292B81672129EC06BBB56EB663575CEBE222888F40C7C38 +F8C0E0A40DA2E530B6D6280ADBABC497DF508BA5A38EC09A11C609FCDF9C2377 +F8E26C248701CC61B6F09D633A003CF6DD28E1B489C10AD2C2501A9856E2A9C5 +01A6111E5676BD7EEF30057233C01ACF30595EACC055F2052B03171BC69A7CA9 +D4EFF02BB0720A6AE73CF7DB1F80918D54E57BAE1F924FD2607AB5FB6FADC4B1 +79E884FB8DE9EB46A8533E1BCA01A054E324B5EE30E427894417BB4594B246B7 +73FE9B5801AC4DBEA7A77E6BFA46168FF02C8CF2656F78A55639199747A54FD4 +07E33BE3A31155FBBE6045C147D70419B8941CACBB1A552A8BD80F559AA63D7D +409D84F8C6AE7F09A631E3CF53C567E5E5C8379ED4FB393263539F6CE08BEB74 +095DD7F6ABEED5335975DFEDED8C27DF1049E2530AF72F4613880A6D7A1EAE54 +FC694E9324B63ACCD766796163EDCE4E5A9C0D7A1C18FEF3F5279EAFC32B3C3F +1FA999D53BB0FD6F62BC250BD75D8F95B17BF74F823DC61FA3C6D0D0294E1D1F +1EF4A1F472EF5B2B529ED647F279A5BEE26F594AB1A730BA4AB0EC51B4811843 +F299642D190F2C6EEC70AA016BE41091DAFF25036D2D28E9F2B97E652A250423 +9C81F7B77EE03E67BCE170FDD3C99EC7E3AECB3DEF216197FD585C4E73F32BBC +3468FDB24135669FC1D2D7671C1BD8ECD4EA541BF59148106F52A8BAF398EF96 +CDF614AC1D089A652CD5C3C2B78D4E7E6950F9B4885318DE3B18D5F2C295293F +5D47DE26C9DF16FEC283567D8239E3C97CD818C35FDD2D7EC5FB6512D53B0E57 +A086B95839129E7CA2197D95DB913C10A8381AA049801A7653490F502BD04E9A +FA322FCF369FF126837968BE92D9C6917D4D111FD79DA9DCC03710B5EE0C477D +8080679B19D7EF864AB0197B64ED78CFD8981698D92065EC1052799A0CFCAAC4 +963DDF1E7985A2C4ED0CC494FB51C6447A71BA635E7EEFB4BE5167EEDDA6A5E2 +CC60ED7887133CCFCCCEAD0AB7A4CED576CF25E374B24D7F2862E925518B4804 +2D2F72E04BEF42E8139265BF3976E82832A0B1AAF47DF21E5A5270698EB4DA6D +FFAB17C19C65827C949953C1007D294AC8053D7570C6FEBD7B7C6D0C7151C297 +8168677B605292EE83E7F4DA147D0EBA8CC04111F01C5BAD0668C9ED3F6F0C95 +7FDD094EA33E0792C9E7851D1CD4B6B3D3680FA63CC99FFBE81B77E0E7CA6D2A +E6825FA45C816C044AFD06844C7C041E624151ABE210C81A0840862DA7B6A8A8 +2C83F9BAE28E9E074962BFF8FD3B1BE17F6CAF5211E26264359C2B33E3A34F84 +62A46587D0B5DE316921BA22706DD3049A86A2F67BE34AFDD8A33809F53635A6 +853C411FE625503BE4F3192BA22C50F58F687A15E6E9E6A71CB5DDF7C69CA071 +17935B116DFAF79C6EFF26CBB637AF3C29AD9700DE81293E088E3ADF012B26E8 +79D64A84C930D5E52A93E19FB44D98B0F500050E5BBA589E7D47E38F044104A8 +57F06D30D3C1B29042BB57F45238073025EFEB0594E687461474C57B719E30F3 +34B50383F969B81C8FECF983983F639ECE5431C2DCCB62888A339A04A4A2CCCC +2CF26D24530FE48170822176CA267CADB5D5BF5B7496820BDF248BDFFF8699AE +62496B64231B937E6B5CB35D250C0261A4F02DBFE7CCC7F6F6609ACF6DFBFF90 +E59A8B13D610C235866F1A7E822B3ED2A9B3F912BDEDC1078B3A1F890D40A69C +46BEB4405E86196BA2F0C91FAFF52EE55498493309EFF19218E8BFA3210DA263 +B6BBDC1B1B7898B43FF1B3A4C11E30CD67B9C1CAFF606CB8A97F6A989C66F508 +ABF86EE9BAB0DEA4BA22051C77D2AACE1641FE9220B1CC795E99F9D77446B14E +7CF033F753901FA50DD77428E18C8F31A5947EB3EED98F159DFD8AFA98DC9DA7 +31377FD084E5ECE5D4D0A960BE68A31EFBBF1F8AF6092054A6DA276F1BA93AEA +23F4BF45D49A89A0A8CCBD44FEFA37D11F05EB76801091F170B8F2976E502F46 +6AC58EA87D933009C05F688F87B191CEEE874C87E7B3291FAD8D38DC3783F208 +C778472ED87FD648E73A5B1FC37ABC18DC9438CC6D46075EFA22E613741C4DF8 +4BBE1608EAFAAA474CDE375EB5E8F7748EBDBB8C1EC93A9226C66F5C5E503523 +AAED793996B0291CA6A92BA6F704869A3DF97F04038A8AC092D01D7D38FDBB6B +9688656C507A47B6B724312D577FBA080669DA30676E15456F7A9F12F8B6EE0E +FB505CAA25D7C4678AF5F798F14A9CBC3F3CA2C09C7DE86A52653D3AC142094B +6FA27728D6D8B3F085A38A9525F73C43A65DA88451D09E5F1BA0214246975C6E +922DDCE24AA9973F6D368903A9BA08CCA68CE2854146AAAF8CD4852B9ED84C10 +7742C94FC1BB35323A4D5306536D5545A21CD4B0FFD491BBB44BE19BCAE59E2D +E47899D8B71EA8F3CDBB5EA7FB98963F0E1DA36732EBF4B6C325E1898DD2084C +059C8E755FCB211906088A919D08387A21019EB44B909F446F328CEF9689D651 +D19E2FA25D3577556DE54C71B8D27CB5060DA2C146A0252FB6E6C3C0E82317C3 +172D8C23A67E303024271125870E0445DA5A009A6EEF6AD5BB6AF874A0C4F3F0 +34EBA8C268ABA8C159B5A9970D8996545C27149C097BC5B46268E770FD86BA13 +83C8DBBCE8D60C8E0EE9B46B7F835E16B2292DBCC58BDF25F7CB2CB91B84D398 +7615B5CA1B326BD632DF34393523494487DE624B76DD325AF6B4B0BD2875A12C +816E2E81AE7AA21284E068704B8EBA17ABB3EDEC961303602459ACA319F5AD55 +17C76BE63E1A55FD705C6213B0217B352BFC33C6C774EBC45840890AD9AA43DF +2256BD37766E42C1C0CDE1238CF532F46368FE093DFA13B836BB592D782FBD36 +C549343D026EC3DD9B0734CB666890E9E8633DCD29243CB4F28E5998D6E8F8E3 +F18D8DA3F99AE1A8386DD087DF1F16E7D588F491B53B0E45A6E1FE1E887CC293 +BB09E68B74DED8DA9AA00493D0E676ABFCC4DFCC4FF4D9783664CD13AE912975 +EB2B7709C27A62092613CC15C9228472FB8FEF513F1129D9353AEAC3EBAC8469 +849E3443F2DC4332DA38B163E949C31D333A4406FD2E25996503030BCAED1528 +198576D3B977D41B77A3A8550D69B82006ECC6822FB2DAEE326D2038352DD433 +FA6C2D8A86CBBF1219978F6E746F203BFDA12E9C65A03CA6A2BC1FBCF0A617FF +E52D5D841B162562F8D5CD989FDB0D935CB4E153FC6D7E1C318F7E95617BAC3A +19B96B3FAEF20A216D3BD8DE25B1AE598EDBDE46C1A62D3964D3767CF4399076 +DA753CD5C3BAD2AC86E0966BCA2A599F710020E6CFAB777420B31EB306994677 +818B9B1FE6D9AFF1C8DC6B88911EF793A6469524075864C9AE5F91D4579F7D74 +934D1B6E07FE3741FDE0B09BCF1BFFB4F63AD3D22E557B54C8A0EBA9AD236E45 +1EF413E03F3A6082D592ED17D4E19045BA3983BBDFE4BD3DE7A2220EE29A4C0D +6B144DBEAA490C2F8B6403AAD5BB7717AE531E3ADE789E3EDBEE53FB189B196D +F64FB7813BA7472B35742AF3AFD75ED88CF7D105C6E2079E5C071108B8A0F1ED +C68216D2A4B3AA02AFFAC4B45D22755ABC4810AA9053A76D4E89FE0B22336C60 +615584AC94FEDDEF30A59B4718DB5775DE20A3083F39CEABF6D06D94DAC9DC95 +5D5FD40E6388D07D1AE31D5CF580978A56041270D4D86AB3CDF8DC13FF173AD4 +157A73E182B861E8AF9665BF620F5B615EFB2201A3AA477C6D02361498C1F769 +D26A8EA27748CB6C8D91B47733105331E1C0C8061B079BCE8D1E1D795465445C +CA7660C46213AEFF533C5E44D2A8FC3EC147AEFDC280CE997A8A045D7E0CA2CE +85A4ABBBB416F6D8FBCE97AA63C228B02681B17D5D71C40589D1FB71BB7E32B6 +A93FF90C5604FABCDFCFC5996E4C4AA1E2718C7EEFAC9B28D164E0EEC750D2C6 +508DD9292479DFB15B31EEB0F69099CC68EE4FE40722EE00D6F505DA6DB65961 +8B6194524B30DAE671461878322FA6F914947EF5CCA5CC847664FAA4D2D5D59B +629765A3AA4B34A1C42758C4879ED92D2CB917469AE7A6530CB9A1B641F8A09D +A960BBD4AF12506DD0FEF5FF7E38ADC69746A8823030857E359ACBBF2FE785EB +D66471F479DD68BF7DB2892CA1B54084653493A43C8BB66EEC577F8B5D6484D7 +9BFDFD72A382268F4D1917D93C687B97A90E45ED0ED9B7F07A35D4989115A5F4 +3ADFEB695B223E70E24BB6170CA492EA0C9BF5ABC429C2204BF82F69DE92C7C3 +086BE7B49CA6DBED8EB43C7303DAC79C37767F5F0D5E302E3F5E2A271F5BD1D3 +DCD3F2BC370BECC49C60FC2D7EFA6A14AECD34C5DDA32A8DB25D688E2BD2F989 +90011D8600047C6422D550E1B2CC3D6A6F85E8E6FF4A1BAE2F28345662FF3CE3 +E59C19724F51F5B7545D1956C98E13C91A8F76C65E350087D686A04D4BDDFC4F +6480363C00AEE361C6FDF28FA51E572472BB5CF701F61B110D1711A19C2658F4 +F058E5D0B2829BF4828238FDCB835847C053A32C25597FB9822CE575FA21E2A4 +0B4F564FC136DD4E5B4A7F531DF2B3BD5648C8F7027622EC463737BA6E989D4E +6AD6E5474C8ECFE80C53B5003914E1DCF46C1023157819DC25274327A99A7A30 +2E2BA87A3190E5241BC9EB070CBE3CA9BD5CFCBB60A0C2AA50AB314AB1BFC499 +7CB6C8D864164D1EBFDCA99D321C66094E1A61232FC9131CD57A4210C8876DE8 +B3C7447099C6BF2C49E49B57A3E3DAED4B806B3368F3D4B5AFCF5EF81EE5AFBD +5FDB91A3A384D2C8F8490589813D8FEF57265CBDB1C17DBBEFE037AC3C227A56 +ABB9114E63FAC205478BD4BD75A9A9FE85FBDB11C691016EFBC55375ACDD0BC6 +EB7568B1A6697718420A06B8286BC097454009FC86AC7923F92E59575C7E1DB6 +CC53F93E7DB17DAB6859E65C3F303B21034B8C8F0D8DBBB210C4D1C8F4F9B3AD +CFE53352EFE9663D05E72EEF73EE36C93841DF7D318FA82E95A87DEB522CE111 +2EEB46C8A809EF588A77B9E6148D66D81035D3820A6A17776D44F0FE57D40FF8 +F48422CE909FEED7CF390A114DE170515A200A04D585C22CF51268CA8C89C0A0 +7AF1BBB4EE3A1A3658B792A8A1C629C841D05FDBAA2C95BF9B8B70174F1C81F7 +0371EB7C39D83BCAB9C3C8967CB36C9E52F34CC5F0704FE113EAC8725B7A60D4 +51414E73373A4A615DAD5851C518252E2A408E9A7BD0661F7ACEAB9464D9AE33 +AEEFB57E6711F9229C8A5943D68C340BDA682F1D2162F0594294A57C6BC9B2D0 +EB14BD58ED48731AD70E87F438AA5724776C97A89A5D8B38B2487EF0F5291133 +6276FC53AD3D1167DA2CED202B11756A91900C9AB09D6A09BC7BE3F7C39C4B3B +4F9380DE7120A4B001D808F76C54BD229ABF6DA9EAB1F640DE6A1988916A18F7 +DA865798DE1826081F7C8E187B008014D4F20C4E684359C88721EB3887B6B093 +8E68007EBE9D5D44990D5EF3A34D357BF9FE0B6D8F74CC528880E4B051DC3B80 +CD0939B888291EC81CF0174DD62C0CCC78E13133BF8168A51BE287522A8C9BD4 +3ED21691E929276EB7AA14538A5A04267708C03575860159DA9A4A9032716894 +183539193969C1D6698E53657BB57E071BE2EFFCEB47DC3111268CB1E72DF6DD +0A656288F33729FF8F49FB227FF7DBE2485D470644B6C07CF8B0B298564E41E8 +B85174E2ECE84ED00E3554F668BC02AD346F429CAB889BB13298834F18CA2A66 +41011B82F359DC27147B8030E27B9660B788AC19E93A6ACA4DEE7F14CB2B5D17 +12C5162DB9F5976071C7AA2BEACB69ACF2845347DAC20B6230C0D9B108AE4246 +DB13290C506F42957107115EBF80268C71E87EBA5F13E4EB2075CD2527DA2969 +1A8C344358C5F3FA928208B028933F2EB079D77334B1FC97FFF19C73833C7F1D +4C29326707E69DAD317099F6FAEF0448DEC23D6347DA21B42E82F3D78A12AADB +D58089919895704DC74C7F51DC08D2D06F75146098215DD6447A83F5273D1002 +E7FAE0AF95B072DE05EF580430BC0834088116B66DB032A392701970C43E18CA +B6E192D158F75C935512FF4F4D5D5B6F1C9766FF74E9ED9BA2A860FA8D59E41F +39064594748B3F329D8DA81C624C32B5E0F196F5D69AB0052D58B09F9653E15A +FADD0A1310352FA8B5650E90865F18C13A86EC50ED850AF71D2A1D526EAF4497 +5E960ED8D3FF21ED94BFDCE03B97663F5DB8F176207F7FA1E96F1BC1B8A6DF00 +FE2EE8217A304930BCA7DB53733AAB0DF733F5EC4E99AAF654FE2EF583506709 +D3BE4BBB892600018C7A1ADBC6B4EFFC5A81B3E5092F65CA6F7A5268046ADC22 +692FCC6A001841139644CE124F3C98F5EE7CA19F3B9F4EF3FDF5898ED14BB078 +9E53E0FD8D3AA9EDC78389864850AD7C55009B251ACC811309098291147AAA26 +524D48DD1CB00885188021204BF304236D6476864CDAADA0F851634027360EEC +E050532007BB84EEEDF5D6775049E3BDE78DA91F7B108637E1DC68F00B123F94 +AA03C537903B317802264C67267213A796A6FCDB107C2D6810B7766A26CB9F40 +2FDF3B6F80FACFB0F09735616A62649F28B4E5DAC6A1F149ECA2B919D1235800 +A129416943A11346EF947EF6A2B3A30008FEA9F28A929A0F33818C5E397EE1F5 +0326FFB11B2D58C31CBBB0DF5FFDE77E942E975BB80BF3B776F6BE07FBDEFE37 +80B4BB323A292EF123C185D8F7DF773193173A8E5887CBAD8E023BF28C4E24D4 +842050725584C730C7B821E2020287270E160740F6EA1F43F79101FC842E09BA +9DCB931427D84A3703A044257258DC0CB794788D1B14695CBD147DF369141C58 +9BFE9D860763D74A99E7CC02025638A15E115B49534C5E8C7DDD31DADC1CA7F9 +6329FFDEE6B8DA728345D93562596276526EA73A0AE56714AA5FA3BB7E372E2C +9D08CF5E9AAD04B1A42193DC5989FB0045E0F2C3C0CFAEC90DAD5A9566546207 +547E9D4E8AB01CA489D09ED795214CB283C3DF9FEB1587617574AA28968E050D +E45BE07CF0A0F9814AED9C690B90D193A4075F35B1A00A81D030C8DC4594FBE9 +5011FA4FA53D1E7131C5AD7559D5DEE8304DF981963FE932A5C6D83BD1650ED7 +C9EFC793B940E79A78FD92E4EA99FACB5CBA5709CA0C94D6C6E683C95CCECF82 +46AB169ADAF958EE22942EDA5442EED65432AD4D4D0579C7E9D32C4E3C996F81 +851E0A8F9C7BF9C02BAC17D72E200A25A5DBA8178D9512EA39A278395116A0DA +C261E9890CDD3A99464E6F4E6846D5FC3E52356970BCFF45820312754EF2D299 +51909A00A172A9654EFC91A3EA0020DEE1F37630AAE66BF50589D2B6C8D2C259 +75AF0F635572C8149B013EF65949AB764985E10FD9E9BD7115A1C55A7849F767 +C1379BDED08845C31D06ACA10B9076B94427D7F19959763F05840517B7B55352 +A30EA7B73B3C03C334FEF11CF62C8C766B95DACCA03319D4021FC37513D2F8D7 +73DD4604FA8DA2ECAB2CD902275D4AE194FF263A49B038DB1ADDAFE5DFF63C00 +541F314CA0125B0E2856643CEC8C46854DC6B13A03DB240CC986A33EDCD1ED6E +1F22D9C3A152EA006A570C636497189E4A177AAAF2B12D827515786DF14CA580 +D82FAA832CF3631058395549B2A249695498852E17AAC26F900DD29FB42B9B14 +DF9691858254F13A84A49DF184F56265A31960FA9864DF802E970B7C1ECF766E +FC587F2A4D4A9A538AE3B7C207F7596F643AB8504824868137E463ECC97DD238 +7FEA8FDB5F8A2A9FD79A95436232E0A7EB2CE9303305953AD9E8DC24B2FAF6A4 +76B7E8CE895D464FEC344C38346B9AD13FB32E4FADE1BBD44DD5A87BB9302584 +B7DD75DF9874C8513281CF98C740C66EA0BBF67CDDE33CDEC8700B8B00C02A7C +63BF1AD24259094B799ED502F64BFF9A17E043F48AD4C8718ABAE844DE1F74DF +7677A8329ED2A0E6EE5B22A95F9B489939421400ACF6D39BB49B6EC1343A3A72 +2971599E41BB197931D928E2CB2107D5F243DBA0ABD767B9A54D4355DC8B8702 +C8E6B84A2EA762D01B02CFCC6D03600CD187C2B08FC83AF29D1226077874A44C +DA81759E07930DD3E781196CE4570988E280653193DC0F5ADFE4D7D4AF188C26 +51C64E402BEF4CD65EC79E0FEAE901104784E23D4ADCF3A0E93835D87B992D95 +5DF80FB1F1CCA9CDF5457B7008FEBC8641423FAAB7BE59DDC52881B356A7135C +29B95BF6B552C3A8253EFC9E0F61967CE59B0BDFF1BAC8788B1323F5E76DBDE2 +5BA0F7FFDEBF22C7F851377642BCC3FD1285F4FFAB73477106A52C6DDA377D3B +C781D35A45DA3DA67A74954EF118750E3C06FAF33487EFC0CC74DE6BA1C4D973 +DD3148814CB3E430B4007E515CDCC8A1CCA0EC0F6FD2456B581C1AA45C266402 +35C268B343B44FEF8FB822AA8BD2C8E7E96B45C351A1DEB2F8F88D69E19FCED1 +36E3E70F16ADCC351DE474DF5C6F1F18869B707A4A35E2137D44543772597BA5 +0FE86DF1504074BBADCDAF0C4EC5186589B0F10A122B409154A0DC949BB78195 +52A56B59967BE621AC6A9D3F7165E2E3AF8D3FCBEDB88D66A004B96BCE8F24E7 +A5298E4F14746A2AFDD4307762D725E9C48A0ED0C3FD2E2A96BDD849BA270B30 +D8D82843593A3AACC6CAC3584111E6F182180427A07757016B0A15253B77B8B5 +67D8C5B04AC8C48B76EB92BC60AFFB7BB376E29D971CB72FB28720788634285C +9F1478226166D8B953A6A0978B24D0EF5A83F0B7A8A1A7C7CF38694CE6FA43B8 +8AFB2EB93590A366AB756AA8DA37F20AD1CD6DDA90C582C3E8CBEAF468CCC792 +49FEA18351C444976E21C4D99B683CAAF0EB682783DCF6B9262615A753150801 +B14F6451584BA046215D406A669B8F452AE0F45BA1D8CFD57E38D4E68CEB7E1B +4548AD3DE7B41B830FC2C83DC0292D4714830A5E8F47812BE422D33291DDFC8E +CBB773503921FA7A4A14B67C81D1DA6B2DF5F621B223B09BB3CBBD1C79365E03 +89D34BFFA843E343FCBB9B5C85D10CA7EB101E08E6B22538E78F72C8381C318C +ACB366A9C5EB4164ABA5F20691223F87AD1AA8A1D60D4C6990ABC487F3026DAF +CA13A23A670817D5E1DE6217150F9F88A3FE8D1661EE1A23EFCFEE6BC6DCD1AC +5EBB91F9AD25ED81E5B25719F7D3A8D42FDD215141DF82A08228CB9C0D5128F0 +E15C6A3736A79A2E695D914736DB708D9C1638CF395053ACFB7678CA86E1B8EC +3D373054240573A161EA75C11EA41F0C5548B52C58B5A6316DC97355F8D58B8E +2F978BAE2C45C104A6EDC6BD75C18AFA19634F3DB0054675CE470103BE0DABCC +F48B1E3B51318256A412BC542A0D1D1BB39426FE871BF8E0EB9E28872B5AD0F8 +32DA58781A99ED850039F22D774996F57E77C61A4CA661FFAEFBAF75BF5B6544 +3BA814FE153ECC2C561E2E21CD07BF5C1A1D94C11B7894C60741CA684EB4DA67 +B2C413EA903B46715C8EA8D89D552F784FE95D97219B9198659B5914E955631D +9A50778E607D9D9B54ADE0F791BE97C9FA35BE1083CA6AFED04897D49D0910CB +7F5FDD8C52FBDB0F2BBFE5DD0F950C460DCC540095F8B98DA3FD0EB216C6C4D3 +546D518D92BA23977CC78CC8CDFCD6F3BFD179952D414AFC1B5C1EAEBAAB1B9C +BE7D5C3E8B1480318BC04F0880596C18E83E5ACBDF2358400DDD01081AD16BE8 +BECAD72887C1D3B942FDF4AEDFFC874411079D87892FDF15BCE85458CBB6C34A +F4BB7EB60BCAB868F785D0848BA771830634B9366F487087255566198681B647 +42CBFA22F80980B0779A5D634575A767CB4A81D818204BAEA74F6AAAC637A580 +3FC8DD430398D0FCC738423D780F8E72DC6BD9D0D750F642348BD654F303F229 +72C037126C2ACABBBF595ADC89E632AAD17CB9A6A69152E8F7213703B521C22F +3A97C7DCA73EA94E62A3B9DD2DFA9995A7977B8F28F45DAB67E8DC9169F29D55 +679FED8D96E3E7DE2F8CEEADC4D9F005171D02667F6021816F46BB114CFC1F61 +F3EE667CB28BD9457DF9F690AFCFBCBDB8F32DD00FAE3004B9976FEA5A92B599 +BA4F0E1B006F7B235F3060D658086660100E0361CC2084C4395984EE86932328 +07C6D9861AC161B69DD7C8A37621C98BA781F19E08385B5D2949F697474512FE +8AD9FAB1E155C207B9F4A4B3B0971DA7806331AE8C4703BB81FE509D745A124B +110FBC72A6484527BB44C159F7DF19F4A47C3757113CFCDE2A790F09DE8C244F +D42B91782D47CF2A7DC03151E36B20E8CE904E79DA3FF07F4A598EDEBEEADA78 +C8175D7FCB87B0736A483EE1A8D2B9A6C2CFD703CD211585A84D1BA077B71D25 +8D0AED5F7EDA97FD1AD237122ECABE4DFD9B5AB9BAD811C9320727DF3398FA5E +B448111128DCF487E0F6D7C8715D8308FC53A0C8A06F5AA4C97CE2CA244BAF4A +79125D476D3D9B8CFD0E1421AAF47A06097FE0CADC027E631BE022CDF940B9AF +5DAA06D9ABEAA35E01B8905557E5D8E36B5A5D40D165D2257A3FED845DA4E7FC +B15B10BC9B02392D79C53B8F1C25895272F7B55FE0FB0746944C82E718043AAF +E9ADFB4C3A5515AA8E8CCA58FA38061D2A1F491675EAF479A3279344F20A85FD +4E7406068273B5909F9FA26A447FF55D17C2AE063B4B9A4546CDEC42FD1D4642 +9E327322346FFCC65ECD92DE5D802E4EC29FE1D3E2FA26B532A1B6BFB8DE58BF +DBEF574225E93E7836856CB751A9DD974D72D8EF55C3B4BFCA1B74660411EFE8 +F288A92BC83E7EE7CC2A85302A8046FDC70E8DF5B450A61ACA17A6BB7359FE8F +56B7F51CA0F3DC69DBEB79CEB66AA45EC776E98AB4156A67D29F9444ACCF48E5 +DE907C11B481A90D275C0C2493F247D3EA95E21A0821A001CAE7708F6B0176C2 +41F4E7C698A2256696D80FBD8D414C43E4C2AB2D2C927B1A6887772AAA189977 +685FB4537E666DABF6042013B2F5CF5EEB322C806F6265B117C276EC86A7905B +DB522EC46C02E8B72F07327EF9C8C980AC693D336E5800B5FD3E84C7DCF859A4 +5D9212FC2191ADF5F2E2FEB294AC8F014FF60E8FCD9537993488CA77D3AA8DA2 +0B72B157621AE6EE16805DBBFAA07DC73F1E1DC1E51A2644711F272BFB359C1C +5A89CED3AAB1C6FEF124EFE5C7D4006828A72C6B6389734CFEDDD0CC03856056 +EF035883DEC58509C28D5349256DBFB7605D3465C1D9F317F7D8BAE9AA53CFBC +923853EA59D8DAE0BA36E147830271B792C6CB75B41CF903DFAE6B4B5C30C312 +13E85A1DD2512AC76786E76575C3EFA5281652F5A6F06B2DBAD10A0C4B77CF12 +DAC9F1ADBA150D51F1EE6C9A5F17D2B437BF672D59C5515BAEAD714EA519DF4D +05414B78ABB12F8F69A98A9427CEFA691688A0E64309EF3D4417F3DA117178AD +C2C964C301A949E02029CF36A017D02C9EBEEBC550FFF8F41E1C20ACD25E5FA6 +4BAE6CC9F685A41504BDE6BCDDF43066E45B4F786088225FE03EB7973970486F +D96763B797424971C67826D960A8661A93E4EDCB6E544AE6283290C9575E6557 +68C39185A7964FC92181B99552FBE1C199EB12648B791C3CF11349CA0E581534 +9693D6D08922D8A8FB148BB2495B64D7674F40AA6DE6245537E86E40C8B8A625 +DF60F5DDB4A3A3F3D269628BBE87203BE0A746D33AA98689FC52719809B52DD4 +E8CC50553F2DC0F994AB25E9BC228C0771E9943A94A12EFC73343B2979161ED7 +D258BED775D280A871A562B0F7A704A0A94F36F601AFB51C8CCCFB4EA2AA9D40 +4F0DEDE814AE53347E169E1719EF5313BE390A038080D98F2ED8232E2BD759C7 +186A61DC3CC15CCACE167AB1970A0D104EC7DE511F45CB68302E3818B3757ABB +E531684333387A71D8FCBD84910ECC73550D39B11B495F181FF3B226752D55C2 +B3E8669B1D013263B8B6EB4BB6978A80B763628E51424223C10039363A6D64B9 +860266F7280812611015FFBB3D8B5B1CA65634DDD10DE619AA6ED80849297D9C +6AFB6FB5C0CC99FD438E04CFE43C187C76A5110A311DB4BB8B670505ED7DB043 +0B0A554AD69D8392CC1938E6FC27F7447278BFBAD9542A807B219591D7CC9CE1 +20961F5349962B490E0717FAC9C3314BB07CCEB6999505516E9C796B1848EF92 +6FDB2ACE69B16946AC910E6A2B7DD0A7953482676086DBA46E3FB4C0C25FE68F +080CFAFC7780CA9AE369A28BDB9C4EEB1B743B5364A34BC23B61C7434D3F107D +F47A07C8D5768F0B70C5F0144B3F8E4AA9FDA63D50BD871E1DA42FA8034DD0DE +BFD7971C26AB2F6F71C37A83D9E396C6BD14588E85901688463B405FAD35D3A4 +32AE3BA2486C9E8359AF5949B29AF91F8630CD9C6F0496387A7EEDF5D18C1615 +147BD65D33A0DC10AAADE9774375C95062C594AD8BAF93187C5C255C845C1DE8 +F0F9467142979FF5CC5F50AECED0B008D58EFDFE55A6C4D0E1AD91685C78E323 +92D2B0AF92FF0E76CAD58A5745CE9BAE6FC16993F8F3839D22B546951703337E +154B4576FC09CDE7EF75664C810D6400FFB669DA4EA2B9D361F1C07425673589 +4FFE2AA71CE04E1394ED60B1195B717A5AC19DFF305AD4F26C72551ED0FC0814 +4C97E10F078441E50C56AFBE120DA1196841D837F76ED41BBB9115E635AB2567 +0993A7D6AE33A562DF54977C034E4B7E2A4B0068615ACD9B62F694CC9C58A1D1 +F7CDB04714F5A3DD71CBB874EAF88DBB64218357A6294DC9015A0078CDFC93AD +0FCAAAB616748A4BF19C265A3FEB24521E80ECD55FC8983543B098301245CB8B +7718847705707790AC435D3F31E85AD5D3097A84DE311ABB89DA7357CDD82558 +00425C6FC81261C4F4A17C458E8AE6F9B118051549462E62934599E08762B837 +30D0A8E50D54A4AD250773E9A0644FD693E544599166C02566598A89C3F16BAE +1F924A84C1E8A07ED179DACA41F88A5006C193D6BC96567F7A13F3A5359548D2 +A233754622805C32F79CAD4F7DBDF43F9C80D9C34AEE35695B963D53D8E8DDEE +056864F3026294E045C4E3981A1CE89A452EC888C8C0287D55E192F281D96C07 +F894FFAC033B8534A4B1CE780C8628AAE08D9FD4153844F3665CC29416F2591E +5B88585CA5A6A1C3DAB903D9A6A362BADF76CFE8E2C031D479921F0A66A5D1CF +15ECBCFFBACEF3A2FC2C0CB19D4859B2D11F348F238578A2315C079C8850EBC8 +791066DE9B8F39DF2A1078845FC3991CC073A7DCBF6C72FFA90C5D5F4BFC09AB +5F13273289FA80847C8A34A29B8FCA3CD320F64DE759269D1F9A015AE49E59B1 +0797631A6A628AA469F347D79CC9C35543191F11B6FF709B9C84B6C8B729F3CE +EFF6C0491A00A3B119D40FA209059C1534836A504F05C95311C87A6122FE85D2 +D27DAF86288EF8A28B8120915FC90014F35A2A2510DF3FD43EC614F90946D5A1 +76168ED657F2AF4B4701EF58855BF5931093D26A56D2345811FEC50CEB4466C4 +786B0D360FD05DE14964F0229585BAA414DE5DA36195E959F4DFA6C05D5D2C2E +D6935443DE7CAB73DDD4F26ADBE1B7B5E16A3A192493A959F08AA460088B04F0 +18B3789637671242F9BD38987C20BD3236C8E0A888FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +TeXDict begin 39158280 55380996 1000 600 600 (llncs.dvi) +@start /Fa 128[39 4[31 37 35 1[35 41 25 31 32 1[39 39 +43 63 20 35 1[24 39 35 24 35 39 35 35 39 9[77 2[55 43 +56 1[52 1[57 69 48 59 40 30 57 59 1[52 58 55 1[57 7[39 +2[39 39 2[39 39 2[24 27 24 2[31 31 20[39 19[{ + TeX74afc74cEncoding ReEncodeFont }52 74.7198 /CMTI9 +rf /Fb 138[44 44 44 44 1[44 44 44 44 2[44 1[44 44 44 +44 1[44 40[44 10[44 44 46[{ TeX09fbbfacEncoding ReEncodeFont }17 +83.022 /CMTT10 rf /Fc 139[24 10[22 35[45 69[{ + TeXaae443f0Encoding ReEncodeFont }3 49.8132 /CMMI6 rf +/Fd 139[22 1[22 8[17 5[25 48[28 50[{ TeX0ef0afcaEncoding ReEncodeFont } +5 41.511 /CMR5 rf /Fe 139[23 5[37 110[{ + TeXaae443f0Encoding ReEncodeFont }2 41.511 /CMMI5 rf +/Ff 149[20 55[45 49[52{ TeXbbad153fEncoding ReEncodeFont }3 +58.1154 /CMSY7 rf /Fg 134[50 50 2[53 37 38 39 1[53 48 +53 80 27 1[29 27 53 48 29 44 53 42 53 46 10[72 1[66 53 +3[72 75 91 6[60 63 1[69 1[72 9[48 48 48 48 48 48 48 2[27 +32 45[{ TeXf7b6d320Encoding ReEncodeFont }40 83.022 /CMBX10 +rf /Fh 165[55 90[{}1 83.022 /MSBM10 rf /Fi 143[83 23[120 +7[88 62[50 50 6[48 48 4[35 35 38 38{}11 83.022 /CMEX10 +rf /Fj 135[38 1[33 1[25 5[41 3[27 23 1[32 2[35 30 12[39 +1[39 12[52 1[49 7[34 61[{ TeXaae443f0Encoding ReEncodeFont }14 +58.1154 /CMMI7 rf /Fk 138[55 55 9[23 2[42 42 10[55 19[49 +11[42 4[0 3[55 83 9[65 5[83 8[65 2[65 65 1[65 15[65 1[65{ + TeXbbad153fEncoding ReEncodeFont }19 83.022 /CMSY10 +rf /Fl 134[40 39 55 38 45 28 34 35 1[42 42 47 68 21 38 +1[25 42 38 25 38 42 38 38 42 9[83 2[59 3[56 6[32 2[54 +11[25 7[42 3[25 30 25 44[{ TeX74afc74cEncoding ReEncodeFont }33 +83.022 /CMTI10 rf /Fm 134[41 47 1[40 48 30 3[42 40 50 +73 2[34 29 48 40 41 39 43 36 36 44 7[48 2[48 57 49 51 +1[66 53 63 67 81 57 2[36 1[65 1[61 1[59 1[62 2[65 42 +65 23 23 42[34 8[65 6[{ TeXaae443f0Encoding ReEncodeFont }42 +83.022 /CMMI10 rf /Fn 135[59 2[62 44 44 46 1[62 56 62 +93 31 59 1[31 62 56 34 51 62 50 1[54 9[116 2[78 1[84 +8[42 3[74 1[81 1[85 10[56 56 56 56 56 56 49[{ + TeXf7b6d320Encoding ReEncodeFont }32 99.6264 /CMBX12 +rf /Fo 135[44 55 37 44 28 5[46 68 4[44 37 2[40 33 33 +8[45 2[45 1[45 47 1[61 1[58 61 6[60 1[57 3[58 5[21 21 +58[{ TeXaae443f0Encoding ReEncodeFont }24 74.7198 /CMMI9 +rf /Fp 136[64 1[49 34 35 36 1[49 44 49 1[25 2[25 49 44 +27 41 49 39 49 43 12[62 13[56 4[67 12[44 44 44 44 2[25 +46[{ TeXf7b6d320Encoding ReEncodeFont }26 74.7198 /CMBX9 +rf /Fq 134[39 2[39 39 39 39 39 1[39 39 39 39 39 2[39 +39 39 39 39 39 39 39 33[39 17[39 1[39 44[{ + TeX09fbbfacEncoding ReEncodeFont }22 74.7198 /CMTT9 +rf /Fr 149[21 2[38 38 10[51 31[38 4[0 3[51 77 15[77 11[60 +20[60{ TeXbbad153fEncoding ReEncodeFont }11 74.7198 /CMSY9 +rf /Fs 129[38 38 1[38 34 41 41 55 41 43 30 30 30 41 43 +38 43 64 21 41 23 21 43 38 23 34 43 34 43 38 21 2[21 +1[21 47 1[58 79 58 58 55 43 57 60 52 60 58 70 48 60 39 +28 58 60 50 52 59 55 54 58 3[60 1[21 21 38 38 38 38 38 +38 38 38 38 38 1[21 26 21 60 1[30 30 21 1[64 4[21 12[38 +4[64 1[43 45 11[{ TeXf7b6d320Encoding ReEncodeFont }83 +74.7198 /CMR9 rf /Ft 139[24 24 24 3[34 4[18 5[27 33[45 +12[30 30 30 30 49[{ TeXf7b6d320Encoding ReEncodeFont }11 +49.8132 /CMR6 rf /Fu 135[35 3[26 26 26 3[37 55 3[19 1[33 +1[30 37 30 37 33 35[51 8[33 33 33 33 7[26 26 40[{ + TeXf7b6d320Encoding ReEncodeFont }20 58.1154 /CMR7 rf +/Fv 128[42 4[37 44 44 60 44 46 32 33 33 44 46 42 46 69 +23 44 25 23 46 42 25 37 46 37 46 42 3[23 42 23 51 62 +1[85 1[62 60 46 61 1[57 65 62 76 52 65 1[30 62 65 54 +57 63 60 59 62 1[39 1[65 1[23 23 42 42 42 42 42 42 42 +42 42 42 1[23 28 23 65 1[32 32 2[69 2[42 14[42 4[69 46 +46 48 11[{ TeXf7b6d320Encoding ReEncodeFont }79 83.022 +/CMR10 rf /Fw 139[52 53 55 2[67 75 112 37 2[37 75 67 +41 61 75 60 1[65 16[92 2[128 4[105 6[102 65[{ + TeXf7b6d320Encoding ReEncodeFont }19 119.552 /CMBX12 +rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%PaperSize: A4 + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 456 387 a Fw(A)45 b(Practical)h(Minimal)f(P)l +(erfect)h(Hashing)g(Metho)t(d)607 676 y Fv(F)-7 b(abiano)27 +b(C.)h(Botelho,)1337 646 y Fu(1)1401 676 y Fv(Y)-7 b(oshiharu)27 +b(Koha)n(y)n(ak)-5 b(a)n(w)n(a,)2273 646 y Fu(2)2334 +676 y Fv(and)27 b(Nivio)h(Ziviani)2969 646 y Fu(1)393 +818 y Ft(1)466 850 y Fs(Dept.)d(of)h(Computer)g(Science,)g(F)-6 +b(ederal)26 b(Univ.)f(of)i(Minas)g(Gerais,)g(Belo)g(Horizon)n(te,)f +(Brazil)1258 941 y Fr(f)p Fq(fbotelho,nivio)p Fr(g)p +Fq(@dcc.ufmg.br)662 1001 y Ft(2)735 1033 y Fs(Dept.)g(of)g(Computer)g +(Science,)g(Univ.)f(of)i(S~)-38 b(ao)26 b(P)n(aulo,)h(S~)-38 +b(ao)26 b(P)n(aulo,)g(Brazil)1492 1124 y Fq(yoshi@ime.usp.br)602 +1378 y Fp(Abstract.)42 b Fs(W)-6 b(e)31 b(prop)r(ose)i(a)g(no)n(v)n(el) +e(algorithm)j(based)e(on)g(random)g(graphs)h(to)602 1470 +y(construct)27 b(minimal)i(p)r(erfect)f(hash)g(functions)d +Fo(h)p Fs(.)k(F)-6 b(or)28 b(a)g(set)g(of)d Fo(n)j Fs(k)n(eys,)g(our)g +(al-)602 1561 y(gorithm)38 b(outputs)24 b Fo(h)37 b Fs(in)h(exp)r +(ected)f(time)25 b Fo(O)r Fs(\()p Fo(n)p Fs(\).)38 b(The)g(ev)l +(aluation)g(of)25 b Fo(h)p Fs(\()p Fo(x)p Fs(\))37 b(re-)602 +1652 y(quires)23 b(t)n(w)n(o)h(memory)g(accesses)i(for)f(an)n(y)e(k)n +(ey)h Fo(x)f Fs(and)g(the)h(description)g(of)i Fo(h)e +Fs(tak)n(es)602 1744 y(up)g(1)p Fo(:)p Fs(15)p Fo(n)h +Fs(w)n(ords.)g(This)g(impro)n(v)n(es)f(the)f(space)i(requiremen)n(t)e +(to)h(55\045)h(of)f(a)h(previ-)602 1835 y(ous)e(minimal)h(p)r(erfect)g +(hashing)f(sc)n(heme)h(due)e(to)i(Czec)n(h,)g(Ha)n(v)l(as)f(and)f(Ma)t +(jewski.)602 1926 y(A)e(simple)i(heuristic)g(further)f(reduces)g(the)g +(space)h(requiremen)n(t)f(to)k(0)p Fo(:)p Fs(93)p Fo(n)e +Fs(w)n(ords,)602 2018 y(at)f(the)h(exp)r(ense)f(of)h(a)g(sligh)n(tly)g +(w)n(orse)h(constan)n(t)f(in)g(the)f(time)h(complexit)n(y)-6 +b(.)22 b(Large)602 2109 y(scale)30 b(exp)r(erimen)n(tal)e(results)i +(are)f(presen)n(ted.)g(F)-6 b(or)28 b(a)i(collection)g(of)f(100)e +(million)602 2200 y(k)n(eys,)g(eac)n(h)i(k)n(ey)e(63)f(b)n(ytes)h(long) +i(on)f(a)n(v)n(erage,)h(our)g(algorithm)g(\014nds)e(a)i(minimal)602 +2292 y(p)r(erfect)d(hash)f(function)h(in)g(811)g(seconds)g(on)g(a)n(v)n +(erage.)365 2574 y Fn(1)112 b(In)m(tro)s(duction)365 +2771 y Fv(Supp)r(ose)25 b Fm(U)39 b Fv(is)30 b(a)g(univ)n(erse)f(of)h +Fl(keys)p Fv(.)h(Let)f Fm(h)d Fv(:)g Fm(U)36 b Fk(!)27 +b Fm(M)39 b Fv(b)r(e)30 b(a)g Fl(hash)j(function)d Fv(that)h(maps)365 +2871 y(the)23 b(k)n(eys)d(from)25 b Fm(U)31 b Fv(to)21 +b(a)h(giv)n(en)f(in)n(terv)-5 b(al)21 b(of)h(in)n(tegers)e +Fm(M)32 b Fv(=)23 b([0)p Fm(;)14 b(m)7 b Fk(\000)g Fv(1])21 +b(=)i Fk(f)p Fv(0)p Fm(;)14 b Fv(1)p Fm(;)g(:)g(:)g(:)e(;)i(m)7 +b Fk(\000)g Fv(1)p Fk(g)p Fv(.)365 2971 y(Let)25 b Fm(S)35 +b Fk(\022)30 b Fm(U)41 b Fv(b)r(e)33 b(a)e(set)h(of)25 +b Fm(n)32 b Fv(k)n(eys)f(from)25 b Fm(U)9 b Fv(.)32 b(Giv)n(en)g(a)f(k) +n(ey)24 b Fm(x)31 b Fk(2)g Fm(S)5 b Fv(,)32 b(the)g(hash)g(function)25 +b Fm(h)365 3070 y Fv(computes)40 b(an)g(in)n(teger)f(in)i([0)p +Fm(;)14 b(m)26 b Fk(\000)g Fv(1])40 b(for)f(the)i(storage)d(or)h +(retriev)-5 b(al)39 b(of)25 b Fm(x)41 b Fv(in)f(a)g Fl(hash)365 +3170 y(table)p Fv(.)26 b(Hashing)f(metho)r(ds)g(for)g +Fl(non-static)i(sets)e Fv(of)g(k)n(eys)f(can)h(b)r(e)h(used)f(to)g +(construct)g(data)365 3269 y(structures)30 b(storing)g +Fm(S)35 b Fv(and)30 b(supp)r(orting)g(mem)n(b)r(ership)h(queries)f(\\)p +Fm(x)e Fk(2)g Fm(S)5 b Fv(?")30 b(in)h(exp)r(ected)365 +3369 y(time)36 b Fm(O)r Fv(\(1\).)h(Ho)n(w)n(ev)n(er,)d(they)h(in)n(v)n +(olv)n(e)f(a)i(certain)e(amoun)n(t)i(of)f(w)n(asted)g(space)g(o)n(wing) +f(to)365 3469 y(un)n(used)h(lo)r(cations)f(in)h(the)g(table)g(and)f(w)n +(aisted)h(time)g(to)f(resolv)n(e)f(collisions)h(when)h(t)n(w)n(o)365 +3568 y(k)n(eys)27 b(are)g(hashed)g(to)g(the)h(same)f(table)h(lo)r +(cation.)490 3668 y(F)-7 b(or)26 b Fl(static)k(sets)c +Fv(of)h(k)n(eys)f(it)i(is)f(p)r(ossible)f(to)h(compute)g(a)g(function)g +(to)g(\014nd)h(an)n(y)e(k)n(ey)g(in)365 3768 y(a)d(table)g(in)g(one)g +(prob)r(e;)f(suc)n(h)h(hash)f(functions)i(are)e(called)g +Fl(p)l(erfe)l(ct)p Fv(.)i(More)e(precisely)-7 b(,)22 +b(giv)n(en)365 3867 y(a)31 b(set)g(of)f(k)n(eys)24 b +Fm(S)5 b Fv(,)31 b(w)n(e)g(shall)f(sa)n(y)g(that)h(a)f(hash)h(function) +25 b Fm(h)k Fv(:)f Fm(U)37 b Fk(!)29 b Fm(M)39 b Fv(is)31 +b(a)g Fl(p)l(erfe)l(ct)i(hash)365 3967 y(function)40 +b Fv(for)25 b Fm(S)38 b Fv(if)26 b Fm(h)33 b Fv(is)h(an)f(injection)h +(on)25 b Fm(S)5 b Fv(,)33 b(that)h(is,)g(there)g(are)e(no)i +Fl(c)l(ol)t(lisions)42 b Fv(among)365 4066 y(the)e(k)n(eys)e(in)25 +b Fm(S)5 b Fv(:)39 b(if)25 b Fm(x)40 b Fv(and)24 b Fm(y)42 +b Fv(are)c(in)25 b Fm(S)44 b Fv(and)25 b Fm(x)42 b Fk(6)p +Fv(=)g Fm(y)s Fv(,)d(then)25 b Fm(h)p Fv(\()p Fm(x)p +Fv(\))43 b Fk(6)p Fv(=)f Fm(h)p Fv(\()p Fm(y)s Fv(\).)d(Figure)25 +b(1\(a\))365 4166 y(illustrates)36 b(a)g(p)r(erfect)h(hash)e(function.) +i(Since)g(no)f(collisions)f(o)r(ccur,)h(eac)n(h)f(k)n(ey)h(can)g(b)r(e) +365 4266 y(retriev)n(ed)e(from)h(the)g(table)g(with)h(a)e(single)h +(prob)r(e.)g(If)25 b Fm(m)35 b Fv(=)g Fm(n)p Fv(,)g(that)g(is,)g(the)h +(table)f(has)365 4365 y(the)28 b(same)e(size)g(as)f Fm(S)5 +b Fv(,)26 b(then)i(w)n(e)e(sa)n(y)g(that)f Fm(h)i Fv(is)f(a)h +Fl(minimal)j(p)l(erfe)l(ct)g(hash)g(function)j Fv(for)24 +b Fm(S)5 b Fv(.)365 4465 y(Figure)25 b(1\(b\))37 b(illustrates)g(a)24 +b(minimal)37 b(p)r(erfect)h(hash)f(function.)h(Minimal)f(p)r(erfect)h +(hash)365 4565 y(functions)28 b(totally)f(a)n(v)n(oid)g(the)g(problem)h +(of)f(w)n(asted)g(space)g(and)g(time.)490 4664 y(Minimal)g(p)r(erfect)h +(hash)f(functions)g(are)f(widely)i(used)f(for)f(memory)h(e\016cien)n(t) +g(storage)365 4764 y(and)i(fast)h(retriev)-5 b(al)28 +b(of)h(items)h(from)f(static)g(sets,)g(suc)n(h)g(as)f(w)n(ords)g(in)i +(natural)e(languages,)365 4863 y(reserv)n(ed)j(w)n(ords)g(in)h +(programming)e(languages)h(or)g(in)n(teractiv)n(e)g(systems,)h(univ)n +(ersal)f(re-)365 4963 y(source)38 b(lo)r(cations)g(\(URLs\))i(in)g(W)-7 +b(eb)39 b(searc)n(h)f(engines,)g(or)h(item)g(sets)g(in)g(data)g(mining) +365 5063 y(tec)n(hniques.)p eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 1192 1507 a + currentpoint currentpoint translate 0.80 0.80 scale neg exch neg exch +translate + 1192 1507 a @beginspecial +0 @llx 0 @lly 279 @urx 168 @ury 2790 @rwi @setspecial +%%BeginDocument: figs/minimalperfecthash-ph-mph.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF + +%%EndDocument + @endspecial 1192 1507 a + currentpoint currentpoint translate 1 0.80 div 1 0.80 div scale neg +exch neg exch translate + 1192 1507 a 962 1682 a Fp(Fig.)14 +b(1.)25 b Fs(\(a\))h(P)n(erfect)h(hash)e(function)77 +b(\(b\))25 b(Minimal)i(p)r(erfect)f(hash)g(function)805 +1842 y Fv(The)19 b(aim)g(of)g(this)g(pap)r(er)g(is)g(to)f(describ)r(e)h +(a)f(new)h(w)n(a)n(y)f(of)h(constructing)f(minimal)h(p)r(erfect)681 +1941 y(hash)j(functions.)h(Our)f(algorithm)g(shares)f(sev)n(eral)g +(features)i(with)g(the)g(one)f(due)h(to)g(Czec)n(h,)681 +2041 y(Ha)n(v)-5 b(as)30 b(and)h(Ma)5 b(jewski)24 b([4)o(].)32 +b(In)f(particular,)f(our)g(algorithm)g(is)h(also)f(based)h(on)g(the)g +(gen-)681 2141 y(eration)d(of)h(random)g(graphs)23 b +Fm(G)j Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\),)30 b(where)24 +b Fm(E)34 b Fv(is)29 b(in)h(one-to-one)e(corresp)r(ondence)681 +2240 y(with)35 b(the)f(k)n(ey)g(set)25 b Fm(S)39 b Fv(for)34 +b(whic)n(h)g(w)n(e)g(wish)g(to)g(generate)g(the)g(hash)g(function.)h +(The)g(t)n(w)n(o)681 2340 y(main)22 b(di\013erences)g(b)r(et)n(w)n(een) +h(our)f(algorithm)f(and)h(theirs)h(are)e(as)h(follo)n(ws:)f(\()p +Fl(i)8 b Fv(\))27 b(w)n(e)22 b(generate)681 2440 y(random)e(graphs)f +Fm(G)k Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))21 b(with)h +Fk(j)p Fm(V)c Fk(j)24 b Fv(=)e Fm(cn)f Fv(and)f Fk(j)p +Fm(E)5 b Fk(j)24 b Fv(=)e Fk(j)p Fm(S)5 b Fk(j)23 b Fv(=)g +Fm(n)p Fv(,)e(where)j Fm(c)f Fk(\025)f Fv(1)p Fm(:)p +Fv(15,)e(and)681 2539 y(hence)25 b Fm(G)j Fv(necessarily)e(con)n(tains) +h(cycles,)h(while)g(they)g(generate)e Fl(acyclic)35 b +Fv(random)27 b(graphs)681 2639 y Fm(G)c Fv(=)g(\()p Fm(V)5 +b(;)14 b(E)5 b Fv(\))28 b(with)g Fk(j)p Fm(V)19 b Fk(j)24 +b Fv(=)e Fm(cn)28 b Fv(and)f Fk(j)p Fm(E)5 b Fk(j)24 +b Fv(=)e Fk(j)p Fm(S)5 b Fk(j)23 b Fv(=)g Fm(n)p Fv(,)28 +b(with)g(a)f(greater)f(n)n(um)n(b)r(er)h(of)h(v)n(ertices:)681 +2738 y Fk(j)p Fm(V)19 b Fk(j)k(\025)g Fv(2)p Fm(:)p Fv(09)p +Fm(n)p Fv(;)j(\()p Fl(ii)8 b Fv(\))27 b(they)h(generate)e(order)g +(preserving)g(minimal)i(p)r(erfect)g(hash)f(functions)681 +2838 y(while)i(our)f(algorithm)g(do)r(es)g(not)h(preserv)n(e)e(order)h +(\(a)h(p)r(erfect)g(hash)g(function)g Fm(h)g Fv(is)g +Fl(or)l(der)681 2938 y(pr)l(eserving)j Fv(if)25 b(the)f(k)n(eys)f(in)i +Fm(S)k Fv(are)22 b(arranged)g(in)i(some)g(giv)n(en)f(order)f(and)j +Fm(h)f Fv(preserv)n(es)d(this)681 3037 y(order)i(in)h(the)h(hash)e +(table\).)i(Th)n(us,)f(our)f(algorithm)g(impro)n(v)n(es)g(the)h(space)g +(requiremen)n(t)f(at)681 3137 y(the)28 b(exp)r(ense)f(of)h(generating)e +(functions)i(that)g(are)e(not)i(order)e(preserving.)805 +3237 y(Our)37 b(algorithm)f(is)i(e\016cien)n(t)f(and)h(ma)n(y)e(b)r(e)i +(tuned)g(to)g(yield)f(a)g(function)26 b Fm(h)37 b Fv(with)h(a)681 +3336 y(v)n(ery)30 b(economical)f(description.)i(As)g(the)g(algorithm)f +(in)25 b([4],)31 b(our)f(algorithm)g(pro)r(duces)24 b +Fm(h)681 3436 y Fv(in)h Fm(O)r Fv(\()p Fm(n)p Fv(\))35 +b(exp)r(ected)g(time)g(for)f(a)g(set)g(of)25 b Fm(n)34 +b Fv(k)n(eys.)g(The)g(description)g(of)24 b Fm(h)35 b +Fv(requires)23 b(1)p Fm(:)p Fv(15)p Fm(n)681 3535 y Fv(computer)k(w)n +(ords,)f(and)h(ev)-5 b(aluating)25 b Fm(h)p Fv(\()p Fm(x)p +Fv(\))j(requires)e(t)n(w)n(o)h(accesses)f(to)h(an)g(arra)n(y)e(of)g(1)p +Fm(:)p Fv(15)p Fm(n)681 3635 y Fv(in)n(tegers.)41 b(W)-7 +b(e)43 b(further)g(deriv)n(e)e(a)i(heuristic)f(that)h(impro)n(v)n(es)e +(the)i(space)f(requiremen)n(t)681 3735 y(from)24 b(1)p +Fm(:)p Fv(15)p Fm(n)c Fv(w)n(ords)g(do)n(wn)g(to)25 b(0)p +Fm(:)p Fv(93)p Fm(n)20 b Fv(w)n(ords.)g(Our)g(sc)n(heme)h(is)g(v)n(ery) +f(practical:)g(to)h(generate)681 3834 y(a)26 b(minimal)h(p)r(erfect)f +(hash)h(function)g(for)f(a)g(collection)g(of)g(100)d(million)k(univ)n +(erse)f(resource)681 3934 y(lo)r(cations)34 b(\(URLs\),)h(eac)n(h)f(63) +g(b)n(ytes)h(long)f(on)g(a)n(v)n(erage,)e(our)i(algorithm)g(running)h +(on)f(a)681 4034 y(commo)r(dit)n(y)27 b(PC)g(tak)n(es)g(811)f(seconds)h +(on)g(a)n(v)n(erage.)681 4214 y Fn(2)112 b(Related)38 +b(W)-9 b(ork)681 4365 y Fv(Czec)n(h,)40 b(Ha)n(v)-5 b(as)41 +b(and)g(Ma)5 b(jewski)24 b([5)o(])41 b(pro)n(vide)f(a)h(comprehensiv)n +(e)f(surv)n(ey)f(of)i(the)h(most)681 4465 y(imp)r(ortan)n(t)d +(theoretical)g(results)g(on)g(p)r(erfect)h(hashing.)e(In)i(the)g(follo) +n(wing,)e(w)n(e)i(review)681 4565 y(some)27 b(of)g(those)h(results.)805 +4664 y(F)-7 b(redman,)27 b(Koml\023)-42 b(os)26 b(and)h(Szemer)n(\023) +-39 b(edi)23 b([10)o(])28 b(sho)n(w)n(ed)e(that)h(it)h(is)f(p)r +(ossible)f(to)h(construct)681 4764 y(space)37 b(e\016cien)n(t)h(p)r +(erfect)h(hash)e(functions)i(that)f(can)g(b)r(e)g(ev)-5 +b(aluated)38 b(in)g(constan)n(t)f(time)681 4863 y(with)k(table)g(sizes) +f(that)h(are)f(linear)g(in)h(the)g(n)n(um)n(b)r(er)f(of)h(k)n(eys:)f +Fm(m)k Fv(=)h Fm(O)r Fv(\()p Fm(n)p Fv(\).)d(In)f(their)681 +4963 y(mo)r(del)25 b(of)h(computation,)f(an)g(elemen)n(t)h(of)f(the)h +(univ)n(erse)e Fm(U)34 b Fv(\014ts)26 b(in)n(to)f(one)g(mac)n(hine)g(w) +n(ord,)681 5063 y(and)39 b(arithmetic)h(op)r(erations)e(and)h(memory)g +(accesses)f(ha)n(v)n(e)h(unit)h(cost.)f(Randomized)p +eop end +%%Page: 3 3 +TeXDict begin 3 2 bop 365 387 a Fv(algorithms)26 b(in)h(the)h(FKS)f(mo) +r(del)g(can)g(construct)f(a)h(p)r(erfect)g(hash)g(function)h(in)f(exp)r +(ected)365 487 y(time)f Fm(O)r Fv(\()p Fm(n)p Fv(\):)i(this)g(is)g(the) +g(case)e(of)i(our)f(algorithm)f(and)i(the)g(w)n(orks)e(in)f([4)o(,)j +(14)o(].)490 590 y(Man)n(y)23 b(metho)r(ds)h(for)g(generating)e +(minimal)i(p)r(erfect)h(hash)e(functions)h(use)g(a)g +Fl(mapping)p Fv(,)365 690 y Fl(or)l(dering)j Fv(and)e +Fl(se)l(ar)l(ching)h Fv(\(MOS\))g(approac)n(h,)e(a)g(description)h +(coined)g(b)n(y)g(F)-7 b(o)n(x,)25 b(Chen)g(and)365 789 +y(Heath)g([9].)38 b(In)f(the)h(MOS)f(approac)n(h,)f(the)i(construction) +f(of)g(a)g(minimal)h(p)r(erfect)g(hash)365 889 y(function)29 +b(is)g(accomplished)e(in)i(three)f(steps.)h(First,)f(the)h(mapping)f +(step)h(transforms)e(the)365 989 y(k)n(ey)i(set)h(from)g(the)g +(original)e(univ)n(erse)h(to)g(a)h(new)f(univ)n(erse.)g(Second,)h(the)g +(ordering)e(step)365 1088 y(places)33 b(the)h(k)n(eys)f(in)h(a)f +(sequen)n(tial)g(order)f(that)i(determines)g(the)g(order)e(in)i(whic)n +(h)g(hash)365 1188 y(v)-5 b(alues)32 b(are)f(assigned)h(to)g(k)n(eys.)f +(Third,)h(the)h(searc)n(hing)d(step)j(attempts)f(to)h(assign)e(hash)365 +1287 y(v)-5 b(alues)37 b(to)g(the)g(k)n(eys.)f(Our)g(algorithm)g(and)h +(the)g(algorithm)f(presen)n(ted)g(in)25 b([4])37 b(use)g(the)365 +1387 y(MOS)28 b(approac)n(h.)490 1490 y(P)n(agh)23 b([14)o(])i(prop)r +(osed)e(a)h(family)g(of)h(randomized)e(algorithms)g(for)h(constructing) +f(mini-)365 1590 y(mal)i(p)r(erfect)g(hash)g(functions.)g(The)g(form)g +(of)g(the)g(resulting)g(function)g(is)g Fm(h)p Fv(\()p +Fm(x)p Fv(\))f(=)f(\()p Fm(f)9 b Fv(\()p Fm(x)p Fv(\))k(+)365 +1689 y Fm(d)408 1704 y Fj(g)r Fu(\()p Fj(x)p Fu(\))537 +1689 y Fv(\))23 b(mo)r(d)g Fm(n)p Fv(,)31 b(where)f Fm(f)39 +b Fv(and)30 b Fm(g)j Fv(are)c(univ)n(ersal)h(hash)g(functions)g(and)h +Fm(d)f Fv(is)h(a)f(set)g(of)h(dis-)365 1789 y(placemen)n(t)i(v)-5 +b(alues)32 b(to)h(resolv)n(e)d(collisions)i(that)h(are)f(caused)g(b)n +(y)g(the)h(function)g Fm(f)9 b Fv(.)33 b(P)n(agh)365 +1889 y(iden)n(ti\014ed)e(a)f(set)g(of)g(conditions)g(concerning)f +Fm(f)39 b Fv(and)30 b Fm(g)j Fv(and)d(sho)n(w)n(ed)f(that)h(if)h(these) +f(con-)365 1988 y(ditions)h(are)e(satis\014ed,)h(then)h(a)f(minimal)h +(p)r(erfect)g(hash)f(function)h(can)f(b)r(e)g(computed)h(in)365 +2088 y(exp)r(ected)f(time)f Fm(O)r Fv(\()p Fm(n)p Fv(\))h(and)f(stored) +f(in)i(\(2)19 b(+)g Fm(\017)p Fv(\))p Fm(n)29 b Fv(computer)f(w)n +(ords.)g(Dietzfelbinger)h(and)365 2187 y(Hagerup)24 b([6])e(impro)n(v)n +(ed)i([14)o(],)f(reducing)e(from)i(\(2)8 b(+)g Fm(\017)p +Fv(\))p Fm(n)22 b Fv(to)g(\(1)8 b(+)g Fm(\017)p Fv(\))p +Fm(n)22 b Fv(the)h(n)n(um)n(b)r(er)f(of)h(com-)365 2287 +y(puter)29 b(w)n(ords)e(required)h(to)h(store)e(the)j(function,)f(but)g +(in)g(their)g(approac)n(h)23 b Fm(f)37 b Fv(and)25 b +Fm(g)31 b Fv(m)n(ust)365 2387 y(b)r(e)25 b(c)n(hosen)f(from)g(a)h +(class)e(of)i(hash)f(functions)h(that)g(meet)g(additional)f(requiremen) +n(ts.)g(Dif-)365 2486 y(feren)n(tly)k(of)g(the)g(w)n(orks)f(in)e([14)o +(,)j(6],)g(our)f(algorithm)g(uses)g(t)n(w)n(o)h(univ)n(ersal)e(hash)i +(functions)365 2586 y Fm(h)413 2598 y Fu(1)474 2586 y +Fv(and)23 b Fm(h)679 2598 y Fu(2)740 2586 y Fv(randomly)f(selected)h +(from)g(a)g(class)g(of)g(univ)n(ersal)f(hash)h(functions)h(that)f(do)g +(not)365 2686 y(need)28 b(to)f(meet)h(an)n(y)f(additional)g(requiremen) +n(ts.)490 2789 y(The)40 b(w)n(ork)f(in)25 b([4])40 b(presen)n(ts)f(an)h +(e\016cien)n(t)h(and)f(practical)f(algorithm)g(for)h(generat-)365 +2888 y(ing)27 b(order)f(preserving)g(minimal)h(p)r(erfect)h(hash)e +(functions.)i(Their)f(metho)r(d)g(in)n(v)n(olv)n(es)f(the)365 +2988 y(generation)34 b(of)h(acyclic)f(random)g(graphs)g +Fm(G)h Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))36 b(with)25 +b Fk(j)p Fm(V)19 b Fk(j)36 b Fv(=)f Fm(cn)g Fv(and)g +Fk(j)p Fm(E)5 b Fk(j)35 b Fv(=)g Fm(n)p Fv(,)365 3088 +y(with)41 b Fm(c)j Fk(\025)g Fv(2)p Fm(:)p Fv(09.)39 +b(They)h(sho)n(w)n(ed)f(that)h(an)g(order)f(preserving)g(minimal)h(p)r +(erfect)h(hash)365 3187 y(function)c(can)f(b)r(e)h(found)g(in)f +(optimal)g(time)h(if)25 b Fm(G)37 b Fv(is)f(acyclic.)g(T)-7 +b(o)36 b(generate)f(an)h(acyclic)365 3287 y(graph,)e(t)n(w)n(o)g(v)n +(ertices)f Fm(h)1150 3299 y Fu(1)1188 3287 y Fv(\()p +Fm(x)p Fv(\))i(and)g Fm(h)1551 3299 y Fu(2)1588 3287 +y Fv(\()p Fm(x)p Fv(\))h(are)d(computed)i(for)f(eac)n(h)g(k)n(ey)g +Fm(x)i Fk(2)f Fm(S)5 b Fv(.)34 b(Th)n(us,)365 3386 y(eac)n(h)d(set)25 +b Fm(S)36 b Fv(has)31 b(a)g(corresp)r(onding)f(graph)23 +b Fm(G)30 b Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\),)32 +b(where)f Fm(V)48 b Fv(=)29 b Fk(f)p Fv(0)p Fm(;)14 b +Fv(1)p Fm(;)g(:)g(:)g(:)e(;)i(t)p Fk(g)31 b Fv(and)365 +3486 y Fm(E)d Fv(=)542 3419 y Fi(\010)590 3486 y Fk(f)p +Fm(h)680 3498 y Fu(1)717 3486 y Fv(\()p Fm(x)p Fv(\))p +Fm(;)14 b(h)913 3498 y Fu(2)951 3486 y Fv(\()p Fm(x)p +Fv(\))p Fk(g)24 b Fv(:)f Fm(x)g Fk(2)h Fm(S)1379 3419 +y Fi(\011)1427 3486 y Fv(.)c(In)g(order)e(to)i(guaran)n(tee)e(the)j +(acyclicit)n(y)e(of)24 b Fm(G)p Fv(,)d(the)f(algo-)365 +3586 y(rithm)h(rep)r(eatedly)g(selects)f Fm(h)1289 3598 +y Fu(1)1348 3586 y Fv(and)g Fm(h)1550 3598 y Fu(2)1608 +3586 y Fv(from)h(a)g(family)g(of)f(univ)n(ersal)g(hash)h(functions)g +(un)n(til)365 3685 y(the)30 b(corresp)r(onding)d(graph)g(is)i(acyclic.) +f(Ha)n(v)-5 b(as)28 b(et)i(al.)24 b([11)o(])29 b(pro)n(v)n(ed)f(that)h +(if)g Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)27 +b Fv(=)d Fm(cn)365 3785 y Fv(and)37 b Fm(c)h(>)f Fv(2,)g(then)g(the)g +(probabilit)n(y)e(that)25 b Fm(G)37 b Fv(is)g(acyclic)f(is)g +Fm(p)i Fv(=)g Fm(e)2562 3755 y Fu(1)p Fj(=c)2662 3714 +y Fi(p)p 2745 3714 321 4 v 71 x Fv(\()p Fm(c)19 b Fk(\000)f +Fv(2\))p Fm(=c)o Fv(.)37 b(F)-7 b(or)365 3885 y Fm(c)23 +b Fv(=)g(2)p Fm(:)p Fv(09,)i(this)h(probabilit)n(y)f(is)h +Fm(p)d Fk(')g Fv(0)p Fm(:)p Fv(342,)h(and)i(the)h(exp)r(ected)f(n)n(um) +n(b)r(er)g(of)g(iterations)f(to)365 3984 y(obtain)j(an)f(acyclic)g +(graph)f(is)f(1)p Fm(=p)d Fk(')g Fv(2)p Fm(:)p Fv(92.)365 +4187 y Fn(3)112 b(The)38 b(Algorithm)365 4362 y Fv(Let)33 +b(us)f(sho)n(w)f(ho)n(w)h(the)h(minimal)f(p)r(erfect)h(hash)f(function) +25 b Fm(h)33 b Fv(will)f(b)r(e)h(constructed.)f(W)-7 +b(e)365 4462 y(mak)n(e)35 b(use)h(of)g(t)n(w)n(o)f(auxiliary)f(random)h +(functions)25 b Fm(h)2080 4474 y Fu(1)2153 4462 y Fv(and)g +Fm(h)2360 4474 y Fu(2)2434 4462 y Fv(:)37 b Fm(U)45 b +Fk(!)37 b Fm(V)19 b Fv(,)36 b(where)24 b Fm(V)56 b Fv(=)365 +4561 y([0)p Fm(;)14 b(t)23 b Fk(\000)h Fv(1])35 b(for)g(some)f +(suitably)i(c)n(hosen)e(in)n(teger)24 b Fm(t)36 b Fv(=)g +Fm(cn)p Fv(,)f(where)g Fm(n)h Fv(=)g Fk(j)p Fm(S)5 b +Fk(j)p Fv(.)35 b(W)-7 b(e)36 b(build)g(a)365 4661 y(random)28 +b(graph)c Fm(G)i Fv(=)e Fm(G)p Fv(\()p Fm(h)1229 4673 +y Fu(1)1267 4661 y Fm(;)14 b(h)1352 4673 y Fu(2)1389 +4661 y Fv(\))29 b(on)c Fm(V)19 b Fv(,)29 b(whose)f(edge)h(set)g(is)2330 +4594 y Fi(\010)2379 4661 y Fk(f)p Fm(h)2469 4673 y Fu(1)2505 +4661 y Fv(\()p Fm(x)p Fv(\))p Fm(;)14 b(h)2701 4673 y +Fu(2)2739 4661 y Fv(\()p Fm(x)p Fv(\))p Fk(g)26 b Fv(:)g +Fm(x)f Fk(2)h Fm(S)3176 4594 y Fi(\011)3224 4661 y Fv(.)365 +4760 y(There)h(is)h(an)f(edge)g(in)e Fm(G)j Fv(for)f(eac)n(h)g(k)n(ey)g +(in)h(the)g(set)g(of)f(k)n(eys)d Fm(S)5 b Fv(.)490 4863 +y(In)26 b(what)h(follo)n(ws,)e(w)n(e)i(shall)f(b)r(e)g(in)n(terested)h +(in)f(the)h Fl(2-c)l(or)l(e)33 b Fv(of)27 b(the)g(random)e(graph)f +Fm(G)p Fv(,)365 4963 y(that)36 b(is,)g(the)g(maximal)g(subgraph)e(of)25 +b Fm(G)36 b Fv(with)h(minimal)f(degree)e(at)i(least)24 +b(2)36 b(\(see,)g(e.g.,)365 5063 y([1,)e(12)o(]\).)h(Because)d(of)i +(its)h(imp)r(ortance)e(in)h(our)g(con)n(text,)f(w)n(e)h(call)f(the)i +(2-core)d(the)i Fl(crit-)365 5162 y(ic)l(al)44 b Fv(subgraph)33 +b(of)24 b Fm(G)35 b Fv(and)e(denote)h(it)h(b)n(y)24 b +Fm(G)1797 5174 y Fu(crit)1902 5162 y Fv(.)34 b(The)g(v)n(ertices)f(and) +g(edges)h(in)25 b Fm(G)2998 5174 y Fu(crit)3136 5162 +y Fv(are)p eop end +%%Page: 4 4 +TeXDict begin 4 3 bop 681 387 a Fv(said)32 b(to)h(b)r(e)g +Fl(critic)l(al)p Fv(.)h(W)-7 b(e)33 b(let)25 b Fm(V)1700 +399 y Fu(crit)1837 387 y Fv(=)31 b Fm(V)19 b Fv(\()p +Fm(G)2097 399 y Fu(crit)2202 387 y Fv(\))33 b(and)24 +b Fm(E)2486 399 y Fu(crit)2623 387 y Fv(=)31 b Fm(E)5 +b Fv(\()p Fm(G)2882 399 y Fu(crit)2987 387 y Fv(\).)33 +b(Moreo)n(v)n(er,)d(w)n(e)681 487 y(let)25 b Fm(V)846 +499 y Fu(ncrit)1010 487 y Fv(=)e Fm(V)36 b Fk(\000)16 +b Fm(V)1311 499 y Fu(crit)1443 487 y Fv(b)r(e)27 b(the)g(set)g(of)g +Fl(non-critic)l(al)h Fv(v)n(ertices)e(in)f Fm(G)p Fv(.)i(W)-7 +b(e)27 b(also)f(let)f Fm(V)3344 499 y Fu(scrit)3498 487 +y Fk(\022)681 587 y Fm(V)729 599 y Fu(crit)865 587 y +Fv(b)r(e)31 b(the)g(set)g(of)g(all)g(critical)f(v)n(ertices)g(that)h +(ha)n(v)n(e)f(at)h(least)f(one)h(non-critical)f(v)n(ertex)681 +686 y(as)e(a)h(neigh)n(b)r(our.)f(Let)h Fm(E)1478 698 +y Fu(ncrit)1644 686 y Fv(=)c Fm(E)5 b Fv(\()p Fm(G)p +Fv(\))20 b Fk(\000)f Fm(E)2094 698 y Fu(crit)2228 686 +y Fv(b)r(e)29 b(the)g(set)g(of)g Fl(non-critic)l(al)h +Fv(edges)e(in)d Fm(G)p Fv(.)681 786 y(Finally)-7 b(,)27 +b(w)n(e)g(let)e Fm(G)1283 798 y Fu(ncrit)1447 786 y Fv(=)e(\()p +Fm(V)1615 798 y Fu(ncrit)1774 786 y Fk([)18 b Fm(V)1895 +798 y Fu(scrit)2026 786 y Fm(;)c(E)2124 798 y Fu(ncrit)2266 +786 y Fv(\))27 b(b)r(e)h(the)f Fl(non-critic)l(al)h Fv(subgraph)f(of)d +Fm(G)p Fv(.)681 886 y(The)d(non-critical)f(subgraph)g +Fm(G)1696 898 y Fu(ncrit)1859 886 y Fv(corresp)r(onds)g(to)h(the)g +(\\acyclic)f(part")h(of)k Fm(G)p Fv(.)c(W)-7 b(e)22 b(ha)n(v)n(e)681 +985 y Fm(G)h Fv(=)g Fm(G)922 997 y Fu(crit)1045 985 y +Fk([)c Fm(G)1184 997 y Fu(ncrit)1325 985 y Fv(.)805 1085 +y(W)-7 b(e)35 b(then)g(construct)e(a)h(suitable)g(lab)r(elling)g +Fm(g)i Fv(:)f Fm(V)52 b Fk(!)34 b Fh(Z)h Fv(of)f(the)h(v)n(ertices)e +(of)25 b Fm(G)p Fv(:)34 b(w)n(e)681 1185 y(c)n(ho)r(ose)23 +b Fm(g)s Fv(\()p Fm(v)s Fv(\))34 b(for)f(eac)n(h)24 b +Fm(v)35 b Fk(2)e Fm(V)19 b Fv(\()p Fm(G)p Fv(\))34 b(in)f(suc)n(h)g(a)g +(w)n(a)n(y)f(that)25 b Fm(h)p Fv(\()p Fm(x)p Fv(\))33 +b(=)f Fm(g)s Fv(\()p Fm(h)2968 1197 y Fu(1)3005 1185 +y Fv(\()p Fm(x)p Fv(\)\))24 b(+)d Fm(g)s Fv(\()p Fm(h)3381 +1197 y Fu(2)3418 1185 y Fv(\()p Fm(x)p Fv(\)\))681 1285 +y(\()p Fm(x)26 b Fk(2)g Fm(S)5 b Fv(\))29 b(is)g(a)f(minimal)i(p)r +(erfect)f(hash)g(function)g(for)c Fm(S)5 b Fv(.)29 b(W)-7 +b(e)29 b(will)g(see)g(later)f(on)h(that)g(this)681 1384 +y(lab)r(elling)24 b Fm(g)29 b Fv(can)c(b)r(e)i(found)f(in)g(linear)f +(time)i(if)f(the)g(n)n(um)n(b)r(er)g(of)g(edges)f(in)h +Fm(G)3075 1396 y Fu(crit)3205 1384 y Fv(is)g(at)g(most)691 +1451 y Fu(1)p 691 1465 34 4 v 691 1512 a(2)734 1484 y +Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)805 +1584 y(Figure)25 b(2)36 b(presen)n(ts)h(a)g(pseudo)f(co)r(de)h(for)g +(the)h(algorithm.)e(The)h(pro)r(cedure)f(Gener-)681 1684 +y(ateMPHF)23 b(\()p Fm(S)5 b Fv(,)23 b Fm(g)s Fv(\))g(receiv)n(es)f(as) +h(input)h(the)g(set)f(of)g(k)n(eys)h Fm(S)k Fv(and)23 +b(pro)r(duces)g(the)g(lab)r(elling)i Fm(g)s Fv(.)681 +1783 y(The)f(metho)r(d)g(uses)f(a)g(mapping,)h(ordering)e(and)h(searc)n +(hing)f(approac)n(h.)g(W)-7 b(e)24 b(no)n(w)f(describ)r(e)681 +1883 y(eac)n(h)k(step.)p 677 2066 5 52 v 677 2019 52 +5 v 728 2019 2788 5 v 3516 2019 52 5 v 3564 2066 5 52 +v 677 2145 5 75 v 3563 2145 V 725 2122 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m +(r)m(e)39 b Fs(GenerateMPHF)45 b(\()5 b Fo(S)13 b Fs(,)49 +b Fo(g)8 b Fs(\))p 677 2223 V 3563 2223 V 844 2201 a(M)n(a)n(p)n(p)n(i) +n(n)n(g)40 b(\()5 b Fo(S)13 b Fs(,)49 b Fo(G)9 b Fs(\))g(;)p +677 2302 V 3563 2302 V 849 2279 a(O)r(r)r(d)r(e)r(r)r(i)r(n)r(g)45 +b(\()5 b Fo(G)k Fs(,)49 b Fo(G)1441 2287 y Ft(crit)1547 +2279 y Fs(,)g Fo(G)1677 2287 y Ft(ncrit)1817 2279 y Fs(\))9 +b(;)p 677 2380 V 3563 2380 V 850 2358 a(S)s(e)s(a)s(r)s(c)s(h)s(i)s(n)s +(g)49 b(\()5 b Fo(G)k Fs(,)49 b Fo(G)1481 2366 y Ft(crit)1587 +2358 y Fs(,)g Fo(G)1717 2366 y Ft(ncrit)1857 2358 y Fs(,)g +Fo(g)12 b Fs(\))d(;)p 677 2431 5 52 v 678 2431 52 5 v +728 2431 2788 5 v 3516 2431 52 5 v 3564 2431 5 52 v 697 +2598 a Fp(Fig.)k(2.)26 b Fs(Main)g(steps)g(of)g(the)g(algorithm)h(for)f +(constructing)g(a)g(minimal)h(p)r(erfect)f(hash)g(function)681 +2789 y Fg(3.1)94 b(Mapping)32 b(Step)681 2958 y Fv(The)24 +b(pro)r(cedure)f(Mapping)h(\()p Fm(S)5 b Fv(,)24 b Fm(G)p +Fv(\))h(receiv)n(es)e(as)g(input)i(the)g(set)f(of)g(k)n(eys)g +Fm(S)29 b Fv(and)24 b(generates)681 3058 y(the)41 b(random)e(graph)h +Fm(G)45 b Fv(=)f Fm(G)p Fv(\()p Fm(h)1767 3070 y Fu(1)1805 +3058 y Fm(;)14 b(h)1890 3070 y Fu(2)1927 3058 y Fv(\),)41 +b(b)n(y)f(generating)f(t)n(w)n(o)h(auxiliary)f(functions)26 +b Fm(h)3503 3070 y Fu(1)3540 3058 y Fv(,)681 3158 y Fm(h)729 +3170 y Fu(2)789 3158 y Fv(:)d Fm(U)32 b Fk(!)23 b Fv([0)p +Fm(;)14 b(t)k Fk(\000)g Fv(1].)805 3258 y(The)30 b(functions)25 +b Fm(h)1381 3270 y Fu(1)1448 3258 y Fv(and)g Fm(h)1655 +3270 y Fu(2)1722 3258 y Fv(are)k(constructed)g(as)g(follo)n(ws.)g(W)-7 +b(e)31 b(imp)r(ose)e(some)h(upp)r(er)681 3357 y(b)r(ound)25 +b Fm(L)34 b Fv(on)h(the)g(lengths)g(of)g(the)g(k)n(eys)f(in)25 +b Fm(S)5 b Fv(.)35 b(T)-7 b(o)34 b(de\014ne)25 b Fm(h)2656 +3369 y Fj(j)2726 3357 y Fv(\()p Fm(j)40 b Fv(=)35 b(1,2\),)g(w)n(e)f +(generate)681 3457 y(an)24 b Fm(L)g Fk(\002)f Fm(\006)40 +b Fv(table)35 b(of)h(random)e(in)n(tegers)24 b(table)2182 +3469 y Fj(j)2217 3457 y Fv(.)35 b(F)-7 b(or)35 b(a)g(k)n(ey)24 +b Fm(x)37 b Fk(2)f Fm(S)k Fv(of)c(length)25 b Fk(j)p +Fm(x)p Fk(j)36 b(\024)g Fm(L)681 3557 y Fv(and)24 b Fm(j)k +Fk(2)c(f)p Fv(1)p Fm(;)14 b Fv(2)p Fk(g)p Fv(,)26 b(w)n(e)h(let)1492 +3823 y Fm(h)1540 3835 y Fj(j)1575 3823 y Fv(\()p Fm(x)p +Fv(\))d(=)1798 3731 y Fi(\020)1882 3712 y Ff(j)p Fj(x)p +Ff(j)1861 3744 y Fi(X)1867 3921 y Fj(i)p Fu(=1)1995 3823 +y Fv(table)2175 3835 y Fj(j)2210 3823 y Fv([)p Fm(i;)14 +b(x)p Fv([)p Fm(i)p Fv(]])2444 3731 y Fi(\021)2516 3823 +y Fv(mo)r(d)23 b Fm(t:)681 4074 y Fv(The)37 b(random)f(graph)24 +b Fm(G)39 b Fv(=)f Fm(G)p Fv(\()p Fm(h)1760 4086 y Fu(1)1798 +4074 y Fm(;)14 b(h)1883 4086 y Fu(2)1920 4074 y Fv(\))37 +b(has)g(v)n(ertex)f(set)25 b Fm(V)58 b Fv(=)38 b([0)p +Fm(;)14 b(t)24 b Fk(\000)h Fv(1])36 b(and)h(edge)g(set)681 +4107 y Fi(\010)729 4174 y Fk(f)p Fm(h)819 4186 y Fu(1)856 +4174 y Fv(\()p Fm(x)p Fv(\))p Fm(;)14 b(h)1052 4186 y +Fu(2)1090 4174 y Fv(\()p Fm(x)p Fv(\))p Fk(g)31 b Fv(:)f +Fm(x)h Fk(2)f Fm(S)1546 4107 y Fi(\011)1594 4174 y Fv(.)i(W)-7 +b(e)33 b(need)25 b Fm(G)32 b Fv(to)g(b)r(e)g(simple,)g(i.e.,)g +Fm(G)25 b Fv(should)32 b(ha)n(v)n(e)f(neither)681 4274 +y(lo)r(ops)24 b(nor)g(m)n(ultiple)h(edges.)f(A)h(lo)r(op)f(o)r(ccurs)g +(when)h Fm(h)2384 4286 y Fu(1)2421 4274 y Fv(\()p Fm(x)p +Fv(\))f(=)f Fm(h)2692 4286 y Fu(2)2729 4274 y Fv(\()p +Fm(x)p Fv(\))j(for)e(some)g Fm(x)f Fk(2)h Fm(S)5 b Fv(.)24 +b(W)-7 b(e)681 4373 y(solv)n(e)23 b(this)j(in)f(an)f(ad)h(ho)r(c)f +(manner:)h(w)n(e)f(simply)h(let)g Fm(h)2379 4385 y Fu(2)2416 +4373 y Fv(\()p Fm(x)p Fv(\))f(=)f(\(2)p Fm(h)2761 4385 +y Fu(1)2798 4373 y Fv(\()p Fm(x)p Fv(\))13 b(+)g(1\))23 +b(mo)r(d)g Fm(t)i Fv(in)g(this)681 4473 y(case.)g(If)i(w)n(e)f(still)h +(\014nd)g(a)e(lo)r(op)h(after)g(this,)h(w)n(e)f(generate)f(another)h +(pair)f(\()p Fm(h)3039 4485 y Fu(1)3077 4473 y Fm(;)14 +b(h)3162 4485 y Fu(2)3198 4473 y Fv(\).)27 b(When)g(a)681 +4572 y(m)n(ultiple)h(edge)f(o)r(ccurs)g(w)n(e)g(ab)r(ort)g(and)g +(generate)g(a)g(new)g(pair)e(\()p Fm(h)2780 4584 y Fu(1)2817 +4572 y Fm(;)14 b(h)2902 4584 y Fu(2)2939 4572 y Fv(\).)681 +4741 y Fg(Analysis)33 b(of)g(the)h(Mapping)f(Step.)77 +b Fv(W)-7 b(e)29 b(start)g(b)n(y)g(discussing)f(some)h(facts)g(on)g +(ran-)681 4841 y(dom)k(graphs.)e(Let)25 b Fm(G)32 b Fv(=)g(\()p +Fm(V)5 b(;)14 b(E)5 b Fv(\))34 b(with)f Fk(j)p Fm(V)19 +b Fk(j)32 b Fv(=)g Fm(t)h Fv(and)f Fk(j)p Fm(E)5 b Fk(j)32 +b Fv(=)g Fm(n)h Fv(b)r(e)g(a)g(random)f(graph)f(in)681 +4963 y(the)e(uniform)f(mo)r(del)d Fk(G)5 b Fv(\()p Fm(t;)14 +b(n)p Fv(\),)29 b(the)g(mo)r(del)g(in)f(whic)n(h)h(all)f(the)2652 +4896 y Fi(\000)2690 4932 y Fv(\()2725 4899 y Fe(t)2722 +4946 y Fd(2)2751 4932 y Fv(\))2716 4992 y Fj(n)2783 4896 +y Fi(\001)2850 4963 y Fv(graphs)f(on)d Fm(V)47 b Fv(with)26 +b Fm(n)681 5063 y Fv(edges)k(are)g(equiprobable.)g(The)i(study)f(of)25 +b Fk(G)5 b Fv(\()p Fm(t;)14 b(n)p Fv(\))31 b(go)r(es)g(bac)n(k)f(to)h +(the)g(classical)f(w)n(ork)g(of)p eop end +%%Page: 5 5 +TeXDict begin 5 4 bop 365 387 a Fv(Erd\177)-42 b(os)31 +b(and)h(R)n(\023)-39 b(en)n(yi)23 b([7,)32 b(8,)g(13)o(])g(\(for)g(a)f +(mo)r(dern)h(treatmen)n(t,)g(see)24 b([1,)32 b(12)o(]\).)h(Let)f +Fm(d)e Fv(=)g(2)p Fm(n=t)365 487 y Fv(b)r(e)38 b(the)g(a)n(v)n(erage)c +(degree)i(of)h Fm(G)p Fv(.)h(It)g(is)f(w)n(ell)g(kno)n(wn)f(that,)i(if) +25 b Fm(d)39 b(>)g Fv(1,)e(or,)f(equiv)-5 b(alen)n(tly)e(,)365 +587 y(if)26 b Fm(c)h(<)g Fv(2)j(\(recall)g(that)h(w)n(e)f(ha)n(v)n(e)f +Fm(t)f Fv(=)f Fm(cn)p Fv(\),)j(then,)h(almost)f(ev)n(ery)24 +b Fm(G)30 b Fv(con)n(tains)2843 557 y Fu(3)2910 587 y +Fv(a)g(\\gian)n(t")365 686 y(comp)r(onen)n(t)24 b(of)f(order)h(\(1)10 +b(+)g Fm(o)p Fv(\(1\)\))p Fm(bt)p Fv(,)23 b(where)i Fm(b)d +Fv(=)h(1)10 b Fk(\000)g Fm(T)f(=d)p Fv(,)23 b(and)i(0)d +Fm(<)h(T)34 b(<)23 b Fv(1)g(is)g(the)h(unique)365 786 +y(solution)g(to)h(the)g(equation)f Fm(T)12 b(e)1351 756 +y Ff(\000)p Fj(T)1477 786 y Fv(=)23 b Fm(de)1647 756 +y Ff(\000)p Fj(d)1737 786 y Fv(.)i(Moreo)n(v)n(er,)d(all)i(the)h(other) +f(comp)r(onen)n(ts)g(of)h Fm(G)365 886 y Fv(ha)n(v)n(e)f +Fm(O)r Fv(\(log)15 b Fm(t)p Fv(\))26 b(v)n(ertices.)g(Also,)g(the)g(n)n +(um)n(b)r(er)g(of)g(v)n(ertices)f(in)i(the)f(2-core)f(of)g +Fm(G)h Fv(\(the)h(max-)365 985 y(imal)32 b(subgraph)f(of)h +Fm(G)g Fv(with)g(minimal)g(degree)f(at)h(least)24 b(2\))32 +b(that)g(do)g(not)g(b)r(elong)f(to)h(the)365 1085 y(gian)n(t)27 +b(comp)r(onen)n(t)g(is)e Fm(o)p Fv(\()p Fm(t)p Fv(\))k(almost)e(surely) +-7 b(.)490 1185 y(Pittel)32 b(and)g(W)-7 b(ormald)24 +b([15)o(])32 b(presen)n(t)g(detailed)g(results)f(for)h(the)g(2-core)f +(of)h(the)g(gian)n(t)365 1284 y(comp)r(onen)n(t)g(of)f(the)h(random)f +(graph)23 b Fm(G)p Fv(.)32 b(Since)25 b(table)2094 1296 +y Fj(j)2161 1284 y Fv(\()p Fm(j)35 b Fk(2)30 b(f)p Fv(1)p +Fm(;)14 b Fv(2)p Fk(g)p Fv(\))29 b(are)i(random,)g Fm(G)f +Fv(=)365 1384 y Fm(G)p Fv(\()p Fm(h)510 1396 y Fu(1)548 +1384 y Fm(;)14 b(h)633 1396 y Fu(2)670 1384 y Fv(\))25 +b(is)h(a)g(random)g(graph.)f(Exp)r(erimen)n(ts)h(sho)n(w)g(that)g(this) +h(random)e(graph,)h(condi-)365 1484 y(tioned)j(on)f(b)r(eing)g(simple,) +h(strongly)d(resem)n(bles)i(the)g(random)g(graph)f(from)h(the)g +(uniform)365 1583 y(mo)r(del)d Fk(G)5 b Fv(\()p Fm(t;)14 +b(n)p Fv(\).)22 b(In)f(what)g(follo)n(ws,)g(w)n(e)f(w)n(ork)g(under)h +(the)h(h)n(yp)r(othesis)e(that)25 b Fm(G)f Fv(=)e Fm(G)p +Fv(\()p Fm(h)3055 1595 y Fu(1)3093 1583 y Fm(;)14 b(h)3178 +1595 y Fu(2)3215 1583 y Fv(\))365 1683 y(is)28 b(dra)n(wn)e(from)f +Fk(G)5 b Fv(\()p Fm(t;)14 b(n)p Fv(\).)28 b(Th)n(us,)g(follo)n(wing)23 +b([15)o(],)28 b(the)g(n)n(um)n(b)r(er)g(of)f(v)n(ertices)g(of)d +Fm(G)2938 1695 y Fu(crit)3071 1683 y Fv(is)1210 1856 +y Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1397 1868 y Fu(crit)1502 +1856 y Fv(\))p Fk(j)24 b Fv(=)e(\(1)d(+)f Fm(o)p Fv(\(1\)\)\(1)h +Fk(\000)f Fm(T)12 b Fv(\))p Fm(bt)784 b Fv(\(1\))365 +2030 y(almost)27 b(surely)-7 b(.)27 b(Moreo)n(v)n(er,)e(the)j(n)n(um)n +(b)r(er)f(of)h(edges)f(in)h(this)g(2-core)d(is)845 2223 +y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1031 2235 y Fu(crit)1136 +2223 y Fv(\))p Fk(j)24 b Fv(=)e(\(1)c(+)g Fm(o)p Fv(\(1\)\))1655 +2131 y Fi(\020)1706 2223 y Fv(\(1)g Fk(\000)g Fm(T)12 +b Fv(\))p Fm(b)17 b Fv(+)h Fm(b)p Fv(\()p Fm(d)h Fv(+)f +Fm(T)29 b Fk(\000)18 b Fv(2\))p Fm(=)p Fv(2)2642 2131 +y Fi(\021)2691 2223 y Fm(t)420 b Fv(\(2\))365 2427 y(almost)32 +b(surely)-7 b(.)32 b(Let)25 b Fm(d)1091 2439 y Fu(crit)1226 +2427 y Fv(=)31 b(2)p Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1550 +2439 y Fu(crit)1655 2427 y Fv(\))p Fk(j)p Fm(=)p Fk(j)p +Fm(V)18 b Fv(\()p Fm(G)1938 2439 y Fu(crit)2043 2427 +y Fv(\))p Fk(j)33 b Fv(b)r(e)g(the)g(a)n(v)n(erage)c(degree)j(of)24 +b Fm(G)3119 2439 y Fu(crit)3224 2427 y Fv(.)365 2526 +y(W)-7 b(e)28 b(are)f(in)n(terested)g(in)h(the)g(case)f(in)h(whic)n(h)c +Fm(d)1818 2538 y Fu(crit)1951 2526 y Fv(is)j(a)g(constan)n(t.)490 +2626 y(As)32 b(men)n(tioned)g(b)r(efore,)f(for)g(us)h(to)g(\014nd)g +(the)g(lab)r(elling)g Fm(g)h Fv(:)d Fm(V)49 b Fk(!)30 +b Fh(Z)i Fv(of)g(the)g(v)n(ertices)365 2726 y(of)25 b +Fm(G)h Fv(=)f Fm(G)p Fv(\()p Fm(h)783 2738 y Fu(1)821 +2726 y Fm(;)14 b(h)906 2738 y Fu(2)942 2726 y Fv(\))30 +b(in)f(linear)f(time,)i(w)n(e)f(require)f(that)d Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)2316 2738 y Fu(crit)2421 2726 y +Fv(\))p Fk(j)26 b(\024)2602 2693 y Fu(1)p 2602 2707 34 +4 v 2602 2755 a(2)2645 2726 y Fk(j)p Fm(E)5 b Fv(\()p +Fm(G)p Fv(\))p Fk(j)26 b Fv(=)3012 2693 y Fu(1)p 3012 +2707 V 3012 2755 a(2)3055 2726 y Fk(j)p Fm(S)5 b Fk(j)26 +b Fv(=)365 2826 y Fm(n=)p Fv(2.)h(The)i(crucial)e(step)h(no)n(w)f(is)h +(to)g(determine)g(the)h(v)-5 b(alue)28 b(of)d Fm(c)j +Fv(\(in)g Fm(t)c Fv(=)g Fm(cn)p Fv(\))k(to)g(obtain)g(a)365 +2925 y(random)f(graph)f Fm(G)e Fv(=)e Fm(G)1146 2937 +y Fu(crit)1269 2925 y Fk([)d Fm(G)1408 2937 y Fu(ncrit)1577 +2925 y Fv(with)28 b Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1952 +2937 y Fu(crit)2057 2925 y Fv(\))p Fk(j)24 b(\024)2233 +2893 y Fu(1)p 2233 2907 V 2233 2954 a(2)2276 2925 y Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)490 3025 +y(T)-7 b(able)24 b(1)g(giv)n(es)g(some)g(v)-5 b(alues)24 +b(for)g Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1742 3037 y Fu(crit)1847 +3025 y Fv(\))p Fk(j)25 b Fv(and)g Fk(j)p Fm(E)5 b Fv(\()p +Fm(G)2272 3037 y Fu(crit)2377 3025 y Fv(\))p Fk(j)25 +b Fv(using)f(Eqs)g(\(1\))g(and)h(\(2\).)365 3125 y(The)39 +b(theoretical)f(v)-5 b(alue)39 b(for)25 b Fm(c)39 b Fv(is)g(around)23 +b(1)p Fm(:)p Fv(152,)38 b(whic)n(h)h(is)f(remark)-5 b(ably)38 +b(close)g(to)h(the)365 3225 y(empirical)32 b(results)g(presen)n(ted)g +(in)h(T)-7 b(able)24 b(2.)33 b(In)f(this)h(table,)g(generated)e(from)h +(real)g(data,)365 3324 y(the)i(probabilit)n(y)e Fm(P)997 +3339 y Ff(j)p Fj(E)s Fu(\()p Fj(G)1147 3347 y Fd(crit)1238 +3339 y Fu(\))p Ff(j)1321 3324 y Fv(that)i Fk(j)p Fm(E)5 +b Fv(\()p Fm(G)1693 3336 y Fu(crit)1798 3324 y Fv(\))p +Fk(j)32 b(\024)1992 3292 y Fu(1)p 1992 3306 V 1992 3353 +a(2)2035 3324 y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p +Fk(j)35 b Fv(tends)e(to)25 b(0)33 b(when)g Fm(c)g(<)f +Fv(1)p Fm(:)p Fv(15)365 3424 y(and)d(it)f(tends)h(to)g(1)f(when)g +Fm(c)d Fk(\025)f Fv(1)p Fm(:)p Fv(15)j(and)h Fm(n)h Fv(increases.)e(W) +-7 b(e)28 b(found)h(this)g(matc)n(h)f(b)r(et)n(w)n(een)365 +3524 y(the)g(empirical)f(and)h(the)g(theoretical)e(results)h(most)h +(pleasan)n(t.)p 1066 3650 1481 4 v 1064 3741 4 92 v 1145 +3714 a Fo(d)p 1262 3741 V 150 w(T)p 1461 3741 V 165 w(b)p +1659 3741 V 94 w Fr(j)p Fo(V)17 b Fs(\()p Fo(G)1845 3722 +y Ft(crit)1942 3714 y Fs(\))p Fr(j)p 2003 3741 V 24 w(j)p +Fo(E)t Fs(\()p Fo(G)2189 3722 y Ft(crit)2286 3714 y Fs(\))p +Fr(j)p 2347 3741 V 94 w Fo(c)p 2545 3741 V 1066 3745 +1481 4 v 1064 3836 4 92 v 1078 3809 a Fs(1.734)p 1261 +3836 V 25 w(0.510)p 1459 3836 V 25 w(0.706)p 1657 3836 +V 75 w(0.399)p Fo(n)p 2003 3836 V 125 w Fs(0.498)p Fo(n)p +2347 3836 V 75 w Fs(1.153)p 2543 3836 V 1064 3927 V 1078 +3900 a(1.736)p 1261 3927 V 25 w(0.509)p 1459 3927 V 25 +w(0.707)p 1657 3927 V 75 w(0.400)p Fo(n)p 2003 3927 V +125 w Fs(0.500)p Fo(n)p 2347 3927 V 75 w Fs(1.152)p 2543 +3927 V 1064 4019 V 1078 3991 a(1.738)p 1261 4019 V 25 +w(0.508)p 1459 4019 V 25 w(0.708)p 1657 4019 V 75 w(0.401)p +Fo(n)p 2003 4019 V 125 w Fs(0.501)p Fo(n)p 2347 4019 +V 75 w Fs(1.151)p 2543 4019 V 1064 4110 V 1078 4082 a(1.739)p +1261 4110 V 25 w(0.508)p 1459 4110 V 25 w(0.708)p 1657 +4110 V 75 w(0.401)p Fo(n)p 2003 4110 V 125 w Fs(0.501)p +Fo(n)p 2347 4110 V 75 w Fs(1.150)p 2543 4110 V 1064 4201 +V 1078 4174 a(1.740)p 1261 4201 V 25 w(0.507)p 1459 4201 +V 25 w(0.709)p 1657 4201 V 75 w(0.401)p Fo(n)p 2003 4201 +V 125 w Fs(0.502)p Fo(n)p 2347 4201 V 75 w Fs(1.149)p +2543 4201 V 1066 4205 1481 4 v 1014 4348 a Fp(T)-7 b(able)28 +b(1.)e Fs(Determining)f(the)h Fo(c)g Fs(v)l(alue)f(theoretically)490 +4511 y Fv(W)-7 b(e)23 b(no)n(w)g(brie\015y)g(argue)e(that)j(the)f(exp)r +(ected)h(n)n(um)n(b)r(er)f(of)g(iterations)f(to)h(obtain)g(a)g(sim-)365 +4611 y(ple)i(graph)e Fm(G)h Fv(=)e Fm(G)p Fv(\()p Fm(h)1049 +4623 y Fu(1)1087 4611 y Fm(;)14 b(h)1172 4623 y Fu(2)1209 +4611 y Fv(\))24 b(is)g(constan)n(t)g(for)f Fm(t)h Fv(=)e +Fm(cn)i Fv(and)g Fm(c)f Fv(=)g(1)p Fm(:)p Fv(15.)g(Let)i +Fm(p)f Fv(b)r(e)g(the)h(proba-)365 4710 y(bilit)n(y)d(of)f(generating)e +(a)i(random)f(graph)k Fm(G)d Fv(without)h(lo)r(ops)e(and)h(without)g(m) +n(ultiple)h(edges.)365 4810 y(If)k Fm(p)c Fv(is)h(b)r(ounded)g(from)g +(b)r(elo)n(w)f(b)n(y)h(some)f(p)r(ositiv)n(e)h(constan)n(t,)f(then)i(w) +n(e)e(are)g(done,)h(b)r(ecause)365 4910 y(the)33 b(exp)r(ected)h(n)n +(um)n(b)r(er)e(of)h(iterations)f(to)g(obtain)h(suc)n(h)f(a)h(graph)f +(is)g(then)26 b(1)p Fm(=p)k Fv(=)h Fm(O)r Fv(\(1\).)p +365 4985 473 4 v 382 5039 a Ft(3)442 5071 y Fs(As)h(is)h(usual)g(in)g +(the)f(theory)g(of)h(random)g(graphs,)g(w)n(e)g(use)f(the)h(terms)f +(`almost)i(ev)n(ery')e(and)442 5162 y(`almost)27 b(surely')f(to)g(mean) +g(`with)g(probabilit)n(y)g(tending)f(to)g(1)h(as)g Fo(t)21 +b Fr(!)g(1)p Fs('.)p eop end +%%Page: 6 6 +TeXDict begin 6 5 bop 936 391 2371 4 v 934 508 4 118 +v 1000 508 a Fo(c)p 1094 508 V 2040 478 a Fs(URLs)25 +b(\()p Fo(n)p Fs(\))p 3306 508 V 1096 512 2212 4 v 934 +610 4 103 v 1094 610 V 1131 596 a(1)p Fo(;)q Fs(000)47 +b(10)p Fo(;)q Fs(000)h(100)p Fo(;)r Fs(000)f(1)p Fo(;)q +Fs(000)p Fo(;)r Fs(000)g(2)p Fo(;)q Fs(000)p Fo(;)r Fs(000)g(3)p +Fo(;)q Fs(000)p Fo(;)q Fs(000)h(4)p Fo(;)q Fs(000)p Fo(;)q +Fs(000)p 3306 610 V 936 614 2371 4 v 934 705 4 92 v 948 +678 a(1.13)p 1093 705 V 67 w(0.22)106 b(0.02)144 b(0.00)193 +b(0.00)223 b(0.00)g(0.00)g(0.00)p 3306 705 V 934 796 +V 948 769 a(1.14)p 1093 796 V 67 w(0.35)106 b(0.15)144 +b(0.00)193 b(0.00)223 b(0.00)g(0.00)g(0.00)p 3306 796 +V 934 888 V 948 860 a(1.15)p 1093 888 V 67 w(0.46)106 +b(0.55)144 b(0.65)193 b(0.87)223 b(0.95)g(0.97)g(1.00)p +3306 888 V 934 979 V 948 952 a(1.16)p 1093 979 V 67 w(0.67)106 +b(0.90)144 b(1.00)193 b(1.00)223 b(1.00)g(1.00)g(1.00)p +3306 979 V 934 1070 V 948 1043 a(1.17)p 1093 1070 V 67 +w(0.82)106 b(0.99)144 b(1.00)193 b(1.00)223 b(1.00)g(1.00)g(1.00)p +3306 1070 V 936 1074 2371 4 v 681 1227 a Fg(T)-8 b(able)42 +b(2.)36 b Fv(Probabilit)n(y)g Fm(P)1560 1242 y Ff(j)p +Fj(E)1629 1250 y Fd(crit)1720 1242 y Ff(j)1780 1227 y +Fv(that)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2155 1239 y Fu(crit)2260 +1227 y Fv(\))p Fk(j)39 b(\024)f Fm(n=)p Fv(2)e(for)g(di\013eren)n(t)h +Fm(c)g Fv(v)-5 b(alues)36 b(and)681 1327 y(di\013eren)n(t)27 +b(n)n(um)n(b)r(er)h(of)f(k)n(eys)g(for)g(a)g(collections)g(of)h(URLs) +681 1488 y(T)-7 b(o)27 b(estimate)e Fm(p)p Fv(,)i(w)n(e)h(estimate)f +(the)h(probabilit)n(y)f(of)h(obtaining)c Fm(n)j Fl(distinct)36 +b Fv(ob)5 b(jects)28 b(when)681 1588 y(w)n(e)35 b(indep)r(enden)n(tly)i +(dra)n(w)e Fm(n)24 b Fv(ob)5 b(jects)36 b(from)f(a)h(univ)n(erse)f(of)g +(cardinalit)n(y)3067 1521 y Fi(\000)3109 1551 y Fj(t)3105 +1617 y Fu(2)3138 1521 y Fi(\001)3213 1588 y Fv(=)3314 +1521 y Fi(\000)3352 1551 y Fj(cn)3371 1617 y Fu(2)3423 +1521 y Fi(\001)3498 1588 y Fk(\030)681 1717 y Fm(c)717 +1687 y Fu(2)754 1717 y Fm(n)804 1687 y Fu(2)841 1717 +y Fm(=)p Fv(2,)27 b(with)h(replacemen)n(t.)g(This)f(latter)h +(probabilit)n(y)f(is)h(ab)r(out)c Fm(e)2850 1681 y Ff(\000)2902 +1687 y Fv(\()2934 1654 y Fe(n)2938 1701 y Fd(2)2971 1687 +y Fv(\))3003 1681 y Fj(=)3037 1687 y Fv(\()3072 1654 +y Fe(t)3069 1701 y Fd(2)3098 1687 y Fv(\))3162 1717 y(for)j(large)d +Fm(n)p Fv(.)681 1838 y(As)h Fm(e)840 1802 y Ff(\000)892 +1808 y Fv(\()924 1775 y Fe(n)928 1822 y Fd(2)960 1808 +y Fv(\))992 1802 y Fj(=)1026 1808 y Fv(\()1061 1775 y +Fe(t)1059 1822 y Fd(2)1087 1808 y Fv(\))1174 1838 y Fk(!)51 +b Fm(e)1347 1808 y Ff(\000)p Fu(1)p Fj(=c)1496 1783 y +Fd(2)1583 1838 y Fm(>)f Fv(0)44 b(as)24 b Fm(n)51 b Fk(!)g(1)p +Fv(,)44 b(the)h(exp)r(ected)f(n)n(um)n(b)r(er)g(of)h(iterations)681 +1938 y(is)24 b Fm(e)800 1908 y Fu(1)p Fj(=c)897 1883 +y Fd(2)964 1938 y Fv(=)31 b(2)p Fm(:)p Fv(13)g(\(recall)h +Fm(c)e Fv(=)h(1)p Fm(:)p Fv(15\).)g(As)i(the)f(exp)r(ected)h(n)n(um)n +(b)r(er)f(of)g(iterations)g(is)g Fm(O)r Fv(\(1\))681 +2038 y(then,)c(the)g(mapping)f(step)h(tak)n(es)f Fm(O)r +Fv(\()p Fm(n)p Fv(\))h(time.)681 2226 y Fg(3.2)94 b(Ordering)32 +b(Step)681 2390 y Fv(The)37 b(pro)r(cedure)g(Ordering)f(\()p +Fm(G)p Fv(,)i Fm(G)1841 2402 y Fu(crit)1946 2390 y Fv(,)f +Fm(G)2071 2402 y Fu(ncrit)2212 2390 y Fv(\))h(receiv)n(es)e(as)h(input) +h(the)g(graph)24 b Fm(G)38 b Fv(and)681 2490 y(partitions)24 +b Fm(G)j Fv(in)n(to)g(the)g(t)n(w)n(o)f(subgraphs)f Fm(G)2072 +2502 y Fu(crit)2204 2490 y Fv(and)h Fm(G)2429 2502 y +Fu(ncrit)2571 2490 y Fv(,)g(so)h(that)e Fm(G)e Fv(=)g +Fm(G)3140 2502 y Fu(crit)3261 2490 y Fk([)17 b Fm(G)3398 +2502 y Fu(ncrit)3540 2490 y Fv(.)805 2589 y(Figure)25 +b(3)38 b(presen)n(ts)g(a)h(sample)f(graph)g(with)h(9)g(v)n(ertices)f +(and)g(8)h(edges,)f(where)g(the)681 2689 y(degree)23 +b(of)i(a)f(v)n(ertex)g(is)g(sho)n(wn)g(b)r(esides)h(eac)n(h)e(v)n +(ertex.)h(Initially)-7 b(,)25 b(all)f(v)n(ertices)g(with)h(degree)681 +2789 y(1)h(are)f(added)i(to)f(a)g(queue)h Fm(Q)p Fv(.)f(F)-7 +b(or)26 b(the)h(example)f(sho)n(wn)f(in)i(Figure)d(3\(a\),)j +Fm(Q)22 b Fv(=)h Fk(f)p Fv(2)p Fk(g)i Fv(after)681 2888 +y(the)j(initialization)f(step.)804 3619 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 804 3619 a +@beginspecial 0 @llx 0 @lly 372 @urx 92 @ury 3720 @rwi +@setspecial +%%BeginDocument: figs/grafordering.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafordering2.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Mon Jan 10 18:31:19 2005 +%%For: fbotelho@tigre (Fabiano Cupertino Botelho) +%%BoundingBox: 0 0 372 92 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.824 0.824 0.824 srgb} bind def + +end +save +newpath 0 92 moveto 0 0 lineto 372 0 lineto 372 92 lineto closepath clip newpath +-17.0 416.7 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +7.500 slw +n 1800 5310 m 1980 5310 l 1980 5490 l 1800 5490 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +1860 5437 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +1665 5445 m +gs 1 -1 sc (Q) col0 sh gr +% Arc +n 1080.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 967.5 5962.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 1080.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 1080 5940 m + 1305 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 1080 5940 m + 855 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 1080 5940 m + 1305 6480 l gs col0 s gr +% Polyline +n 1080 5940 m + 855 6480 l gs col0 s gr +% Polyline +n 1080 5940 m + 1620 5715 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +630 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +810 5985 m +gs 1 -1 sc (d:5) col0 sh gr +/Times-Roman ff 120.00 scf sf +1395 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +1755 5670 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +1755 6255 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +1440 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +585 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +270 5715 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +270 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +270 5355 m +gs 1 -1 sc (a\)) col0 sh gr +% Arc +n 5220.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 5107.5 5962.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 5220.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 5220 5940 m + 5445 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 5220 5940 m + 4995 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 5220 5940 m + 5445 6480 l gs col0 s gr +% Polyline +n 5220 5940 m + 4995 6480 l gs col0 s gr +% Polyline +n 5220 5940 m + 5760 5715 l gs col0 s gr +% Polyline +n 5221 5943 m + 5761 5718 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +4770 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +4950 5985 m +gs 1 -1 sc (d:4) col0 sh gr +/Times-Roman ff 120.00 scf sf +5535 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +5895 5670 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5895 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5580 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +4725 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +4410 5715 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +4410 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +4410 5355 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 120.00 scf sf +5850 5445 m +gs 1 -1 sc (Q) col0 sh gr +% Polyline +n 3870 5310 m 4050 5310 l 4050 5490 l 3870 5490 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +3930 5437 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +3735 5445 m +gs 1 -1 sc (Q) col0 sh gr +% Arc +n 3150.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 3037.5 5962.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 3150.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 3150 5940 m + 3375 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 3150 5940 m + 2925 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 3150 5940 m + 3375 6480 l gs col0 s gr +% Polyline +n 3150 5940 m + 2925 6480 l gs col0 s gr +% Polyline +n 3150 5940 m + 3690 5715 l gs col0 s gr +% Polyline +n 3151 5943 m + 3691 5718 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +2700 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +2880 5985 m +gs 1 -1 sc (d:5) col0 sh gr +/Times-Roman ff 120.00 scf sf +3465 5310 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +3825 5670 m +gs 1 -1 sc (d:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +3825 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +3510 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +2655 6615 m +gs 1 -1 sc (d:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +2340 5715 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +2340 6255 m +gs 1 -1 sc (d:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +2340 5355 m +gs 1 -1 sc (b\)) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 540 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +510 5752 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 855 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +825 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 1305 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1275 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 1620 5715 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1590 5752 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 1620 6165 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1590 6202 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 1305 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1275 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 855 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +825 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 540 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +510 6202 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 1080 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1050 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 4680 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 5752 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 4995 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4965 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 5445 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5415 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5445 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5415 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 4995 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4965 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 4680 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 6202 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 5220 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5190 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5760 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 6202 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 5760 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 5752 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 6052 5397 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +% Polyline +n 6070 5337 m + 6033 5458 l gs col32 1.00 tnt ef gr gs col0 s gr +% Ellipse +n 2610 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2580 5752 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 2925 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2895 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 3375 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3345 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 3375 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3345 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 2925 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2895 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 2610 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2580 6202 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 3150 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3120 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3690 5715 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3660 5752 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 3690 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3660 6202 m +gs 1 -1 sc (2) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage + +%%EndDocument + @endspecial 804 3619 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 804 3619 a 1011 3802 a Fg(Fig.)15 +b(3.)27 b Fv(Ordering)f(step)i(for)f(a)g(graph)g(with)h(9)f(v)n +(ertices)f(and)i(8)f(edges)805 3965 y(Next,)h(w)n(e)g(remo)n(v)n(e)e +(one)h(v)n(ertex)f Fm(v)31 b Fv(from)d(the)g(queue,)f(decremen)n(t)h +(its)f(degree)g(and)g(the)681 4065 y(degree)34 b(of)i(the)g(v)n +(ertices)e(with)i(degree)f(greater)f(than)h(0)g(in)h(the)g(adjacen)n(t) +f(list)h(of)f Fm(v)s Fv(,)h(as)681 4164 y(depicted)25 +b(in)f(Figure)h(3\(b\))f(for)g Fm(v)j Fv(=)22 b(2.)i(A)n(t)h(this)g(p)r +(oin)n(t,)f(the)h(adjacencies)f(of)g Fm(v)k Fv(with)d(degree)681 +4264 y(1)e(are)g(inserted)g(in)n(to)h(the)g(queue,)g(suc)n(h)f(as)g(v)n +(ertex)g(1.)g(This)h(pro)r(cess)e(is)i(rep)r(eated)f(un)n(til)h(the)681 +4363 y(queue)35 b(b)r(ecomes)f(empt)n(y)-7 b(.)35 b(All)g(v)n(ertices)f +(with)h(degree)f(0)h(are)f(non-critical)f(v)n(ertices)h(and)681 +4463 y(the)28 b(others)g(are)f(critical)g(v)n(ertices,)g(as)h(depicted) +h(in)f(Figure)c(3\(c\).)k(Finally)-7 b(,)29 b(to)f(determine)681 +4563 y(the)g(v)n(ertices)f(in)h Fm(V)1270 4575 y Fu(scrit)1429 +4563 y Fv(w)n(e)f(collect)h(all)f(v)n(ertices)g Fm(v)g +Fk(2)d Fm(V)19 b Fv(\()p Fm(G)2536 4575 y Fu(crit)2641 +4563 y Fv(\))28 b(with)g(at)g(least)f(one)h(v)n(ertex)681 +4662 y Fm(u)f Fv(that)h(is)f(in)h(Adj\()p Fm(v)s Fv(\))h(and)f(in)g +Fm(V)19 b Fv(\()p Fm(G)1808 4674 y Fu(ncrit)1949 4662 +y Fv(\),)28 b(as)f(the)h(v)n(ertex)f(8)g(in)h(Figure)c(3\(c\).)681 +4826 y Fg(Analysis)39 b(of)h(the)g(Ordering)g(Step.)90 +b Fv(The)35 b(initialization)f(tak)n(es)g Fm(O)r Fv(\()p +Fk(j)p Fm(V)20 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(\))36 +b(time,)681 4926 y(b)r(ecause)29 b(w)n(e)g(need)g(to)h(c)n(hec)n(k)e +(the)i(degree)e(of)h(eac)n(h)g(v)n(ertex)f(from)h Fm(V)19 +b Fv(\()p Fm(G)p Fv(\).)31 b(Next,)e(the)h(non-)681 5025 +y(critical)35 b(v)n(ertices)h(are)f(obtained.)h(This)h(pro)r(cess)e +(tak)n(es)g Fm(O)r Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)2799 +5037 y Fu(ncrit)2941 5025 y Fv(\))p Fk(j)p Fv(\),)37 +b(b)r(ecause)f(eac)n(h)681 5125 y(non-critical)30 b(v)n(ertex)h(is)h +(remo)n(v)n(ed)e(from)i(the)g(queue)g(only)g(once.)f(Finally)-7 +b(,)32 b(to)g(determine)681 5225 y(the)f(v)n(ertices)e(in)i +Fm(V)1278 5237 y Fu(scrit)1440 5225 y Fv(tak)n(es)e Fm(O)r +Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)1940 5237 y Fu(crit)2045 +5225 y Fv(\))p Fk(j)p Fv(\).)31 b(Considering)e(that)i +Fk(j)p Fm(V)19 b Fv(\()p Fm(G)3016 5237 y Fu(crit)3121 +5225 y Fv(\))p Fk(j)28 b(\024)g(j)p Fm(V)19 b Fv(\()p +Fm(G)p Fv(\))p Fk(j)p Fv(,)681 5324 y Fk(j)p Fm(V)g Fv(\()p +Fm(G)868 5336 y Fu(ncrit)1009 5324 y Fv(\))p Fk(j)24 +b(\024)e(j)p Fm(V)d Fv(\()p Fm(G)p Fv(\))p Fk(j)29 b +Fv(and)e Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)24 +b Fv(=)f Fm(t)g Fv(=)g Fm(cn)p Fv(,)k(the)h(ordering)e(step)i(tak)n(es) +e Fm(O)r Fv(\()p Fm(n)p Fv(\))j(time.)p eop end +%%Page: 7 7 +TeXDict begin 7 6 bop 365 387 a Fg(3.3)95 b(Searc)m(hing)32 +b(Step)365 548 y Fv(In)i(the)h(searc)n(hing)d(step,)i(the)g(k)n(ey)f +(part)g(is)h(the)g Fl(p)l(erfe)l(ct)i(assignment)g(pr)l(oblem)p +Fv(:)f(\014nd)f Fm(g)i Fv(:)365 647 y Fm(V)19 b Fv(\()p +Fm(G)p Fv(\))24 b Fk(!)f Fh(Z)28 b Fv(suc)n(h)f(that)h(the)g(function)g +Fm(h)23 b Fv(:)h Fm(E)5 b Fv(\()p Fm(G)p Fv(\))23 b Fk(!)h +Fh(Z)k Fv(de\014ned)g(b)n(y)1165 812 y Fm(h)p Fv(\()p +Fm(e)p Fv(\))23 b(=)g Fm(g)s Fv(\()p Fm(a)p Fv(\))18 +b(+)g Fm(g)s Fv(\()p Fm(b)p Fv(\))166 b(\()p Fm(e)23 +b Fv(=)f Fk(f)p Fm(a;)14 b(b)p Fk(g)p Fv(\))739 b(\(3\))365 +977 y(is)21 b(a)g(bijection)h(from)i Fm(E)5 b Fv(\()p +Fm(G)p Fv(\))23 b(to)h([0)p Fm(;)14 b(n)6 b Fk(\000)g +Fv(1])20 b(\(recall)k Fm(n)f Fv(=)f Fk(j)p Fm(S)5 b Fk(j)23 +b Fv(=)g Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p +Fv(\).)44 b(W)-7 b(e)21 b(are)g(in)n(terested)365 1076 +y(in)g(a)f(lab)r(elling)h Fm(g)k Fv(:)e Fm(V)42 b Fk(!)23 +b Fh(Z)e Fv(of)g(the)g(v)n(ertices)e(of)i(the)g(graph)j +Fm(G)f Fv(=)g Fm(G)p Fv(\()p Fm(h)2523 1088 y Fu(1)2560 +1076 y Fm(;)14 b(h)2645 1088 y Fu(2)2682 1076 y Fv(\))21 +b(with)g(the)g(prop-)365 1176 y(ert)n(y)g(that)g(if)k +Fm(x)d Fv(and)j Fm(y)e Fv(are)e(k)n(eys)f(in)25 b Fm(S)5 +b Fv(,)21 b(then)g Fm(g)s Fv(\()p Fm(h)1876 1188 y Fu(1)1913 +1176 y Fv(\()p Fm(x)p Fv(\)\))5 b(+)g Fm(g)s Fv(\()p +Fm(h)2254 1188 y Fu(2)2293 1176 y Fv(\()p Fm(x)p Fv(\)\))24 +b Fk(6)p Fv(=)f Fm(g)s Fv(\()p Fm(h)2671 1188 y Fu(1)2708 +1176 y Fv(\()p Fm(y)s Fv(\)\))5 b(+)g Fm(g)s Fv(\()p +Fm(h)3046 1188 y Fu(2)3084 1176 y Fv(\()p Fm(y)s Fv(\)\);)365 +1275 y(that)40 b(is,)f(if)h(w)n(e)f(asso)r(ciate)f(to)h(eac)n(h)g(edge) +f(the)i(sum)g(of)f(the)g(lab)r(els)h(on)f(its)g(endp)r(oin)n(ts,)365 +1375 y(then)29 b(these)f(v)-5 b(alues)28 b(should)g(b)r(e)h(all)f +(distinct.)h(Moreo)n(v)n(er,)d(w)n(e)i(require)f(that)i(all)f(the)g +(sums)365 1475 y Fm(g)s Fv(\()p Fm(h)488 1487 y Fu(1)525 +1475 y Fv(\()p Fm(x)p Fv(\)\))18 b(+)e Fm(g)s Fv(\()p +Fm(h)890 1487 y Fu(2)927 1475 y Fv(\()p Fm(x)p Fv(\)\))29 +b(\()p Fm(x)23 b Fk(2)h Fm(S)5 b Fv(\))26 b(fall)h(b)r(et)n(w)n(een)e +(0)h(and)f Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)18 +b(\000)e Fv(1)23 b(=)f Fm(n)17 b Fk(\000)f Fv(1,)26 b(and)h(th)n(us)g +(w)n(e)365 1574 y(ha)n(v)n(e)g(a)g(bijection)h(b)r(et)n(w)n(een)d +Fm(S)32 b Fv(and)25 b([0)p Fm(;)14 b(n)j Fk(\000)h Fv(1].)490 +1674 y(The)j(pro)r(cedure)f(Searc)n(hing)g(\()p Fm(G)p +Fv(,)h Fm(G)1609 1686 y Fu(crit)1714 1674 y Fv(,)g Fm(G)1823 +1686 y Fu(ncrit)1965 1674 y Fv(,)g Fm(g)s Fv(\))g(receiv)n(es)e(as)i +(input)26 b Fm(G)p Fv(,)21 b Fm(G)2892 1686 y Fu(crit)2997 +1674 y Fv(,)g Fm(G)3106 1686 y Fu(ncrit)365 1774 y Fv(and)31 +b(\014nds)g(a)f(suitable)g(log)1224 1794 y Fu(2)1275 +1774 y Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)i +Fv(+)f(1)30 b(bit)i(v)-5 b(alue)30 b(for)g(eac)n(h)g(v)n(ertex)g +Fm(v)h Fk(2)e Fm(V)18 b Fv(\()p Fm(G)p Fv(\),)32 b(stored)365 +1873 y(in)i(the)f(arra)n(y)23 b Fm(g)s Fv(.)32 b(This)h(step)h(is)f +(\014rst)g(p)r(erformed)f(for)h(the)g(v)n(ertices)f(in)i(the)f +(critical)g(sub-)365 1973 y(graph)24 b Fm(G)663 1985 +y Fu(crit)801 1973 y Fv(of)32 b Fm(G)i Fv(\(the)f(2-core)e(of)25 +b Fm(G)p Fv(\))33 b(and)g(then)g(it)h(is)e(p)r(erformed)h(for)f(the)h +(v)n(ertices)f(in)365 2072 y Fm(G)430 2084 y Fu(ncrit)608 +2072 y Fv(\(the)k(non-critical)f(subgraph)g(of)25 b Fm(G)36 +b Fv(that)g(con)n(tains)f(the)i(\\acyclic)e(part")g(of)h +Fm(G)p Fv(\).)365 2172 y(The)k(reason)e(the)j(assignmen)n(t)d(of)i(the) +g Fm(g)28 b Fv(v)-5 b(alues)39 b(is)h(\014rst)f(p)r(erformed)h(on)f +(the)h(v)n(ertices)365 2272 y(in)25 b Fm(G)524 2284 y +Fu(crit)659 2272 y Fv(is)k(to)g(resolv)n(e)f(reassignmen)n(ts)g(as)h +(early)f(as)h(p)r(ossible)g(\(suc)n(h)h(reassignmen)n(ts)d(are)365 +2371 y(consequences)g(of)g(the)h(cycles)f(in)e Fm(G)1501 +2383 y Fu(crit)1634 2371 y Fv(and)i(are)g(depicted)h(hereinafter\).)365 +2531 y Fg(Assignmen)m(t)f(of)g(V)-8 b(alues)28 b(to)f(Critical)h(V)-8 +b(ertices.)66 b Fv(The)24 b(lab)r(els)g Fm(g)s Fv(\()p +Fm(v)s Fv(\))h(\()p Fm(v)h Fk(2)e Fm(V)19 b Fv(\()p Fm(G)3078 +2543 y Fu(crit)3183 2531 y Fv(\)\))365 2631 y(are)g(assigned)g(in)h +(increasing)e(order)h(follo)n(wing)g(a)g(greedy)g(strategy)g(where)g +(the)h(critical)g(v)n(er-)365 2731 y(tices)25 b Fm(v)j +Fv(are)23 b(considered)h(one)g(at)g(a)g(time,)h(according)d(to)j(a)f +(breadth-\014rst)f(searc)n(h)g(on)h Fm(G)3119 2743 y +Fu(crit)3224 2731 y Fv(.)365 2830 y(If)e(a)e(candidate)h(v)-5 +b(alue)25 b Fm(x)d Fv(for)i Fm(g)s Fv(\()p Fm(v)s Fv(\))d(is)g +(forbidden)g(b)r(ecause)g(setting)k Fm(g)s Fv(\()p Fm(v)s +Fv(\))e(=)g Fm(x)f Fv(w)n(ould)e(create)365 2930 y(t)n(w)n(o)26 +b(edges)f(with)i(the)g(same)f(sum,)g(w)n(e)g(try)f Fm(x)16 +b Fv(+)g(1)26 b(for)e Fm(g)s Fv(\()p Fm(v)s Fv(\).)j(This)f(fact)g(is)h +(referred)e(to)h(as)g(a)365 3030 y Fl(r)l(e)l(assignment)p +Fv(.)490 3129 y(Let)21 b Fm(A)694 3141 y Fj(E)771 3129 +y Fv(b)r(e)g(the)g(set)f(of)h(addresses)e(assigned)h(to)g(edges)g(in)h +Fm(E)5 b Fv(\()p Fm(G)2466 3141 y Fu(crit)2571 3129 y +Fv(\).)21 b(Initially)g Fm(A)3016 3141 y Fj(E)3095 3129 +y Fv(=)i Fk(;)p Fv(.)365 3229 y(Let)32 b Fm(x)g Fv(b)r(e)f(a)g +(candidate)g(v)-5 b(alue)32 b(for)f Fm(g)s Fv(\()p Fm(v)s +Fv(\).)g(Initially)h Fm(x)e Fv(=)f(0.)i(Considering)f(the)h(subgraph) +365 3328 y Fm(G)430 3340 y Fu(crit)555 3328 y Fv(in)20 +b(Figure)k(3\(c\),)c(a)g(step)g(b)n(y)g(step)g(example)f(of)h(the)g +(assignmen)n(t)f(of)h(v)-5 b(alues)20 b(to)f(v)n(ertices)365 +3428 y(in)32 b Fm(G)531 3440 y Fu(crit)667 3428 y Fv(is)f(presen)n(ted) +g(in)g(Figure)24 b(4.)31 b(Initially)-7 b(,)32 b(a)e(v)n(ertex)h +Fm(v)j Fv(is)d(c)n(hosen,)g(the)g(assignmen)n(t)365 3528 +y Fm(g)s Fv(\()p Fm(v)s Fv(\))f(=)e Fm(x)k Fv(is)f(made)g(and)g +Fm(x)g Fv(is)g(set)g(to)g Fm(x)22 b Fv(+)e(1.)31 b(F)-7 +b(or)30 b(example,)h(supp)r(ose)g(that)g(v)n(ertex)f(8)h(in)365 +3627 y(Figure)25 b(4\(a\))i(is)g(c)n(hosen,)g(the)h(assignmen)n(t)f +Fm(g)s Fv(\(8\))22 b(=)h(0)k(is)h(made)f(and)g Fm(x)i +Fv(is)e(set)h(to)f(1.)560 4524 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 560 4524 a @beginspecial +0 @llx 0 @lly 352 @urx 115 @ury 3520 @rwi @setspecial +%%BeginDocument: figs/grafsearching.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearching2.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Mon Jan 10 18:31:58 2005 +%%For: fbotelho@tigre (Fabiano Cupertino Botelho) +%%BoundingBox: 0 0 352 115 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.824 0.824 0.824 srgb} bind def + +end +save +newpath 0 115 moveto 0 0 lineto 352 0 lineto 352 115 lineto closepath clip newpath +-272.1 431.6 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Arc +7.500 slw +n 6210.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 6210.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Arc +n 7740.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 7740.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Arc +n 9270.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 9270.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Arc +n 4860.0 5940.0 585.0 -112.6 -67.4 arc +gs col0 s gr + +% Arc +n 4860.0 5940.0 585.0 67.4 112.6 arc +gs col0 s gr + +% Polyline +n 6210 5940 m + 6435 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 6210 5940 m + 5985 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 6210 5940 m + 6435 6480 l gs col0 s gr +% Polyline +n 6210 5940 m + 5985 6480 l gs col0 s gr +% Polyline +n 7740 5940 m + 7965 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 7740 5940 m + 7515 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 7740 5940 m + 7965 6480 l gs col0 s gr +% Polyline +n 7740 5940 m + 7515 6480 l gs col0 s gr +% Polyline +n 9270 5940 m + 9495 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 9270 5940 m + 9045 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 9270 5940 m + 9495 6480 l gs col0 s gr +% Polyline +n 9270 5940 m + 9045 6480 l gs col0 s gr +% Polyline +n 4860 5940 m + 5085 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 4860 5940 m + 4635 5400 l gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n 4860 5940 m + 5085 6480 l gs col0 s gr +% Polyline +n 4860 5940 m + 4635 6480 l gs col0 s gr +/Times-Roman ff 165.00 scf sf +5490 5445 m +gs 1 -1 sc (b\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +7020 5445 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +8550 5445 m +gs 1 -1 sc (d\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +4320 5445 m +gs 1 -1 sc (a\)) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 5985 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5955 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 6435 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +6405 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 6435 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +6405 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 5985 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5955 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 6210 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +6180 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 7515 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7485 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 7965 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7935 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 7965 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7935 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 7515 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7485 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 7740 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +7710 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 9045 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9015 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 9495 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9465 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 9495 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9465 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 9045 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9015 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 9270 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +9240 5977 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 4635 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4605 5437 m +gs 1 -1 sc (7) col0 sh gr +% Ellipse +n 5085 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5055 5437 m +gs 1 -1 sc (0) col0 sh gr +% Ellipse +n 5085 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5055 6517 m +gs 1 -1 sc (3) col0 sh gr +% Ellipse +n 4635 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4605 6517 m +gs 1 -1 sc (4) col0 sh gr +% Ellipse +n 4860 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4830 5977 m +gs 1 -1 sc (8) col0 sh gr +% Polyline +gs clippath +6228 5199 m 6255 5253 l 6389 5186 l 6269 5213 l 6362 5132 l cp +eoclip +n 6255 5220 m + 6615 5040 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 6362 5132 m 6269 5213 l 6389 5186 l 6362 5132 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6146 6680 m 6120 6626 l 5985 6693 l 6106 6667 l 6012 6747 l cp +eoclip +n 5760 6840 m + 6120 6660 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 6012 6747 m 6106 6667 l 5985 6693 l 6012 6747 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7676 6680 m 7650 6626 l 7515 6693 l 7636 6667 l 7542 6747 l cp +eoclip +n 7290 6840 m + 7650 6660 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7542 6747 m 7636 6667 l 7515 6693 l 7542 6747 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7496 5735 m 7470 5681 l 7335 5748 l 7456 5722 l 7362 5802 l cp +eoclip +n 7110 5895 m + 7470 5715 l gs col7 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7362 5802 m 7456 5722 l 7335 5748 l 7362 5802 l cp gs 0.00 setgray ef gr col0 s +/Times-Roman ff 120.00 scf sf +6345 5985 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +6570 5310 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +5715 5310 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 120.00 scf sf +6165 5310 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +5985 5715 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 120.00 scf sf +5985 6255 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 120.00 scf sf +6390 6255 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +6390 5715 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +6165 6660 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +6525 6660 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +5715 6660 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 120.00 scf sf +7875 5985 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +8100 5310 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +7245 5310 m +gs 1 -1 sc (g:5) col0 sh gr +/Times-Roman ff 120.00 scf sf +7695 5310 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 120.00 scf sf +7515 5715 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +7515 6255 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 120.00 scf sf +7920 6255 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +7920 5715 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +7695 6660 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +8055 6660 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +7245 6660 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 120.00 scf sf +9405 5985 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +9630 5310 m +gs 1 -1 sc (g:1) col0 sh gr +/Times-Roman ff 120.00 scf sf +8775 5310 m +gs 1 -1 sc (g:6) col0 sh gr +/Times-Roman ff 120.00 scf sf +9225 5310 m +gs 1 -1 sc (7) col0 sh gr +/Times-Roman ff 120.00 scf sf +9045 5715 m +gs 1 -1 sc (6) col0 sh gr +/Times-Roman ff 120.00 scf sf +9045 6255 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 120.00 scf sf +9450 6255 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 120.00 scf sf +9450 5715 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 120.00 scf sf +9225 6660 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 120.00 scf sf +9585 6660 m +gs 1 -1 sc (g:2) col0 sh gr +/Times-Roman ff 120.00 scf sf +8775 6660 m +gs 1 -1 sc (g:3) col0 sh gr +/Times-Roman ff 120.00 scf sf +4995 5985 m +gs 1 -1 sc (g:0) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage + +%%EndDocument + @endspecial 560 4524 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 560 4524 a 665 4707 a Fg(Fig.)15 +b(4.)27 b Fv(Example)g(of)g(the)h(assignmen)n(t)f(of)h(v)-5 +b(alues)27 b(to)g(critical)g(v)n(ertices)490 4863 y(In)h(Figure)c +(4\(b\),)k(follo)n(wing)f(the)h(adjacen)n(t)f(list)h(of)f(v)n(ertex)g +(8,)g(the)i(unassigned)d(v)n(ertex)365 4963 y(0)c(is)h(reac)n(hed.)e(A) +n(t)i(this)g(p)r(oin)n(t,)g(w)n(e)f(collect)h(in)g(the)g(temp)r(orary)e +(v)-5 b(ariable)21 b Fm(Y)42 b Fv(all)22 b(adjacencies)365 +5063 y(of)h(v)n(ertex)e(0)h(that)h(ha)n(v)n(e)e(b)r(een)i(assigned)e +(an)h Fm(x)h Fv(v)-5 b(alue,)22 b(and)g Fm(Y)42 b Fv(=)23 +b Fk(f)p Fv(8)p Fk(g)p Fv(.)e(Next,)i(for)e(all)h Fm(u)h +Fk(2)g Fm(Y)c Fv(,)p eop end +%%Page: 8 8 +TeXDict begin 8 7 bop 681 387 a Fv(w)n(e)32 b(c)n(hec)n(k)h(if)g +Fm(g)s Fv(\()p Fm(u)p Fv(\))22 b(+)g Fm(x)32 b Fk(62)h +Fm(A)1612 399 y Fj(E)1668 387 y Fv(.)g(Since)h Fm(g)s +Fv(\(8\))21 b(+)h(1)32 b(=)f(1)h Fk(62)h Fm(A)2598 399 +y Fj(E)2654 387 y Fv(,)g(then)h Fm(g)s Fv(\(0\))f(is)f(set)i(to)f(1,)f +Fm(x)681 487 y Fv(is)e(incremen)n(ted)h(b)n(y)f(1)g(\(no)n(w)g +Fm(x)f Fv(=)e(2\))k(and)f Fm(A)2136 499 y Fj(E)2221 487 +y Fv(=)d Fm(A)2375 499 y Fj(E)2452 487 y Fk([)21 b(f)p +Fv(1)p Fk(g)26 b Fv(=)i Fk(f)p Fv(1)p Fk(g)p Fv(.)h(Next,)i(v)n(ertex)f +(3)g(is)681 587 y(reac)n(hed,)21 b Fm(g)s Fv(\(3\))i(is)f(set)h(to)f +(2,)g Fm(x)i Fv(is)e(set)h(to)f(3)g(and)h Fm(A)2212 599 +y Fj(E)2291 587 y Fv(=)g Fm(A)2441 599 y Fj(E)2506 587 +y Fk([)8 b(f)p Fv(2)p Fk(g)22 b Fv(=)h Fk(f)p Fv(1)p +Fm(;)14 b Fv(2)p Fk(g)p Fv(.)21 b(Next,)i(v)n(ertex)e(4)681 +686 y(is)k(reac)n(hed)e(and)i Fm(Y)42 b Fv(=)23 b Fk(f)p +Fv(3)p Fm(;)14 b Fv(8)p Fk(g)p Fv(.)23 b(Since)i Fm(g)s +Fv(\(3\))13 b(+)g(3)22 b(=)h(5)f Fk(62)i Fm(A)2460 698 +y Fj(E)2541 686 y Fv(and)h Fm(g)s Fv(\(8\))13 b(+)g(3)22 +b(=)h(3)f Fk(62)i Fm(A)3297 698 y Fj(E)3353 686 y Fv(,)h(then)681 +786 y Fm(g)s Fv(\(4\))19 b(is)g(set)g(to)g(3,)g Fm(x)g +Fv(is)g(set)h(to)f(4)f(and)h Fm(A)1853 798 y Fj(E)1933 +786 y Fv(=)j Fm(A)2082 798 y Fj(E)2140 786 y Fk([)r(f)p +Fv(3)p Fm(;)14 b Fv(5)p Fk(g)21 b Fv(=)i Fk(f)p Fv(1)p +Fm(;)14 b Fv(2)p Fm(;)g Fv(3)p Fm(;)g Fv(5)p Fk(g)p Fv(.)i(Finally)-7 +b(,)19 b(v)n(ertex)f(7)h(is)681 886 y(reac)n(hed)g(and)g +Fm(Y)42 b Fv(=)23 b Fk(f)p Fv(0)p Fm(;)14 b Fv(8)p Fk(g)p +Fv(.)k(Since)i Fm(g)s Fv(\(0\))s(+)s(4)j(=)f(5)h Fk(2)g +Fm(A)2339 898 y Fj(E)2396 886 y Fv(,)d Fm(x)h Fv(is)f(incremen)n(ted)f +(b)n(y)h(1)g(and)g(set)g(to)681 985 y(5,)j(as)g(depicted)h(in)g(Figure) +g(4\(c\).)f(Since)h Fm(g)s Fv(\(8\))10 b(+)g(5)22 b(=)h(5)g +Fk(2)g Fm(A)2540 997 y Fj(E)2596 985 y Fv(,)h Fm(x)g +Fv(is)f(again)g(incremen)n(ted)g(b)n(y)681 1085 y(1)f(and)h(set)g(to)f +(6,)h(as)f(depicted)h(in)g(Figure)h(4\(d\).)f(These)g(t)n(w)n(o)f +(reassignmen)n(ts)f(are)h(indicated)681 1184 y(b)n(y)33 +b(the)i(arro)n(ws)c(in)k(Figure)24 b(4.)33 b(Since)i +Fm(g)s Fv(\(0\))22 b(+)g(6)33 b(=)h(7)f Fk(62)h Fm(A)2567 +1196 y Fj(E)2657 1184 y Fv(and)g Fm(g)s Fv(\(8\))22 b(+)h(6)33 +b(=)g(6)g Fk(62)h Fm(A)3483 1196 y Fj(E)3540 1184 y Fv(,)681 +1284 y(then)d Fm(g)s Fv(\(7\))f(is)h(set)f(to)h(6)f(and)h +Fm(A)1675 1296 y Fj(E)1759 1284 y Fv(=)d Fm(A)1914 1296 +y Fj(E)1990 1284 y Fk([)21 b(f)p Fv(6)p Fm(;)14 b Fv(7)p +Fk(g)26 b Fv(=)i Fk(f)p Fv(1)p Fm(;)14 b Fv(2)p Fm(;)g +Fv(3)p Fm(;)g Fv(5)p Fm(;)g Fv(6)p Fm(;)g Fv(7)p Fk(g)p +Fv(.)26 b(This)31 b(\014nishes)f(the)681 1384 y(algorithm.)805 +1483 y(A)j(pseudo)e(co)r(de)h(for)f(the)i(assignmen)n(t)e(of)h(v)-5 +b(alues)31 b(to)h(critical)g(v)n(ertices)e(is)i(presen)n(ted)681 +1583 y(in)c(the)g(App)r(endix.)681 1730 y Fg(Assignmen)m(t)k(of)i(V)-8 +b(alues)33 b(to)h(Non-Critical)f(V)-8 b(ertices.)76 b +Fv(As)30 b Fm(G)2918 1742 y Fu(ncrit)3088 1730 y Fv(is)g(acyclic,)e(w)n +(e)681 1830 y(can)37 b(imp)r(ose)g(the)h(order)e(in)i(whic)n(h)f +(addresses)f(are)h(asso)r(ciated)f(with)i(edges)f(in)g +Fm(G)3398 1842 y Fu(ncrit)3540 1830 y Fv(,)681 1930 y(making)g(this)h +(step)g(simple)g(to)g(solv)n(e)f(b)n(y)h(a)f(standard)g(depth)i +(\014rst)e(searc)n(h)g(algorithm.)681 2029 y(Therefore,)29 +b(in)h(the)g(assignmen)n(t)g(of)g(v)-5 b(alues)29 b(to)h(v)n(ertices)f +(in)i Fm(G)2676 2041 y Fu(ncrit)2847 2029 y Fv(w)n(e)f(b)r(ene\014t)h +(from)e(the)681 2129 y(un)n(used)23 b(addresses)f(in)i(the)g(gaps)e +(left)i(b)n(y)g(the)f(assignmen)n(t)g(of)g(v)-5 b(alues)23 +b(to)h(v)n(ertices)e(in)i Fm(G)3435 2141 y Fu(crit)3540 +2129 y Fv(.)681 2229 y(F)-7 b(or)25 b(that,)h(w)n(e)f(start)g(the)h +(depth-\014rst)f(searc)n(h)f(from)h(the)h(v)n(ertices)f(in)g +Fm(V)2917 2241 y Fu(scrit)3074 2229 y Fv(b)r(ecause)g(the)h +Fm(g)681 2328 y Fv(v)-5 b(alues)27 b(for)g(these)h(critical)f(v)n +(ertices)f(w)n(ere)h(already)f(assigned)g(and)i(cannot)f(b)r(e)h(c)n +(hanged.)805 2428 y(Considering)22 b(the)h(subgraph)f +Fm(G)1817 2440 y Fu(ncrit)1981 2428 y Fv(in)h(Figure)h(3\(c\),)f(a)f +(step)h(b)n(y)f(step)h(example)g(of)f(the)681 2527 y(assignmen)n(t)33 +b(of)g(v)-5 b(alues)34 b(to)g(v)n(ertices)f(in)h Fm(G)2052 +2539 y Fu(ncrit)2227 2527 y Fv(is)g(presen)n(ted)f(in)h(Figure)24 +b(5.)34 b(Figure)24 b(5\(a\))681 2627 y(presen)n(ts)29 +b(the)h(initial)g(state)g(of)g(the)h(algorithm.)d(The)i(critical)g(v)n +(ertex)f(8)g(is)h(the)h(only)e(one)681 2727 y(that)e(has)g +(non-critical)e(v)n(ertices)h(as)h(adjacen)n(t.)f(In)h(the)h(example)e +(presen)n(ted)h(in)g(Figure)d(4,)681 2826 y(the)h(addresses)e +Fk(f)p Fv(0)p Fm(;)14 b Fv(4)p Fk(g)23 b Fv(w)n(ere)h(not)g(used.)h +(So,)g(taking)f(the)h(\014rst)f(un)n(used)h(address)e(0)i(and)f(the)681 +2926 y(v)n(ertex)e(1,)h(whic)n(h)h(is)f(reac)n(hed)f(from)h(the)h(v)n +(ertex)e(8,)h Fm(g)s Fv(\(1\))g(is)h(set)f(to)g(0)10 +b Fk(\000)g Fm(g)s Fv(\(8\))22 b(=)h(0,)g(as)g(sho)n(wn)681 +3026 y(in)37 b(Figure)24 b(5\(b\).)38 b(The)f(only)g(v)n(ertex)f(that)i +(is)f(reac)n(hed)f(from)g(v)n(ertex)h(1)f(is)h(v)n(ertex)g(2,)f(so)681 +3125 y(taking)23 b(the)h(un)n(used)g(address)f(4)g(w)n(e)h(set)g +Fm(g)s Fv(\(2\))g(to)f(4)11 b Fk(\000)g Fm(g)s Fv(\(1\))23 +b(=)f(4,)i(as)f(sho)n(wn)g(in)h(Figure)h(5\(c\).)681 +3225 y(This)i(pro)r(cess)g(is)g(rep)r(eated)g(un)n(til)i(the)e +(UnAssignedAddresses)g(list)h(b)r(ecomes)f(empt)n(y)-7 +b(.)765 3864 y + currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch +translate + 765 3864 a @beginspecial 0 @llx 0 @lly +383 @urx 86 @ury 3830 @rwi @setspecial +%%BeginDocument: figs/grafsearchingncv.ps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: grafsearchingncv.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Wed Jan 12 17:46:18 2005 +%%For: fbotelho@tigre (Fabiano Cupertino Botelho) +%%BoundingBox: 0 0 383 86 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.824 0.824 0.824 srgb} bind def + +end +save +newpath 0 86 moveto 0 0 lineto 383 0 lineto 383 86 lineto closepath clip newpath +-19.8 144.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +7.500 slw +n 1035 1890 m 1215 1890 l 1215 2070 l 1035 2070 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +1095 2017 m +gs 1 -1 sc (0) col0 sh gr +% Polyline +n 1215 1890 m 1395 1890 l 1395 2070 l 1215 2070 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +1275 2017 m +gs 1 -1 sc (4) col0 sh gr +% Polyline +n 3015 1890 m 3195 1890 l 3195 2070 l 3015 2070 l + cp gs col0 s gr +/Times-Roman ff 120.00 scf sf +3075 2017 m +gs 1 -1 sc (4) col0 sh gr +% Arc +n 1102.5 1462.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 2992.5 1462.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Arc +n 5107.5 1462.5 697.9 -20.8 20.8 arc +gs col0 s gr + +% Polyline +n 1215 1440 m + 1755 1215 l gs col0 s gr +% Polyline +n 1216 1443 m + 1756 1218 l gs col0 s gr +% Polyline +n 3105 1440 m + 3645 1215 l gs col0 s gr +% Polyline +n 3106 1443 m + 3646 1218 l gs col0 s gr +% Polyline +n 5220 1440 m + 5760 1215 l gs col0 s gr +% Polyline +n 5221 1443 m + 5761 1218 l gs col0 s gr +/Times-Roman ff 120.00 scf sf +945 1485 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +630 2250 m +gs 1 -1 sc (UnAssignedAddresses) col0 sh gr +/Times-Roman ff 120.00 scf sf +2835 1485 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +3285 1305 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 120.00 scf sf +2520 2250 m +gs 1 -1 sc (UnAssignedAddresses) col0 sh gr +/Times-Roman ff 120.00 scf sf +4950 1485 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5400 1305 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman ff 120.00 scf sf +4635 2250 m +gs 1 -1 sc (UnAssignedAddresses) col0 sh gr +/Times-Roman ff 120.00 scf sf +4590 1890 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +5670 1890 m +gs 1 -1 sc (g:4) col0 sh gr +/Times-Roman ff 120.00 scf sf +5670 1080 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 120.00 scf sf +4590 1080 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +4320 1125 m +gs 1 -1 sc (c\)) col0 sh gr +/Times-Roman ff 120.00 scf sf +3555 1080 m +gs 1 -1 sc (g:0) col0 sh gr +/Times-Roman ff 165.00 scf sf +2205 1125 m +gs 1 -1 sc (b\)) col0 sh gr +/Times-Roman ff 165.00 scf sf +315 1125 m +gs 1 -1 sc (a\)) col0 sh gr +/Times-Roman ff 120.00 scf sf +5850 1485 m +gs 1 -1 sc (4) col0 sh gr +% here ends figure; +% +% here starts figure with depth 45 +% Ellipse +7.500 slw +n 675 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +645 1252 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 675 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +645 1702 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 1215 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1185 1477 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 1755 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1725 1702 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 1755 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +1725 1252 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 2565 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2535 1252 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 2565 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +2535 1702 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 3105 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3075 1477 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 3645 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3615 1702 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 3645 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +3615 1252 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 4680 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 1252 m +gs 1 -1 sc (6) col0 sh gr +% Ellipse +n 4680 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +4650 1702 m +gs 1 -1 sc (5) col0 sh gr +% Ellipse +n 5220 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5190 1477 m +gs 1 -1 sc (8) col0 sh gr +% Ellipse +n 5760 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 1702 m +gs 1 -1 sc (2) col0 sh gr +% Ellipse +n 5760 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr + +/Times-Roman ff 120.00 scf sf +5730 1252 m +gs 1 -1 sc (1) col0 sh gr +% Ellipse +n 5217 2000 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr + +% Polyline +n 5235 1940 m + 5198 2061 l gs col32 1.00 tnt ef gr gs col0 s gr +% here ends figure; +$F2psEnd +rs +showpage + +%%EndDocument + @endspecial 765 3864 a + currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg +exch neg exch translate + 765 3864 a 900 4005 a Fg(Fig.)15 +b(5.)27 b Fv(Example)g(of)g(the)h(assignmen)n(t)f(of)g(v)-5 +b(alues)28 b(to)f(non-critical)f(v)n(ertices)805 4118 +y(A)19 b(pseudo)f(co)r(de)h(for)f(the)h(assignmen)n(t)e(of)i(v)-5 +b(alues)18 b(to)g(non-critical)g(v)n(ertices)f(is)h(presen)n(ted)681 +4218 y(in)28 b(the)g(App)r(endix.)681 4365 y Fg(Analysis)21 +b(of)h(the)g(Searc)m(hing)h(Step.)56 b Fv(W)-7 b(e)19 +b(shall)g(demonstrate)f(that)i(\(i\))f(the)h(maxim)n(um)681 +4465 y(v)-5 b(alue)23 b(assigned)e(to)i(an)f(edge)h(is)f(at)h(most)g +Fm(n)9 b Fk(\000)g Fv(1)22 b(\(that)h(is,)g(w)n(e)f(generate)g(a)g +(minimal)h(p)r(erfect)681 4565 y(hash)38 b(function\),)i(and)f(\(ii\))h +(the)f(p)r(erfect)h(assignmen)n(t)e(problem)g(\(determination)h(of)25 +b Fm(g)s Fv(\))681 4664 y(can)k(b)r(e)h(solv)n(ed)f(in)h(exp)r(ected)g +(time)g Fm(O)r Fv(\()p Fm(n)p Fv(\))h(if)g(the)f(n)n(um)n(b)r(er)f(of)h +(edges)f(in)h Fm(G)3063 4676 y Fu(crit)3198 4664 y Fv(is)f(at)h(most) +691 4731 y Fu(1)p 691 4745 34 4 v 691 4792 a(2)734 4764 +y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)805 +4863 y(W)-7 b(e)31 b(fo)r(cus)f(on)g(the)g(analysis)f(of)h(the)g +(assignmen)n(t)g(of)g(v)-5 b(alues)29 b(to)h(critical)g(v)n(ertices)f +(b)r(e-)681 4963 y(cause)34 b(the)i(assignmen)n(t)e(of)i(v)-5 +b(alues)35 b(to)g(non-critical)f(v)n(ertices)g(can)h(b)r(e)h(solv)n(ed) +e(in)h(linear)681 5063 y(time)28 b(b)n(y)f(a)g(depth)i(\014rst)e(searc) +n(h)f(algorithm.)p eop end +%%Page: 9 9 +TeXDict begin 9 8 bop 490 387 a Fv(W)-7 b(e)24 b(no)n(w)e(de\014ne)i +(certain)f(complexit)n(y)f(measures.)g(Let)i Fm(I)7 b +Fv(\()p Fm(v)s Fv(\))24 b(b)r(e)g(the)g(n)n(um)n(b)r(er)f(of)g(times) +365 487 y(a)h(candidate)g(v)-5 b(alue)24 b Fm(x)g Fv(for)g +Fm(g)s Fv(\()p Fm(v)s Fv(\))g(is)g(incremen)n(ted.)g(Let)g +Fm(N)2166 499 y Fj(t)2219 487 y Fv(b)r(e)h(the)f(total)g(n)n(um)n(b)r +(er)g(of)g(times)365 587 y(that)g(candidate)g(v)-5 b(alues)23 +b Fm(x)i Fv(are)d(incremen)n(ted.)i(Th)n(us,)g(w)n(e)f(ha)n(v)n(e)h +Fm(N)2457 599 y Fj(t)2509 587 y Fv(=)2596 524 y Fi(P)2698 +587 y Fm(I)7 b Fv(\()p Fm(v)s Fv(\),)25 b(where)e(the)365 +686 y(sum)28 b(is)g(o)n(v)n(er)d(all)g Fm(v)h Fk(2)e +Fm(V)18 b Fv(\()p Fm(G)1223 698 y Fu(crit)1328 686 y +Fv(\).)490 786 y(Com)n(bining)23 b(the)h(fact)g(that)g +Fm(G)1448 798 y Fu(crit)1552 786 y Fv(,)g(the)g(2-core)e(of)i +Fm(G)p Fv(,)g(is)f(almost)g(surely)g(connected)h(for)365 +886 y Fm(c)i Fv(=)g(1)p Fm(:)p Fv(15)i(\(see)h([1,)g(12)o(,)g(15)o(]\)) +h(and)f(the)h(fact)g(that)f(ev)n(ery)f(edge)h(is)g(either)g(a)g(tree)g +(edge)g(or)g(a)365 985 y(bac)n(k)e(edge)g(\(see,)h(e.g.,)f([3]\),)h(w)n +(e)f(see)g(that)h(the)g(follo)n(wing)e(holds.)365 1167 +y Fg(Theorem)16 b(1.)41 b Fl(The)28 b(numb)l(er)e(of)j(b)l(ack)f(e)l +(dges)f Fm(N)1887 1179 y Fu(b)r(edges)2112 1167 y Fl(of)h +Fm(G)c Fv(=)e Fm(G)2448 1179 y Fu(crit)2566 1167 y Fk([)13 +b Fm(G)2699 1179 y Fu(ncrit)2868 1167 y Fl(is)28 b(given)g(by)365 +1266 y Fm(N)432 1278 y Fu(b)r(edges)653 1266 y Fv(=)22 +b Fk(j)p Fm(E)5 b Fv(\()p Fm(G)926 1278 y Fu(crit)1031 +1266 y Fv(\))p Fk(j)19 b(\000)f(j)p Fm(V)h Fv(\()p Fm(G)1375 +1278 y Fu(crit)1480 1266 y Fv(\))p Fk(j)g Fv(+)f(1)p +Fl(.)1488 b Fk(u)-55 b(t)490 1448 y Fv(Our)32 b(next)g(result)g +(concerns)g(the)h(maximal)e(v)-5 b(alue)33 b Fm(A)2209 +1460 y Fu(max)2368 1448 y Fv(assigned)f(to)g(an)g(edge)g +Fm(e)f Fk(2)365 1548 y Fm(E)5 b Fv(\()p Fm(G)528 1560 +y Fu(crit)633 1548 y Fv(\))28 b(after)g(the)f(assignmen)n(t)g(of)h +Fm(g)i Fv(v)-5 b(alues)27 b(to)h(critical)f(v)n(ertices.)365 +1729 y Fg(Theorem)16 b(2.)41 b Fl(We)29 b(have)i Fm(A)1274 +1741 y Fu(max)1424 1729 y Fk(\024)23 b Fv(2)p Fk(j)p +Fm(V)18 b Fv(\()p Fm(G)1740 1741 y Fu(crit)1845 1729 +y Fv(\))p Fk(j)h(\000)f Fv(3)g(+)g(2)p Fm(N)2254 1741 +y Fj(t)2283 1729 y Fl(.)365 1911 y(Pr)l(o)l(of.)43 b +Fv(\(Sk)n(etc)n(h\))24 b(The)f(assignmen)n(t)g(of)g Fm(g)j +Fv(v)-5 b(alues)23 b(to)g(critical)g(v)n(ertices)f(starts)g(from)h(0,)g +(and)365 2011 y(eac)n(h)c(edge)25 b Fm(e)19 b Fv(receiv)n(es)f(the)j +(lab)r(el)e Fm(h)p Fv(\()p Fm(e)p Fv(\))h(as)f(giv)n(en)g(b)n(y)h(Eq.)k +(\(3\).)c(The)g Fm(g)i Fv(v)-5 b(alue)20 b(for)f(eac)n(h)g(v)n(ertex) +365 2110 y Fm(v)41 b Fv(in)c Fm(V)19 b Fv(\()p Fm(G)716 +2122 y Fu(crit)821 2110 y Fv(\))37 b(is)g(assigned)e(only)i(once.)f(A)i +(little)f(though)n(t)g(sho)n(ws)f(that)25 b(max)2940 +2122 y Fj(v)2994 2110 y Fm(g)s Fv(\()p Fm(v)s Fv(\))39 +b Fk(\024)365 2210 y(j)p Fm(V)19 b Fv(\()p Fm(G)552 2222 +y Fu(crit)657 2210 y Fv(\))p Fk(j)e(\000)f Fv(1)g(+)g +Fm(N)1016 2222 y Fj(t)1045 2210 y Fv(,)27 b(where)f(the)h(maxim)n(um)g +(is)f(tak)n(en)g(o)n(v)n(er)f(all)h(v)n(ertices)e Fm(v)30 +b Fv(in)25 b Fm(V)19 b Fv(\()p Fm(G)3087 2222 y Fu(crit)3192 +2210 y Fv(\).)365 2309 y(Moreo)n(v)n(er,)f(t)n(w)n(o)i(distinct)h(v)n +(ertices)e(get)h(distinct)26 b Fm(g)d Fv(v)-5 b(alues.)20 +b(Hence,)g Fm(A)2561 2321 y Fu(max)2711 2309 y Fk(\024)j +Fv(\()p Fk(j)p Fm(V)c Fv(\()p Fm(G)3018 2321 y Fu(crit)3123 +2309 y Fv(\))p Fk(j)t(\000)365 2409 y Fv(1)f(+)g Fm(N)575 +2421 y Fj(t)604 2409 y Fv(\))h(+)f(\()p Fk(j)p Fm(V)h +Fv(\()p Fm(G)957 2421 y Fu(crit)1062 2409 y Fv(\))p Fk(j)g(\000)f +Fv(2)g(+)g Fm(N)1429 2421 y Fj(t)1458 2409 y Fv(\))23 +b Fk(\024)g Fv(2)p Fk(j)p Fm(V)18 b Fv(\()p Fm(G)1829 +2421 y Fu(crit)1934 2409 y Fv(\))p Fk(j)h(\000)f Fv(3)g(+)g(2)p +Fm(N)2343 2421 y Fj(t)2371 2409 y Fv(,)28 b(as)f(required.)346 +b Fk(u)-55 b(t)365 2573 y Fg(Maximal)46 b(V)-8 b(alue)46 +b(Assigned)f(to)h(An)g(Edge.)103 b Fv(In)40 b(this)g(section)g(w)n(e)f +(presen)n(t)h(the)365 2673 y(follo)n(wing)27 b(conjecture.)365 +2805 y Fg(Conjecture)17 b(1.)40 b Fl(F)-6 b(or)41 b(a)h(r)l(andom)f(gr) +l(aph)h Fm(G)f Fl(with)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2239 +2817 y Fu(crit)2344 2805 y Fv(\))p Fk(j)44 b(\024)e Fm(n=)p +Fv(2)e Fl(and)i Fk(j)p Fm(V)18 b Fv(\()p Fm(G)p Fv(\))p +Fk(j)45 b Fv(=)365 2904 y(1)p Fm(:)p Fv(15)p Fm(n)p Fl(,)30 +b(it)i(is)f(always)i(p)l(ossible)g(to)e(gener)l(ate)g(a)h(minimal)g(p)l +(erfe)l(ct)g(hash)g(function)f(b)l(e)l(c)l(ause)365 3004 +y(the)f(maximal)h(value)f Fm(A)1115 3016 y Fu(max)1272 +3004 y Fl(assigne)l(d)g(to)g(an)g(e)l(dge)g Fm(e)23 b +Fk(2)h Fm(E)5 b Fv(\()p Fm(G)2303 3016 y Fu(crit)2408 +3004 y Fv(\))30 b Fl(is)g(at)f(most)h Fm(n)18 b Fk(\000)g +Fv(1)p Fl(.)490 3169 y Fv(Let)32 b(us)h(assume)f(for)f(the)i(momen)n(t) +g(that)f Fm(N)1903 3181 y Fj(t)1963 3169 y Fk(\024)f +Fm(N)2126 3181 y Fu(b)r(edges)2324 3169 y Fv(.)h(Then,)h(from)f +(Theorems)24 b(1)365 3269 y(and)h(2,)34 b(w)n(e)g(ha)n(v)n(e)f +Fm(A)1012 3281 y Fu(max)1173 3269 y Fk(\024)g Fv(2)p +Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1500 3281 y Fu(crit)1605 +3269 y Fv(\))p Fk(j)k(\000)f Fv(3)g(+)h(2)p Fm(N)2031 +3281 y Fj(t)2093 3269 y Fk(\024)34 b Fv(2)p Fk(j)p Fm(V)18 +b Fv(\()p Fm(G)2420 3281 y Fu(crit)2525 3269 y Fv(\))p +Fk(j)23 b(\000)g Fv(3)f(+)h(2)p Fm(N)2952 3281 y Fu(b)r(edges)3183 +3269 y Fk(\024)365 3369 y Fv(2)p Fk(j)p Fm(V)c Fv(\()p +Fm(G)594 3381 y Fu(crit)699 3369 y Fv(\))p Fk(j)9 b(\000)g +Fv(3)g(+)g(2\()p Fk(j)p Fm(E)c Fv(\()p Fm(G)1222 3381 +y Fu(crit)1326 3369 y Fv(\))p Fk(j)k(\000)g(j)p Fm(V)19 +b Fv(\()p Fm(G)1651 3381 y Fu(crit)1756 3369 y Fv(\))p +Fk(j)9 b Fv(+)g(1\))23 b Fk(\024)g Fv(2)p Fk(j)p Fm(E)5 +b Fv(\()p Fm(G)2307 3381 y Fu(crit)2411 3369 y Fv(\))p +Fk(j)k(\000)g Fv(1.)23 b(As)g(b)n(y)g(h)n(yp)r(othesis)365 +3468 y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)551 3480 y Fu(crit)656 +3468 y Fv(\))p Fk(j)24 b(\024)e Fm(n=)p Fv(2,)27 b(w)n(e)g(ha)n(v)n(e)g +Fm(A)1382 3480 y Fu(max)1532 3468 y Fk(\024)22 b Fm(n)d +Fk(\000)f Fv(1,)27 b(as)g(required.)490 3568 y Fl(In)33 +b(the)h(mathematic)l(al)h(analysis)g(of)f(our)g(algorithm,)h(what)g(is) +f(left)g(op)l(en)g(is)g(a)g(single)365 3667 y(pr)l(oblem:)e(pr)l(ove)e +(that)g Fm(N)1160 3679 y Fj(t)1212 3667 y Fk(\024)23 +b Fm(N)1367 3679 y Fu(b)r(edges)1564 3667 y Fl(.)1589 +3637 y Fu(4)490 3767 y Fv(W)-7 b(e)26 b(no)n(w)e(sho)n(w)h(exp)r +(erimen)n(tal)g(evidence)g(that)g Fm(N)2075 3779 y Fj(t)2127 +3767 y Fk(\024)e Fm(N)2282 3779 y Fu(b)r(edges)2480 3767 +y Fv(.)i(Considering)f(Eqs)g(\(1\))365 3867 y(and)h(\(2\),)g(the)g(exp) +r(ected)g(v)-5 b(alues)24 b(for)g Fk(j)p Fm(V)19 b Fv(\()p +Fm(G)1716 3879 y Fu(crit)1821 3867 y Fv(\))p Fk(j)24 +b Fv(and)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2245 3879 y Fu(crit)2350 +3867 y Fv(\))p Fk(j)25 b Fv(for)f Fm(c)f Fv(=)g(1)p Fm(:)p +Fv(15)g(are)g(0)p Fm(:)p Fv(401)p Fm(n)365 3966 y Fv(and)37 +b(0)p Fm(:)p Fv(501)p Fm(n)p Fv(,)e(resp)r(ectiv)n(ely)-7 +b(.)36 b(F)-7 b(rom)37 b(Theorem)24 b(1,)36 b Fm(N)2057 +3978 y Fu(b)r(edges)2293 3966 y Fv(=)j(0)p Fm(:)p Fv(501)p +Fm(n)22 b Fk(\000)j Fv(0)p Fm(:)p Fv(401)p Fm(n)d Fv(+)i(1)39 +b(=)365 4066 y(0)p Fm(:)p Fv(1)p Fm(n)19 b Fv(+)h(1.)30 +b(T)-7 b(able)24 b(3)30 b(presen)n(ts)f(the)h(maximal)g(v)-5 +b(alue)30 b(of)g Fm(N)2210 4078 y Fj(t)2269 4066 y Fv(obtained)f +(during)h(10,000)e(ex-)365 4166 y(ecutions)h(of)g(the)h(algorithm)e +(for)h(di\013eren)n(t)g(sizes)g(of)g Fm(S)5 b Fv(.)29 +b(The)g(maximal)g(v)-5 b(alue)29 b(of)g Fm(N)3057 4178 +y Fj(t)3115 4166 y Fv(w)n(as)365 4265 y(alw)n(a)n(ys)d(smaller)h(than)g +Fm(N)1178 4277 y Fu(b)r(edges)1399 4265 y Fv(=)22 b(0)p +Fm(:)p Fv(1)p Fm(n)c Fv(+)g(1)27 b(and)g(tends)h(to)g(0)p +Fm(:)p Fv(059)p Fm(n)d Fv(for)i Fm(n)c Fk(\025)g Fv(1)p +Fm(;)p Fv(000)p Fm(;)n Fv(000.)365 4430 y Fg(Time)e(Complexit)m(y)-8 +b(.)54 b Fv(W)-7 b(e)20 b(no)n(w)e(sho)n(w)g(that)h(the)g(time)g +(complexit)n(y)f(of)h(determining)25 b Fm(g)s Fv(\()p +Fm(v)s Fv(\))365 4530 y(for)d(all)g(critical)f(v)n(ertices)j +Fm(x)f Fk(2)h Fm(V)19 b Fv(\()p Fm(G)1479 4542 y Fu(crit)1584 +4530 y Fv(\))j(is)g Fm(O)r Fv(\()p Fk(j)p Fm(V)e Fv(\()p +Fm(G)2001 4542 y Fu(crit)2106 4530 y Fv(\))p Fk(j)p Fv(\))k(=)e +Fm(O)r Fv(\()p Fm(n)p Fv(\).)h(F)-7 b(or)22 b(eac)n(h)f(unassigned)365 +4630 y(v)n(ertex)d Fm(v)s Fv(,)h(the)h(adjacency)e(list)h(of)g +Fm(v)s Fv(,)g(whic)n(h)g(w)n(e)g(call)f(Adj\()p Fm(v)s +Fv(\),)j(m)n(ust)e(b)r(e)g(tra)n(v)n(ersed)e(to)i(collect)365 +4729 y(the)25 b(set)f Fm(Y)43 b Fv(of)24 b(adjacen)n(t)g(v)n(ertices)f +(that)i(ha)n(v)n(e)e(already)g(b)r(een)h(assigned)f(a)h(v)-5 +b(alue.)24 b(Then,)h(for)365 4829 y(eac)n(h)g(v)n(ertex)g(in)h +Fm(Y)18 b Fv(,)26 b(w)n(e)g(c)n(hec)n(k)e(if)j(the)f(curren)n(t)e +(candidate)i(v)-5 b(alue)25 b Fm(x)i Fv(is)e(forbidden)h(b)r(ecause)365 +4929 y(setting)32 b Fm(g)s Fv(\()p Fm(v)s Fv(\))d(=)g +Fm(x)i Fv(w)n(ould)g(create)f(t)n(w)n(o)h(edges)f(with)i(the)g(same)e +(endp)r(oin)n(t)i(sum.)f(Finally)-7 b(,)p 365 5002 473 +4 v 382 5056 a Ft(4)442 5088 y Fs(Bollob\023)-38 b(as)24 +b(and)e(Pikh)n(urk)n(o)i([2])e(ha)n(v)n(e)g(in)n(v)n(estigated)g(a)g(v) +n(ery)f(close)i(v)n(ertex)e(lab)r(elling)i(problem)f(for)442 +5179 y(random)k(graphs.)g(Ho)n(w)n(ev)n(er,)g(their)g(in)n(terest)f(w)n +(as)i(on)f(denser)f(random)h(graphs,)g(and)g(it)f(seems)442 +5270 y(that)30 b(di\013eren)n(t)f(metho)r(ds)h(will)h(ha)n(v)n(e)f(to)g +(b)r(e)f(used)h(to)g(attac)n(k)g(the)f(sparser)i(case)g(that)e(w)n(e)i +(are)442 5362 y(in)n(terested)26 b(in)f(here.)p eop end +%%Page: 10 10 +TeXDict begin 10 9 bop 1595 391 1054 4 v 1593 482 4 92 +v 1739 455 a Fo(n)p 1928 482 V 157 w Fs(Maximal)26 b(v)l(alue)g(of)g +Fo(N)2608 463 y Fc(t)p 2647 482 V 1595 485 1054 4 v 1593 +577 4 92 v 1656 549 a Fs(10)p Fo(;)q Fs(000)p 1928 577 +V 310 w(0)p Fo(:)p Fs(067)p Fo(n)p 2647 577 V 1593 668 +V 1637 641 a Fs(100)p Fo(;)q Fs(000)p 1928 668 V 291 +w(0)p Fo(:)p Fs(061)p Fo(n)p 2647 668 V 1593 759 V 1607 +732 a Fs(1)p Fo(;)q Fs(000)p Fo(;)q Fs(000)p 1927 759 +V 261 w(0)p Fo(:)p Fs(059)p Fo(n)p 2647 759 V 1593 851 +V 1607 823 a Fs(2)p Fo(;)q Fs(000)p Fo(;)q Fs(000)p 1927 +851 V 261 w(0)p Fo(:)p Fs(059)p Fo(n)p 2647 851 V 1593 +1002 4 152 v 1752 909 a Fs(.)1752 942 y(.)1752 975 y(.)p +1928 1002 V 2278 909 a(.)2278 942 y(.)2278 975 y(.)p +2647 1002 V 1595 1006 1054 4 v 1028 1149 a Fp(T)-7 b(able)28 +b(3.)d Fs(The)h(maximal)h(v)l(alue)e(of)h Fo(N)2181 1157 +y Fc(t)2235 1149 y Fs(for)h(di\013eren)n(t)e(n)n(um)n(b)r(er)g(of)h +(URLs)681 1292 y Fv(the)38 b(edge)f(linking)h Fm(v)j +Fv(and)d Fm(u)p Fv(,)f(for)g(all)h Fm(u)h Fk(2)i Fm(Y)18 +b Fv(,)38 b(is)g(asso)r(ciated)e(with)j(the)f(address)e(that)681 +1392 y(corresp)r(onds)d(to)j(the)g(sum)f(of)h(its)f(endp)r(oin)n(ts.)h +(Let)g Fm(d)2424 1404 y Fu(crit)2564 1392 y Fv(=)g(2)p +Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2893 1404 y Fu(crit)2998 +1392 y Fv(\))p Fk(j)p Fm(=)p Fk(j)p Fm(V)19 b Fv(\()p +Fm(G)3282 1404 y Fu(crit)3386 1392 y Fv(\))p Fk(j)36 +b Fv(b)r(e)681 1492 y(the)27 b(a)n(v)n(erage)d(degree)i(of)h +Fm(G)1537 1504 y Fu(crit)1641 1492 y Fv(,)g(note)g(that)e +Fk(j)p Fm(Y)19 b Fk(j)k(\024)g(j)p Fv(Adj\()p Fm(v)s +Fv(\))p Fk(j)p Fv(,)28 b(and)f(supp)r(ose)f(for)h(simplicit)n(y)681 +1591 y(that)e Fk(j)p Fv(Adj)q(\()p Fm(v)s Fv(\))p Fk(j)i +Fv(=)e Fm(O)r Fv(\()p Fm(d)1402 1603 y Fu(crit)1508 1591 +y Fv(\).)k(Then,)h(putting)g(all)f(these)g(together,)g(w)n(e)g(see)g +(that)g(the)h(time)681 1691 y(complexit)n(y)d(of)g(this)h(pro)r(cedure) +f(is)1051 1849 y Fm(C)6 b Fv(\()p Fk(j)p Fm(V)19 b Fv(\()p +Fm(G)1335 1861 y Fu(crit)1440 1849 y Fv(\))p Fk(j)p Fv(\))24 +b(=)1638 1787 y Fi(P)1726 1874 y Fj(v)r Ff(2)p Fj(V)14 +b Fu(\()p Fj(G)1937 1882 y Fd(crit)2028 1874 y Fu(\))2072 +1782 y Fi(\002)2125 1849 y Fk(j)p Fv(Adj)q(\()p Fm(v)s +Fv(\))p Fk(j)19 b Fv(+)f(\()p Fm(I)7 b Fv(\()p Fm(v)s +Fv(\))20 b Fk(\002)e(j)p Fm(Y)h Fk(j)p Fv(\))g(+)f Fk(j)p +Fm(Y)g Fk(j)3158 1782 y Fi(\003)1295 1984 y Fk(\024)1383 +1922 y Fi(P)1471 2009 y Fj(v)r Ff(2)p Fj(V)c Fu(\()p +Fj(G)1682 2017 y Fd(crit)1773 2009 y Fu(\))1803 1984 +y Fv(\(2)k(+)g Fm(I)7 b Fv(\()p Fm(v)s Fv(\)\))p Fk(j)p +Fv(Adj)r(\()p Fm(v)s Fv(\))p Fk(j)24 b Fv(=)f(4)p Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)2788 1996 y Fu(crit)2893 1984 y +Fv(\))p Fk(j)18 b Fv(+)g Fm(O)r Fv(\()p Fm(N)3213 1996 +y Fj(t)3243 1984 y Fm(d)3286 1996 y Fu(crit)3391 1984 +y Fv(\))p Fm(:)681 2153 y Fv(As)38 b Fm(d)857 2165 y +Fu(crit)1002 2153 y Fv(=)i(2)25 b Fk(\002)g Fv(0)p Fm(:)p +Fv(501)p Fm(n=)p Fv(0)p Fm(:)p Fv(401)p Fm(n)36 b Fk(')k +Fv(2)p Fm(:)p Fv(499)d(\(a)h(constan)n(t\))f(w)n(e)h(ha)n(v)n(e)f +Fm(O)r Fv(\()p Fk(j)p Fm(E)5 b Fv(\()p Fm(G)3264 2165 +y Fu(crit)3370 2153 y Fv(\))p Fk(j)p Fv(\))41 b(=)681 +2253 y Fm(O)r Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)966 +2265 y Fu(crit)1071 2253 y Fv(\))p Fk(j)p Fv(\).)39 b(Supp)r(osing)g +(that)g Fm(N)1889 2265 y Fj(t)1960 2253 y Fk(\024)i Fm(N)2133 +2265 y Fu(b)r(edges)2330 2253 y Fv(,)e(w)n(e)g(ha)n(v)n(e,)f(from)g +(Theorem)24 b(1,)38 b(that)681 2352 y Fm(N)748 2364 y +Fj(t)800 2352 y Fk(\024)22 b(j)p Fm(E)5 b Fv(\()p Fm(G)1073 +2364 y Fu(crit)1178 2352 y Fv(\))p Fk(j\000j)p Fm(V)19 +b Fv(\()p Fm(G)1485 2364 y Fu(crit)1590 2352 y Fv(\))p +Fk(j)p Fv(+1)k(=)f Fm(O)r Fv(\()p Fk(j)p Fm(E)5 b Fv(\()p +Fm(G)2145 2364 y Fu(crit)2251 2352 y Fv(\))p Fk(j)p Fv(\).)19 +b(W)-7 b(e)19 b(conclude)f(that)h Fm(C)6 b Fv(\()p Fk(j)p +Fm(V)19 b Fv(\()p Fm(G)3301 2364 y Fu(crit)3406 2352 +y Fv(\))p Fk(j)p Fv(\))24 b(=)681 2452 y Fm(O)r Fv(\()p +Fk(j)p Fm(E)5 b Fv(\()p Fm(G)964 2464 y Fu(crit)1070 +2452 y Fv(\))p Fk(j)p Fv(\))23 b(=)g Fm(O)r Fv(\()p Fk(j)p +Fm(V)d Fv(\()p Fm(G)1553 2464 y Fu(crit)1658 2452 y Fv(\))p +Fk(j)p Fv(\).)h(As)g Fk(j)p Fm(V)e Fv(\()p Fm(G)2092 +2464 y Fu(crit)2197 2452 y Fv(\))p Fk(j)24 b(\024)e(j)p +Fm(V)d Fv(\()p Fm(G)p Fv(\))p Fk(j)j Fv(and)f Fk(j)p +Fm(V)e Fv(\()p Fm(G)p Fv(\))p Fk(j)24 b Fv(=)e Fm(cn)p +Fv(,)f(the)g(time)681 2551 y(required)26 b(to)i(determine)d +Fm(g)30 b Fv(on)d(the)h(critical)f(v)n(ertices)g(is)g +Fm(O)r Fv(\()p Fm(n)p Fv(\).)681 2725 y Fn(4)112 b(Exp)s(erimen)m(tal) +38 b(Results)681 2871 y Fv(W)-7 b(e)40 b(no)n(w)g(presen)n(t)g(some)f +(exp)r(erimen)n(tal)h(results.)g(The)g(same)g(exp)r(erimen)n(ts)g(w)n +(ere)f(run)681 2971 y(with)c(our)f(algorithm)f(and)h(the)h(algorithm)f +(due)g(to)h(Czec)n(h,)f(Ha)n(v)-5 b(as)34 b(and)g(Ma)5 +b(jewski)24 b([4],)681 3070 y(referred)36 b(to)i(as)f(CHM)h(algorithm.) +e(The)i(t)n(w)n(o)e(algorithms)h(w)n(ere)f(implemen)n(ted)j(in)e(the) +681 3170 y(C)32 b(language)e(and)i(are)f(a)n(v)-5 b(ailable)30 +b(at)i Fb(https://sourcefor)o(ge)o(.ne)o(t/)o(pro)o(je)o(cts)o(/c)o(mp) +o(h/)p Fv(.)681 3269 y(Our)18 b(data)g(consists)f(of)i(a)f(collection)g +(of)g(100)g(million)g(univ)n(erse)g(resource)e(lo)r(cations)i(\(URLs\)) +681 3369 y(collected)h(from)h(the)g(W)-7 b(eb.)21 b(The)f(a)n(v)n +(erage)d(length)j(of)g(a)f(URL)h(in)h(the)f(collection)f(is)h(63)f(b)n +(ytes.)681 3469 y(All)i(exp)r(erimen)n(ts)g(w)n(ere)f(carried)g(on)h(a) +f(computer)h(running)g(the)g(Lin)n(ux)g(op)r(erating)f(system,)681 +3568 y(v)n(ersion)26 b(2.6.7,)g(with)i(a)g(2.4)e(gigahertz)g(pro)r +(cessor)g(and)h(4)g(gigab)n(ytes)f(of)i(main)f(memory)-7 +b(.)805 3668 y(T)g(able)25 b(4)f(presen)n(ts)g(the)i(main)f(c)n +(haracteristics)d(of)j(the)g(t)n(w)n(o)f(algorithms.)g(The)h(n)n(um)n +(b)r(er)681 3768 y(of)33 b(edges)g(in)h(the)g(graph)e +Fm(G)h Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))34 b(is)25 +b Fk(j)p Fm(S)5 b Fk(j)32 b Fv(=)h Fm(n)p Fv(,)g(the)h(n)n(um)n(b)r(er) +f(of)h(k)n(eys)e(in)i(the)g(input)681 3867 y(set)25 b +Fm(S)5 b Fv(.)24 b(The)g(n)n(um)n(b)r(er)g(of)h(v)n(ertices)e(of)h +Fm(G)h Fv(is)f(equal)g(to)g(1)p Fm(:)p Fv(15)p Fm(n)f +Fv(and)i(2)p Fm(:)p Fv(09)p Fm(n)d Fv(for)i(our)g(algorithm)681 +3967 y(and)j(the)g(CHM)h(algorithm,)e(resp)r(ectiv)n(ely)-7 +b(.)26 b(This)h(measure)f(is)h(related)g(to)g(the)g(amoun)n(t)g(of)681 +4066 y(space)20 b(to)h(store)f(the)i(arra)n(y)d Fm(g)s +Fv(.)i(This)g(impro)n(v)n(es)e(the)j(space)e(required)h(to)g(store)f(a) +h(function)g(in)681 4166 y(our)i(algorithm)h(to)g(55\045)g(of)g(the)h +(space)e(required)h(b)n(y)g(the)h(CHM)f(algorithm.)g(The)g(n)n(um)n(b)r +(er)681 4266 y(of)33 b(critical)f(edges)h(is)1389 4233 +y Fu(1)p 1389 4247 34 4 v 1389 4294 a(2)1433 4266 y Fk(j)p +Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)34 b Fv(and)f(0,)f(for)h(our)f +(algorithm)g(and)h(the)g(CHM)h(algorithm,)681 4365 y(resp)r(ectiv)n +(ely)-7 b(.)31 b(Our)g(algorithm)g(generates)f(random)h(graphs)f(that)j +(necessarily)d(con)n(tains)681 4465 y(cycles)36 b(and)g(the)h(CHM)g +(algorithm)f(generates)f(acyclic)h(random)f(graphs.)h(Finally)-7 +b(,)36 b(the)681 4565 y(CHM)c(algorithm)e(generates)g(order)g +(preserving)g(functions)h(while)h(our)f(algorithm)f(do)r(es)681 +4664 y(not)d(preserv)n(e)f(order.)805 4764 y(T)-7 b(able)25 +b(5)39 b(presen)n(ts)g(time)i(measuremen)n(ts.)d(All)j(times)f(are)f +(in)h(seconds.)f(The)h(table)681 4863 y(en)n(tries)31 +b(represen)n(t)g(a)n(v)n(erages)d(o)n(v)n(er)j(50)g(trials.)g(The)h +(column)g(lab)r(elled)g(as)f Fm(N)3140 4875 y Fj(i)3199 +4863 y Fv(represen)n(ts)p eop end +%%Page: 11 11 +TeXDict begin 11 10 bop 1215 391 1182 4 v 1213 508 4 +118 v 1260 508 a Fs(Characteristics)p 1804 508 V 1914 +455 a(Algorithms)p 2395 508 V 1805 512 592 4 v 1213 600 +4 92 v 1804 600 V 1911 572 a(Our)p 2148 600 V 138 w(CHM)p +2395 600 V 1215 603 1182 4 v 1213 694 4 92 v 1494 667 +a Fo(c)p 1804 694 V 382 w Fs(1.15)p 2148 694 V 161 w(2.09)p +2395 694 V 1213 786 V 1399 758 a Fr(j)p Fo(E)t Fs(\()p +Fo(G)p Fs(\))p Fr(j)p 1804 786 V 332 w Fo(n)p 2148 786 +V 250 w(n)p 2395 786 V 1213 877 V 1306 850 a Fr(j)p Fo(V)17 +b Fs(\()p Fo(G)p Fs(\))p Fr(j)22 b Fs(=)f Fr(j)p Fo(g)s +Fr(j)p 1804 877 V 223 w Fo(cn)p 2148 877 V 217 w(cn)p +2395 877 V 1213 968 V 1350 941 a Fr(j)p Fo(E)t Fs(\()p +Fo(G)1522 949 y Ft(crit)1619 941 y Fs(\))p Fr(j)p 1804 +968 V 147 w Fs(0)p Fo(:)p Fs(5)p Fr(j)p Fo(E)t Fs(\()p +Fo(G)p Fs(\))p Fr(j)p 2147 968 V 117 w Fs(0)p 2395 968 +V 1213 1060 V 1480 1032 a Fo(G)p 1804 1060 V 345 w Fs(cyclic)p +2148 1060 V 91 w(acyclic)p 2394 1060 V 1213 1151 V 1227 +1124 a(Order)k(preserving)p 1803 1151 V 144 w(no)p 2148 +1151 V 204 w(y)n(es)p 2395 1151 V 1215 1154 1182 4 v +1001 1298 a Fp(T)-7 b(able)28 b(4.)d Fs(Main)i(c)n(haracteristics)g(of) +g(the)e(algorithms)p 471 1482 2670 4 v 469 1599 4 118 +v 654 1599 a Fo(n)p 881 1599 V 1145 1569 a Fs(Our)g(algorithm)p +1888 1599 V 529 w(CHM)i(algorithm)p 2954 1599 V 2967 +1561 a(Gain)p 3139 1599 V 883 1603 1007 4 v 1889 1603 +1067 4 v 469 1709 4 110 v 881 1709 V 919 1694 a Fo(N)980 +1702 y Fc(i)1054 1694 y Fs(Map+Ord)c(Searc)n(h)41 b(T)-6 +b(otal)p 1888 1709 V 67 w Fo(N)1986 1702 y Fc(i)2061 +1694 y Fs(Map+Ord)22 b(Searc)n(h)72 b(T)-6 b(otal)p 2954 +1709 V 2986 1655 a(\(\045\))p 3139 1709 V 471 1712 2670 +4 v 469 1803 4 92 v 521 1776 a(1,562,500)p 881 1803 V +65 w(2.28)129 b(8.54)170 b(2.37)85 b(10.91)p 1888 1803 +V 45 w(2.70)109 b(14.56)151 b(1.57)116 b(16.13)p 2954 +1803 V 117 w(48)p 3139 1803 V 469 1895 V 521 1867 a(3,125,000)p +881 1895 V 65 w(2.16)110 b(15.92)151 b(4.88)85 b(20.80)p +1888 1895 V 45 w(2.85)109 b(30.36)151 b(3.20)116 b(33.56)p +2954 1895 V 117 w(61)p 3139 1895 V 469 1986 V 521 1959 +a(6,250,000)p 881 1986 V 65 w(2.20)110 b(33.09)132 b(10.48)66 +b(43.57)p 1888 1986 V 45 w(2.90)109 b(62.26)151 b(6.76)116 +b(69.02)p 2954 1986 V 117 w(58)p 3139 1986 V 469 2077 +V 502 2050 a(12,500,000)p 881 2077 V 46 w(2.00)110 b(63.26)132 +b(23.04)66 b(86.30)p 1888 2077 V 45 w(2.60)90 b(117.99)113 +b(14.94)77 b(132.92)p 2954 2077 V 99 w(54)p 3139 2077 +V 469 2169 V 502 2141 a(25,000,000)p 881 2169 V 46 w(2.00)90 +b(130.79)114 b(51.55)47 b(182.34)p 1885 2169 V 26 w(2.80)90 +b(262.05)113 b(33.68)77 b(295.73)p 2954 2169 V 99 w(62)p +3139 2169 V 469 2260 V 502 2233 a(50,000,000)p 881 2260 +V 46 w(2.07)90 b(273.75)k(114.12)29 b(387.87)p 1885 2260 +V 26 w(2.90)90 b(577.59)113 b(73.97)77 b(651.56)p 2954 +2260 V 99 w(68)p 3139 2260 V 469 2351 V 483 2324 a(100,000,000)p +877 2351 V 27 w(2.07)90 b(567.47)k(243.13)29 b(810.60)p +1885 2351 V 26 w(2.80)60 b(1,131.06)65 b(157.23)29 b(1,288.29)p +2951 2351 V 69 w(59)p 3139 2351 V 471 2355 2670 4 v 480 +2504 a Fg(T)-8 b(able)32 b(5.)27 b Fv(Time)h(measuremen)n(ts)f(for)g +(our)f(algorithm)h(and)g(the)h(CHM)g(algorithm)365 2734 +y(the)j(n)n(um)n(b)r(er)f(of)g(iterations)f(to)h(generate)f(the)i +(random)e(graph)g Fm(G)h Fv(in)h(the)f(mapping)g(step)365 +2833 y(of)k(the)f(algorithms.)g(The)g(next)h(columns)f(represen)n(t)f +(the)i(run)f(times)h(for)f(the)h(mapping)365 2933 y(plus)27 +b(ordering)d(steps)i(together)g(and)g(the)g(searc)n(hing)f(step)h(for)g +(eac)n(h)f(algorithm.)g(The)i(last)365 3033 y(column)h(represen)n(ts)e +(the)i(p)r(ercen)n(t)f(gain)g(of)h(our)f(algorithm)f(o)n(v)n(er)g(the)i +(CHM)g(algorithm.)490 3145 y(The)e(mapping)h(step)f(of)h(the)g(new)g +(algorithm)e(is)h(faster)g(b)r(ecause)h(the)f(exp)r(ected)h(n)n(um-)365 +3244 y(b)r(er)34 b(of)f(iterations)g(in)h(the)g(mapping)f(step)h(to)g +(generate)e Fm(G)i Fv(are)f(2.13)f(and)i(2.92)e(for)h(our)365 +3344 y(algorithm)26 b(and)g(the)h(CHM)g(algorithm,)f(resp)r(ectiv)n +(ely)-7 b(.)26 b(The)h(graph)e Fm(G)i Fv(generated)f(b)n(y)g(our)365 +3444 y(algorithm)j(has)h(1)p Fm(:)p Fv(15)p Fm(n)f Fv(v)n(ertices,)g +(against)g(2)p Fm(:)p Fv(09)p Fm(n)f Fv(for)i(the)h(CHM)f(algorithm.)f +(These)h(t)n(w)n(o)365 3543 y(facts)h(mak)n(e)f(our)h(algorithm)e +(faster)i(in)g(the)h(mapping)e(step.)i(The)f(ordering)e(step)i(of)g +(our)365 3643 y(algorithm)36 b(is)h(appro)n(ximately)e(equal)h(to)h +(the)h(time)f(to)g(c)n(hec)n(k)f(if)h Fm(G)h Fv(is)e(acyclic)g(for)h +(the)365 3743 y(CHM)g(algorithm.)d(The)j(searc)n(hing)d(step)i(of)g +(the)g(CHM)g(algorithm)f(is)h(faster,)f(but)i(the)365 +3842 y(total)c(time)h(of)f(our)f(algorithm)g(is,)h(on)g(a)n(v)n(erage,) +d(appro)n(ximately)i(59\045)g(faster)h(than)g(the)365 +3942 y(CHM)28 b(algorithm.)490 4054 y(The)j(exp)r(erimen)n(tal)f +(results)g(fully)i(bac)n(ks)d(the)i(theoretical)f(results.)h(It)g(is)g +(imp)r(ortan)n(t)365 4154 y(to)e(notice)g(the)g(times)g(for)f(the)h +(searc)n(hing)e(step:)i(for)g(b)r(oth)g(algorithms)e(they)i(are)f(not)h +(the)365 4253 y(dominan)n(t)e(times,)g(and)g(the)g(exp)r(erimen)n(tal)f +(results)g(clearly)g(sho)n(w)g(a)g(linear)g(b)r(eha)n(vior)g(for)365 +4353 y(the)i(searc)n(hing)e(step.)490 4465 y(W)-7 b(e)27 +b(no)n(w)g(presen)n(t)g(a)g(heuristic)g(that)g(reduces)g(the)h(space)e +(requiremen)n(t)g(to)i(an)n(y)e(giv)n(en)365 4565 y(v)-5 +b(alue)22 b(b)r(et)n(w)n(een)f(1)p Fm(:)p Fv(15)p Fm(n)g +Fv(w)n(ords)f(and)h(0)p Fm(:)p Fv(93)p Fm(n)f Fv(w)n(ords.)h(The)h +(heuristic)f(reuses,)g(when)h(p)r(ossible,)365 4664 y(the)41 +b(set)g(of)g Fm(x)g Fv(v)-5 b(alues)40 b(that)h(caused)f(reassignmen)n +(ts,)f(just)i(b)r(efore)g(trying)f Fm(x)27 b Fv(+)g(1)40 +b(\(see)365 4764 y(Section)25 b(3.3\).)37 b(Decreasing)e(the)j(v)-5 +b(alue)36 b(of)h Fm(c)g Fv(leads)g(to)g(an)f(increase)g(in)h(the)h(n)n +(um)n(b)r(er)e(of)365 4863 y(iterations)e(to)g(generate)f +Fm(G)p Fv(.)i(F)-7 b(or)34 b(example,)g(for)g Fm(c)g +Fv(=)g(1)g(and)g Fm(c)g Fv(=)g(0)p Fm(:)p Fv(93,)g(the)g(analytical)p +eop end +%%Page: 12 12 +TeXDict begin 12 11 bop 929 391 2386 4 v 927 508 4 118 +v 1092 508 a Fo(n)p 1300 508 V 1415 478 a Fs(Our)25 b(algorithm)i +Fo(c)22 b Fs(=)f(1)p Fo(:)p Fs(00)p 2307 508 V 227 w(Our)k(algorithm)i +Fo(c)22 b Fs(=)f(0)p Fo(:)p Fs(93)p 3313 508 V 1302 512 +1007 4 v 2308 512 V 927 610 4 103 v 1300 610 V 1338 596 +a Fo(N)1399 604 y Fc(i)1473 596 y Fs(Map+Ord)i(Searc)n(h)41 +b(T)-6 b(otal)p 2307 610 V 67 w Fo(N)2405 604 y Fc(i)2480 +596 y Fs(Map+Ord)23 b(Searc)n(h)41 b(T)-6 b(otal)p 3313 +610 V 929 614 2386 4 v 927 705 4 92 v 941 678 a(12,500,000)p +1297 705 V 27 w(2.78)109 b(76.68)132 b(25.06)47 b(101.74)p +2304 705 V 26 w(3.04)109 b(76.39)132 b(25.80)48 b(102.19)p +3311 705 V 929 708 2386 4 v 681 857 a Fg(T)-8 b(able)22 +b(6.)d Fv(Time)h(measuremen)n(ts)e(for)h(our)g(tuned)h(algorithm)e +(with)i Fm(c)j Fv(=)g(1)p Fm(:)p Fv(00)18 b(and)h Fm(c)k +Fv(=)g(0)p Fm(:)p Fv(93)681 1013 y(exp)r(ected)d(n)n(um)n(b)r(er)f(of)h +(iterations)f(are)g(2)p Fm(:)p Fv(72)f(and)i(3)p Fm(:)p +Fv(17,)e(resp)r(ectiv)n(ely)h(\(for)h Fm(n)j Fv(=)f(12)p +Fm(;)o Fv(500)p Fm(;)o Fv(000,)681 1112 y(the)d(n)n(um)n(b)r(er)g(of)f +(iterations)g(are)g(2.78)g(for)g Fm(c)23 b Fv(=)f(1)d(and)f(3.04)g(for) +g Fm(c)23 b Fv(=)g(0)p Fm(:)p Fv(93\).)18 b(T)-7 b(able)24 +b(6)19 b(presen)n(ts)681 1212 y(the)24 b(total)f(times)h(to)g +(construct)f(a)h(function)g(for)f Fm(n)g Fv(=)g(12)p +Fm(;)o Fv(500)p Fm(;)n Fv(000,)g(with)h(an)g(increase)e(from)681 +1312 y(86)p Fm(:)p Fv(31)e(seconds)h(for)g Fm(c)i Fv(=)g(1)p +Fm(:)p Fv(15)d(\(see)i(T)-7 b(able)24 b(5\))e(to)g(101)p +Fm(:)p Fv(74)d(seconds)i(for)h Fm(c)h Fv(=)f(1)g(and)f(to)h(102)p +Fm(:)p Fv(19)681 1411 y(seconds)27 b(for)g Fm(c)c Fv(=)f(0)p +Fm(:)p Fv(93.)805 1511 y(Finally)-7 b(,)29 b(w)n(e)f(run)g(1,000,000)d +(ev)-5 b(aluations)28 b(of)g(the)h(function)g(generated)e(b)n(y)h(our)f +(algo-)681 1610 y(rithm)32 b(for)f(the)h(set)g(of)f(100)f(million)i +(URLs)g(and)f(it)i(to)r(ok)e(3.06)f(seconds.)h(An)h(equiv)-5 +b(alen)n(t)681 1710 y(time)28 b(w)n(as)e(obtained)i(for)f(the)h(CHM)g +(algorithm.)681 1888 y Fn(5)112 b(Conclusion)681 2037 +y Fv(W)-7 b(e)30 b(ha)n(v)n(e)e(presen)n(ted)h(a)g(practical)f(metho)r +(d)i(to)f(construct)g(minimal)h(p)r(erfect)f(hash)g(func-)681 +2137 y(tions)d(for)h(static)f(sets)h(whic)n(h)f(is)h(e\016cien)n(t)g +(and)g(ma)n(y)f(b)r(e)h(tuned)g(to)g(yield)g(a)f(function)h(with)681 +2237 y(a)g(v)n(ery)f(economical)h(description.)681 2456 +y Fn(References)719 2638 y Fs(1.)42 b(B.)26 b(Bollob\023)-38 +b(as.)37 b Fa(R)l(andom)27 b(gr)l(aphs)p Fs(,)h(v)n(olume)d(73)h(of)h +Fa(Cambridge)h(Studies)g(in)f(A)l(dvanc)l(e)l(d)j(Math-)820 +2730 y(ematics)p Fs(.)36 b(Cam)n(bridge)26 b(Univ)n(ersit)n(y)f(Press,) +i(Cam)n(bridge,)g(second)f(edition,)g(2001.)719 2821 +y(2.)42 b(B.)26 b(Bollob\023)-38 b(as)39 b(and)e(O.)25 +b(Pikh)n(urk)n(o.)67 b(In)n(teger)37 b(sets)g(with)h(prescrib)r(ed)f +(pairwise)h(di\013erences)820 2912 y(b)r(eing)26 b(distinct.)35 +b Fa(Eur)l(op)l(e)l(an)29 b(Journal)f(of)g(Combinatorics)p +Fs(.)35 b(T)-6 b(o)26 b(App)r(ear.)719 3004 y(3.)42 b(T.)26 +b(H.)i(Cormen,)h(C.)d(E.)j(Leiserson,)h(R.)24 b(L.)29 +b(Riv)n(est,)f(and)g(C.)d(Stein.)42 b Fa(Intr)l(o)l(duction)32 +b(to)e(A)n(lgo-)820 3095 y(rithms)p Fs(.)35 b(MIT)27 +b(Press,)g(second)e(edition,)i(2001.)719 3186 y(4.)42 +b(Z.J.)33 b(Czec)n(h,)g(G.)26 b(Ha)n(v)l(as,)32 b(and)g(B.S.)g(Ma)t +(jewski.)56 b(An)31 b(optimal)i(algorithm)h(for)f(generating)820 +3278 y(minimal)j(p)r(erfect)g(hash)f(functions.)62 b +Fa(Information)36 b(Pr)l(o)l(c)l(essing)i(L)l(etters)p +Fs(,)f(43\(5\):257{264,)820 3369 y(1992.)719 3460 y(5.)42 +b(Z.J.)35 b(Czec)n(h,)g(G.)26 b(Ha)n(v)l(as,)34 b(and)g(B.S.)g(Ma)t +(jewski.)62 b(F)-6 b(undamen)n(tal)33 b(study)g(p)r(erfect)i(hashing.) +820 3552 y Fa(The)l(or)l(etic)l(al)29 b(Computer)g(Scienc)l(e)p +Fs(,)e(182:1{143,)j(1997.)719 3643 y(6.)42 b(M.)26 b(Dietzfelbinger)j +(and)e(T.)f(Hagerup.)41 b(Simple)27 b(minimal)i(p)r(erfect)f(hashing)g +(in)g(less)h(space.)820 3734 y(In)k Fa(The)h(9th)h(Eur)l(op)l(e)l(an)h +(Symp)l(osium)f(on)f(A)n(lgorithms)h(\(ESA\),)f(volume)h(2161)g(of)e(L) +l(e)l(ctur)l(e)820 3826 y(Notes)c(in)e(Computer)i(Scienc)l(e)p +Fs(,)e(pages)f(109{120,)j(2001.)719 3917 y(7.)42 b(P)-6 +b(.)26 b(Erd})-38 b(os)32 b(and)g(A.)25 b(R)n(\023)-36 +b(en)n(yi.)53 b(On)32 b(random)g(graphs)h(I.)53 b Fa(Pub.)34 +b(Math.)f(Debr)l(e)l(c)l(en)p Fs(,)i(6:290{297,)820 4008 +y(1959.)719 4100 y(8.)42 b(P)-6 b(.)26 b(Erd})-38 b(os)28 +b(and)g(A.)d(R)n(\023)-36 b(en)n(yi.)41 b(On)27 b(the)h(ev)n(olution)g +(of)h(random)g(graphs.)42 b Fa(Magyar)31 b(T)-6 b(ud.)29 +b(A)n(kad.)820 4191 y(Mat.)f(Kutat\023)-39 b(o)29 b(Int.)e(K\177)-39 +b(ozl.)p Fs(,)26 b(5:17{61,)i(1960.)719 4282 y(9.)42 +b(E.A.)23 b(F)-6 b(o)n(x,)21 b(Q.F.)h(Chen,)g(and)f(L.S.)h(Heath.)33 +b(A)21 b(faster)i(algorithm)g(for)g(constructing)f(minimal)820 +4374 y(p)r(erfect)39 b(hash)e(functions.)71 b(In)37 b +Fa(Pr)l(o)l(c)l(e)l(e)l(dings)k(of)d(the)i(15th)f(A)n(nnual)g +(International)h(A)n(CM)820 4465 y(SIGIR)29 b(Confer)l(enc)l(e)i(on)e +(R)l(ese)l(ar)l(ch)i(and)f(Development)g(in)f(Information)g(R)l +(etrieval)p Fs(,)g(pages)820 4556 y(266{273,)g(1992.)681 +4648 y(10.)42 b(M.)26 b(L.)32 b(F)-6 b(redman,)32 b(J.)26 +b(Koml\023)-38 b(os,)33 b(and)e(E.)26 b(Szemer)n(\023)-36 +b(edi.)53 b(Storing)32 b(a)g(sparse)h(table)f(with)g(O\(1\))820 +4739 y(w)n(orst)27 b(case)g(access)g(time.)34 b Fa(J.)27 +b(A)n(CM)p Fs(,)f(31\(3\):538{544,)k(July)c(1984.)681 +4830 y(11.)42 b(G.)26 b(Ha)n(v)l(as,)31 b(B.S.)h(Ma)t(jewski,)i(N.C.)e +(W)-6 b(ormald,)32 b(and)f(Z.J.)i(Czec)n(h.)51 b(Graphs,)32 +b(h)n(yp)r(ergraphs)820 4922 y(and)k(hashing.)67 b(In)36 +b Fa(19th)i(International)h(Workshop)f(on)g(Gr)l(aph-The)l(or)l(etic)j +(Conc)l(epts)e(in)820 5013 y(Computer)d(Scienc)l(e)p +Fs(,)f(pages)f(153{165.)i(Springer)d(Lecture)g(Notes)h(in)f(Computer)g +(Science)820 5104 y(v)n(ol.)26 b(790,)i(1993.)681 5196 +y(12.)42 b(S.)25 b(Janson,)i(T.)i( )-25 b(L)q(uczak,)26 +b(and)f(A.)g(Ruci)r(\023)-41 b(nski.)35 b Fa(R)l(andom)28 +b(gr)l(aphs)p Fs(.)36 b(Wiley-In)n(ter.,)25 b(2000.)681 +5287 y(13.)42 b(P)-6 b(.)26 b(Erd})-38 b(os)21 b(and)f(A.)25 +b(R)n(\023)-36 b(en)n(yi.)32 b(On)20 b(the)h(strength)f(of)i +(connectedness)f(of)h(a)f(random)g(graph.)33 b Fa(A)l(cta)820 +5378 y(Mathematic)l(a)c(Scientia)f(Hungary)p Fs(,)g(12:261{267,)h +(1961.)681 5469 y(14.)42 b(R.)25 b(P)n(agh.)33 b(Hash)19 +b(and)g(displace:)h(E\016cien)n(t)f(ev)l(aluation)h(of)g(minimal)g(p)r +(erfect)g(hash)f(functions.)820 5561 y(In)25 b Fa(Workshop)k(on)f(A)n +(lgorithms)g(and)g(Data)h(Structur)l(es)p Fs(,)g(pages)d(49{54,)i +(1999.)p eop end +%%Page: 13 13 +TeXDict begin 13 12 bop 365 387 a Fs(15.)43 b(B.)26 b(Pittel)j(and)f +(N.)d(C.)k(W)-6 b(ormald.)44 b(Coun)n(ting)29 b(connected)f(graphs)h +(inside-out.)43 b Fa(Journal)31 b(of)505 479 y(Combinatorial)d(The)l +(ory)p Fs(.)35 b(T)-6 b(o)26 b(App)r(ear.)365 673 y Fn(6)112 +b(App)s(endix)p 361 875 5 52 v 361 828 52 5 v 413 828 +2788 5 v 3201 828 52 5 v 3249 875 5 52 v 361 953 5 75 +v 3247 953 V 410 931 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m(r)m(e)42 +b Fs(C)t(r)t(i)t(t)t(i)t(c)t(a)t(l)t(V)t(e)t(r)t(t)t(i)t(c)t(e)t(s)t(A) +t(s)t(s)5 b(i)t(g)g(n)t(m)t(e)t(n)t(t)15 b(\()5 b Fo(G)k +Fs(,)49 b Fo(G)2075 939 y Ft(crit)2181 931 y Fs(,)g Fo(g)12 +b Fs(,)49 b Fo(A)2428 939 y Fc(E)2484 931 y Fs(\))p 361 +1032 V 3247 1032 V 494 1009 a Fp(f)s(o)s(r)43 b Fo(v)24 +b Fr(2)e Fo(V)829 1017 y Ft(crit)960 1009 y Fp(d)-5 b(o)36 +b Fo(g)s Fs(\()p Fo(v)s Fs(\))h(:)o(=)j Fr(\0001)9 b +Fs(;)p 361 1110 V 3247 1110 V 492 1088 a Fo(A)550 1096 +y Fc(E)622 1088 y Fs(:=)22 b Fr(;)9 b Fs(;)p 361 1189 +V 3247 1189 V 494 1166 a Fp(f)s(o)s(r)43 b Fo(v)24 b +Fr(2)e Fo(V)829 1174 y Ft(crit)960 1166 y Fp(d)-5 b(o)45 +b(i)9 b(f)48 b Fo(g)s Fs(\()p Fo(v)s Fs(\))29 b(=)g Fr(\0001)36 +b Fp(t)m(h)m(e)m(n)42 b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s) +50 b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)2666 +1174 y Ft(crit)2772 1166 y Fs(,)g Fo(g)12 b Fs(,)49 b +Fo(A)3019 1174 y Fc(E)3079 1166 y Fs(\))9 b(;)p 361 1263 +V 3247 1263 V 361 1342 V 3247 1342 V 410 1319 a Fp(p)m(r)m(o)m(c)m(e)m +(d)m(u)m(r)m(e)43 b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s)50 +b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1640 +1327 y Ft(crit)1747 1319 y Fs(,)g Fo(g)12 b Fs(,)48 b +Fo(A)1993 1327 y Fc(E)2049 1319 y Fs(\))p 361 1420 V +3247 1420 V 492 1398 a Fo(x)38 b Fs(:)o(=)46 b(0)6 b(;)87 +b Fo(g)s Fs(\()p Fo(v)s Fs(\))37 b(:)o(=)j Fo(x)9 b Fs(;)84 +b(E)l(n)l(Q)l(u)l(e)l(u)l(e)40 b(\()5 b Fo(v)12 b Fs(,)49 +b Fo(Q)9 b Fs(\))g(;)p 361 1499 V 3247 1499 V 491 1476 +a Fp(w)o(h)o(i)o(l)o(e)38 b Fo(Q)21 b Fr(6)p Fs(=)g Fr(;)35 +b Fp(d)-5 b(o)p 361 1577 V 3247 1577 V 571 1555 a Fo(v)42 +b Fs(:)o(=)35 b(D)l(e)l(Q)l(u)l(e)l(u)l(e)42 b(\()5 b +Fo(Q)k Fs(\))g(;)p 361 1656 V 3247 1656 V 573 1633 a +Fp(f)s(o)s(r)43 b Fo(u)21 b Fr(2)h Fs(Adj)17 b(\(v\))33 +b Fp(a)-6 b(n)g(d)35 b Fo(g)s Fs(\()p Fo(u)p Fs(\))28 +b(=)i Fr(\0001)k Fp(d)-5 b(o)p 361 1734 V 3247 1734 V +650 1712 a Fo(Y)55 b Fs(:)o(=)40 b Fr(;)9 b Fs(;)p 361 +1813 V 3247 1813 V 653 1790 a Fp(f)s(o)s(r)42 b Fo(w)23 +b Fr(2)f Fs(Adj)17 b(\(u\))33 b Fp(a)-6 b(n)g(d)35 b +Fo(g)s Fs(\()p Fo(w)r Fs(\))j Fr(6)p Fs(=)i Fr(\0001)34 +b Fp(d)-5 b(o)35 b Fo(Y)56 b Fs(:)o(=)39 b Fo(Y)57 b +Fr([)39 b(f)p Fo(w)r Fr(g)9 b Fs(;)p 361 1887 V 3247 +1887 V 649 1865 a Fp(r)o(e)o(p)o(e)o(a)o(t)p 361 1962 +V 3247 1962 V 730 1940 a Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q(n)q(m)q(e)q(n)q +(t)39 b(:)o(=)44 b Fp(f)5 b(a)g(l)g(s)g(e)12 b Fs(;)88 +b Fo(x)39 b Fs(:)o(=)g Fo(x)29 b Fs(+)35 b(1)6 b(;)p +361 2037 V 3247 2037 V 732 2014 a Fp(f)s(o)s(r)42 b Fo(w)24 +b Fr(2)39 b Fo(Y)51 b Fp(a)-6 b(n)g(d)36 b Fs(R)q(e)q(a)q(s)q(s)q(i)q +(g)q(n)q(m)q(e)q(n)q(t)30 b(=)k Fp(f)5 b(a)g(l)g(s)g(e)36 +b(d)-5 b(o)p 361 2115 V 3247 2115 V 817 2093 a(i)9 b(f)49 +b Fs(\()p Fo(x)29 b Fs(+)g Fo(g)s Fs(\()p Fo(w)r Fs(\)\))20 +b Fr(\025)h Fo(m)36 b Fp(t)m(h)m(e)m(n)h Fs(restart)26 +b(mapping)g(step)9 b(;)p 361 2194 V 3247 2194 V 817 2171 +a Fp(i)g(f)49 b Fo(x)29 b Fs(+)g Fo(g)s Fs(\()p Fo(w)r +Fs(\))38 b Fr(2)22 b Fo(A)1415 2179 y Fc(E)1503 2171 +y Fp(t)m(h)m(e)m(n)37 b Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q(n)q(m)q(e)q(n)q +(t)j(:)o(=)f Fp(true)8 b Fs(;)p 361 2268 V 3247 2268 +V 653 2246 a Fp(u)s(n)s(t)s(i)s(l)41 b Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q +(n)q(m)q(e)q(n)q(t)30 b(=)k Fp(f)5 b(a)g(l)g(s)g(e)11 +b Fs(;)p 361 2347 V 3247 2347 V 650 2324 a Fo(g)s Fs(\()p +Fo(u)p Fs(\))38 b(:)o(=)h Fo(x)9 b Fs(;)49 b Fr(f)8 b +Fa(s)f(e)g(t)51 b(t)5 b(h)g(e)45 b Fo(g)h Fa(v)5 b(a)g(l)g(u)g(e)48 +b(t)5 b(o)50 b(v)5 b(e)g(x)g(t)g(e)g(x)46 b Fo(u)q Fr(g)p +361 2425 V 3247 2425 V 653 2403 a Fp(f)s(o)s(r)c Fo(w)23 +b Fr(2)40 b Fo(Y)52 b Fp(d)-5 b(o)35 b Fo(A)1255 2411 +y Fc(E)1345 2403 y Fs(:)o(=)k Fo(A)1522 2411 y Fc(E)1591 +2403 y Fr([)17 b(f)p Fo(x)29 b Fs(+)h Fo(g)s Fs(\()p +Fo(w)r Fs(\))p Fr(g)9 b Fs(;)p 361 2504 V 3247 2504 V +646 2481 a(E)l(n)l(Q)l(u)l(e)l(u)l(e)40 b(\()5 b Fo(u)k +Fs(,)49 b Fo(Q)9 b Fs(\))g(;)p 361 2555 5 52 v 362 2555 +52 5 v 413 2555 2788 5 v 3201 2555 52 5 v 3249 2555 5 +52 v 904 2728 a Fg(Fig.)14 b(6.)27 b Fv(The)h(critical)f(v)n(ertices)f +(assignmen)n(t)h(algorithm)p 361 2974 V 361 2927 52 5 +v 413 2927 2788 5 v 3201 2927 52 5 v 3249 2974 5 52 v +361 3053 5 75 v 3247 3053 V 410 3030 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m +(r)m(e)41 b Fs(N)s(o)s(n)s(C)s(r)s(i)s(t)s(i)s(c)s(a)s(l)s(V)s(e)s(r)s +(t)s(i)s(c)s(e)s(s)s(A)s(s)s(s)s(i)s(g)s(n)s(m)s(e)s(n)s(t)53 +b(\()5 b Fo(G)k Fs(,)49 b Fo(G)2233 3038 y Ft(ncrit)2373 +3030 y Fs(,)g Fo(A)2501 3038 y Fc(E)2561 3030 y Fs(,)g +Fo(g)8 b Fs(\))p 361 3128 V 3247 3128 V 494 3105 a Fp(f)s(o)s(r)52 +b Fs(i)c(:)o(=)40 b(0)h Fp(to)f Fo(m)17 b Fr(\000)g Fs(1)35 +b Fp(d)-5 b(o)p 361 3206 V 3247 3206 V 580 3184 a(i)9 +b(f)48 b Fs(i)22 b Fr(62)g Fo(A)863 3192 y Fc(E)950 3184 +y Fp(t)m(h)m(e)m(n)38 b Fs(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q +(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)j(:)o(=)g(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n) +q(e)q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)h Fr([)d(f)p +Fs(i)p Fr(g)9 b Fs(;)p 361 3281 V 3247 3281 V 494 3258 +a Fp(f)s(o)s(r)43 b Fo(v)24 b Fr(2)47 b Fo(V)854 3266 +y Ft(scrit)1010 3258 y Fp(d)-5 b(o)p 361 3359 V 3247 +3359 V 575 3337 a Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 +b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1403 +3345 y Ft(ncrit)1543 3337 y Fs(,)g Fo(g)s Fs(\()p Fo(v)s +Fs(\))9 b(,)48 b Fo(g)12 b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e) +q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)11 b(\))e(;)p +361 3438 V 3247 3438 V 494 3415 a Fp(f)s(o)s(r)43 b Fo(v)24 +b Fr(2)e Fo(V)829 3423 y Ft(ncrit)993 3415 y Fp(a)-6 +b(n)g(d)74 b Fo(g)s Fs(\()p Fo(v)s Fs(\))29 b(=)g Fr(\0001)34 +b Fp(d)-5 b(o)p 361 3516 V 3247 3516 V 575 3494 a Fs(t)5 +b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 b(\()5 b Fo(G)k +Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1403 3502 y Ft(ncrit)1543 +3494 y Fs(,)g(0)9 b(,)49 b Fo(g)12 b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q +(g)q(n)q(e)q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)12 +b(\))d(;)p 361 3591 V 3247 3591 V 361 3669 V 3247 3669 +V 410 3647 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m(r)m(e)43 +b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)45 b(\()5 +b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1640 3655 +y Ft(ncrit)1780 3647 y Fs(,)g Fo(x)9 b Fs(,)49 b Fo(g)12 +b Fs(,)49 b(u)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(E)q(d)q(g)q(e)q(s)s +(\))p 361 3748 V 3247 3748 V 492 3725 a Fo(g)s Fs(\()p +Fo(v)s Fs(\))38 b(:)o(=)h Fo(x)9 b Fs(;)p 361 3826 V +3247 3826 V 494 3804 a Fp(f)s(o)s(r)43 b Fo(u)21 b Fr(2)h +Fs(Adj)17 b(\(v\))33 b Fp(a)-6 b(n)g(d)35 b Fo(g)s Fs(\()p +Fo(u)p Fs(\))28 b(=)i Fr(\0001)k Fp(d)-5 b(o)p 361 3905 +V 3247 3905 V 610 3882 a Fo(x)39 b Fs(:)o(=)g(NextUnusedA)o(d)o(d)o +(res)o(s)o(\()6 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q(d)q(d)q +(r)q(e)q(s)q(s)q(e)q(s)h(\))34 b Fr(\000)c Fo(g)s Fs(\()p +Fo(v)s Fs(\))9 b(;)p 361 3983 V 3247 3983 V 615 3961 +a(t)c(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 b(\()t +Fo(G)9 b Fs(,)50 b Fo(u)9 b Fs(,)49 b Fo(G)1447 3969 +y Ft(ncrit)1587 3961 y Fs(,)g Fo(x)9 b Fs(,)48 b Fo(g)12 +b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q(d)q(d)q(r)q(e)q +(s)q(s)q(e)q(s)11 b(\))e(;)p 361 4034 5 52 v 362 4034 +52 5 v 413 4034 2788 5 v 3201 4034 52 5 v 3249 4034 5 +52 v 689 4207 a Fg(Fig.)15 b(7.)27 b Fv(The)g(algorithm)g(to)g(assign)g +(v)-5 b(alues)27 b(to)g(non-critical)g(v)n(ertices)365 +4847 y Fs(This)g(article)f(w)n(as)h(pro)r(cessed)g(using)f(the)f(L)1621 +4830 y Ft(A)1654 4847 y Fs(T)1696 4863 y(E)1740 4847 +y(X)g(macro)h(pac)n(k)l(age)g(with)g(LLNCS)f(st)n(yle)p +eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/papers/chm92.pdf b/papers/chm92.pdf new file mode 100755 index 0000000000000000000000000000000000000000..08825a1315b7beeab0803141574fed3a9486d0ae GIT binary patch literal 191651 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μaS*y`qt+j=>cFJGd^LFMA-h<-; z&ZA>+TTy}_h{3Su*!=7yj%~&=(TA>zrY2@@V38t#myo>k2hI|!)q4En0&`@}1c45f z(U}4^4A;-Ij|%Uf9Xc_{JidCG{&W7o=mn`Mb%g_dUL$z5w@Y2bV-WwxCbl*4`sW`t z)=>hM6sP)?ziOZG8ZoZj7@7eGvf@o`R~O6;^i2V_I39 zRv>j7B8OS8F_DL;MHtwm{hDm>S9wL^<=z22cW%95?2h>jS0}!WS9uA{M6`#lp>Uhm zkvn_}%LcpH>x!&n&H?9WW;7z?ZWX+K{Fd_zM}3>R?XQ5-=)D#*EuyBe!3dGi)fTXy zOhR(zkaa1w@cb^)s;7NlgP!oQ9I(CT4R=g5yz3_kV0Es(B9Cd@*r$VVZd>^p;$_N6sgR;jNZ zhwl7r*5`uhX^72b39g;-ri0HMdO&^oQ=Xucf%CKPQ#KP;z*8014D}`e;*j@G_FnK4 z{QyHXEQt}SRWB@TL(!r)x6oqm&$ee6dIQ3VCV;T5yHLU6$}Cj#>pL%ZP&?$`#u~Dt zQd?#z)Tf3=nrnBqZ9kWqecotOTS6{fMqU!ms%p*{6u;J4-g%9R-LHTbLpLlUU1@F| zqFriR=Sw}@z#BJlNu~3d`p46;16h0^QZVQAjWU4qB{j4!Qk*-ml2Ez4iW~}t;+$a8 zw#P%H$R>~MQZBECKG8846RJ?2{IS#E+(sbko$>z8KZLwY%w>;Z02?1HT}_Y8Z*Fe7 z)`^V1gY-6a(Hj)M`jB>PYsH5N(hkQCa08(@laMg6+=~KfVxd9!p(^TQSc^ZM$sopOD z!6jdF2Cn`YMoApr0KuP}Iy7($!RWF^7NTAsG{#;$IIQT_bAQ@(Am|b&e&W_=OyX^EwSU-8EN|uV81~!|H~`p&Z0^T>Ofd zLZWop)!;VH*xvy~WYZb_cXfc-ixm0L7&ib8G*z(T9FG0>~0i6#jYTO*j z^q%?j=Z+ZUq0!Lsjv9V$ON0A>cu|&=C%1_=+=<|B7Kr}}sHejL`dW=G`eDmZEf)K# zchiT)aV+pQ5yg%~jB|fw{I%C@SUd0_pM*LEHRBx_&aQU4 z((d)|_9xy-eq_+U^Xb2M@jnttw*N{bS^nGnizpN`^FOzWbpQWJmG!?Rod1VZS^ooi z{|8cC*4nhgGINc~NmoG;ycCA92#J-sP9#LmdYWQ;h0<8cbZ^>Fkt$&z#!qJqY@;dc zBWT_*#f#=8r_cWZ278!8Gtz_RL5J??vh!V2Or~gTES7AvhSorjLWi!~0KX|b?V6s# z_{aa+6?mwjBo4H@$Jx6bUo-y*Etawcet}?%#n`WJi(mv_5rz$!o zf7j^nXcqaD4VAC5OU(a}xxGLBEL;SgaHa8G_R^2!sYC$F>Hd8FCPXjWP7?d@N}kXw5$zJN32X$ zhNR`QJHi6z)vJ_aBBJR+&el?vwqx`4pw~J77`szdRt((^_j@7QWs!2*JYbdFQJW+( zy+fNfDJ#NteLa8KDS4?fE#6(|+~&;esdln7=IKhYZhh+Z@ObvNdpg~oTsV?7JyL8H zr*R5hRb-@mEI!@LeQQ^>s#;9dEbdQMUYm2MG_B3usUq3N4pL<-mxMwGTJPxUXmaS^ z&fdf}pS~=94lf_4Jhh&(Fy-{C+U!1Ric@zqiAzYMwWz+>c6IxL9cIdZsWpj<+&~V}AH!ZVbun2t4HL)wNMsQw+=z zM9*hATeD@}m4(c8K7F*KR<&|6)!M~6kGm~rM>BxD3b^!0KY;ILC2M{Hz+*EV$Cz+lf7P5f( z0d?aQt!6W8yvDg`t$Z*lX&3()n-A4DwLFu#jBN3hyN;{pN293IRaBp#m!sby6_8-2 zW{K;a%!S+K1t!z8KqZK*4Dd(_fU?!6Fu+6#7Bn!e6rdFdsEPGcKX2Ry%{m_diac-@ zy|in4Ho#nTwKgyv?Khm&ku%F3n#QCQp5{1BuW0n~kMk=fdr^t%nustlaB0J#>*7?a zB^PMxT{AuEtX0<(9CL^`8K@)Hc90F5C>v>s@6px;xcQNvZM)T=a>f!Ls=(a;!`eGW zS=wyff|cHB+qP}nw(ZPHqcSUP+qP}nwoz$Unw{@Ceee0k`0gEjyGQ@pV?BF~SSw=h z9})AJbB2r@Lo(dY{cY20AcBR87P3^FW5K6`#rCqRzrdvISB&&!<-r<2JQ|y>+G|I^ z_#SxFJ~;N*&j~cxy@qoE-7|_KiHv<>ju{O*lV9xdbJX-95OugOcI+crvvJc$SgJ=y zpsSLPR|T;h2MmrXXJ@Sowvp9eLa7@}G^S8|&ceI>ODHu>Qx4Tj{P*~K;*gybloA_0N^qZ+#z?uSCaUmY}BCAb}vbL4wr zs-#?hH4vPtVp|ex&_6>#KMz3hI=xKw2NZB_rNU6)66?%}K?vg}qMw&HcBSxHN|psu zrnKcFye6_J8UB<#!~kvl+E6{?<pw)Vn9>EGVIkOBsHPI6yT`$i zdm!1$S~kdp_*WyJV$gfl4|h^#6}pswZEu?Gmmg-(>F#N;*T z{Si#3(7tHZBMNorh)x#Gi3zB9NpJ)7Bc5b!0`_=Swc;1aZav3c0qSs}#%UEBT?2PX z{m6wC-8}&LBN3ZL_<=1Cs3YA$WPC4cqfigSY+U^t};;UE@#dsLIn-o3WRB87lYFFqBtl7`T?e-@OR#Pn56Th&8-qCH*?O-lpt=&_I8kd6#VX`tn6YqpMLu}R zLQ^8DU5<*XbZ)T<%7f5qaSF<2pwJgzjW|rb087yr9_B1~8qI$8oZjR%80v%>1~?gq zMsFCz0p3&_lF_Y90zDz0#l%>7H445P(MRxU4BYkL)b6>g-i*23GN^*fNI-%{l1AwQ zqcE00zP5x?k2SW||+JCMSv9pKw0x|ys|@bMPxL& zcwovvMEqH0XM&u|U-6kk%ubHdc5@W@r9p6SIWJSFMRyxfhb_fTAY(9G11=j&)kSZ;nUp5LgutI1vUH`=Kn`Hy)EQEN{AY!ssTqMek%s)lxW$T8f znUnhdFN^Kt@yMb=Hd;epuERI{+iad z!vGCajY{IW+wC4L%qaeNy#T3YWZtEbeaWpfZpu(8o=Ze3nUiu)G9EHDK~-KS^o>Eu z?*Y2DlK^5Y#AIO1o^XH*8juYk)Y%_IA9zx|m2W2wV3c=a1|T$+rvFCumD0^pH&>nt zPseF(T-O2y&qqcWNtF9Z3?DET2$PaCk$!f>s@Lj(0Xh30i50plg-?IDZa4LZu&t)hZ` zg?}6J3<+z_A1a`cdTKeeChuV;yLb)8PhZU^Bs7sIPgwxFbNn`20N%P>gt!>Jr~(1h z+;r!driQi#w%H;-!vHl$Jdl){Wl+5W1@~Ze&v^ut!dq zmA$R`1JK(UwIfo9{U%9_0~oGQDMDeXq9;3yZZizL|V7!InP(54&iGpxz zIWZoDJ((5aIrNWtQ>b~)<@P)R+Cc80%Bp250n5Q`E zXDBkU5-hVlxFbQtYfkc178V7A4a0cq@_TJV?$;afJjrv;AFg) zhrfAC$jqIt11hKMtRv0(kw8|(vc6nmL!p9U<`28GDv}ssgT6cO{cv@K8<8eMsBR;x=;~E?1XExm)RZWw806y!MUmwWirF%J5F|#1Z(Rt0{Vvd?&GNboEtEM(C5o!#x=AbpUyV%0 zy+ncl;-Gsd2Ig&PS!@;KMWwX^fr0lvW2Jt04o&X4Qa(EpvkKmo@KP#9AqJ9$L2i&& zV$ns**+rm2B6l+=<^+W|xB&u`9LjhiB{#wJC?e zp6gN)8>y;CCDW4u!rflc%3XO1mSTkI@`QU#tE_>Egnd;6kWRnUe?s)`Ex`vcy8uSH zSJKrr1~I|W6?8<^0%CR&3A!8aBEQ9`oXL|nmQyYeQ%?IgJa%p>gL}C~tT1;NMwuqT5_p)-O}>mTlDo#+@ph*>{5+#jy`svysDE`^8UXA_&@8BHsWw=u%C{L#P1@MnAboSA?pF)xVQnoep+HgrPK25}A*RQFe?<&42) zV-MW<DkGed1GMF$V}Dy`-53ae=c$8^hs)6 z#qfxS6Tg7kxmT*fm33q$-%X->>83m^SD<;0bpdgeZxiWwQxz(Q_q5Bjj1IE8OQbTM zIO65?c3DH!o@M$nB1O(|KLX>D-;fI(0G_Bj0{f#L+RhC!Y z%n_`_71V+Jb=MjWwOWLzbBpx}GJpRRhj{)OSLMe*eNVb8t4!R-pQ4plx6>a3HN6<*zj26n_zMmD72-GmTL23Yr2xU(hrF-ybC@IPZ9j z;WRr{amw_(VPtH>t-cjPBQFH3N}?$B+W{NZ%KjT|jyO=s>IM?8Vap6+DI8E|nr+rBj%8EyQ zOMnr#Mz{aG$mX=xwb#Cn=^826#zYEgHJ7u?t#n`^`0lwVPFkBTjYxO{hbPs?xPRtpz9ilS=-O)|3!IE=7k4jcn!E5q+>B-9%f;Dk zWK?N#%0*&ujC}D~zPxG1#8YY!^vp!xa!KyVnB93@i(29wENnU1Jcw^s!&VWHa?cK8 zB^hs&5FsC3^$>q2{en!_@Q1rI;r*@R4IWE&rHW^)?+x6=5V^u0c4(H$8?UEtr>Kq} zCl|Xu%AQX?8}mDHuLmWKx0{ZPmhSA%cEDRN1;24Jq;?ib!eTJ&2~V6169L^(!spFC zE>!Az{}KgS{FGA6#*`nWB3#r{6MvfHBVJyn-@|n#A1rfPGmcJg4>gPX9-1C*W=bF6iw09e0`xZvyBGpvac*3FQ}cW!kz@w zW4G#a{0Q_CW&ue3ENcz$CiMbQ#u5UmW5<&mJ!g;PEzOn;I7F+h(<=(!wz1**$pN~t zNbj4mZXAMQA#Jd+MO7PBg0=L~SXzW)VV;#Wo=Z*y)hHmR8L$7NIK-I6@mrDedL{;S zq!oyVeTcFE@bwYvYGsi0X2`h8Rpe3!Z7T z^oHIc_iz58`<+WQ^%U+F)6?aeiI-yu2h71DQ-sxX8dKLPZEoUxNQ>7ouyZ6u)0I^> zkn^n2T6$6F(uND^R_qbN}X53uPhhky-$5QCqjr0Ep$n$?8A!PYKlMr5NPC4O-qr#J^agM7g z#A+nfb6}FbYG_+9@$%-Bh7)Nj2_}{w4)#||1&caLP_)_PVc>+LK;+!hJM6~qUj@K- zJ52^Hjh}D*q#@iOQViOUjTn%`&~uZ2y3fF@S~LxZrc_$>+4_6Fa((c$eePmo#ChR+ znscp(_ihlYK^;(i8Mqi$xdZ3(Bf=5KeKF`k^EqZUTKGfZ%8hrW!FVVA0e62Ls7dDx zi5nQGXb{e5ru}YvSMwYegaApb8C^34qH7lVf+9hO3o90%`3<(TQ)Y0DGoFKn5$VBF&-(6@FmV(T!Z{O z9qN}+2%V4;5p!W`AltjLxDpXD$xK-3C1KV-`R7B;*aRfsX?LOa$o{d3qcCGJ1|Z9l zVUzWuNPgmLS?@dr3dUl$-mUS-){#V{W|8|~7ed*?6iTAPVspR0^Cjm)g8ykIoR6vS zyA_gCVd3v$B$D`8|Fj|bI{VL{|4uTKi05PZE+(XOA4h2Vze`#p3M06|{p#tb5JW&a zNn;X{1T*tS5@9iLNGDO9jg@ElXA$BL^9U*95aWqrU?`El%iR6DO#DB+e3#+*r_BGI zgc(l)4=Wk=EgAJNkx2XQ<$sl=*<7kfdiPtre4%_eCiajKc`a0vC4yG>`356wRnbI%%hTfgkYF+7gd~=xbPq$Lu0sb!Fw>m{wM+f|CPj3vDBq%q;#F0#Q4K|ROvI7u zRn~E3DgR_3|HMs(Wuo#JVK)?j#SE2gAT7><|I)*b4=roeCmV)7A3y61yg|NrCkgW~ zeVo@e*zIIX{*xyesh04bH@Y>E5D(`fR|K@N7u*Ryasol}jMh(-86FKue7n~Lgj=TI z>s;kUzi@ozh})Q9olq+=j$lbKEY;ZWzUAQAlW~POc|WMkmKjLA^wr z)JZUbDWotCFODb*;#AAaJCW$I!qnu;Wi_6QL|TBoK#;xC8-eKuNPkr%*kRdg7O3-S z8PUEW01}d=gS0KBI#J!Id-slY&2Ijstc{8* zS$n;m(kq?QDYs)hnQOi4#r3J0?-nsXQm3ex3zNxR5@@Mjgq=xQ-oMXsOjD;f7BOTkN9C$N2<#tUvvI zuy(Eqwd8t1mB|D2FM7hfMUpoE?)25{ZJ3Rf-h`&d6XBa5?x!;jV-Hs(J<1JD0BhM< zu1zcdX#8uvo)nT=!`Eri*4e13j9MVN?evYV&)Rgo=&J?00^YtXr+vYCs8x1PqS-W} zc?*MTGy8o*7vuCin@m-**1kzFvQ#Vmbvd<;rWrJD^DDXDe(!MNDj{#8zjr+C%OSZo zAUEo%+*k5fb+bal4SE7^f&tqnytrIHi-zP1;N|%P_;j9;JS>+N)XVyx6C-?S1_jzH zRY7i%xmXU$RibB7zmO~yynw5gXQ>*mPveBQ5yaN?JGuLLs2bRohM_Y@6d^`gco8aG z@Thr%l3qalBt{T862p!I0ZboN!)SG7! zw;8yM;Y76RAO`|jv7-fq<8$K*6t*Lcf;PgBjnZD()ROVWg%!rT5cr8=8Y?cv zT$((=JVwfq5U&dGm)=ThylNEJqzuy5UoCB}z6?f)9N?Z@nw*W5bizK?VCZ+T(kDoO z!4WU%69|izhJ}BDYKecbB9^5S%w_G1lL?!~0KMmUx;$L&?>bWh1GLu3iv}00e{rsQ zwLT!4h*s%Z>KjY3trK@iS)chWrI`$cj5xSOjnu}RX?-~7W!{1)E->czLz2m<);0tO zfV@+f+MHyB5_^`|pOe?EsnN;g6N@VC2vIEZ;*dt^LoyF^HY&pXE@1(k zFp>(+^c48=I){xSFlgC6z4?iH5O-8{Qmj#>3$NGxY?OgQ4bx+mLJO7 zL#lUaS4TNYkv;C(u)cIQu=X_#d~w(oRF@Z(_fi#If8SPzmrN@wPR=a z9?!CvxA%xyQ_FSZ%$O9(=P+LJ$@u zbt1*^_a>dCCnjrpgvJC9Z%b2%&K~v@QA7G$<`tFu1%dqUQ6HRNt`y9R?Pq@tzPh1d zXJPKiFN0pPG!sVRt6)CWO{fPB=#0$Zkbw`(=@_){^<4~J_dVx3(AoTK?zZVAYd8qcy>^ zoSAnqR0Z?&cdOG$l|{h5jrI#Z+qImWQ77d|Gl zDnv`(RKuoURbav_0DuP9f8lsx z5e0_Al*39YUJjZR?VimAaXA58>LgbK;_h9OGbVfa4rW4g>6?DSTlN_s+<+X_Vz(Pq zbm~#8&thuN(l+W2r)s1wRB%Eh_pG7XMIy@2WfgnNw*-Bk4`%!GRep1QSKUt&Yp6Rs z|@)5yK+&{N67U_XwwMJ*TC#J!z%(rhQN{ z@243p(+u2t2Z8--5%CmWi8PplYB!rjd?X^A3SFIx2G>${YH8D~g>~UO^~aHq4sNh; ze0@8T!(~J*8)E~p`sUd6FBwkz!JTf}rBPn(L&p(r`*$d=D{$7&pD`4nb zd|@`bMQzj%>up{4Ee`nxpRjPsHkgyY+g#(6{XEv3GWTR z@endvolOkSd2h!_)(<(OTBvvWa3->tDDn9Fx#&fLC6&2SSxaoZ1_P;VsbJ@TS`Ci# z52Z>QeD{{j&fKmUP%}=0dh~da7^? z{=43Ba3Do_Tp<@xwu~!UQ;X~^_QbK5>g^);x?vBLJ_5G#+~d!$91{r~5wxOprweQ8 zW$XZZm`{k46Y-`0ey;wHq>-J4>3^K7SsDI|z(oRzh4bIuIsZ9f|G%UX(JQfVGJg-l z{IBErcfk4`{9EPt9dLXH|7IwC2aMmrznDe;aR6pz`0qj)R)+s0p-j>@{YYoTLmoFI zPqRNx$OtpI>DOW`8E(>u`Sc{G6I>|IC^oBMuYWkLL}@Ll3A3C`pOFch>s&586wD$0 ziMC#3_jw<@=e000sAz*uIQnROIkYh((}h4S?YSiD>)R3EL{gIoPUzbud(Sn~j_q{X zlv1+EJ^$b9yS2QQ;BBeY{59X?88UiYe9yYH+Qa9W5SnwEk3LZOzanNlRS5^?A!b@t z=+QZtp0}Z9S(q01Z9n(-8n_28)vM`jb2gLI(XZsM$1mHm;-)sZiC3^PX7sJA?C4#G zt3TeR`yV%}PPd>l;F~j2uu_U!#MsEWh;jQTnDvDAZ*yR$boiF+?09|YUv$PSwK(O) zjmYuv&S322H!b+Quf`9}DqLLhwmLaoN*sHD+Q>ii-Sy`?BhB0Vvbk^zXf~~@9#M>w zkLIg+5UMg>iL~xpd{ODr|0s13bX6OP>%m+MTWOH8Hk)AMNU1~&r4N=j5m zT;b`m)*wSzt)7;zdeD<4)HPZETU3?@^7bHi#yJH7l&^f}-*r15udBP=g8tcY?p8wX zIH8^Bek-#Zf%{A5+m z;wqK72UhS1tkTaH6lU$f-7sSsm%D2XK|hC&#-omo1|K(R}AJQ(tyOEoAA-YbL!%REbIt4V>edf+;Q+9*2i0lk|lX$p{XLphnGu;#!nED z!yh#KkcJg9!(=h^prDtwvF%klGAQE-ezO^zMG}wK&?bWuHZzFx!w~MpDhWSuJj0H) z^LljxDJSn75oUK+0-7<>+0UO;t_BdvTN5$FL7hUblIbN|jsfGzsn!1&Ld^6Bk{nkF z9W0Ot?n3b+5$+`_iTZO(hLLEO@#-8T4WhP4d8R00v^qsJ8Y$x+0+D72Ff`M^OTk1N zLT)T1V1|mEvW&$Lokop7HvtG*x#Lw-1D!UP%8RQ2NHMwl6Cxp1`{ucvMS^mZ>WE49 z+X1+QbvsPXf#e+G9PxF1ej3DC1lNF)$b-5wtXR80;$2P9X;oE7WJP!=$}BifjYadlK6K2u3ka!D&Q2%!z|VR)Q_Ghttq-Xk{R%q%B0s z3Z+OFp=DLALjnLK9tI_}13><_PrNA?0j)e`5S(GeK4cIjEl^o9N0(=8d_WMGKa3x! zrYTK~x_W@KcB8yFAWSNVpGYaYr1B;j!BjO~PmW(2fV1ab83*^zyn7Mz`_G7O0!wED z9Pe)9VF+&m4;){${SwPDXTqKovW2EiA=i&+qEx{_5$K^=jit;o5-R7{-kw;HIVBU7Y zrz6-&RA650S;%(serU6;AKiQ6fXiR>7L+~8GoGzKPlGwD&;YAx-5sx_M)0(`Y-a5n zZmVwU`#}^Rs*-D&0=fEq=>!W1{L!nH2Ar%0o)PL2721u;>TM^S0*|0{zG$$Dng7D> z9|fs1KCq{F8lZ?uw&cV6CJHZ`vjtS({_|1f=zQ5x%j^l@4yQhtfCmt{j#)nlnoQ~P zGrU3MO4sN^np%o!G2+pVzSDh8s{td1e@z<(Oj;J-MGgpENksIUxK~-9fT&@hpoRth z;gLo}Ar1CK0zmN8U?Tt$oKSqTlBmr#Gm43q9y$O`n?X2quA@=YjF>Z(>xmO^l(a1# zwwTaFiZehWjKDE0O;1vpqB_R#|G5Wgrr*GH*k_W74irvqA=x+@8%`7O;j*s~9vLtK z&6Gol7D<;pKy^;g4tq8Oe?lMM9FuGaT962kV1XMC9MggYG9h-4eOCG{>Va0)cq_+OO_pvE&V&hg738F}-W*RtpZ%x&UvdxoB+`^^+p|WDe zyy7}O7b67$Rrg`l7x1t zfC#Q6NeRZ$UsNJt((q9{u>}|Kr9=}#IMS>5GO}hO9MSdk1le(zL_h8lKY;$E$+5#9 zQoMoeGl&FMKYl-fWFi@?3;gIyG!Z+ol3&A*C1EB~=N|w3Z8PjiAijnk+e^-B&q?t8 z4Z^|M{gES$p)Uhx8e;pp@*{-E191e(&%}>En#mbJ)9|xf4R*c~k#GX-mdwn)U?9eM zV&mWQarT*AsG$7dG#4w03|8K0_S%+o$3&JAs`5|kfOLrh(zcoo6qe82{1GiFR1OW5 z=3^b17o6=_SWoeQjXAuejfHc`2qIduy+<@D`ePtp#_Ecv#NH&>BLo}==TajqNva#5-ayx$>qjuUzT9o*rgTh8hiRAx>ESKd*O%2Gt2PoBt3|6ctX zjxjp8M^$P)JcJrf*Cn>7TKS5kgKAvwSW^7#fI0yIC=^Z-n8yN_HJY){u;aF9idZr_ zl(I)fAw+Z`P$ya4u~ce3UQSUX{W~>vHYp5ljey`bwH_>@3(?OzB=vdUy_F=(urWq< zbT%bV?GX$a#_oB%y4}2`hDcS8BTaP^uNVKKN7UTS3Drx|GT9|94*92EbDNqUxHiB( zNkLureV!7gyo2?g^t3aNHyS8VcStleHj$x8(!oX{kzA{q_abjvF9_XG28TL(p= zL`vu_j|xfntv4T2=R^GSz4Zw`+w{!XW>9)cZAv)`3M6%JDW>sCa1v0hoPiii<^3Uk zo;c=l8#4X9xA-et(8{zrCE-oFe5>$HJ0DJ=c7=tLH8& zDkU)poj|+R)AP@l;dVm>94)o@=C$Z++6v#KO!S;paLzLGia3|;AR%N=(?qh+lyt|y z80(-3a^=ONJNqliuS$1Oi|VhZq)A~bMzD~NHZ(3&{NjWuDimS)>6uY>iMGcZRoxL` zAT~KijJf}==p1wqgNSf2OQn0GXl~1TVyA0HU%_uYrt2xj zP(P`k%o@(JY&UZ1S~`nFJkPqhgHt7V_J5JKZL3(8rx@;GPcdc6xRNgi)DV#wJK0hn z!y9dU-fVsix*0^5Gma!(rvBRPnf~H4nbD=>&rg`}_N3JLWB2qy7=Pb|FCqrOo{}Hp ze%_hOH%7dh9K9Bf+*Exj>4(h{-8H(Qd{F0QbBl8Q8%}q*Jg`CTMz3SvjNUT5m{c`9 z1p!Z9BXicXG4;JyR4-HWwl=Q_OfwlX*98269NJb0jv;O* z?p(Gy4+0?S#O&5?xZkKW61+(K;<4fzr|b0NKlRuNLa!epR|QP!%4UYzdarsKT7z1# zF1rj{>O+O)ZNdyZBXM%WcBntRB zc#t!)8p&8b<}$k$wci6g{RRFoJ$A`S0O&p)%!97mb$QbPC5RFGquW! zMAF|nMC7cmMOFuEm0!}GacvE}lUsTH#HZ*GSw+wJwsC6)5m#%|owhjKmN57|Qhz*? zG8;a3?F~ju`J(@wyriRizoG&k=N* zW6MJqzcfM+H4z+<2I>8q(vKBknV|=kvF^q(Z-c_h6drS1YIrz*MA`Vo+_+-8YVk$a z42?Sy^lWha%PLiy*a`)U{mH)|pI3Rf$>Oryh%02)vi!Fwf=e{tVaFj!BfEEYxPy1b zY4<4atGfZ~RbutLpz4A-_0el(`pInTlAVmbP9Pe!dPovD(6Ug81$)wYO7nB{r{}Mr z^tb6yLk7bO6mLR2^)J|YPANs?U26TcM&GLT;OjNda__0OE(S=4QtH1hOmD?2T9@zB ztb?8L)qQ#y-S{rmefDB^C5!n@UlEfp8DV~P5~m9Rj)aj_U+1gt;qj=t3ce-@A!`b6 zW{FKSPm*tU+l8VXImHGddUGgjl~w=`f2u>0som~ax^$uRHNoY!+2vT&6>+ph`Rw)y z^67m}C(?ZJWc)XWXsyLx<(~FJuX*rVRUuVNGd_2ghn08Sx_#L4P{#P|{Jalq@_hE& z*537jfAAxHac+H~=XSKBl2LNTybxz5ZiBwa4EXq-#@@-Lb40JI@NY9phrAH5Pu~~a zh=Rks#!6t{KnmsMf5AoZM?b?4rB%CHIw=iZy*#Kok2x-p!uLsU+78YOqc%y=K3Qi# zF3C7MX)40Hz9**}tJglZ?H-z1TbutN>?jt=3Wd{$pInRJmvMC#%4+onchO@n@5?CZ ziC340v3pyhCu|f9*oeqN9Irkv)gqIPNqacE`9YtxjcG}*l(h4~mo%3V!agGo5O;O- z88Y_;%=Iu}3BSsp4EvEqfQoOVy<4CpJ!u9o&ta-glYV#~i=Apg$CO4@504i*H06nt z$Y1>>0P4`HklK4l!Y=nG~)ZUXaIHf?dOwzx( zA?}6PZT4vkJzhxFuKUf9E5$irQI@4F84~|ASxte`W~% zgJk{}@RF60@tctJZzbga2E1haAD5r~=gweOrhi++{Xb|Yn{=eVy~t6gD=I6Y%2bg| zNX4MO#W6_gD92NNvCV9kBrqBZb+FJ9#g(y*q9_!B`D~gfdZiS*`U<%bcK$ZdbdkMp zC=Q4%loaFMD$P2)CmIfFkibhB<#sc_CbQavryVeyXf()<9gn$>v#+_2H`5%+Xi1n( zLO$P?I|i;{dr}aZBD2+QlQ}uFWC86z#7iM*3#2R+#X_>i;Af6~)1Rka-+D6jr2v0x zdUu#3+5#Ce`7_*Yo^|+cv0wt_h6@1k;Ui-fmatI;CJR6D4*(d2FEiTLWYao0+5A}u zNa((-HbyzZ_@KJd=M3GTJ@nn&JYMH75!Wy?$D?r#^9Rq=yo!ma9GCm_!R9@K8Tw=y zOEyMweHr)-IhCQ1^{m0o*&VA>d>C=BloW3wq7u?~(jFj_( zQnmJd1d>Qfxp{3283XT(f?Z57M>+QS?KTfC%slf}tQFDCq6k*~#I(&VU&wtMNz2o{ zu${eCJ$n{}v6%X@fXK;YWXRmx*TGy+Ek<}64C=gzeK-VwtzskpV9yk}l2}Mad<6fI z%-g}h6tZ(~Pm}4oo5vbTaK~Wlxx&;?o}lu#JD8dU)u=oQneHvAx}1B&d$x zF0s#Pw+e&kst~{{0p&1u==E|ayex6I%p8G%IcP%c!CF{$ldroL2EQrAd38Mb((W86 ziOqTdTcKs+Yu!kVUxQQ@4!EkQmM@6M##@xK1&H{AH~_+ZEd+WuvyZ=er=y3a1^`O>OSwanL)4PU!Op;#x<>s@ zI~r9`$|~?7B@BJBzX2E7hrs+xh~k7X3g#@h04?}*rbgbo;}?5@1wVtQT*`rM=KkRb zy|VB)HjduFMzmeI`RF$y+wXxbxpl^g2=KyDdC9Wo8ubJ1Sds{8_tR^`4CGJ z>zwdxYaRr?HLPG&A=382S#!g_#)WW!XJfj`y~>3bj^1@YNMhjtfE1(+OyRzZ7hGxc zjAdd7O-#I!V^Izz9=qQ)>v7*|r8G&*J<~;8>PVxx>^YeAhz{{Sn()iL%Ow_GN{H^h z`y;UH$q?IjiN=HcK|Z;AgT$xh?!jj^<>i_{_@ad#aj4* zk8+9L2`!4MiwxXO96(uq0@Vu42^3DhK3aAp;;|e-rV9};n^le0ujd@);W9<08xTMp z1{K(Yy*XW)enT}N(+me*&8{eCZMo%=4y}8o5|YLEjiLsmF#-@cP%TJ@4G-QCqQP*1jHhTt zTNFq(^QIWQtB`;*t?(D=Sj}hSK$^8{r_OUIYM8mVWB>XR~~o;aF_WJ1I7uz>3t zyDdYE!b$2VLLoL(*KLe} z=CJU!lsEVJa(nH~RQiau-&cZ!M-wd2sB`_An_h(BbzTIqJgc;C66bPuZ|7qmPGtMd zld&Vhdc400PR+nES2H;2t-fQoqqd8H}%7p ze{hqQs(8)EVy8ybPF{;TpAKAwHvkF>QgrsDfN_}1{N2Rql3=M@?RfFMBUx zg-Y5ii_4rp>;Y=#=kezwgCaevkv8hP#IH703%Vw9>^;v;G;XOT>M9-|PD8obdMYDS zygbxyQDIHp!H;eOiyEwjFeY+@DbhfCwsi)I{Tj|TP<)td?w-STr zye%VQ9o^QbA|0f96kI%JC@+qH6pvZc-`op2)!z!3kG@?QcaGcTgws@D;BpqjfDG0M2D^4Rr`UbJc1f}a7hH^{-@;P?R(XKe@Ox3xi4Qp8(J zB#hJ<41{({-XtStlnIlb;DWKE?Z4aC9SAWi9C1PYSn!lgIsr1&`*Bv(WnqgY_G`8gpWa+n3v-5B&H?l&;r*(B!l%a!adJYC z#W0%N-vCY?d9>bru|}oDWX_X$*BmCH>W08tR`--LKK6EBCD(4^nc|Y)%*S6h*Y`ca+x_2 z;>fRX3m-%KXch$}=em)gUc`W=Gf6D2Y{dloL(+%V!Q;nC4eYy{{k{KsAV$LkyftP4 zN9yet88J=~YJrIq9Rb&~smZIYG|M;lui_RRU~_=~&a!yNiDV5(N(+oiX%%p8Hu6G0 zF;MiboOG@sF4haI_+=!Gi3qrY;E)PoQx>25xCbI~02TdXo2x<$PgEBk1c=v3JPLxC zVl;ZfQ>0nC5VcY#WTtK6w^_J!X3lEUfvp?#NCJMa)AFLKb9UY*?RuCkecdX zJ_U)1smcg?jZSi!&J`?@VB)^!tT5vJZjO!UoVKuvG2Pe`av79CxymLi{6zKh<(RWR z#mWJU+dDKtcYwj=$u0RxC|a;AtJ4mW^*1W<;qDShfet+o)PMkb5DH*PloetRprYt5 z*R$SdiNHBSAsU3{AMD<;Nd&fHq>so4LP)s>*g2s}j4xf40;0pYM{nKJcTdOW^NpyX zlmF=jJ%Z4@#3)w93F)$3tmjPd0f|}o)7>0C<;0qsy9}kS}K{0C9}W< zyM&6St|`j8WTbRvoY44Xhfu2Yo9)U{O_hH%iISRR0078jL|)~5Nsbmcuq+V z&jUROljSA&P3|UE862zn$sUW=jFP%JYnAmaK4&jiB&TXjDj0$6u>OXix#pj}(JBWe zEd53YCjd(7vkLJ=Cu&ZF;6t z99A`Wt&^bC{D<&@DrN7WvXKjou_+9VSW;F8eSp(Wph$ug3#~%t3M{Cnt*4-M&qGi% zO%*>*qll!F~m6jMe2+3z?7R)0f>m;R_f=o-nvM5oUH5 zK+B#2Yh$JW+@Fe-eMF`}r#u{2hL(D9O=@!uv|Qi-GlCgllk&FUar}8GTJ4{Wk+B75 zFrVG9mhZrYkBF&?6ypY1^9mdzPs@EF%>Ng0ZvqZg8#jzswh1A!R*VR3W??L)#+FpJ zl#~*KP%4T_sU~|=Qc{#GEfVb;r7#E;MWwwM6qPb)85wi_zjN?BGBfo4zwdp%GuLI7 zbDv}G-@Z?M)uag&A$9$wdutl-qv{Sx)$Tkd7n62x^Q%<~m2=vSE^WVK*L2{k*ow}D zb|(@0;?|1XuG@?qS6fq-8wE}iy;^_Ot6GJTVn%4RIDFuTO~|7kky9>)OR4Xg!7yF3 zQuB=IQx%Qwtd6_UC+x`fqq}cLJgk)6*REw)W~}>7bN=DCjTbG?u1d(8G?v2k#4VU0 zp6?cJV;Smluxj;dwcMriKT`AzuglDK(Mbp69mxqZx$filCc#T4XS(BLz10@CZ{J)I zbUJ9c^UK>f$(y0CH@W{(`q)#wajf%{$&)M(;YY7~pK+^_V*Z`A_-nqk)NX$Z>*Leu zH32mlZ^x~(-2Q61VHIN9X#D89BDHZ;=L-9cA=H9Y?%~c#`(67ArXE|t&btT<)%HeL3yNn!pd?ZRzYE zk!s4KTVHFxOPnkB%60~Ks?OSWmC&fC8n$yMeEQgxIwNd>i^;}q*ONqVR8F>5S@}Wp z)6@$o1wK@#7gY~N%U_Itol{+IXoY{7+3r%J>9To^vsA+M==mO#%wBAXICO1!&>QjD zW4V`2;uJq@607ixUo%Je>!s^+UWce%KH+7)%Kg+z(`gH=b$*?kr4excW*ChPqZJs=OLH(DT0A@}sBuVF6 zAAFnD{60Bk>!WweEuKlw9eX*ju&t}-QCmu2!re{N=W{!`JCKsh1IOmX-v4g+v%Fia zY}M=+K|AnT<&SzYV<=zM=?4>+R9a`>UE2CK+BW73bMBP1X_gB#uB~SohAh5KBb51Q z1U4Hs)@DQoySMXB)4DM`|?d8r;ubUF6Wb>)qijyTd2-)GBX&pyqtHr7ulc z_HEU{2UT66E0ozidhC!DQ(W>ycLrVyPpo-my>XJieNK+o;l@k1r!8y^Dr+gco2YeL z;mo1NqU|TWzOB(V>|C=tXz?aRXD!>17IClIbiX{V)8xf1(=83o$gi0!YWv!o_B`41 zUd*S1^4iXy!qskX_;@7l!kG0lFF$_uvBQ0J-pp0{?o~k_<-S#3%{czPAVtG>z8gc= zeKzq~y?G~$MqAi)*nPD`)xGw$@92`y~HGQdJkh3_2=VJ z+7rKQEIjX;WG-}O$&O`b-_ncd=>Us3h`^1@eF{Z_6sb2(HO8E!|5 zHXJc4^ZARK=F5SWvXY-4jQh-5X*4cQ`jkQ%PP?s$ncyaAON*{mv6_9_2}xy^&X}D! zmAt;&0&ypES~lFNtJ7$2)$@JuuE&>sq>x=WRdj{u26=8^cU`s4)$X3t-S$p5?`+8L zdAHs1w(4TXZ)dm?6W@=|@Y$L%vhMRe?OU-0TbP%QcI>Qe|Lipgyd}75)>zwLGbfZrEs9$*=BR4JHtpOGgexS;3UPsY`H;GqY)X2BJk1QxW`uOlck+thvx))vlZke;YwNUnE zbV*FOnCy{BISZcTkF@kvXx7VByETU;npPhph4b+w%-3sQbMCO~)kPM1Q?8YabB-$e zQu-#A@T%d4rd@RP{F$Dn=CsE`mv7LBV-A4>Kq-?gy$)FJm$*tI6m z?vb*e)!zGaOg4`f+9>^d7jsu@LBfgybqw$EW;;{sp1yu!RipWk-1w4sv!TcLBdazpKQ2ca`RE=%XuY(IV1_atM?^r9{4 zWo;+#<&gEh?yr~~Bt^KMZZ^x1?0Y;WH}dPJFSnwb)lQf{nqKodY-d`N`5Us=qgyoO zBh;z4y*G_o`lfr4zSrq9JN<*|M()tqxx%0(_7wisNs&9BeRWjYOf@Eys?@lrYN*7z zuPTdsV`Xz*$6IFXL(>zfKbD?cc5(+;?qP z?q+PMO!py$Z#nWbkrv;4z}02K@-MDG@*y z8NJv+8tu-iB1)8RVw(hb+>{)NUtLB_F4whG2rbAwGd@Dt>7?!h%bRX_??vVq%??aD zw9;is5b6A}1EUUIm97cRlw#iXj8rHdLHYH2Ui3oeP#MX+8!|ep_XhjBuR4}E zs*DG>Ztb0#%QV5Y~p!JS0T=Ck&;;+b;QLJoGk5EJR3Pwur=7hda_ViLE&gZm5Mca6v*r;jd zn1Wnx9A7Yvd|<@IuH0{{CT-&=1qG+nS+lO?nKkoee+Zt{mYClc!3ZevA?AFebAw29hF^9$zw-s|`6X~!q$%X-^C(Hne?4FV1$TH@sWRz@$Q z1Kj7xOHE29zIK+r8Iri@U8u~X6CS6Ij?bIpZ00>m{`ARsYp0s9QvqN)kh}{pc#=?>>6IWbghJj}es@iIF!Wy_Z>Uxiwx=ZS-^}k&Tmcwin$yn0|I^ z!Oq!Iw8m45rA6Dk_M9HIwqVDv#{GW3wlBXkMcBi{;MLPFk%xAalGGE&{jkLSVpZH} z8fP!#sa_rXB3WU~^l=JdDUB0@SFK&<;`nQt%EgA;HTAbH6x_&=KeyuoyL_rk={bD< zUeALJPWnk-E1{B*v1z+y*9Dtisbsz0dA%h@YTCUWk)}5lmzJNsh$CBHek@^Kpc$k- zWBG$HMvGtJCA-}}{ZH9^aw|ymD8)x8ZpaK@8tHq+`_>8Kj2oYr+2S)tiQYEYdhpmr z#hY)xZTI}q(5Ra1^+mo`(pp++%oCxN6&{T?9&)!en~v6MUfNM_gy@uZnaNtn^h^*U zf6N#YGLb@^){@qJrKnZ1drln7lhry`zwy>KtGKuO*X688jlJ|{K*vs3ZAFZ; zwuraAZ{6OiPfX?QhaMg|>%Mj3wQhptmhvg5$0;rfd4J~Dt-Bj8%Ac>!YByc{R;xty zw7N<%{$NVGZSJGk4yTylc#(zzo8`yr9p)!%7mXk-NEW$T``zQ)*WjznuKSA?UP+P- zv{Kl2ZvDpdt8BC%2_F#;meHv!7nZ)}mt)30(KLl>S+XxaLU{X>kRI^`H?(agIJ}m$ zH>vYVZ?mZPEOI{lRL0OUuj5LvQ*OtZ=IvS|NhQxBzobkY`#vhkA^IkhC z3W>jaq9jHqA;S@;`n<8TN9L+e+v<%Ks>K?aYbxSg8@LC39FB+1I~(w9r_py=my7qN zk>5znRv%?8x;^@x{^v1sh3C!^=;1<7RGEFM8nO-mf7`Db(U*S9eJ`r)zHA^K9Nv5# zFWxZPcl*Mr+mwr+KqQKgKlj1-CZ!2t#X7Qkoqyxk{yvtO>9yQ>l*LKU-Cz9gz)$yB z<&3u3Vm1Gs`1#`H3@4*&1>##raWWf61f-mmjotOZXK{2&XzH6IEz@f*iRm9%otmRC zu1QoSr%k)%3u~rz_>Z@DLL{=+Y|NIE+eDDKaqkDaq%%EZ&F^ngKd&%wX zCuq#9upeBfd0CC;j;XGgGn0Dl( z-p0$0LE`gCe(s&;&941gR?@Vnc+BxVcjVW!&ut?`x{6NLf7430VO({IP0rpHk8E8! zjdfr95=RL!o9a{dj_}S*Nl3S0YI+&F%lT)*=E&mpEPJf9H^O|{Fm7LF% z>XUC`uf2YLlP)xQ$$es+$byY=hsAuVKib{-=%3#CdBGfKT>j@AC!NmD`h91QR!dAh zG0U@~bbCy+z6~eY=KNm!69pNUj&Di4n%m0p-Mne>q}SB6+I5?*8gSE{C&erz9-)rY} zP0Keimyftoy)r0my5hwVpW`BeC3x=cOw@UG$fiJ$zk!&yQz->r*x$U1Sx)mKzE%~ag9 zW?Qb$uHAX*3Rkv^mA$Bx+}S11UpxaOQI^JiRdQz`aEFr^4Khi&K7@Evniz zZNq&Ry4J4W3D27frBmnBZT~*wtWU?g_#R60t{E%$nRXsj=>D>?IVYQ(a~64i%;ps} z|I)&!rA5}|v#O^iGMb{r(w*L1FO<6Nw)Kwig&DqGW3IowHpzBN-I1yHrmXMmSc{0? zIeSXtcifU|AKqGJ1eLrzoc(Ib@A|Z450_)JC~~UZI5B*Wvi7PNr)z=CH^-iSS>Nnq z@$q5A;;$(a^A2W>^9lL3@EUW$x|!x_CBHiK8W%tDXmdQw)$%So`a8Sip({)XR!F9< zh?ybzh@>&a>B_#mlgn?udlTtMG2GenGqLO1c-gARnRC6%9vc5Pdbi@ZYgto*$Ia%) zM?0_4uBL6Cm3C^;xaQ((FMPD7-V0g2y=}6Os`k6Ni@fgb+~r0OVLKrcDEB7SJ#8&> z?pf%S-9FC$<(Q`jOe!w8?qb)5zinh{`=q&i>7sn1QG2>S*bDiU)7fh$D$I;{EcJfh zoQj&o+Rp?1xayfpTo*pQ+VZn|CS#;s!ALC+>Am*p?{Dy^pvVZb)vZ zdi0fPTU>G+FSDpZF?YnIiMD2?lp~VIyBD)ws)>srrPJq%DjJuGG0N*DS(Tj0VX+k} zlSWEMve_ONQ;ts_k#4wPp_-jq5_Mr+zM|;F@9A;Z){mdC2$z)7Q<-!_N9gpSZ;A`N zx_)!Ejn9@csu*{xN_DYUa`zWb*UXfeQUR_dmBn+Ho$$ZE;m!J(RqS`>SGKQHey*dz z-eiBqx-p~cdR5o{vv++r?eA#%?oh7NwQIE9>0Xm$wwvdDKI(dXk7Pg(gEK{5>A zGFQEq%5S+In(_7K&8}^mpS>Z)t<1j}z4EB>rVA66O*}Tr-!|v%S820n%i_P@vAn6^ zlB(0J82y}cg0fi3CL}U^+%>tq+tfZ@-cs^xwikZslb%cFF}Cr68T8i~44Jag!J7h4 zQRP{7H-xbiFasYlIwh?Bt|`aFgF0 z3%Bo(A5Yu2kLmI?DDXlI%JhLf(H%;n!}J=jZck@MlM}u3s4O{tH1eIJPo3^yt#JYwHN6MM9yt zinRUWvsURakB6u@XlrgJ?5z%FoLc`bE`R4u6_JvN&>doKA_kL>?~oWvB%8f`=em600pS>>W`?0!X zYqv?RbrZX!bn6q9#<_n`M$^;vgXVfSlOWB@!LliLqIS3&6{=|^g^8a!GPTq+bdue{ zr`1&!_^dOI$L6<`Y`cP6didHxsoXUs9SbNbQ9BCa8uQfsKbJih&$c97&z=!4r&FKX z@L_@)+lAsYV^ogk>$3gAPn9$Er_Wv!B_^a*{$_@>#MlSr54z5@ke59uXl=_-*^&F; z%%=ve6@ga_7G{U0#1Z5OvA4oJ+mk&rT+fd?x_ydKx?sIYY^OP$bm ztJZ>`*&X;bVz#90$%wi4BF)00SV7XXC#6rA3#80Ej)uhq%tmliuB1Pg2{zfiW^3cj zT?-wa)J<4$=-|$tuU3nN4?5(u;wGB8eiZU`zHwdEdePj~-gKRYsX8mhdH&SCZJs1{ z`s)JS`?Hlm&i=GdUu3B0`13Jw{ZF5DNe?ufcJA{Ne8Qax zBTPQEop^4fJ11cCyaVm+%3saYxMS{|UqAb1+^oxT&Gs8dgnxY}_HOIEBIdZs)uDk^ zXP%zb)_JnP@Uh7{MJ-y=R2vWC%OYIk2x(5qGZT5?#4-ze_x&dG=P6a6l3l!8Xl#VN z$^O^t+B2@XPO*LZRQ1q>xVP~*+J#TJZEBN*mM-}C#r>=JdgO(0&fHb9tO@F6You!) zn%t#@6&c6vbGz}q-X=TXfcm;Ii<6BDM&nOEtlCt#+b8eg#g~lI^D{^zz4dfBx%Wl# z{8VK%=Gd?Ka@9Vmej@$A#P(%n`qxEoxGtY`aq5Lq=jhDe6RL`iM2lvZED4czn%B0l z_2p?B{UfoDTUO>xIKkQDQf%2OcJz`XZSC=p7boVvZYa1bw5l`hlWM%QZUBQ!JL|s6 zpXK2DDqN~PLG8e}<%=UNWO6kU#onvq*tQFulP&u<1^0A~y#6s#Zp4d= zMWNevrZMesDKD(WZf8#S&Zxo@B1>!2*WK7N{Zz9-(*BUtcJnnk0WzJ>mr?SQR(PeX zWtGXhZD{aWc{M}$&?6ny$ZZ`8KUL1fJ&I~uY@mJe@nUhc`)iu+)g21oCi_BOrY1VQ z;fs%Mvi4CE=V`1xiHV(yZ)^?lc3e36{b<((p3O^wHOtCnkol&2wjSJcBYIXw$+-lX zF(D+CnQEck&x|^cAJl2c-C3WjAojSX$^C;TL29}9^d1$Dm0}Z4O_rE{o_j~AX2cDV z`H|N}49l-KY`^6Z7~{QR)wNrG<5MqeJG<#*xOCktE1Bnwfg4imom8J#pD(*P`8M%) zcgm7zW~{pGxpDquY(2NkbFG?oXywY<8=}q4zb0n}1!rIW_UZY^W*5bEv|AGoC+ap| zjums!c6OAti;8y2u=Km1`cXDOM}7ld;>#Khqmt2AiCbg!t~gk_|5nn;Y*j8@^xfgJ z5Lb3*s_^ggCNrhSy6R*sd49`mLV=@~btgscU}md?T>WX~3?pro&8x2-Pn};G=`(Tt z(!{6uwvvx+7Z-9~bzKX5v0*bgopqm99l>BA3LeJd~Z(c=(+7LCnn5arYV~<%g67~&V7%sh;Q6dbZfWy;}e0`>Pw$Q zdwo~?ar^9{%+|_@BkH=A7u71-#3@f>Ygx&~bSl?+K2ANgP;>28no5i8>?^|W*S<6h zvI~$~GJb~N!Y7v3^~U+xeSIdmmHB9gWrc5yXd=$zvC@j31u*N|@KK~LVS>}Nuj(GV z>rTCtSy^z|^L3Ou{{8G(&*YnaT+CmqBF!*e4Fn~UcWl9BPwn=yBOdzrj-~r641dI~ zicei~52w2`&DZ1JrN+3e34y<7d{V6*x1hSc`jln;=FHb|t)iLM%ja*6v#O!b#6;c$$Xm>pk3O%8j-M> z0#oSDc!fWh8@+U#I49`fqc(Q7O6cqM^}j6{`Sk>*u)L^v6Q>BXUtrB>dn(nR?g3k&5b|wNce;37GZbf_Y<*} zi#NuHTxs*i~XX&#|Dyt?|`mPP%Ir{dr85y^ecAx8mnJ08sNkm4(NWc5vLgTPDTCKo&R^D%l~kW%Yga?!~XEWfVKvs zziMl^(EG#n&Q7&w6i&*l$Un29(xv$2{Ix!X<;-1Ula_o| ze-OH=LlK^jW^I+qYM{4F=DJ@I898$Dj4-WGt@s58eQT53_vQO9&p+s*?$!1vq_bdG z;jh%hl&RC24(xn?Z2$Y1_XnMR$I;&&OT1(=m*9HDY1`)<9mT3cglz8*@%zTj_IbGY zT1{nI^I7kcM^lb?ebo456Nx@)g?>B_u!v!&xAccxQijdTsg zSHwBHBxWspfAxwROft|DYg$x0qCv@wPWR_HJh||Y+bjw$g0L_^!PK;o);_@QJMDLOx4RKjkWXcI*Uh2Vt&b^6T*59*`a=uc*A1KMnlvH%?CvQMLy>qVM0|wC>C1 ziM1Y-D-9{Q9FKRG&P_8pWf)3r6O&t+{HAA@A|>g~^kwg!n`P&HA2nm1r_@mmD+gy= z!$MD8pUrb0HohKzp+j@py%Wz;119Nv8om6stght(p&=i4)kKU<^V<@AIzJhANwKhe z#$uwkQ|&V^+iO{?;&Trgu|6~+6)VnZ_>1W{tuOH!*?K>*_*=u4TT|;RC7+M=HcesS z&Tb6KX*uO5DVKL|lkIvrX}xqY2Lq`ovv4{&%AX4zf4UsMio5afxpdfkRmB&9U&5n5 zY20y>`g-liHl0;7piPH_;)mwGt)5`-+jd-<= zA*$#%E}LFY&%HCsF-@v@ti+>Y&r^vOuLzO*wyc$Kl8LyVe_Uh(44uUADWv-?uxBX9U1FsVOU~3_3p@d`2c3fPsVZYMG^~d6pgq2Bi zO+20irL8PF8D5a_v6ZuoZeIIxNubLS?c_`TcO@o$qT8xbnfFPycMgB?aVJ1Ba=iPBCeK#&V zHfi=#TRrE-&>e+8)xL-~oH}W5^1@|_t=A31R3yJ==Db~BPCuuOSg1Pd%Lvo2Wlcvy z>my6_-`~=T+r3zbMb0CCv6lF{ae>T{OQv||aEHT2vO@9A-sc1Kk`l)zC4|J^JZMiV zyZhvEUX!-4NX}h%`qfsu!aVC-sds6wr|WfOu2VWP_9R#J>j=-q9Y0!rwA8J75|hNM zZ7}(cY8#S1h4@d%*a!{c_E)m;(Ki3Tb<6-Qwq#qtYJvmJXEnigwbvS&xqmQz1*&We zNMyXBG1*ldPHtMgAqbC67!xNrt`79yyvcKQAZRCtP5z#XR|l;iI9OWY3G>&(UCi-> zC98vj;4&+J^ddb>LyCiXBUr!(aHBvx8VGkpKLR*l8deXzci%q$m%k4-)*Soi|9&4m zJ#;49AK%F6KZB4y2~+KVLP!srkv{Mn>689580qW(1CD=Tq)+!V}l{u8X} zW52pN2y6QKXf5d0>|U`Nuc<@93y^u;5@A@z4>4_@7}7eomkt zLI2WG@5I4@FrttKB*y-Cu|~nlj|ahsg0&I<@r}s;8TV7Ltl;2pgjF#A@r?}rGs>o5 zF3#X@gryk&_(q2RD_9$-J1Cg?m9#Cd@Oq&Jb2@BVF1>#qT_Y$EV zrehq%^)QZf6z`R%@Qg_@c*bN0JolaN{2g2I%eHuVg_BqOJ4y>HluMy7XTSh|1Q1l639{Pk*m98+-_sYrMTzgZc%1yMicA zpb-f)5`ji0(DVp2eFBX_pcxQoh6I`sfo2S+(9>|91Pe&8f&@!Q6u688t4Oen1nWq! zkPHjS=#5|@85WXZAsKE)hIM3EM}~D|Sf>Z;^hj_6J@j9~LOoch2MhIJp&l&MgN1sq zP#+fR!wvOeoj&^AV4Xg!(}#8XhHwLYSf~#RDX@?N3n{RW0t+dykOB)Su#f^bq`*1~ ztTTXh2C&Wm)*0x*4GdtR0W36tg$A(D02Ug+LPJ<+2n!8ip&{JR5Y`#OIzw1z2>XVVyCoGlq4>u+A9P!C(UT0}G8| zp)o8phJ_>|tRxX(DTxScNkmvoBEo7C5pGK&!g3N3){}^E0f~rS(TgAypd<`O7?Ln7 zk?5puh=})GFK#|x zoG{-OAGB%nYJxMmmSBypCYU=|;7J54f`x?@!O{Vok%jmffI|!ab(`032t*f(6U^7q zJpJYelCY~$@jTxWua$LL#0^0zZpTlvN4kVr?u8`?n}F1_3K6cPuBrrrAY7%DCIkdw z&=FC0`CTZT6r#%zR;AD~IFBGDl6ZK_QRGT9m~@0gEJUKi5QOcXhhC1b ziFv{BTnzUMfMp^GN68I6TZph|bOb399$_jzcRuO_^#P>Mu*MvMK5ftsI2f}s7;vDt zz-#OS9Ogd~@rI~z2Pb&o23%ncXNQBD5$G8HK#PfljYd2Rw<|=#aYWe1a7PI&V9z^% zunLP2hJ`fpKuk{(5sO5c2%|)hc#HT|g~)E)h~4}lFhGCyL4aiV@BYy}|N8*4;RPW| zMuR{|rtkwHgn9cwhy{Fy03nE>zX72k5FuX>W*qU8ER3%}+Tx0IFFrQFXx0wscX&0RTg~#9kniG`orrgn%9TrW8h`Ltibj4g+S~0LM8zGP8x$=pAjYF)@90!1aNbeivo#{5qvcM z2f`U)D$F0$16-_rP#gS9zJ0vf3v0fR<|8>_Q2W1k=)Dv?a(&}|>V;S6r(kuUfAx7K z0EliB(gwppS|7B60Q$8a-7$vIu@T5u8WD-E2i9g~41^wwKJXp(nyb0?epVqzFH4b4 z=cutjBv3)Vs$u8qM~%Sqhu;AAiy!>ZE%rb7!f$|U(tkbp>x1E^kB8t?AM;~jDgYb_ zy*D4|fjR}~ftDVIPW1$7ogAb?&J9xl*xvd5VG}+G0V%5^?Y(C^WRM6{EFdffU9hr1 z@&2czBMqQ6>}UIig4I85y8kAdK$-KxiUN=_=!X{i61}NFb%WZaePhT!ghJ z47#454yE8hTlBFJyh3j&P%D6w_&0KjqA!4pvSP#4hEk&(zyhM4N@vl;5)jTfBGM5G zC{r%Vpf|}h>CgqrbUi-q#sFAjQT-ud#VgYX>R^5J_WcjOu;vwc;KcK=5Rup46DYAT ze-F+M$3Xu}4j-!o;d(1`r6rJxRl@Lx;D(?Yejt{Y8$^Ty5QF`| z(vX1Vm5mUB;R9G68WspxjE4ULumXwrio7Hpsn`ibO8*lagWhqhW$ZiFDrrmB{c)m6 z53J`XoEli)JE&}0xCkQ6D3RcVFHI91Krj#~{QyLt`BEpZfd9i8?+e-V-iGfD zctsgRxp=Su?jigVH41pR3HF=RLx>WHBL0miF&M%b7oB5as;Di7MC_1AQR~22&KWCu z6aiw5P;z6^SV)8-!lH|CC0K>M@aLR~LYj6zNBzcPgl*)8go6{wb`PZkK17ww=nRng zP5L&GXSaP8sA^c#ekDe5KJ(i{!^7>&!-Ee9}e`rx>*sB2q(*mZq z27UiOB0IxHAut1bh#T~oazlIrUYRgZSYz3*At5+4J7K@DHstku*lB=F!+ywZ$m@Bz zY2f$AGUY>F&+9PqlZn8MaH~FU?7OL8#g0aChL0{%1O;)@S3Z~A5fzkDsm8TXH7%fr zl`v)2&{-LgT%00O!bETcR-qWec2mPxQ7f12rP7FSqTK1gj3wY6BlVmK;S1pnGoHXU zA#^BzH0$JqZWruiU_x&Y6%9Z_pTpG)Mt*Ea8HSC9V*|?2Y-Eg{?tk$8|9@vOph*1h ztg|9rKT&GQq>(%7Nk|7fYAL_(&?4DjI2RfdkAsPh*T5m764i)|Laa}q!W$G5 zJn;s|nOeij;UFeRo=P+kD>=uWjPXIDnGmEwm{Dr5eNibj76f6b^$d6;NoCW;SV*`S zg1||xB!p&J@QMLRD>@>js>X7MNDqYEq7i8%Jer9#n?4Xj)C5D2k5b{2vYJ80Lja%; z1ier-LPaHf&IA(0uT%QfKMoZh9F1$H#9^R5VC4|rk(_JGWg&sa_88Z)3FFOXD<>4 z^aCX0Cdl`|!q00~|5#o|n50^hW(9%TLAx)O9OcZ>2+e{pJy#tli)-u8Ar>gIy=jSvx(J=^7GWBS zbcS9)Gt6Ac%SeNtsCvQy1V^MZN5OIgqDQ?D=0X%2(oLtgfy*pOEbI~$np}rWuwE{Z z;|x%~5e!+Z+G$A0^3f6yEBqHXy%$3mVzAJ{#5{b?3s_WY4KL>fNv$c;T@;+RxMb;I zn)~NH7T>`U(VSeFauJiRm7!@1V}1oBJTb972tvRte0B(hq`fSKRg{95Mk$Ej4xt+2 zZ+56JP$s3fs5Q;B^Oi<%lg4Xsrq97q+4xXI0%7AhbV&W^_$Ng9C#*n3C6JP01PCM& zo+K-c2py8n0;5-$X!&!WP*}ompOB61-Dh7~R^UFdtnBcZ6quAve_O9;GzP^RSB7W? zPn=%}LsUUJxj+s55aotqVaYse8ukwM&oUFGF_N%k7j_ayic&+*6-OhHTmX*|O$dpp z_EM_YT_+e0!#GC6xwZpKEc*lDU@Q%$7f25pgI>byo?d4aQ(=6xIF@l8UV{ltxTZ(! zCUoeI)rR=8t|XlS;c8Y4BLEb(G{OMbFe4Ez6$O%jgDcS`Ia(lh@R=F&M^vXzyYxx{ zexmuG{l}D;6mK~BKZKN4x>+@~Vp7}=Drao{OBx~pN!bXT z8p{nSmIj-)_h3PcME%-jI)_MuAPSwM%nB&1kkJz?8u&PX1A-%%e>o(W__$MiGJ>cx z(65mC{UL$Q0LEp*I|Bl^>@Q7=D8*#ZOp^5hg`Aj6|0C-kQ>cR|V*tqdigSh#ro8?W z)Wh=dAeOW4Wx>8UC%i%L$|Fj#jP>vyq~L@#C*s9$848TLxH#$qIe}IxR_ZheE_`AM zz%j6&KQ<;%wqQFO-Zl}qvn<9$b9&TR(OvFpP`^n=$ zz^oibbAymNkl2TF>Wp}ux`D1Tmh>A+zF_v&p#KlwX|NUtq8cn;1QHb%a2cMc1i3C+ z8R;$5CZhD?==Bl=?868q-GS416g4!;{8j2qKuBSVkm3C-3nHYY`;Vp@ zNHM;oYj+`nlYw&QdbSy;I0)jRn=a{J1h3Il49kthfC7S#yCk^8M>xffwX&8Pf|F*T zxCi6@50{bHPdMl^U*h2>_<22S)EXGXr2>fu>;w;(RXdu*fN?35t_@#hiEwP=Q* z41%L-1A(~HAk?G|9UuZ#B1YqbC=kU* z4ABFkIQ4#sz8Z&6A1)2i+Csp-TO`8PmFO5VlWUrHpu$}uj1w`6qZrAaYwF9kx?F|a zFIilw$eEFX18c|RClg#+PlW6B0 zix6m18}o*_pc9Q}W2jaq_iOcDCqW<+K^xcKNMMSf+V%{ojQfwf@b2MF4c`7x6ba=p zLI~3nnp^q|pptrUK@sS2k)(3{)bJ7XCVd=IL9vJGFI_qkA&GYbc~l~7fv`Q?C5GTK zeqPeQ7{v;mhN3BG*yNF5{6eJ=o$3$&^hHWBn&9JRVS&=&Lwo`Qr5UF;OV-6dOcp!9 zx>jFjG@e=?rkG_CRg zVxS3bJe(N;4X?a6;2$&^obVG&g?|@Z7o6}r;!Z9=3vrQRTpNJR9ppE9gyD!_iK7uU z^c@?*Yp|jO+&%;nfoumeL~fZQ-cTUFL0d2HRtK0|&;r#@bNsa)v;_0qfFISN9Q$9H z4O*FYV+wK4Rgy!grR)+2CrcLTcTq$UCg%Qm3r$07HUMh)I0)e@NQVss9fQ^DMfSmU zjtmv_2_1o2i~B! z<*~l7I`iSfBm&FKGs0XTx>|D(}XCRk@NTaa?AWkM7=`!+(e?;eM2$pxy zJD-0s$c%?4k z4r3&&q&bw%UPfhIMim95SrB%wV2eaWAJ4%t>1{CON)pZJ7zamz-O{lUnnIg!8iG|V zmhJkJ4x!VY2fH)$@en5L6Iy)`z+3}9&4@7Z06;LTYhWl41Wy)6`BW$xixo?&bxHod zU;Yuw6q!=yR1DRC}23ncfdA}~9l0Y|rO_S6lH2=hc z9(WLaD1$=hESt)mpvY08(d!ujopn&hux~Wd>_Cs#4JIJ?Cn?k+sDzJ>9at8Ob+z^~ ztNq(%mYPbp8?l<3%;U~G_=DqY+Z40>*%0w0LJ=YfdiA(`pXUa3d;m3Cm4wF zH&0xr(38Q|{^@(bMz8WU0hd0ax32RhJ z*f+_jrHxKFz{Rm-CJ;E&cgRrL4rp0wZxw4lta@w7KqEy-61Wo4NeEjHaWSBUYt2Bpmtl^1|Q}9ys>8H&`8Fzk4G<*7mwL!^&EL?oC!q z4AP`^S}zC@l^H^xaOj*Am4Dzl=mi^JEX~OvihSck;~nU%P09&K6OjYmiB#~XrD2Q+6<`#NT0mGk z{Q!W4VXq~yj1|kY5cM5JAb!KxYx@Zg~|d&30PF#U5S*i z5H`8q4H1K&8hBty=tbbVPf|*IAg6v}p5PXu-sby3a^eqV*&A>lir$CzEA)nSY5Dxb zHW>ngVVnze_7i{8&dyGbsq&bs$fj}>yNp7) zip64(pN7IZ?<@rWHcTC1Eu-ocGoWdmb5;xqW3hF&fscEKh;VVldWcpj*h3=;or8~n zhyk>})4}7w(;HDfLl4femu^rwjhcZF{R9^Vyg0OOQxxX0(BMf?ERt(s!cdN)cPOor z7U5bL6bcL&!=Nr+MuF_hURs1vACK-9hbNzI9?Kp};V! zVdw;%e8-ngu7pyhrP<(1q8=xf52~WF0Lv1rVu6V_n5V|OkpYqo8y`5NWWz>`3}Rb8 z^@V7TpkK@M)uRfuaT;jJ8j^{DBLA_7Ed`;T4&5Pa(rP&U8-=rh}dim+ISsAN$Z z5*-b3$)@MwNU0i}d?cF7l@RRJ4xH)BC)m?R%|i$&KFz-{I*o^Nz*p~gi~Bvt-kb9H z@4cSmux_zH&oK*1K)^~4P@yxU#n=G|gGC3)9nD~HrCB9hpeQ0h2wu|=v1nKc;+)Z? zjdWQGq4156Kt7H<#ilXnFi7KJXh2~Jar`JGIgBf!=yZZpy-#GeKWlT$xLjd*YGk^;7G5m zLqckampf$0%JUF0$tW<-#IUdxdyX1x1Uu>r(L8G*OpstemQ`Cwt;=W~(nQ{al)zH7 z;06r3{sXKvXc=G=81%4+9VE_~I42?M5YQM}iTCY!C- zSBZfa0^bMx?!Iv%f)D~@7XQX>HWn1wfZ2YPqd;kQjoTNxlg=tG0TP4eK@J+DMvr1` zTJH;>wNN2lW$X=C#tf{lzJn=@Mj^3-JzcFg)C~*zZ2*WGadB$B=OL%S`X^M>cO7RV zTvC6T{y`^kWT9Y>gc16Jv20mTq z{JJ{-!vMh)G04&Cjfn_H<6gTYK>R^#83zIY5H@pzM}S*!0)0M@@wCjC>J=2n=W^=CS1< z&(F*5;2lHVJg|G8o7`7K&!dqsHyJAEhcV;?yUAIiRG9c;6qQ;C`UV|00`3+Q)DM>m zqt+gYKIZg};0%Y^n}7`h$mdAVISeQ*Ll8g;0hAWJV$zW!NFWWksBKUf@5Yr>gRLR`2WTA-djxhs zVUv4W7;;D{6}ld&{bzynhTt|niUkDr;0=ST54K6~hWnzU7=^*-Jc!1McA+a^7(@#$ z+HIT}fym-JOz9l94_eFw+v9{W%R6w=73YX<$=cwMR}hhePx6Fq?7{9R%e3Tx1cSz{Q z0u#%`4yI0C4G)|BuMi0Ixy(L3#yE-2Hj~jPgz{Yk zVqNi76t-J0MmfeHkD<;2y2sJp94V+}mBbB&Pu{pI4B6(PQ3!$fK!;8z@tfFYdj*>0Ie77-FaURNiQKA@X8*n zUT}Cq7E~{Yf80eG$M(@vL-)XY)FW(-QkcaeQIBwF;Pni#H9iqw2>tQd8f3A1x7L@= z7PvJmpFRB61m?3d!c6Vscf&AXR+#z;gyGIIgMv?-+5rSP=w7Ec3TxVSgBi;lB^dt~ zB@qo_JYl+E{m5s)2F!iuw?jzq^^t9FWr4sQVyV92cPKE`myw=lsH;K^1K9(;!{CjF znb2ADb{C?ECf$p^!*-#+5))tdtM4_p5$%_2x~o;+cxM=zGdcNN{jJUbi|yY|^a(h!nC zU|4Y%jt-+^!1ZoMx~4;7D|Fu;7)|BQ_?!n3Fqb0<{Vv*!tcd9rMW3>~r{5agJE zfe1~2png`Lq)dn@VbF(+UGf|M0o*W{@?nb*9PiTwy{Tw{k^&pVJ-nn8G>3a?IZ!{) z!@#3Mn-2MDIuw>cQilyTsNk3zX7~@n8J`XPKW1g99}lO)4x3hT(8x;o5K;Q!#)zO! zME`@YaKlEp41x$BO9uKKF?j~}z%oK04Nwz^U%w;zOBH|NLkaq&ij1(puF-CK1c>>e zRvLDIcI!V%_uV;`Y~)#wX3tB|4+Tp)tUPDX)?lj4VCuyNLiDM*UU0!1^ugl=VI?psggQQX!l_(J$OTuby2^@icu^uCNSNRl z1?(BThj5WfDnZ(@>etr@$=_+)0|%<-lu6>SPzhIB$Z$!^ZL$|$BMncXSm z*|SxB?%Z#m_q(@@RQLPpYKCnxvo}P#RktMT`+I+%_j#}1L}Ss-AQ@HiV}`RR4@C;- zL(mMzHcFgPB-+hkS{Zlg8RaQ==QAoxx%=K}A7;lM-WpB#f77F08-(CahhXY&-5R>- ztwuy~x(30Cih7-A%I}RZc_xqh5QXb%FV^7+NJ}W0=9_F?k&2v;J`Tyy9zXlaDt$mO zx}&deZ5a1PHS^K*25qPm2`J`!r=$X2#?PfN4iS^dY}Mp=sQEw(W=K%M&r@&a3|YZL z*$na2+dOu@EUrH`(8o$Q9n8FVoTV4~;s~|+fW$&gHqR}Y^Mh0hLR`RMp*f0wd+Rx5 z`LP*hP3w%Sxrk^N@tMq;G#;@pDhUPTB4{!tI!Kh?UC#|8b6;^$hy!L97__mRWuYv; z>pK&}F^X)p=3r*0mO9ecdPZYasDX$8;ZG*=5PSyn;;27XVF1?p$=Fs%&v)*-UoIU* zv>{^i)g&tUSA^b8B6+_7newYCu}2Kj>!{ zL2H-U)lozNa5me5V<4#ICkrj_=vf(isc7UGduP!oThWHG-<^396`kbOt%MZ=&Uvol zL23UU6dDA5yQ>rHO*Hq2NNg-;SMMFV*HvuW3u5{hccGFa6AdjXO!T?w@kqyby}@4a z9*vf6T7F<_w(W=?bv&5}(ki8&@|k2b0>#C53M^2@;ON&&+2jXKRN`xr6*zHtym;MP`Egm0w0eK639^= z{^V%1f+;|dtZ)RN+Q|D0d5@1`_kv@Arj@XA9K$~$iN}Y!>Xy8TV=Zvux6k<26&a5} z1B#MLyh_YG=R7r&Pm~G7=yfKQR+JhK-RBP0u#t?X8X4+Aqs|vjP2J36)2u3%!Tv4N zeFvf8(Jc_+nSrWcdKe@sfEJu=uen%6Wr#RoX6;`q16b_93v`aaH6V2g%#Ug1(vMgU zKi;=Va_$_=!^)L92Rro0m-0)F;_}py;fpu3Odl9#P{Cp>QeZytOpW;&gTv>`0ovV% z*vJZP2t6tNy~Xmx4x}rb6Q%f}7vy3Ec`ll?8{`^L0kG;;TG&~Cm!V`2sOKl1pp;hS zC^#=LPjTKc?KB|nup?1IUE9ki&+Wr51hO4nj97Mc8#7jIyVCZd9JC^!iI&4+DzBs@Zcc^S6va>~%`&~j77JF2R z;_p16fX+Y*;CW?VBm%er2K%|>Snl{}=6Tn?kI;-k&H8|t8|Lvhk1})j zZS2MVVRWp4z2%P$^|NCGn3v>|SBs2NkRTPE7-af!V%Cu}ZGmn~XId~y4!Us`Gg8pa z&sy$0@S~3H?;Evsph$n{fOgfjeOU}=1|53P(iIj)!k{3sq5}_$st#yT6&d7A8w?Rd z8ol^ZhVFU;HJi2;5zrzg8BuZ(h?M+}x2#U-@?LLpacnUDv)=buIoJ{!*^_6GI z`@|JpUZYXm0Jf)VdvAAw>OcXEKBSP?VCTFExM*eI_dTE*H9pMA?>!Cv9~G0eBHkDf zp%or@+TQE(uoY9kNXO6h%RGE;seT#Sc5&v;=XA3*Pkd|3ZEBgmT%jQ`s!hU`e&Gsg^0WS4nEjOq*#&_4 zZb(LPrvUHUO#~uin@9XmM#eUN{+(yk>Bl!5c<|&Z-M6U*@Tx-!!A?0OZu$cctY2Kb zB`|mg$|LO9(d3R*K<})_E{0pRobP933zU&x{GT5Aaio0IE(<_Nn4D@}XH@ z2z3Qt4V49DcqhG(C9APvH^f%C)bIY46jw%MQMO^vasjN8VAEs}`TRi<_s?uZ1n;42 z{=B$YpBMvee**ry_L+xY357_?-IVbbMT|{8G*jIGhy)#6;AWYK|0(v%vb$zauK51l zm28+X-?!A6MNNA2udp!E@KI1e`x8LWyl{|fc#kG)lqO7uA1=IaA0`1M);oIo(%yrw zF_v5C(!^u4zx(^oX!7VdL7r@jD9U$$%Fl1DqLn!0Ib%_44xTt%>llBOB@S2oEymaE z-s5@s(XIB;eEJR@qDT&~+DVpc0Zd5mIyQjr$ET=GrBtg0IR(XBttQNqQlQmZO%r;` z4R(P}<3WP;j>YwIVbcbg|0*RqdSv)tnQi)aD6$`&!2VwA`bnxnL;%A}*@Wo6Ezl$MpDdGSK# zYkR|JzpMU_tZeAQ_)m&r$}KrYoWh1ms0QL1cdouhBH8&yoTr2^}8T#2gm`c_2}V7R92o^4vwFhwrby5(AuzcJNYL7Ez_(aIDYNoW-j%^f(7C6BZK@FJeHk* zwklUyvg-{tQ~S6&JC%%|n^|;Jg_kdb_)iZ@O?HjHgQvNY#%F=NRu>Qw#K z))lucpzdJWT(jcZoLsxBE&HX$Go77^)!wHy@as0-H0 zAfe;m-&CU1k8Nf3-`;!=U~C6hELvp{CGI4;FAcKn9j;%6(d!GNH!o-fy%v?N<-o7I zTe0|>uAs#$&;-*>i(roZy);-s@W;Z@i#lkm!C8T|Zw}uw`%Q8{dSW{T-0;V9r&Az< zJ+p@K$}ZI!UEw!f!(*5OsGho#Z8u;z!x^GNs8swA99UTc72+){9I6QY$)ml{6|mfR zJO-|vsTpjeL_h|fouf&!R@U=n{KPXJ=KC<&%98#~8+vNPnLbyiW=6%`HQ`i@dEIJS z!>Na6Fk=?y|E7%G1bFXR4gb4aL1PRpdaJjQC0y=CJ)-$^FH`D&Sfpo4P{bA`a`e{o ztTK;JSw1c=IudPo6Tt7729cq|8ph(6z^(qqi$~dtoaYm$jY%(g1?2AO2yf%cHJ=Vs z2(BHk(2Bk>=iAb8p-0KNn&k?D8}kKbkHCs0BY-oQk*#ily?MGv)PRkHy&VTCvtrF= z9;LM+#1xH^f^95&|AFw;_#gnP#N1rOtP_z}iN!R*SolJ6A_q9KvhkS^RmbtkAgT=$ z@v5`Tv!Wgx-dHRoa@)DX4$am7PW7~J_ZFW2c4z8=$C~YDA>* zGoP2ce%u8wSWH2^c95#S%(3Ezlt1Tg5!kRnT1w}}zd?zRM(VCWt70VBuK$SEo)noe z?pKM>7Ni04h$%4u*hCUs)IvWC1$+4gv>N?jgfuprNaA$J;Mj9=CMEECz&mQS`USb; zFCO2DI;rhQLZO`->n9tH#8Cbk!aynPL^1J9^2GE~gqvz!c#lV<@}HST-?x!pj>^3f z5#^WIMn`JTT+)1%pKSY@Rep}!S61ama%ffZnS)a*8Y7+tyCRy7^ixwJmSx6YBo3lv zRX_2e?hB_Q7-gobAAmE{T$KwUA;Fh@i6MlbR;@#71%+j!G{b6+qm(JvI~IaCzNa?7 zPWkVdtBi`n>6g-zf?2r{k-UBYGUJg@_@vpN=Ek3@Qkr9k18;Qla%n!%_(y^Pyy_BOoIQO-t=k!s;{A-9jX zyqqgxgGfvj3Zo#RIAjt*Tk>EJBrNS$frLf02NKp%7_FCi%wvOz&2I%Y;GtF2#?wMZ zaPBhgiJZ!&ffqoK5p~iTux222ai$sW4_b(k6O`TH1;Gv8)%|7;fMvSRxwcoBGmzk^ zVvh>Vgs8c`9KRSJ9^hegVh@6_i{nRIv|QV!oyiupi0{BV4bGjifIx)7cE*&M3fQzI z`IHIdH_w4MPnj$S((tp*OO1|;7`g2-8cx61y!hI&&sB_OCd<9ldatXW4ZDi%e0$Mc z5PRFUF}OQu4%70JrFMo1vv(9>QZM( zW&NA#f)%6kI1|St&fNeaq9;gq7@p?TaPV;v6O8kEH#ts?l-CUqHfEvN#{ zu2cyU0e{iB#UJm&T^S}T6DDlL{wR><6i?8R3muw7ij=&{>|v{7r-xm>dl4AQ}JXr%LCrDZ0rr7ZdE$O`PuqSum{uhmU8 ztLA4$w&T05B4CWR)ZnZ-H`4eW-PcR1FV&o`KG*iy|WCEq29+mW%UsjeQ?(WASCZwus^^qqc$EO zH9rlJFEI_3>^F3vfhCCC^1VktK2*)VgP0h9WPSlr#wvO6TR>VUBA^Q z%7L-%XR6Jv2ks@8vDmO{+_cK>s-6Y3&b$XT!WQn@K9ycpt=2M~@Fjj!aw2g^R(}}e z{J{kSot0FAh%;x2zCze_KecoJ)BC!+zD{@aV?mB`D)`xlfy_vkkpGh=quIKM2F@T>Xv5w3(KAc$&>N>O-9DnpbtgCG<_?;YNVY*! z<+Ld)@}YIEIqh*QGqmogIAx)Abm2B?4?hV9aeD0)!*k~A8W=))(=7f2*N2&dEgE72 zwTFL&j+Nz^?!;f>8B*!!5r=<3!NwL<3<7qI_r|r-YL*(;2Fuu@YLMjBzoJ}Kip+xD zf)KTpN7@Kk7jqhBx0T2Hws_t@d0Tnv=P@4*&*P}(-^>H5me((EVL27Hv$&HnVc(fh zXTElaZ`qcYG>D7T}TGQ;09?oyvG7bNtK+z( zVVsxmjVSJj_c$OS?#Mqke5nk9moxkJXjhqUyQ)WBhun>mneh3W&KbQG%oo$B18=r# z$ne~~9K>b+SY)(zQ$WN31=lV_fj%j(YWdm9NT8 zAztl2S5=94+h~{PSKB)7QcLE#v!4Tfo^yItSNVm~3pnkI!P~}D+Qjp*SSj}s!xiSC z#vkY3zeqvKgulg4uu9C6QPT_1ejMt$epOkKg}29OBshn{2!?dvJcQxw$jCw%4X+#s z4i6Z&EV-oPv?dY=SW&Q7!*~s)yc`84=8|XPQ7*t{Mj`X3Jbn^;SrrgcM70bhv=qU* zGM0*0^%lvr@ii=1cCi6_c8 z9E6%Js-fsnfAoN{ML~Cl_MgXOop^#Go=HJS8p13eiL)x1q-l!lD{*Xi>DUm6K|f-H zz&4lzGwNC~AobIujPM&SZ@E6!=o^Ku=8FwF`fB-R=0S$S<+P)4kqyqPs=SjXF*r>p z&C%eLIcW_qje0ZpKYV4BdC_w+j${i2vNFV6H5eJs7QTA`>|M2ecps-XJyb@79~-yw z6ml}4rjbuA0$t%*-@@SvVpBIzHKTB9@675Ay<4$+8%NVS(=8f`@wRC&L-^(;D-2c% zk~A>8St=ESY94uKBZ?CeVBUJFh#4&+m=x8n-#FL?^1`0jz|TMTC8|JJZ*vr+qL@1h&Z0OV)55320}6KPVAdST3C(;dkBbSI zBxi>d5F&GMlzGIsU{AvZD)bpqmJSrMS-Z^P$UK>bFM@{jKqRBNiX$Lvy)>ixY>kJi zhEOt-?I|&qE1911kG9;FYc4qxDakgLW!n!`HO3Ew*L#(kf{^tA~!(tb0Z8P zh)5SjxFwr~B7?e^4vC|1lQ|?SJI@{4HgNbo9w0Eh+zdmd5iZOXt`v+AOJ%WatAhI> zf@;cDlpvKdy9k5#2Pis2pb{u_TIaNXuy7*g?-0(hh`|ttt8n*`uik9g!THucba;in zI&bach1eWNVe;v}Vr~ubO^=-CgF05&CPL7P2?ZIzPfBV9A_+(G0^5R#`yX+iQ=nn)FoHl<6|O&A@_a%PH#9YfQ_we?*UHJP zoTF4yu9i2?T-dVea;egy&g_9DcdNpEG*CO$Ew5|Q5QL^};EN@yV!4(cW65O(#;$nO zbEYMXxDBw`+=Wy1x(#*fKck}b;WEH2eD6fKNS*$imUDUK+Ls&abLS%f=H0^iz)Iuf zz@Wmhw<4}&|Ke@igz$)~ql%CPTpM01QcfV`^s{Sv^eV_3>lVVC)6xkJF9*P_b1XlS z0pRA*B>MLXs@=V;{wQb=q-7F3#aXZjf*R->D|~a!d>h&2&)jz|%lDRuO>nk)wqn*r zl&gSFFo=Lk;qF8kF=9--M$+1x2)p6PN;YSUV?#7#>k^{5vF-RJ*!K7I__=49Eh)bQcZpMnhoN}|Gf;XN(P0IOBR zBs1*Ho&nCMR#taBHgFoj#K&UjGbOz4^vA6CGk^=FscIJp0>)OkZm(9^5+)BOi}(ix zX>*(nIOYXSo_P6@sD{++@&xuY2Y9p8OCJmCzF27m027mF5pGlg0tHvDB90(hHPs_C z#T+hBzEIQ(LTYeh6?9Y3&@dAv*`X4>RZUGAb*g-gNx;rsW2!nXT;m%%aDSP;WHdA7 z(g-ne2GIu450a&c(ZGn;$gt;Q#c=6LYxIAr$i#F3EQTqXG^)WrUOkv?`+3WDsqZ5q zEEKFdEV3Je8MyPqnXgq%Ro|`Ojsi8(! zn2A*io4MtFL#4^EuHt|xZe|p&y1if;sy82Xv+!?H`-Gxy^RQ23@VA#n66)m2l3K8A zmDZ?+5@Cbb$XIa|UvOm-E>lmSHWnN zp*^%55O^VgOynUl95^et&VuAhIgdUlLC7?`(xaryFDUxz9`3Bdwi+7pQu#Yk#o?N5 zYNae6mfp|Z8k_dZ!2yV)7M|_EpEy&5Fr4O~|d8N6v zt^!0jb?BSV!s2t1{ zrLb`N6X^pQ008A>^yz*u!oXq6CyenF^s~{bc6vrv+4D-N2famb8P$`^Sm&71rqia+*)Yy9YGnXL`zA3S=e%y)3b~ zf~B(RQ1Q$Y@+^hNMx+uE<;!aYt4dvF_V6Ng=h7`{k@`e`pLX6Cs4uBM%~I3B7>l5x zIjYqlC!q`Y7aoD3<+m;XLVzXW|41jIHEO#yeM@;JoEk4Pwl&IQy&}>~5l20u*?HI1 z!qUP^6PFirHZbQ{uZ#_B#X{Ebaw*t>k_Q=8+=DYag&Go~l61(ttVU(~Gdrwry++ z=mS;m4LuFLt5_;h(^JAGGthN@$rW?nYNS;;He6`E72i7oIxoz6g#=0)`MZ zVMO+(pP}>wHnFjB3&KBAG#N*N&K02nW0R!%uUid}IY*-mPULTXi{iUr@xpDd4@Kp`b#DJ9Sq5lYA%?uAj$HWZ`5^e=wKn?5$9sLwA3vzfa_OY}2uW(;eWZJZ?X#$@+@U?Y>m z$xWmEnef1uTpOxSoQX}Re)Um>vBdQQd@im{e}HeEdla@9M?JNFn4L@isG~@xT*MeE zFy@e21#=3Y1KiN2<=klkr4M>v07M*}_n@o{?3HJh8cX6OMtwXD%jNv*xA5F?!Tx3a zId6ETk|ldi;K@ww6|Tcj`yz$5gW$DLD+LfKv#&L5Rrsh-(3a6^Ws+?tlN+sYQ5{aE z)My=FjFSl_?2iwAl4~A-dTBV+HCom4?8Q$?UN{%;WJSDf5m%|S{su7xvNlXP!;wr_ zK-*||{f%=jOtbb-uz@{qlF)$RIO~_puA}JzXqaxO${BS~I4@;L zQt93>e&OZpCgr4;tpenz6}^c{6}VC_`2T&+ZR)YFG7sz_Eb0bdc)CTChZRvjG@tW^ z1%xg%_o#(Tkq?ZV^8Exg(K zbp7%CWX$>=$GyG;h5#61ip+^1bR$4vU?=BS*vhTTR+v*TIIpmjf??tmm8)}h34|yW z8jy>B8f84i*cO5vn3ynS#RY$hTsqR7|Do{aCim#xh7fHqViP}({ z8mDohK-)8PwWR6GRfVfKJ)^|umP%6kNl9tTxTg%Ook8ghaR?6w~<{8w)mW0KMi|%Ma>^xduf>4kwRT>horV`1hKypH^n39tV7z^x$;o1yTp0IXaHfc@} z8T{VRi?Qss@pAn#HfVyn4`*PUnt=0kBHNqQDEmW~@kPW0y3AcmXs2?#Rr}oK*7|o2 z^uxQ_Sl>~CIZNF7Y?q)2U;U*Y^F89v1$UqMUdmF9mQ-= zV!R^9p$;f8xDk^=+c<1UbjpONr6JMK(3=avOcb%5ZPYcK+5TM_w33z&&mQ>*KwA_J z4}`yYPHc`+fo| zPQIzP8&k0tBW&e`YRFL-H{fF^VvL7GysL1*1RE1Z>l|B-3s8*MCP2A4?kqs%M(gXh z!I-Pd1}MauJYs@Yxxgm6lcdlEd3g{0787qo%-Rz?D`^0-l(Cwz3v>IYySykAcX` ztuPcwXF>5Y<*wEb?DR_mJ0TG@D*VC10b>IqnG@u}Z_{bCN-%74h6i?>8R2Dtordwz zbZ^XE4T(94>?2@WVd(pI4Qou+3oZn)aB=q^9sj&YRjH}>MqwC46}eR-WJt9O)IZU> zA`swZ84%lTsKpk=aWqscZdgAy$wrrEV!xltQ#K{fi~=&uyeG?w2^oP^Be3AGqySx- zOKKJNnk#ExQeN2Wh_VgJN{S}V>>{+>dr`G~$WYSothn1BRcIkCWr4f6hA(Lp)esgB z=qxNh+Pa`icC5&{3TzxyjTCNQC`2r+DUxtQ|C3q)T%bBz0WyKwa5`LNJk%LeFc|j! zXqA2 ziNl9+!e}9{@Ow9bABucM-5>vfdKDi_Fn{F+S&l!%Bi;o$eo-f5bp67=wX+gabnft; z?cnj4u;aOtg@mQC-VhGHEhY*{Pd)q?Ys}7+7Eu5qPE$eL2}(U+$q8NPex#*@K1*23&T7I6mG%FrU9E4;KdO4DBS zaw}&iD&;1lh=vbBu5eT#-rW%SYNYG295f!BD~wgZ#mZ}?oLkMWl?0?4PB$KDJ<<1{ zXjB*etwo?0bnDa_0Tv0kJbGwZb%sYZ)JA`}yY%~w#N|TMuvpHSFvk@=>ih@NL zIzpHx_}2myNWs6?+tlHe1Iqv} z9MR~LEeNH#kxRjf!+E7RAucd$ad^VWFy9h*C##~|k+VyA6O({^r{bRstwB(&c!acWVo%5t|n7x|`|nZ!CzmZQjl zU!}??gq35N(;8>WruzynQQ(_b*4Os~Q$pZ1h;#u+Hm`mlTdeETpGCJa#d=TwMy8MG zFTT6@ODOxC4ge7=Bg?yt7v_u(mb*!&Zjk?GmS%|tI z)eL4kWAzI%G4}`EC?VR=`VR_2zrxhf#4a|3?FOI>F8EpTL)F>dK5Z(VEzW)t;?l7| zy})|4A1x|5;bxSDg~AKkHa07Yx7=~&s+2;Z#&2Grrk-=72x>!>nr#~grH2=8JqR0z z8AgR%Xk*1p&Bf${jWM+G>tmB;)PxAFJ1L2g2{-(kM!hARy=QrKwsW$KE$_H8{mpD! z3@0>;BF%FMNe*QXp7@29K{=MErd>N1DJvp_?XISXbNL4EnxCvtFge?A1Nk~?sv(D$ zMlYh34i?^cfSp5J4@sR&c*L(IcZAa*P)J8$lOb4=VKXSkrwkYTw#Yq|6j$C=#zGZ| zNp!(HBz1p8bceI}x~;$uZ3ZzxPKeuP1$#_j&E2?Z9BcO}(@WjQs0(5_gm5R$8{kTy z;-*X=_i8blx{7xxM`CPE#dLr27|ZIlJ|+7Nc)qZ0I(BKWY9erb69hht4>DK9$Vy)< zxy~y$Yy~WXqB>1;DtJYVWyQ#NT6iGanWsf+#FzzM*`AUR;7qVf6X^JgbYBMi-FQXt zpUeR*KBS`(50V!f>|LKqb8}C%ex|34P?&1@Ac(*(R2V(gLxV=gGI{V#z&a=&{G8IS ze<~r|U(-0V^vI}j>*nR1AvRg6=(l_%-9J)+bP#fpgVz+X6WvinqO-dk94R+_3TmoVe1J=hmEa4nqRLXc!->Haga7 z<|x=_eCsYQjQEX*_M%S@-UGp=+4YNRR(lrW9YpTpKTvSv0a^o_0d6Zydn6g8M%}6PYn`oy6x2;}f0DP%Ct-F@Q|_3@mk`6@yw}nMV&+X?T~~8BkIC zWWuBf)^Dlp-GQVD@+6x5{Y5#jYhQ7w$xS^T`dBvp*=C#Mj% zc)m6Il~e1B#BN2zjk2Pi8)SwZ4yRyGnpd2EgRaD3#>OUZ4$TV`&lwE{C+7{!+}E36 zNAO6=_5NCJIPggG+`~>ifeY9B#%a9q#Xx`5Eb1Y%%8e?3QuJ)g_Clhw$Rcv!D0HJo zONMgpl~ZR~x(-0?%$phBm9&D+I$gjGKp-MpNFY(5UJ>!t{o7l?g}$fAObARUp+ABR zZ?1TL=S%EMbLTsj`$~8ISp4Qg@L1W~;s6sOUa42FOctF-Ub%&;+{s<8pq_y~9vid*iwV9_X^vEM443_7^ zsyvC|#I9)(NER`wMC_V^UYTpK?GV34v=%~z2eNt4%6|OyWzOFC@J!_u znklw)V(*X3rp`g1U{8qigIIyGK9RE*am#KD&ZQbZ7;UxR2VRyKhDUt8km&53HHU zaC|Zttu+b;;z*%300IdB1hggKcZNp+U8|f4EW}rQ?hMT#spUyg^AJgV6C^flfDK5X zLP?EGHpu%K~bBr}hvmj%?Jg|&rZ_cG}KD~GP(z2~3Tj#t@FXZ+Y zikb@t7lc1iIJg_Vfm$m!Jk$x5122OP5d03D5W0&1BScaaX9?Q?+J^Q9zvA?A&V|OA z{K~}2@SSfsB5a_SDRTGq>TGz>yra!}d9a8uwijju0qZE7CLmV8Q*3f6nu$GLqb!Jl ztR-OTdPnBlwK8DpR+c#S)vN|QJB#)#)3S$9{DoR~e;4zjJKL5rG^yEF8;ya3!<)Ml zio^K;k9HTx^8g|P{~WCM^P}KV@&Z`}7PiKIR?%>JTP)#5SM8DbBs$R|f`Vp`yUOKy zo2UBbo~)qX9&%kn)KpE@tk4}DHeLjbCpO80575Lo(gEOeGH$Bhop5Pb?~yMp;j1tD zk_(UQx%PevX$Hin(;8|6aijmCc3Vt8Qu&=yH)9{EFl1!x6(IqqY7pdGh1+7yIx6!t z_XV%_Bs?~?slo%>4DhDBc-ourY-R;$%DiC!U}s-fi-2XgC04ixgkTv68tY(~sV6Q~k&Cg7pR)|%csQi$Uo;wnf<4Q#+rmJH_2T`2-QbvS5M)jt(XW z6~yNJaE8_*)5DuHJI{{1Idl8#Ay$7=@>^=|&g5T#bup3I6q^160_8Pq5>vu2kBWdO zrmTJ`n|XZ;+GhOX%Q;uy8+!l0&~U&?!7idAL;&xe3>VJ|?;F`b85^m;U#>(%#Iu6p zMF<7hY358==D1v1a1ic1q=n2K3@<)moGGJ>Vk#F4i}sROhf?MlVTVa z_?={eNEq;ycGd>+mHyqSg{;2+4SnEJ^nGpe_L9wN=5(%Qt%fw&U?lI>ry~{26M6JG zq)!4y`^{=u8XYEJFH~*&ZO(@_r?Gyx!7oJE(ap8t@BHGoozGLjyQQu0;qHB|JVhQ*+zh_p|Ay65n(YDPp%VML9W=A~0AjDPozfaw!tz)t`={ z6u(j|MOI8Md6@PF`rI~0ySCIuPmfvyE&7e32Gq~}LJS9E{Uw+aEK=cV9D>zR6G~5d zrdohsX)mdYG2dJLwH>P5Iu$Y5f&$I9r3g4|Ie1q0TbYB$yWcv_h!i+H@vS~Bck>(h zOfJTWjFCAR$kwX{A?%qCN@pV56?R1IEbutWPI!&ma+Qb`pnRxnZodZH+ZM|`g-{5C^PwN!@MOE~#m{Vbka_+LO(R5qm=?XM*_l$0~2 z{*4K($Ud+mSA}GT_NgJeU0`OKQ{(7>$>mD?@H!pl1cr}#h2md)~mVph!pRLy$V_RXrv6G59#>tf}!Qh$E#^?A?X+r{!dZA->oJ zyF?H$2dt|wU@kclX29I>NXR;c-c>)k_@RwUqmLl{)dR)odJ8TIq8Tj*S}>|Kg+8J+ zAOQBgtqo(i$eff@{oG71(kHET3dKB(_5+Zwp7ud{j+vsL!3<@?GoCf_;14&X=T3yE zLo_J9*TUL1n=kNlB5%1upr?6sT#On4)8DC0h?7~89Z5|4b zt?wdDd43IAc|5b_HH0A?YF%w*_P~HVt{8uat*U% z(MN>O$`G*oyP6M+>{~(okDyWsDRr1gNRMHSc>xJwOz?k!oHyw?oE#<@JBQr6#Re-h z=mOxSw6Dw!)4oR`W(IyuP}n)wOoKPKdg&?;D&mhKE(FbkNKyVmD78;R_P(tCB>VkB zCO6Mfrdc@LAd0o@!-dOd8XMgAlSh-Un;`j=C$WH~_uZjnyR_^*z_-8@gtmdwY=?5wJaq;_JMglcXxP zDhFLtc*Dej+r$wsg_(zpmDj@jaHi}^_OV_yu2sOWEV$5(x4&X0r0=Wg-g#+f>ch;l zUNt_H=e?T!VRG*>Q|EG*){VTcN(C}6v@TFGD99+>6EMM%t2H-;)tH6zDd2tE4E&Qf z6AuYE9)kk@TxdqDmZci!tedFo$Mr5;ee^32-M6KZm5+Raa*_D8^O;{1n2g{Ip3;8Q z@vP@pxrLwTjV($lhLVxOE4@&!9?aDm>pj8K3vQ|s_WujPMY0`cL3777)EXYR3usZ& zrDj-$7)>erg-5p4}L>R3ofUYR`;M6PDhkz`Rr$Y;0g{@sKt+YV?^G$yoUYw+p>F=@DcF^T`oOdW45^ z=N^%upb8w5kLeAfY_M>m@#O#eX&!qIP%Xsz!voboW+B&9hS*>AAnfuOKph%t1R*i>Ge#3 z4JcY$a^|h!?4iYNnI~3){s&#?gXNJ&P+F+yEq*Nn{3jAXVAWUC8O#OfJ8HBDkqQu* zPNE!g1-+mBS|ZNMbRXFZ=>tfLWgFvKrXK>AP7eAHaaNF6De!Jcnf0f&{!(Dwj9VHj zFz3E-7RP8&Tjo7A+g{aL@kayqol02+^BrhYGoXMuDC=3&B;wB$C0VhZK-&<6!Hj9< z1P+kjB%=a&V%t@m-EAHf#WD;O*xeEzqk)Y-%mr_jT67?o=I5$KynL)W69&rlkQd+H&*+%dVUP_zz`ckSdxPVko-nSQib%xF2Ig~xkM-eSV}4E3aiX6 z>(_7?)VU@XCJZJNf!gvHq$Rf2oJ;CcHu**7mB57t^+O)hYpD!rO&T}Eoomu$4phbT z2ODaErU5?}O7B|$+-4xIL>*on<|4tl%k{qll_gD2wl{-v?N0V_XN+ZsiVTwE?_3K| z6eqyBp$d^XO-bk{@xDzu@DdSc!7VEhX{npi+#9~Zjy<~EV>u9D%uBGVWo#;;riPXD zk^A?xvTVx+1%XF}4M#wq5TG?B>lp$a)H^bg&L$}T!r=;o(E$?XW}x13EI8&9JUq7H za#8NgE+BO(-aPzez4LAVsSn~>6csD+en1-1(W-DdQVIa(TdmdEE+8>$?g2{#>Vvv8 zpqaDnp9~xBD!-O4tw9b8Ez3}0r10KlslJkON^t4DUFFjsM2by?z!scU_hH3HOa}rg z&Bo>41h>>am-gTva=|UuROU5{#IQ2einCEH$#^x4fB$JuY~;eeDhA|$f2GlJvX(#u zVC9XMuzv6?4pDPyv?7Dlh%m&j&1+^4&Io)n4b(8Orl=VMdWb;nM61CS6Ioi?O>WNIIkLfLN5hxfH_Z6H+CHED^B1@-R zMvW!DPy~gSt2`G|vGl_Fi9PTI*!S8#yf7BdH3PN?ahRneQ|oI9Uri6@T%~gRRm5>8 zVCldhA?LX#jT<@`96=)*+Orjz2Egtb*JuH_xqQHDd|VWhH-h9?L3o zXvZr%+4)nz_1!z@S<`djQLmiuklMkYS?i)C>uycrz zq^2?1E6vY0!QUv9Qvm@};~LPA!LT=nYhgF|0@DMV)HfSwI~H5Zpc@TiagT-;BTFj5 zTjd3;$Gk@37*+ntey=*$9C~zzv2h7V1{AzaACpCcngon^L9h!H3LqdBYicB!ab@0CDG_a5 zoNEHI8a5xlbd}$EVfj*}5+OCfTdnDbyhcqgROKM^R0DCov_@mYS$Q(LNl2u3ZHfY1 zr`(E-ijz(lNKVN438?K@WH_u49KDhZ}#ytwF`5CxB%17A@BuM zSk|1n6WV}+nH-d6@tQ=ec7g)})s^oyh#M~d$eI$!za}2ta?D#c$)v$6ZCLFjkMfvf z$bU6%uhC|{Ru{cZ82D}k%DpbJHx_q!4i4SMlK-yiAAw|>_Wu^!yAPZT%xKYQh`Hv|F}S>43vnO+ zQOO|cPQDHDa=EbMA%_CVjucNl- z4z-A-Dx#}fcWp!gODUPlCp1+Byl_EeW3T-V^JjtcMKTD%5d0F}xQUWsrafa*0P6_^ zJ`eETdKn6Q;y<=+g@g8DpUN`(%A;ut0$v7yVqf`>wFIa)dI1cF=EI%g$U+S*TjQ4H}gEs+zf=Rb8HaXI|PR-u2@P9k7I-EJO zG{W4PUM+VCIW(W?Y7@pU0bnpKNP1G`lq?59H7(iG#Cz0UIi0*k;@ zmd-*?7SelVOKmLkyeCzycMJ`oCM}LucZhYF!4Hz`Duy+ieyJY85KzbBO$B#`H=fp_ zK0bII@Ff(n72(fq;!9Sr$Uwx~7a4x9X%cY<*ph_;nGX+mUZPMUC+;X`GhYkV?7BT~ z3SqFbugv|!lq+Md8ei=4u%~)@LriK32{`D2IL3uzTSJl_ghHm16|&Jni4a={x>ATGs{|Hwe1ZO9#tu2SJ)L5)M-|S9lr0Tke+^EHv@NOu^V7 zb8PF1Ie-i^*VV$=a=_UdJg}`R*Kf|fx@0h00LO&-?Ykj5x{R&3$lPk2gcQ217ip&2 z#M5hqgR>tHzV+NaAdJD@I6!dkX64zyaBgb`4 z9-b0#e$D|aar)o98zyw(1XP(qVpN;^E@KQZWvFu!UbJGd?~HQ*PALy$@yZ)CpT?UMVo0;01Zv~1zj z06+ zn?&=*)rdHo{In2RvyLN=A%`KNQ9SQQLwSG<-~B9dt*0K}Qj4sMOCDSk(z^+(Bryr* z4zgy0A2R7|IG4l9X2aJRLmTHy{w=llon{H-Lcp4-B75nffmICkBYp&b83zoxAv!M@ zb*Yjr`S>Sn&;y{?5V~g|H#$&lRCouJ>`3P{&6Cuz7BReGP=C_xFur(fD{Js(j+U%) zZ9Q8DNL(DJU}$E~Lhxi}CfQk)2gMO521_+e5)Fc*E%ye#-mMZbSOsSU0({g*PASso zGy@f&4OFcUFn07S72oZPF}WGXAp!-*1W84~yx^1OzOYaQ(tW{E1X(rKvN}P4`A0F~B97i9zP}6Z_eb#*tqxnQpo{eW-nry5jpBZF>~L;Ali~pYpt+ z|6$pO{q;XIBNVEcURhPf(!;F&@Xlw8hzt>G#vXh@$^>f3oD1BLl;s{U-nXeB4k&TP zm&yPo=<^!7qWj_{SG=uQ=N42Cld47#V#o`^CtL`_!re;`g6fRv2SQhhthB(76R20- zThesWd1Z>+Ty3E+va`9`B8?(XxZK#+$x~JD|61=q0CC{!K%J%r(oat9chj)0Qh$-R zR6Vp%OQVKFWiCpURmCvwM(|^vCvKk9X|STXLkqq~KQ$Tg-=hBEoJw`)Ddx+Ao4dZz9#|Xq(B%tmP31U@{6_u7IFJ=#8w4 zX;~IV<1-EGL17dSav}yuu}=OH;tVgz$%vB!LOsOHmk}~FqYAzdu+^x;Vig&+y`&<5 z!&fMw%=m*DcPXCYGi_%_M^hSq_}N#OKJ??cT(NYk^o606?L^P%31eR$enyB;kktjPr?dua`BE81HY}^O+JQ*|szIUGSNl z+2vVs3Bu>@nnw@%X4(Qs{*`!q7+5Azic^hq3|*e}pY>q^`cdIPxX^?fSh4fV5t(Q& z0Rd1=8$O=x>WuehBB+^|dZ!BAt=Q#Zm)jqn_P19)UTlKw(oE!0@v{Kw4CBrMIC4=f zIJ6w!I1foJvxi^l1^6%L{RD(ap4AvXBoL4Q5Y*)n+V_NbDc$9vDgYJH8GoXJT|F1A z@`vR{Kd-GV*aJYn6mEQAL?9SY&WbT|2?5j^2@1S#Q%C4sHm?R|vUL4Kb}37&DrnHc|cA{B$(;v3Tc`i)g(;p6mRw8&)G!%YE5$K>!jBl{aI~ovmN);b_0&lVUd!f`VowYXFQVyZ~|0qhj{}FK?w~P!)RaOfSOt> z6T`2eT`>LGdjExIOZJ-*R+(A$k6^bL`K6kEHq$s$yI+s&H`>4bY|GaU_A4{@ynXVs zhjxHWVU<3zXd9a)zmx0K%(I@Kff0p$r=(S#ZoZf+>tOf(%#_~AyRS%HY95=MyIV!| zzQ8UKirUmqCSb=*`w5z#au~I9+D}GM>8~8xHd+tP^HL>I|J_=6(UbA%^iO8?xZ1Jw z!_hC4gn=xG+#A`&j;QgGCx6ZG;Y_<8tlfApin4?iy}$9MN4~jlPge^bV8xLmWVe^It+O^AvgtlDxb zP7wezBIa38re_va`yELirICs^5AVF1nf?F~bD9B-dp#WYiRu>eZ>U_Fx)Xd_Cas~9 zE5s0{kVGCKV#rZSK|sMxB3}O@y1{NZ1O(6~C^tCu0hkmJ>{fJw*Ye_lZJ+Vzgfml< zG&(Vn>efsdOIynls<=bvX!9j_RQdkGUcnemnVe2!RjEwjDroLb5%o1$1BDI?!fdE) zVYfJ;3q7z6lM{2dIQAou6LW9RtVNI?19M-dahAGi^(gEJ#eqNsxpW|=0Vx%zF@6lS zrJp$7&(6{b!Kk5#cpX?P%HsK1q1hoIoLs7i_;}{zQcTmfh;bxhw}C%llS>fJu!_Ko zh~1Jmk7%QSj$`}N8k!{0ia|6ldPg=8ujY!M*Fn)22v2f_=QFx#kj-q|^*FV8!F2&`-6|AKvCUUz*HTRyw{ z&q@^NoJ2-LaWmpruy_1${g92uKZpbp57fy5|KJ(Y_p52--)M)Reo!^Ma?@GBj}rvG z$hNky?`+hc>-pjeEIgC?(>Wg`r~X88V=v7>a>;b%I~w#wBlHEn``7Mb91aEy|( zK_-O`qQ(1fdbH%fTIfCLJ&6ttODd07wWFa4Vt#sbCwu{17%&5uT_%yBJ6IL5tO~ga zW|9^kN`e)X&Q`GRl+KhQqgbqkQ8ULo&s81)sEERYfu#lo4fm~aLo$JTgo4orD8lXR z5e8%t?l=3?^iVbg=Gz+VYn8DkHmR_*R-~e#Sy1>MfcY3gaB=-=LKmDj&j%WqLEc*q$|=Q)(uiO3O`{W>dq+Nf6x?s1bQDsgHk*Os%^U#$0xFm=%rIH492g185Xs zUpJU$uyP=Ga6_BVO0(MZ5-+WBcDbdcHK)U{Pas>fSgB*f_yXe}rvIl`w%xo>6wi0IaHpip}NHbryxl%?H z4InH=K4WT`9#Z8C>tkM63<>`J^KO+beyF3gvx&_t`+LHgBP0UD6ESB~h3L`q7%UHb z;MwM;6L>Y_eFO0lsOvMDLG3F+y3Zvs?og6>nUpPoG$;_0{MsWR%RF`eRfS2dl4i~= zK6hFI$YK=kf3R|Zjfsly$>KD#r(F5a1KSx0&M#*Xl;td54k@7KQOVxGby;7o(03QU z>JKdV`9mF0Nw|d@R%Bd)q_80Ah9C!eo$yiN=2N92u%g$JHQ_9erCh*BG^G3o!|Z(Z z#|lfhJTtUdsK*TNZC z$eX?g&*NE$BEkN?UWD4%_9K;}^(WEKy-x#3V4FtW2C}|w@HhYip`MZ4!r~3U2NAlj zj`x@8jU&F?5`xJf;eo-ON^6MvEB<6lAKn)#7Y;O0AZ$p@%oPBdu^T+J-W3gG~y$JqA7A z4QBLSsCabHg3+BoC~NxgOsO_~+aKi;Ur>E1wyI&LLB>O{S!@wp;ER@>fUeHImMqNK zFxHv<+Ckn2Aitx@qokFC2*=qcF9NEbMwckhh4ap4!d0V!1Q8Oi9iO7knQ7cd7ll#C zCv~Zs1!b8*%t)aqKoK^Aq2{jVQBj!L+#nZKXRo8;(|J@Nu9Mg`u{%=qnSq&=W6&MkTZoFfjnt!1hagclW;)(QP@Fn5b())odkSN zOhyGQZ0^#Vq!4qr|ClV1n8|O;Fs*a%UJoNOUqvT z-xvJ!^L4jKA!W^?x-UV|5Y7mSh0McaRSn4x5BJIEad@Oo`J1a0KWoT5Zi@s6^m4lGhPUG3a8Wy zIL97klzI~>H9@R{8HzgAw(L#GF_F!JN-vRx58w^p1}4^kb~j#7rI#SHY<7lp%=gIy z(64M(Mtm1~>-QVCg7yA0H@%I{>nPTMx5HrO$K&Ad=U28Xs=#W8-42H4E?{cwwH0S_ zEdiEX$Fl2vz55oef+R$u2g6*m@ocFku??Ago4N`rX^pW&pZ9e z0fcDuHy;4uI!WDa!`SbRMzoykC5Z7^7kd6J`4HWb(f_X;ZG)g2z&bOvKtrFc)9`uI z9Uz({z~D{bn#iJ+yN03Pt+4dQ+be(~9(%1)ZvSzkWv&DaV9g69An$8A$IRi0eL-Z= zq+)T*Oh~PqiEqbpr7E;IG}r+ZU(Hf$PBsT;fIrA2^yufI=AQ$GUd>D|Q_;q-m~OLY z+UDl!OrOo%@Gy03z>H>LU6ef%V)m2f#|J_D6yNBas7$9D6EMKe`2a)8-`8sf*>Xz3HT+BVMu;=SSXhSu# zp2=-RL1C0ADUL%?$mTAo620ECxQU1dO~Ti^zN01^;16Pxq~42c#XNY<^dRm5TQSaZ z=ql}L31brlQ|AzXhWSrsqTx9+iVq-|&<%aSqB~F|g*ZN_`cxR0a+g_9FC~(nTrgPj z(~QINM5RFZo4rCDg}w2*Qn{zrc=M7cS<_}{d#%iAc_)@ z21>}~r=SQdC!; z$hlnE#^1NC%RaWpHF`erRal}%`@dFcBD~P$z(Y5Z`=0QuK&a|qOIv~skLqLq#H9$d2=B!uZpaCKA{Dr=$-PPZ*9x&z0hDSL{;k|FG}9ZF zVJJ&)aKq3!oE9u%80sevLDC^RSGykv9eKyJ{?{xuM0;FLJ=M&Kq~;m}L^EGF5==Tg zV^htUBA&y^L~4%khx1T#GR}jSe$*D5Y^h7_LPgYZ56hfFD=-AL+Hr6*DM~NmdmQYL zlteXZc5aAey7t`+vd$yn2+?b=e9g;V94-as4nINXF|MWK_*qhjIJ6#ryEb(e1fSEv zM3LpCA%|(5Yi=g zyh_oLrbOHoaR#m~(fjp{3QFIn!Rx3jL=b%@#4Z!ShpWS9X6nlp@5kf${H6GqSe-Q#kvyV;P-G+v|JXIqGJsqo*nvMc-|3Eo7Co^2!Dd4@ z$66m5`r6m_FQ+fn`)+{}#l?ZD(57?`1^I&i?{cd>JJX|VVu4o^y~_ zO1AfA%Rq`9>HO9=JU9QiQGb83wEePCcgPEaZgl#C3iN{XR;AJO4R#5cbD*_}cGd-# zs(^>;Dq^HdQVM(V?G0Yk)oD4;fg-gS%^XWua3+D$vJIXnw=7|A!i{7h0ZzH)%yl5; zrvz;OC)1~os+mU*o&nGX7|&|#4KoaY;N@l79iq#q$hlX^!WTY%zVFcN zBO(fYkmzwP5|kZ~h6x0EryEWM|1ERf0=u#iQMd|<+~GT{D(eL}Mr$713d(rMT9C?J z1z!=&Sip+Vkc)!7nr@W`W_n6?;bif)<(&$&W2SvzvobS~ymwe`w{tq1g0&ZL>;`=x zxG>j#Hq(V*PB`C~^V-XJE*f60kN$MhUw^!r^PA{3eq#&ZG&LA}dBeX^2rG3N3SOh- zk1F)F94ZU*LCV~8e|0t4{p~|CcKv2iJtRW7_T3JdV4ieK0ZHj9=C=!E8mMC0|8TDP z)Us6|Q^!!UT@;rE`Z$dg21n1rI-&6)uH&UW06;CeJgVgHlb}qW{~PejvqU7L<$M)G zOewO~_UMPmsDnqAcQNw&UlQRq6@;_vD$%_S<0tlj)#j;v-ht1f(l!3<@oEN9)dQvk z_)Ms71zsBv75V}OV)k64(c#~lTbKyrjq`uwJB1m5eS+gci?7#gR~QnXo_o9jHdFgC ze%7^Rag}DM^*?-6EuuSUY;zBQsNFnC{sO{54$Z~;Hoa+zKS$nJx%gYu&XP}$!gq6tlIa3&1u=d$ z^9{gcXKK6TGK~j83g^OZxWS#k%Ja?3O=ZY9Nj#Pl;X6C3aw7c2r~auktB0hF@QXD;h#@3D6f<)fZ;z`OUQ}$u_L{(vx=NUQO?M2NdQNLw$XgjXOm6{ zLc!NbI^pZ^wZDwM^0zP8*Vau3kYAAq!fyNm{!^WO#~bd#kHBf=S3YZo{YPD-aiQyc z(!ci659MJ?K^-^oJ{PVW)Fgs-ra8sA-itU+K??giJ5E7K)VE<`O63s2%p}JE0^$ct zLdAiT7o{|FLuc*=6cbV3Fci!yTZmB$tq7{K>L&qp5K=Q@blk1vJXh+yXql4kWFuEv z9|GUPfrIya19^X#g}2o99v%a0L2tHw01f3ihfX_I(Mq5KD*M$kP;=439te}{DI>;y z)ErP9LwLI8_)7nd?9TK;HeCOMSLGpDQOPI}!nQTPQSH({H}JEfv*= ziWsP95s(#@K3`mr19|*HX0||7*(_SlSt{@>QYy^ zrqe8bp&w*_!=OV`)C8z0&DmtWZUmAkfd|MQOSr=EUh-?Lxb@x+sl?^&~P?~^+pc)IJ! z-8=YaH*VZ};H#*srJ_${Sp$?`SiipIe{Q_*$*x`ded_@yXy3mBzk%Le)Y#G0ySaP! zt|y+xK167p{=@W)es)o#`D@#s+Vx~NN_C;hzxZ_b*S~^}_kdzQw0r;l-B0a$WcSXe zp8#t!e)du87XkKz-}^+@zAtt^y}GftYhU+M`{=*W*wy&>9gFxMdEajQ#wOmx_6yho z$fDB>m~YG#vdz4f?+c9&c0aZ2=_fE0bOAQ+ktu|88nj-)O4+bs|I_=ryS~2YbM-Wb zG?{@lfqVS-`kbe35z3!-?%wgV@A2+kyPq=u$OoS4*-L~+^!CnYdh?Gu_Vzx@$KzXl z?RNX>FMr{Y?RVUD*WK6N3#^AT^!T&BPoMcPySsNiiJN7=cbNAD`_dd1%9$))@UzcxxZ}*PfT~GSD z5A5jfr3ZKWdb{_1omPJDQ@-8%eY^H`J@s_=PT$jeeY>C9@#Hf*=?}pBJ(z#sZT8~% z*YO0uYTMrZPn&z%hyUWXP4}69<qM{C`<{6L_k=?|-;SiBg%1 zOhu+}=X;w(BuRx(Nf|<93ZcQAN=TB5D3zj;p$w6+q$nz-XwamYCPayzwU4`Rx##o$ zKL4KA^ZUH|eb3$Yyw`fK_gZJ~eb#$9ZblOWH4XmF&)(J3SHaII5R$xL6<|etz1{7% zK)X`I4_EgsNE2b*p?jc!3ZQ{rUhWQFUK z+fu1d zfj&KE#V?h9GhDQx=b<>MXG4*a(T{>)n#F#ZY#m4z+nWy}qsxeD1@Q{oTn7#^Kn zaO3J`=c{ouoxSt>f2>`my{)o8++>xMsJ!dJn-2?uzEIqpA{o0=ep)nz=7k&;c<1!! zcy*yFv)(w!%EGX{rnoDa@$I$V2-B0IQSn=DE7obUntiuryQ|0;Zp%zDtr*ChyDBPc zp@C7gD2~n^&gqe_nyR+7iNA|zFPh3&D{N$PDq(KM%|6*-a4YPu;*lJj=9ToW5K5z za(|kOW=Oaz1WnKndSliqo~1Z@q1z6VRq3DCW{xddoiy{lXn)|-rsZzK#tI#pH+Iuc zO}UHq>LypOgjy>l6(8Haw^9GnX4~Q|pI$7T?7=(}ax8a}AY0*C*Zk}}t1qSp+@&o$ z+P4dZJt^NQDPwZ?Tc_{3RsoMZ@y*JwT0{2>rEFIgTH#ufVC59l_Q3hsg}Ij+-Df77 zxz5}y`0TJ^$LrjbWFyKg+fWk;sq1zF$pxI+19BY-EpLU3^fl)HJj0}N7LV?gd#*+C z{&i*QPN!gJ;q}*lNPg`ZcQq>ccmLWSiHA-EygVlOwQs(dN%fWci~3S8>M0){?{;Ft z*#w8cb6#xyJl(+{|D^S7Mb1twKRwG^d!9MHS*PyY6VLHxOrL*H zjXC$=x-q{;RWCiH^Lxbf`iJZNYS|f8d(Y=Y)AEC>%Re1`^s+(Y-c1QgJVjnmyYD6_F<|5s+RAH_ig|9T7zj2q(!ebIC8t{;>87)duRN9x7v=?bZKj_ zt7bY~_o8dsyIaQ&O}I2+;)x)YsxVat;}@wWDXsg2#sqz~PVOnQVni)mwX^z(qvxg< zGLKdDYQrj5Z~fAuC_67JNaA3F(ypU=FjpNAXHJo9k2Yr%=- zBXt9%3$s1EH)}DAp13p$%kHPWtM?wG@H{2_)Ale!+P6t#pXw}@V97c8+WeS!9t9b@BC7PRNnA1FSZ#1QcY{L#5 zi?X6;)vDi4F8J1LYo0F>V`}HD_sc)-6`J+*^q$5pin~fxx^MrsyFzbFO`g?j zI4S-Jj6V8>{qeQS8s+&n)?ZKAR%bT4{4>=>d(UTarMI^iIP@J4b54^m>rHA-mU%eYyG@h75|R?M_qMa zJdmm~l&xCxD#2s8yn#dAyg-514%v zHBlYE=GXMi6Y|H6yMC%p_PxP~j~%}qZ^)lmsI$^!;PP3@?42WW#C`^qjx@SGIrvOK zt~$l8{`)8Sk3x!zGy-PG^{qycEZnzLtZ-tt@!XB2`$LT+?v%!wSaK59rLGI!prIdHCnfw%&Fi~&ua1yM-<$KX zi={A z%((Y%?=sJ-a}@%%Qngd>r7c<{w7zPe%bRby@7ARFEj@EE!J%i0*#63S`?pLVotVQ8 zG!>lAj(Aa-)Zrgb-?n{{lG%?t{xg=E)CndeAEil#8g`pC`kUOpwk_nf*SH@$3rknM z>xpZ+ptCr2oVkUt&#c0%`dte&e&4XU(5St!CG~AcL1@+rHJYLk<-t4F1l>)q?^qmN z|E~4XM7OdDQDuq-tkY+{UCOT7di8~yyw#``cfu`Wb{$r8Kh_|#Ev@Lh_BdI`&5pKr z<-^X!pJ;zv_qA|#QfaYIug@$G(Y>RcetJkg+sUl3^&Rsx$3dbgc$$$67-qyqI0Ay?5Be zQ0EJaH?ErhFzd+fptj{Zoi|+$n4eIsv2uM!-=2_i(>)s!vnuXfdM3VgbmMG`Wm==g z8%D1acpv7aeQ2%MHh~Y#YpI`XwiZPNj0;+?s+GK)EM$1NF^>(N5TKUp;N zEFWz>)3NwSmdk~EOU~O)u5nEB>|;HWiacN!ueBC6Dl14SB)eUxcJl^Xg#q&VHX|g)?%Mk>$SuTt_kju6_2clFprVdmrSwS6CoA3NNDbU%isGSJzcwa zz%^O;%Zyo~iH+6oGV~fF?FB|mX=-nFrfbv-)HHoklhBfAz7=1iF!@?u)2&A%`l@eF zNWB@jSx;ljyK-y4`fqK)oEm-8q#y1|>8CGlGkUen-Nkc!oz}CmQz>VEXsp~_GImAH zwF3Xe>WA+=5_x=WVUNitL8liF43%|_nr|$t>e`XyHz{Vd?(+*r20Dh#w7r}%Ejw-h zfmQL>cDjYz9(wTWoA1tj^wl$No>VZub7|T}>5i%Tan36fla@%%creGtBb0SxU6moKbH^7ehc}0NiA|kZ*wA%k_k~?^lp_;o+%WBKR#_(+Rw6R;OheM>n39#_ z-`b^IE`3!eJkHYY@%2U4X~_$fs(;M)5cjrJ8RKT&`Q>%V&r7l^G^JIqzPX*&p=TyD zuxueG+b;T8u9!mL_5Brs5z{1kUz|7Clvys z@YPF8=KcxQi#hA{7%Ora1AsXDl}{!(y(*fPDJ4QoUP3PuK`^jC;h zk9xPM_V>6&Ul%4bLVx%+rO(n;-Qmo^|avt7nSIPS>Ds*s$Y< zu~$`EE5kZzTOwOTVg9|U7fy-A!MDN$JqB3s6quTm0vYqiDK;1>mToD`udZNci9Rlm zw0ysP+6$#49UB^w;x|~$lS?+=*$`Fo)}cT*>f_UpH%`H;KW_>z-IE==aJ5~)iJ5QC zW!PNEOl5W+sfxPmvNBDfZ11TFiOnObkJH1iE3A4jvb(mUGb;DjLGvadhX=WeA8 zSLFO2g)@5ou}d#6wB0&oWP)``g#B^tJ&QW}?`5=irKXm@%`!`kvovMoEDH%a;MrAv zOK^mR(dy|*ec~R_rQ2#TH)CxHR%;TJ>OR9I;t;`(ybpS)oL`HGv;vB zwgZ9djAyEg+hjg^vfPB-lWz0-*3UMnh~fu93RPvZ$NQCC&h~tL`YzSrbiYw~Ra38G zv60G#zLJBd-{|S(Pqpluewel8^tiSC-cP>Ehg%1E8g#G^SlQ@_2A#{5y>q>DvPH#j z_xc|@T3MFEb*4Lhw~45CV}6rad?@XSkxrn0Kv{)W`f?M+V4BgcF(R6|AFV3hUG(?Z zs&}$p?GZ~XWYidUyZ_dn|dB>FzS)k}Aw zQonwEt$i~!ST8Yf_KcX9=QTwx)UR)pPFp44zG2^FNl}*@*X!Ag;)!kTrU#8ST$<0M zg)KI+ZTGkytWF=OSU$X2x+YA_#C-EfHSr@UH&ae0%b3sJ`7~O3DwK%7t=Gx>J#`?jiR+nVnm9w}zs zd)H-SwdTT$28P-Bgip!GAM8u?@Bh4Dsq)yhQWw28ZayzI)l24-YmVcEU5!>+ar>_|bNu%B*P2l+FXqp=zG1j_>c1BdDTS#)Apo<|pP_ntt zebv&p4kKm1uD@PU*&VQawqt1|b9eP)=1J+LSCc!I$h}`DICa@B2a4pLiW@~uL3=*R z$w^tpmuFtBN&2-TWS6~%qL9eO-ANHMw9YZgl{&jpXRa-DkYe3T->d$5W7i#L{m!Z5 zbK+L}k6dcyk$og)#f7;Un!#^Qj_Gq-^R?9}`ZmjoU4Q;kSMBkzQ*%vqYjTBZdln6- zZ;Dmeyj4i`y~gf2Z|7BObWD*q_!T53$;@17U`(GqD_1-zsLJ(~h5vH)@${XS+Z`O9 zpZ#R`MOtClshg)YluvyA+OQcCJoand~VS@%4uU*ZW|rSV;Jy30;ZXT(3Ao7H{fPFaH3giq8jvPUzci>zzDy!&wZ%Ek*l4jIwbrp)Ct z%y&*&aCLLs+tJF?TV%qL92NUr{PZmo?`vt_@6@zuuyuJ{MQrxozgz#b<`)$6d+^ zo*>d5#WFtW)-cX4=ZTD1S*7?l%ha4bB?otWt~{rrw#9iu^0RLrC?ax8g)__czn$`K zQT7S3i2KX89_(HDc!_xQrJlgH@*^cidB$H}Eqv|0G+k5d<%hbs$&VsRB zLKCFcd1naZUoiSPKFw@>=?;(AN>Q>nh-!Lo%R#YSaMj-AyxTp+e%;hVF^<6r&OIdmsK$YE>MQfs#|oysZ2 zCS!z{dv0nSnELC@xJ{G3T|2NjL+??o(egr(gg*BO#d)dAO?RJ^J#FCP`y#!gWXiXs z@|qpe5+BQj3~!egsu#;}ELiWzxgD2+=k1lAB|8~Vkr}3ccF&lNZ;HbFH{AG*Y`m5IMF`6xBzoaB`!i%W7 zhqLK*BHrs%(>TiBInDNGk0u)|UHIUB*J}$W$44B>g%1<=j}LINRFyd&cRJ*I# z3Y~SS@8~w`(1N8UZ4o23D_*($;PZvIr*3476i**>ka2@i^K@%Yti(*EeOpg7MXNG= zj=8O}&9hWJdh%1N^zabnBQAa+;^na#rrM6}Kjte-Y<;8d{Cf4Km!tMd^hO?e=n=WU zq|((hJ+p`!SHyf37b!FPN6)p$CST=|QIt!fA`Qo6b5!5ZBzK>muW>KT@^(S?-oUS- zoi`Rq>PdBJ38?;jW3x)JK=I7RnX?3A6>6GGN9PwBT%6zgm`EwJJ37aY^mt$T#nvPW)h)^Z4hQ%Rv$>fiUKn$saD9$=A%8 zU8!_#MIjJ#6 zeN4O)(yFv%l>aH~%-R;MW|xy!wwySa5azT(li@tEO!81+t7GK?&2iqZ%l5J~Qo6)@ z-&^M)bS_vYQTQS;fqsPf~e4F%QH)-V%9u0GhmT{U2gxru+tvkljpY~602@f)8@ znbPyh*3qBFa4WHDatt!RxZ~`+-r(Aii*BzP(N!+g-|9TaKJ(jtC(-w(XRV&zYSeJ$ z#UYV%hn@B3>83lpj5zy4v|TMq<78+-mbTv0J9_7qsU#NMXj*Awlcc4#IUT+PHl}ve zUc2+EnInIxU6I_BoPT3$*k+l^!*nIPhN+RiDB-5Nn)7SYW;O4aZ{lM)oxW55F{@8R zOmy;dYW}xdjRpgn@%JrE^UO4JZU%2LFF5g0W9HY>sr<2%M9jk-;<~!CY&g@%u=ix|I1(72{+KyMQ%E<(usoZ6lp669O@Wvy4 z`+Kdq+4p`eStKg|Buuc5GFRjBtiYZ+#oeh^!dsi;X6BzgW0fv3e9Q!ib(y2|_FeO1 zSVcD`nBSuh?7yuYYVG#p?Xd?htlZv>4m#meBIET$#O9V)>W#^i)9Y?l_?)fk3@OfX zdGB&G;^Dk2aed!&d-`VSKA-<(%&yM0=jyy>vxa{z>3!wA=f>C(%5VB|@7_9>pY$bYIb(vU8O}?lbBe_f zTvf*93y+p6k85(wU%$XxUt!Yg!cQvG`(liv-#H!Y+9tElsJQgfiPTULPnC&x19Rpd zomu=bP+F)ASd%JS3JlN$@_+?M2_cei1 znbD`Rk3QVT+Evu5wq~2{YS-|c_bWu=YF1RGDO+BqmEU%=tlN?Br8Fgzv#DkEM1>b# z%Pl{SbBNjUbbH$g?f%BL(GMTYnJpY7VV}08fWsWtZql1lV4C}o@ojgkm$$SQbNgM- z+D8V7t%^T(+1}i9;E5;uLq)WxV`kja`ni`oqqL_os}_VmIMnyvV)nG9i^}(zi$7y@ zt)1I=t2_P5NwbIRIexmQbQ!z9R5oj^FydSL79uDH|v2N46jkhO15Ex~?iF3ECymN$aV##oNzkpJfy5F*R ziQnh99T5%c4{$zayJbpnY2o^Q$W zlR0L~=gu>$CVO~S_#OD=arU?En%$E|d8SIgElSkw65nT1yx?X>ob|%Sh3yLx?n``J z`snrRhAgK=qvE3Xyu6lIa5EuocYDUTWVzHYy=6-oD`mS^<)5<1@b_38{Bm@@YV=~3 z!pHM{XQrQs7@N?Q)3H+Zs*2-D8S%8Hl;e!T!{ZOt{t`GDu}Jswy*D2N96p{EXbD{@ z_B)+5`>Nn>U5V7^k+#=Min=}8&u54w2v*>8hmF{Y{2bM;or&dwjNp z-S<%g&ZifB9^RoE8KAyuZSJXUd#;7)`umjSD3>WqG-VvVIakH@^9|`7x2A3CqU%fE z{nDSWa#wL`jHlP7vlTw8?tTdO`~1VIe*5EH{YO4kW{d53vbNOUOg{40@~oFX3Rw>% zGfl(x89k{C3tN$PMg5|%!K%Ybn({h{A6BP5JY;h&;CoHQSam(!ltmd?N7MwC4s### zHO{ce?xy4G>hKqVXWhJRi>xf~O`dVee}jo;x~JlImjbmn2~Wk~a8b#U@E6B?lC(Yv zt2;J3u>{is7{5~$40|PWEO%f${Lo99>GkF!}85s(p@bZFSY zVLu;g{F**v$LHxnR>}po z)dQ_{edd1t53OAy%1i^7g-TAgyT!#seEKnK zi>$S>?WbQ}41Kz>#p`sjrN!cTtvjD+I*T953Nmfo>;3dc+MN1OX%YD`-xju>x-&9N z^2vjS)?KN>=GDIM@88gMK9IKmy3?6;v9kUjY(hH*0`taX)=qfcX*j!l%}p`!cDma2 z;AO+ihLuFfK95xOxI3dEbIODrt4{d&_m*iGy)E%telKQ*ruf0Jl>)u~n_ObzY`%D2 zzr0QH(tu>P#)`IX_d0OgL z!bD?f)9>4)^@0O`JUDwl(>O6NK{U88$#ir;Y2ZOqn;qAt&far)P0xkQESIy>oaRJ6 z>ezGr*}M^2ox2SC=H9AL5O3Tfn40@u#V^3Ial@=t8`MnvC+IUy*ttFa)dqoA^Cs(# z0yq2G5xr%BuHi*;&9f98^jaM6eUq_&%2>X4O`pWw9a;~kEUr4$b<0iJY?t?`()&~E z_9|;XkGbzOcdTv9oYPT0n?7v3Dw4D?xoC})4dudUPGE8LT_-K~8yo5_fAg{173=Bq zZGrCSIZ5?44V~7OZh7Tp1F6@f8M3|Ss*Cpil=pI5Obf2q_+ZxweJ`79ao>Bk(`bv# zc2vhYPc6A=-O&H!rN`7WbB}oJS(eioa{vDPhG7ZwBTS3f zYhS*fXus^2!pKv5&)$s~ebngM>bTI|FV)kokM52V?_MDGRdB(6gQ#bcUn?57PYCk; zcB@cVDNRAGYTr1=+D*l)#4b-CyB#E>l<&WOm7wx(;Z)sERqr!mhlvfJQFEuxd zrmxQO7~ZHfo6^luDAzFhxq9E&u}Kq?wEJ_6f_iJN-WQPVGjpp>Td=14!;?4H9*w4y zHAJ6vf0`%b=v3kD<=s<%&V9bo)y^s*Y?{B) z*KKo_ouQ_N|6E-rC}ho1unk*UH^Fmp<@4l`ge5Ehf zQS|cGMVUpnoBH*3wib-5n6)ua=hf&c`u&TS4TYvyDRm{8h8jn@Mg5FDZIaOvGit7+ zXYWM4US(s4nw$AiHVOla6&mYmT=(5g_x~kTFB)`jePiKIDMzs+L5bT&HFIdzTQVN` zPa9Zv`o7((lWF(fy}xv_t+rm`p=oyPRO31a53h&4xnCw%@2)P)F_wF)9eT9PajbQ( z(;U^rWg}-x$(L4sRqHx5xub8gfK^lETYFpCSXJ9GW18~DntU5M{u|Te%*Gqcb5;n1Erljt1}^CXzv>K7l)*l_rKp&8qnVmkIx%BJ_XvtHlZ{(j-! zJ4J@??dfrP!)v^~KQEYs_xM|7eo_#C!sZ>r3nI_IijZW~M7Oge5viazq zkMCcUw7okvu+jT0HCH1*ev{EOU0QWf$@8B4aU+JWsS+8y%8GkIs&iU}l4C`sV-=2&J37qMquDv+q zS=do|rT9oE4Reuph;%3jNjfoc`+^)R$nQbX|$M#X4>Evs6U3On?a*Dkl2keSDXZ^e1YIu+x zt*mi%Vw(QUvpdeJ8}=R*z4>gqt6XltojX;#?xzhe+c5qq7`a?vaMD@H$H zb$54Ze9^pD$`Ctdd1Zm?>qX1=MT;t3EY4dd?CePkSm}2;n3ma+dp2e9hfm)dS~FXy z;T!eVsO0$99&9z8DpK-(%<~7%7RoEqLzH*A9j7s@M$%m4_hgoZR>!#4xJcYAX_N{I zTGqCX7Wv`)`5)gOH@|!~@qkU5Px6;x;k75fepYz;`$F{d+}=$oy)qHM7-D^WZIfyv~p6!A_W=Sefy~qbA^r=sJ)t1B(c{24n1V} z`-#67ZvU}+qwmG6$ola!nKM)FCBB+ll_(-mS&%=vqwUxOyw$ z>dNia**={~TQ}tmm+P@*>TbOM{HoqoQRSMG&Pt7xjnj>)h58d+?l0+d86{4=*>=Q3 z*ltf?>z0FB<_-p`3&Y;e)H2>1`)cXub&aWQX0z_B^Qv3BrE+qIOIDvi?`%)A8*VQu z<97%&6uup+C9-zbUayzED!XMuI-i?oZ4cG?@#f2v*W0XxEGOSh9I&-IC3#j~yT-pu zcCF#X*0+8;pSnbBzNQkD?j-CyZ+Nhq&@*;xe7w$Zred}Hx!aaMO0P6}8r%|szE^q5B^G(rBP`h#Of$k(_Tl0_F73WsT z#<3@SKhbXc>yX8!S4rVix9{h)1g?B)Zmo}wmuE0*q{mjg>v3a_^u5$l?4BK7>bBA@ zP1*2kQ_M9_K>yA>VELF3gVCEcP7AGtzWn#|g-Kp#lGuFxPhvT}+ z=-4G)4R<6GGlaF?yWV;k9Q*xBkE_nXmHHRc(= z_03kR=1S`R9_B2Yn{~K1>%HW{VQ=X9I~-inPrD935PNZdm!B>}ZkV7^VoAc5SVv~f zi^H5dUa|8!4AQ5}lpC$mR_B){ltUnv4ufizEQ^$ zME#bAY@F3US5)|A)v=>$93A=olI*(D=U=v$U9S^d=POtLu}Rh1ladgwcYNd-^WD@C zj{_649zNfipmk2KaEyesKzqYBtsGzap{jrlC)c;Ery%Z zExpw_i|gOZ*HdOFC8^pyI5PLg?zU%#{imo{o-&rWc;`!7`%Up#4WAB-^eivB{%X3+ zvyY*DalYc7wVxFYh707;FHI1Mw10c@@-e5V$TMR1HHwPQTsZhxx6p8cg^vD_eo^M{ zF*Cj`DTs7DZTqRi;^^$t2Lio6NM9V&)OwIJzDsqU$Bq7wEL9U1y5nTq_nHNdRemlA z_LYws)wZqHlhIY8ny5J@;>6y~l0h??G+Q%%?p0X3{!2@p^S#}Y6|1v3_J?n@h@X!z zQd{nH!s1l=g~yHq9x zHlLc$E~FcD{9Dmrv-41B*I5WA;gGtk4ikYpQ)8eZP8D>R$KaqmFXN7MsOCO}#e# zVM~r~g>F^yb_1igADoP4Uw<7a{V*|d#;vKLt8VN4D)7AWc(&EWOTK!?ZKKQU?ujKC z`>kH?X0}0n3T)7&U)~ZvWqdha<-~6tY`0&gM?~|3%3z@b-)x8E1NpEH@E6b%lR^>GB zT(EnIbYx2(W0_dt!(Ypd=InP0|Ky>l7XJG5ok=~%4u3f1sy9RXY@@D_VK;?s+ueC8 z@N+}>)HCkv9H~=9ug1(@_gnt?;|6^z0ap?4Jrn$+x7kf=m6@Xd?78Ofj#SLO#4}o`3ndzwt4HGjZ1ZYmQP9_Q~t(%)3MzFW7^X` z_`Y~ILvQi+(CZt=ZH-!&S}3?f_?y9=bhF0iU)1bu?)V*9y;SCWl!&)*vOvL7+XfK< z-}5P5>DvocJ{Po5f-a?CM-#?i# zt{-x|xN-C7N#R*XO+J?^ZYk>Mwk#fhW$QxUtE$r93_E9C2vuKT)9t$Iq3s3j*&TDP z_Do){PG2myZF2Cjb)|1Q=Es!RNuOvw+16{5bS6g8F=O?dY5JNiONZ@VI-J%xI!#t= zM6FWLy11r{l?e;um#{QFpRQR~v@SMZ_ac4$)J?%Vo?Fh{_}gFbnC7S9w*o&JEPLYg zz+P?fmg7^jy}Gi;x(KH1d*mq}T9nW@uvd_#dG!9O#D*%x*d^!f6vxgDQ=0ms|9VHl zLd_qtZnGBmb$|1^tn&Pmex*_Ddr1?Egr5^Xn0V=bt*U+G^H49(X55?L=OZsq+56VN zFT4obPFwy*AyObc$Jvb$b>c(-Jx zck-9$-}5U4V%${#>;JIZeUvGELaw1(>~(# zE#tlu3oX4rmEEeXj=MI0?lj|~?=q`JWIG*>@7}PfSYeUgQE}bq1ucF4*V-5@V&5}o zY;{gnn3_I0g8Ht>LeNfT?)c9lec9ff0h04JYk&D|x?<_~O@*$Ew0MylkFHI)ch_>8 zaG6+e^iRrZ*UT?lW7&+4(oNIvdX~R0J8B*FJ4&S_k%Ewpg4V$c{uhu|VF6B%#Ew74kFGDgl&xiM$bSEp~1pYPNO zF6+pMdB00;AN!WW68VYin|E5twflTc{?(?daZT)5O_7@xtI_3lfl0aXCyxo5@4EMi zXFY5xeI8>5zU}i#-ny;L%a0^ps@}3%K)mnBor8fI6xE7x>P3_0UCPoJk#0#p9v&a3 zmb}BUF4nFgX8n!%iR~p-%@1wz=RMm}xoNobjr81gPb!z|Zwi@Eb5P<#sN{vLFb!tI zk6Np%fy(j0TdRZTjnydG6y1Av%BDr%i_UD(x7m4RTFtJ!QWx*vm8K^R{VMKy2(Jpi z{;74?^qa|!G70k9D;@;DnSZTfbGBmKo~ozL(r!niWw$*Vf6r)bf6uPjyS4WOF8I*x z-m+`>ibAVswqrZvlz+hC;otQ1bSf8!Tu%MbHNbh#$h44suOKcIseK}KZP;c*`OoKP zpZooUDl9WXH|Jy0IV}yfaUH|n+>)wNS|$5_*^Xm9Zg=DkPSxN{&JgSi?wwsKnbLo* z@ztXrxB8ggUyN6ryZpw|_DapZf&?Gk%!dmuzKS>9y|b}3<@tAkaif|<)*U~-TS>uU zL+fdkFFTVc>p#Ajnyffd(*E+=Df&yw$Ngwq+mNs&%{MhgAIQ#3D zg{^42=CX5TW7!Q^`=pxkUS-9GwQwfo2lmLfE_Jw@veK(cNw+D^U7}g=HhquJTScGz z$Th;_sz<+^6Wp+U_drDHc#F{9I92_(Gc=}kC;e1?_V%DunUlH`L($Xe$$7Vs_-k)D z5?81OQ?Jwh<3df|$Gj*sD%^;`JuAfc`)i@Rb5q*HNvS2;7MmUX&{-<<2bwnTI0QNa zZB86bTJGcJ=sRbQwmpR^#30V5nQPm#;1OM10FMlK9L#O61CQtoG^A4Dt0mk=?uU~g zkpdTZGAQ(=1W4rwQ3i|6oA>7g z7aZRr&IEHfaB_=xfWv0+;|j$8hjdpTUq5uvNh+`@qJQ{WkO51!#>7zS}oGtBOVDn;)dXnCzgX3l|wO919wF5O*#hL!#6m4=wv^) zML6R};hwLvXR(CfxEhfKj`vZB&*4EWbRCdRZaWNkCca_>=`^+walbJ z;GsS!$Qt|(0Llx^5NEpKnaUC3sT)!UZj*GX5T07N3<(|WCwc;(_rZ@$7y~zz$>C`n zizrxP`rud2QI}XeO{9Q&5uZ~=$*{8Ap~GQEydLm@N1n3Mgz!o-gy2Z}U?&(t zZ0;iiApmzGsnAcX&1}$dJa8&Q2&+C^-G$eP!h)$r*Xuwx=ztU4O5k!$iVoHZG`&~` zIYLypF`UTGU_y4hVo(&z4uBz*__`mORvG17B+TgF2`m#LZuDp9Y`}aSQ(73sR9TSNHEAY_ktoM z0>m7``V$L^XLe%8AG6w5NG~VyMxwe z@jpN%Xg{_MAezLOVKHH)h;NF(BPcQP*%f$X@T41LesJCSRu2RgbPLe^9~X}?WbM#o z60^b?GGee9|0m;M{0}2WTFeDA5JFYPGI)R!0EeMPLVOn4=c*qKmSZCpp z3kVDbJGNv303 z2WEKid*+ZI%rG4jJ21m^45h&5=mao89%zdAm<>EaOPJI^hcTytK4MCPigCNH1CO}p zRGwJ{{y<0&>MP*Mpa=sA;n`O(`j~VA7vLEeuwXo@0qt=u2m6n)04vEe5U4t?b^!lC zU!A}jBmR-L49MMwc4EKjLO&0_+Fr0)Rf6a|(jaK|+G&fzBEt zvjkrJx6Cg52bo23gsCQy9ZWT0+31*R!m1JXX2KMLq+z0oGIO;X<;Cj&kK9#*RltN3 zB$R@s@{jC*d}38#@z@c}53ep7j~#*JU_uF`1hWzlGaf5Jq71VHeWU^5Ku>(D3`-9X z_wNu2A1fJ32nKl*p@>i?u~cBM35!l>5C`-Jo8lpshfWCVf3KP0Kdc$>2s);G;2zMi zngC~|<5>b%fsR!MTm?Gjdcbz+nByYmh)FoYD?FD#Bk7oiBV8h>4$>u5mb=afqX;hx zr9)eoVj_&>FVeCJ0E*cnkrRA(;l89Cr?8 zliN3-?^qrFaBaaOoe4Rc>0_&j<4;|+jm!1fR<23}NHU#@O}sp0toh&^LhipAsl z;D=yN0xTWVe&F#u+7BKl519cbv9=Sw5$--(LGCkn3_QY)h&)DHP*^(LmrhnV5DECe zB85WzM^t67hA12XComaWxHdXhfK*otX2_XEu!NNyLaqmIoG0S2@bwqAH z+kkG+L;*1xh4PQWN~7=#Del$Fh5DlYY zx(Y!S8m6ld#h_uj1u+>K#!1jT8m6ugF{5F22oWPVn)MJ z119ttQ(7Wg!xdbJq|tb!7V5#Q7C?)JX)OR74U<_E&%n_+z)u>E&H-xDa6}Fa1r0~! zz*N#OO#(|m!!!v@B@F{7NInhoBoI*=CQ5+&G#*oeb}`(8GSe_Y0_#J=)&tls4Rd3} zdoZs7#in6d2Xjip!7QZAJTOLOxf%z}@{9~Ta+L=f#VQ4DVu}F8FhfA(9@Bp?3%n2; zFa!#odI&gh@c=9V1wV5j1cVn2`id1F96IhJKoAx_ut|R+aBx9C1|aAj7j!s0JOCq$ zO)ryYc@ae8LSR_2Wn}{@a+3idu^EPtAkKhdlh~sD;g?`fvAqShgeM4*B|L2~PK?Ni zb8$z+{5w1j0M3OXHUz!6xCPNZp2cNDC0qyuvp8Wt^;B!cvabKA&k%{7KwQl1T-mFVAwDKEZD#+c`g_5M;e|HU@Nr2 zHRgj&FwGPodsNE5hW0tMA*e~1B7$)eg8-=|mI#0ZnkDQ%=qq8W(Q2Uoh_1nG6BY&H z8AxUTLy>)lUmOL%0s=|^HwZN(1Q&vV@K=Hgf$SkUAz%m%0cr%QLKqcTe6R+C%|LGW z8;;r$Vhmmcnt#MWkQkx=07$^%fhK?r1WP&?$Ro@&5dcKr${?_EFrGIA*Qo?J{Wq@b z{{yarTLT)*m1{IO8Ybry9Z&--jOhDOG)&LY*EeX`By#|023Z`$3Xt-0C6WUug1I`x z8EIICK-XzJu8vyZwhcl_!^9mK7_4@n5j0HQK`d!l50K%($5hB+%TLO75HGD^dd zG|+DvX852MV6b5UfCqrO&`@}jc!oMLlR`!da|O@=8rETCoG_~bouXk@g^UwsRmeDD zR)vfcW>ui{G)y#*p~9>R6q$-y6&NilW>sLQsF+oO-czyS0|BREUIjh{6%#AaH!9X! zz)32mR-gn_OsxPZs60{+Wib{4dchTjgYy6ej7mr#%nukaD#l&_J1RE(z&fee@Ph%P zVyGrUJlwej>P5wdAJ`}r8-6fgR1Dl;z^K^pgVCa5!w-gviVZ&)Dk?Vo!0f2l@Ppq+ z#fBe-%d_=hhqxe$A~zV-;gLH&=q|SNzzhC1T0BDqe1zu&f&s&p3Xl#j6xb0SFGX05 zvmlVf#tc*&TQeXOSbqR*cv26Bjf={_2=F|^iveCl480w}yjh3Avv&k18C)&SA72v~ z2_7zx4Lp@#&v<4Im^Dw^!M<>7M#LEF0~j>iBR0>rp(rC)Nr2hmKn;*HY|l`n4XY;b zI&9BSY!CB;zr03ZT|AbJ{7vq`0>~&f5QGX6RtPMV4pa!lZP2KpWh3Ygv1)|aa4i|ihW;a%2%$57 zoCd;V5Pw9DFF^sg?}i4;{Qds{CJ0mdcN(&jfBO~)>HpgT>HUKRqJmCQF} zMY^y}hc6|-53c@E5fWpoP6cg5AAjdo06oC!NJYSm4LcRIkcu&mieMU>b}G_UY}?_z zHT=N%tOGs3NI=zr9$@nh-x`4*c&-5iso20%fxSS(-0lE-frjx9=mECz;N8OyB+7*2 z4~=5WP65gSZQ;K_qu91n09L6Oci`jh@B?ELC^wad$-rBv*p5T|0^9}e^iqJiK=s_J zfx1wzDTkl|{J`*rxIH%P6ksnDY}qM@Vq?=z0obKr+YXiqesC8U&<+p}H%hR7JRaaM zP$Rbo;CVxh_y<&ttv7|Rb+|U*G!$&7!5YF3JOp4k=wru&lZY%Hwl5UmI~1O+2Eqfk zBjaq)4$oSnH~rXLQ-J578=41e1ENF0hKmBmfr2eHKs@}wQ$_fUcs$7Iz_399*q~t8 zpa5(@^|)#n4|dEcfFV#l_bwVFg!SbjluUpNMOSXyfD{yr6ksyp2Ujs*8w&iu6OYU`#slC8@B_~dXgyTI?HlO!;F~AZ9Z=`N zH&5sXXz-wSMErp6V5LRA1cY$86@V{+-dGK;HfSTUqkzyx@FfO=vQPo|5`(T3dWO2N zE`s)fpE6h)#R@Q=2HitG5>YE?8&)>ty>h1*^a-mIXcJZ@P#>&4K(#P42Gzj?7~Fo$ ze?e`q)_|VyLRt{?=Qa!qgY^Y81S<%r1l9;({a6J+1F!-B=f^A&I4I_;Ap2PKLGrQS zgWMCg8>R)M9t%B)IhJx@gILBv#Ib~ffMfYa=A1i$AkSEwK}@lfqPP=x=|PUL7=el5 zSs3K^a2F6T6N@n5B32ZH|J)1+6S>O;I5YSJ>&cZ=SWRvjBv#xau#$sMFd2gn5SaMG z%|X$iJnjI@7>}t_5L?D;2w(#Za_aV426Kj7>dCO#T*^h4=*3sOOOv-2l&wV5xvM5oGLKOf1+lv8Hk$;1IVp<0F658Q*5HTNaI|%9rn*r0wvz)-Xc&-YF1k52`abO(0_g#<) zLkqZF+-kshVB3KLpST?I5V3m=P>+!wZN}sZ4T=+Ts{^{hb912IylrrZieZI7emt)s z(AYomI@t4tpLvEfXB$-Mn`&~@&NgN4Ti9=d^h0n(0z9l7<~z9IR-S`Q0_!3_91jGo&JuyXhd z(Pci@4w^v&1FQ6pt{u$gU#=ah1+_J3Uy0EX3Qb5e(P=_JkVX;q1%^Z*KXh==4@2?= zqB>~y0MfxU09b>LA{&crGgt>OJYa?hhz6?wsKSj367fO;@WF9JgCr22Kws1+08bDsdIAgt8TyzmP_=^!`x^Cto^|NO+R^Is`Y=U@L} z*P3Vwtu^UC-iXj&2s$!I_7Hs=Jk8|K7Dv(bl*3bwWGewO6=$IQbHv zIU)A*6B|1P3iyc$pWvyfaH_$%>Rp^a7`iHhBGC^~2e)PW(=OoTi;Bx=#e~J812GxQ8!G1I_^6*ju zB!~rVp?_@X3-KE?kPT|U2K=J~J~06|SRm&tNaw(BHlPILh4M&c5m-UJKs#8#({LRq zAFd0PL*qbgjQU56 z4aSFJ+vpz}Kl~%wC-R}Z@DGoL3ATce7bHVyUbz1NumKZME8JR%8c+}Z*FTgO|NZZ0 zNCP(USF^bJfB0Xb1BAGvVFG98FN;J6EhPu+9eT&j_xHi_AgX_-BQe3h(KDJxB(m_o zL!yiXpZMR1z=e^S%iz;K@Z}bg`ZFk$KM=zpJdJ-qCtU5HD(Hm!_`mx!h_L2f9`>H3 z{y_P^D?>)%|E52GRr#klvPRs(aHMPfW=AI<1>P5rj5hrF=nzv&M-9$8aZis0`oMQ- zKpr8k1j51nKOi0Gbd9sZU>fZFMgAH3KLyXhG>8qcktg|gnhxv*M(z<`8XFO}ztbQr zMC?8IJ52{RG9w@!ng(`^zdp!-EdG#uI`H-ixbcuQ*gTC~3%)c2S^Q}%my$p3n>kM z8uA2(rU9AbpHt8dL~8l+5l#eO8l5!vaF_vkYJB;a$lK>jWB*4!&VS_N0F3gLg;+GH ze-Qcx_hD!o@Uno^F1+d^*T+Jx2VYtE#u|Sbyxk?u6}&kn^#$Hglj?)+@yivQS3_Z} zq3zO$y-0j%#MW8^w|497<%T1CY*a=J;8=Z+_ zJwy8fU_z1&&~tJd9I{-&xggS7f~b+o0;3?c%V3e)1<@eY$0U5?p?zi&fhE2)V$U#N z+JDFulS7_ACWkzKEaGj((E3=!t8%_HI$7>nEab}Z<>Mf)duSS42f2oPX~Y&1zBFRP z2VWX-&X_NaNp6>oY&XirvlTiFjt+{x@}&`5KKRpsD)Hwd4gv7x1A|1$$0F+`eAkhG z4wyQ`i=rX*K^ltJ@}&`*-}urPq;W8H*vR$f%SXmAAjl*;1BeI|o3AW*iljcniwFMs zW5Syj{yAVmM2&y$A&sO9fCk869@=Mk??~zkypJX4WBx}z4)Xbj)(5agst_~RWl|dq zVs`^yK4PyZUmBBSKbUZEoYWTv2Sr+jmSySy=O(407YTg%i0ycMX~f2R{xn2t`O?@V z+sFi}&#$XY7V%zuXjvAq#fmSD%nz6>CW(VES!|Ns2hAt9%chgdvWcT{L)!()N|Hao zE7DxCIVg-gv@C~svB;N3=3GoLp`FBt7KH=&%d*L1 zgB@?A{=sfQ{C3r1b!J=EqJ5wxKsgL)+l6NnC)fql3cfL-GM#Bk^Y#8i`M`bx=5vzbu=iZ)_bl z$-iVngq~Cu-WQSj0vjgy?JpZ%vGU6X8#c?3(}*p!L&pZL5UCBIqU5q{l09O>&R+hx zho}>Y>#&Oo4;#Ld_&V)Nb5IbbnJaS)h2l3uc53P`fSCbk_9 zt&dII>cW>s=COdpDg(c>R4hj<@5v_1}T{)R7&iC%>BrLjp|8NxpNu__&o4zYcG zNLh{!*%#vIuu(j5Xg+v<#=jmMc(2MYyByem#6LC;yjJC(Qx0r5Bc~BtUWc{|TN?Rg zmjg6{Ul%yAW1Q4y*nv*!AGm7#^T&am|NOWHQ%}+(NF&AEIB<-LUv>dH$zuceh}35Y zgYeA(Y$gNt$UpaRVwu!GIH^v~2Sky-EQAzD;{_LjR3BV+#Mc)cpn4?Ez+phNl)nuo z*rf=N%O+eA>kDV;s>Pl1)V1Kg~cY>GO*?(y9#EDWE&w2OyW%( z;MAl(gVK=N<)FAfpU!ZI`H9_ob;!C6P;{oJj@W&${4T6IF^>N5?ejPXw#5ecg z*puxR2^Q93-u=&y${5T03NQ$q)rcqM-8PZ6c71Gda zRn)|vIfaSg=V8EriCrW^^MOyyFIVs`mZZPHp85SF*!M$vHvwr3(p*6rzYh!ffF$wv z8Qw3D#sOl$FQ>2v80|+NIu6iZKHLS;M2ba18gWE(Xj!g(_7@fdf;{~BU}&T^0Io>=WB$jQGub3O1wrM1=K#t^@*yCN6f1x< zU^V>xgB=*8v4NVTk05^zp7k`&U`S^842LT{|pIJI2o(Q{FiIWO{*9U22 zdk!Z=NOl3vlaTlU97W;h5g-J_@tvV)M_X#BBUfFa`kg}?iZ)`(=Im>g1^ z3(At;d4bvI*9EALguC!!k;MN9NaVMdu=SI~H^5uv_aWfL9fP0mLK>Sa<0vr7KY!qM zlh%ku+#&JzyufB~aK=exAtJ$_20k&LegL$S-V;L_nTNrlTmJYOHxS{Qe;9g8q*=V31-NkdJKhV5b2|KY;r1uQ{SaBs_py zTlizN|4&-_ z9^W#r^-Jm3HjdsmN}tjLSd<=ftVj7$XArBKI3|(@%*{Oq+|)bZH>G_c)bkkxyUsX~ zUQ3zlvgfWvv*W7uGS6f9l+;r)CfRJp6xU6xE%l|s5vf;*$}z)JYarF_+ao3BloilT z*4ntv*qY3Cza0Uu(_cb~Nj!&p0aQA3kD#lhoN?!=LnnM~+BMGQEc_G+2&S~#8^5(1>3_@hlF&c0OXK_xgq@xTP~CsaiSt(P9Chy) z!5&hFXnZK&Lz6^d888fW_DSEeHbF{wt@yl`Y=~q^-`DWJMC0OUQk-$z zP6yDmIm{D|$vs$MzKpf&d!78~Fq?QM^CrbZj0taoVN-9G^v|2xRkRpueavD^oF^DN z03muFNN|o(FiYD6Pt|gvK;z&3^Srs;_3ytA{(;s8T}98E`Eh(7*`RDTZd$e&cu0N= zR9SwINFdi+&qC@cXJ2_Y^ID69`?XbwG3zM|s5Zt69J9hn&2M3zauRNJyXMb(WykSG zs-c1Oc^+*3&$u1N_U&@}yl#i{xeV{OpKB#(mtk4gy>J4{Qij*BkG1gR aveZAW_}(wu-niVPxF9r# Date: Mon, 31 Jan 2005 18:50:58 +0000 Subject: [PATCH 087/739] BMZ documentation was finished --- BMZ.t2t | 309 ++++++++++++++++++++++++++++++++++++++++++------- CHM.t2t | 24 +++- COMPARISON.t2t | 105 +++++++++++++++-- CONCEPTS.t2t | 56 +++++++++ CONFIG.t2t | 42 +++++++ DOC.css | 33 ++++++ FAQ.t2t | 3 +- GPERF.t2t | 3 +- LOGO.t2t | 1 + README.t2t | 7 +- TABLE1.t2t | 76 ++++++++++++ TABLE4.t2t | 109 +++++++++++++++++ TABLE5.t2t | 46 ++++++++ 13 files changed, 753 insertions(+), 61 deletions(-) create mode 100644 CONCEPTS.t2t create mode 100644 DOC.css create mode 100644 LOGO.t2t create mode 100644 TABLE1.t2t create mode 100644 TABLE4.t2t create mode 100644 TABLE5.t2t diff --git a/BMZ.t2t b/BMZ.t2t index 37e3101..08c8ce2 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -9,15 +9,17 @@ BMZ Algorithm At the end of 2003, professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] was finishing the second edition of his [book http://www.dcc.ufmg.br/algoritmos/]. During the [book http://www.dcc.ufmg.br/algoritmos/] writing, -professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] studied the problem of generating minimal perfect hash -functions (if you are not familiarized with this problem, see [1][2]). +professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] studied the problem of generating +[minimal perfect hash functions concepts.html] +(if you are not familiarized with this problem, see [[1 #papers]][[2 #papers]]). Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] coded a modified version of the [CHM algorithm chm.html], which was proposed by -Czech, Havas and Majewski and put it in his [book http://www.dcc.ufmg.br/algoritmos/]. -The [CHM algorithm chm.html] is based on acyclic random graphs to generate order preserving -minimal perfect hash functions in linear time. Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] +Czech, Havas and Majewski, and put it in his [book http://www.dcc.ufmg.br/algoritmos/]. +The [CHM algorithm chm.html] is based on acyclic random graphs to generate +[order preserving minimal perfect hash functions concepts.html] in linear time. +Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] argued himself, why must the random graph -be acyclic? In the modified version availalbe in his [book http://www.dcc.ufmg.br/algoritmos/] he got rid of such restriction. +be acyclic? In the modified version availalbe in his [book http://www.dcc.ufmg.br/algoritmos/] he got rid of this restriction. The modification presented a problem, it was impossible to generate minimal perfect hash functions for sets with more than 1000 keys. @@ -32,19 +34,38 @@ During the master, [Fabiano http://www.dcc.ufmg.br/~fbotelho] and In april of 2004, [Fabiano http://www.dcc.ufmg.br/~fbotelho] was talking with a friend of him (David Menoti) about the problems and many ideas appeared. -The ideas were implemented and we noticed that a very fast algorithm to generate +The ideas were implemented and a very fast algorithm to generate minimal perfect hash functions had been designed. -We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho -David **M**enoti and Nivio **Z**iviani. The algorithm is described in [1]. +We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho, +David **M**enoti and Nivio **Z**iviani. The algorithm is described in [[1 #papers]]. To analyse BMZ algorithm we needed some results from the random graph theory, so we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. -The final description and analysis of BMZ algorithm is presented in [2]. +The final description and analysis of BMZ algorithm is presented in [[2 #papers]]. ---------------------------------------- ==The Algorithm== -Let us show how the minimal perfect hash function [figs/img7.png] will be constructed. +The BMZ algorithm shares several features with the [CHM algorithm chm.html]. +In particular, BMZ algorithm is also +based on the generation of random graphs [figs/img27.png], where [figs/img28.png] is in +one-to-one correspondence with the key set [figs/img20.png] for which we wish to +generate a [minimal perfect hash function concepts.html]. +The two main differences between BMZ algorithm and CHM algorithm +are as follows: (//i//) BMZ algorithm generates random +graphs [figs/img27.png] with [figs/img29.png] and [figs/img30.png], where [figs/img31.png], +and hence [figs/img32.png] necessarily contains cycles, +while CHM algorithm generates //acyclic// random +graphs [figs/img27.png] with [figs/img29.png] and [figs/img30.png], +with a greater number of vertices: [figs/img33.png]; +(//ii//) CHM algorithm generates [order preserving minimal perfect hash functions concepts.html] +while BMZ algorithm does not preserve order. Thus, BMZ algorithm improves +the space requirement at the expense of generating functions that are not +order preserving. + +Suppose [figs/img14.png] is a universe of //keys//. +Let [figs/img17.png] be a set of [figs/img8.png] keys from [figs/img14.png]. +Let us show how the BMZ algorithm constructs a minimal perfect hash function [figs/img7.png]. We make use of two auxiliary random functions [figs/img41.png] and [figs/img55.png], where [figs/img56.png] for some suitably chosen integer [figs/img57.png], where [figs/img58.png].We build a random graph [figs/img59.png] on [figs/img60.png], @@ -54,7 +75,7 @@ key in the set of keys [figs/img20.png]. In what follows, we shall be interested in the //2-core// of the random graph [figs/img32.png], that is, the maximal subgraph of [figs/img32.png] with minimal degree at -least 2 (see, e.g., [2] for details). +least 2 (see [[2 #papers]] for details). Because of its importance in our context, we call the 2-core the //critical// subgraph of [figs/img32.png] and denote it by [figs/img63.png]. The vertices and edges in [figs/img63.png] are said to be //critical//. @@ -65,7 +86,7 @@ We also let [figs/img67.png] be the set of all critical vertices that have at least one non-critical vertex as a neighbour. Let [figs/img68.png] be the set of //non-critical// edges in [figs/img32.png]. Finally, we let [figs/img69.png] be the //non-critical// subgraph -of [figs/img32.png. +of [figs/img32.png]. The non-critical subgraph [figs/img70.png] corresponds to the //acyclic part// of [figs/img32.png]. We have [figs/img71.png]. @@ -74,33 +95,222 @@ We then construct a suitable labelling [figs/img72.png] of the vertices of [figs/img32.png]: we choose [figs/img73.png] for each [figs/img74.png] in such a way that [figs/img75.png] ([figs/img18.png]) is a minimal perfect hash function for [figs/img20.png]. -We will see later on that this labelling [figs/img37.png] can be found in linear time -if the number of edges in [figs/img63.png] is at most [figs/img76.png]. +This labelling [figs/img37.png] can be found in linear time +if the number of edges in [figs/img63.png] is at most [figs/img76.png] (see [[2 #papers]] +for details). -Figure 2 presents a pseudo code for the algorithm. -The procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) receives as input the set of +Figure 1 presents a pseudo code for the BMZ algorithm. +The procedure BMZ ([figs/img20.png], [figs/img37.png]) receives as input the set of keys [figs/img20.png] and produces the labelling [figs/img37.png]. The method uses a mapping, ordering and searching approach. We now describe each step. -| procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) -|     Mapping ([figs/img20.png], [figs/img32.png]); -|     Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]); -|     Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]); -**Figure 2**: Main steps of the algorithm for constructing a minimal perfect hash function - -===Mapping Step=== - -===Ordering Step=== - -===Searching Step=== - -====Assignment of Values to Critical Vertices==== - -====Assignment of Values to Non-Critical Vertices==== + | procedure BMZ ([figs/img20.png], [figs/img37.png]) + |     Mapping ([figs/img20.png], [figs/img32.png]); + |     Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]); + |     Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]); + | **Figure 1**: Main steps of BMZ algorithm for constructing a minimal perfect hash function ---------------------------------------- -==The Heuristic== +===Mapping Step=== + +The procedure Mapping ([figs/img20.png], [figs/img32.png]) receives as input the set +of keys [figs/img20.png] and generates the random graph [figs/img59.png], by generating +two auxiliary functions [figs/img41.png], [figs/img78.png]. + +The functions [figs/img41.png] and [figs/img42.png] are constructed as follows. +We impose some upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. +To define [figs/img80.png] ([figs/img81.png], [figs/img62.png]), we generate +an [figs/img82.png] table of random integers [figs/img83.png]. +For a key [figs/img18.png] of length [figs/img84.png] and [figs/img85.png], we let + + | [figs/img86.png] + +The random graph [figs/img59.png] has vertex set [figs/img56.png] and +edge set [figs/img61.png]. We need [figs/img32.png] to be +simple, i.e., [figs/img32.png] should have neither loops nor multiple edges. +A loop occurs when [figs/img87.png] for some [figs/img18.png]. +We solve this in an ad hoc manner: we simply let [figs/img88.png] in this case. +If we still find a loop after this, we generate another pair [figs/img89.png]. +When a multiple edge occurs we abort and generate a new pair [figs/img89.png]. +Although the function above causes [collisions concepts.html] with probability //1/t//, +in [cmph library index.html] we use faster hash +functions ([DJB2 hash http://], [FNV hash http://], [Jenkins hash http://] +and [SDBM hash http://]) in which we do not need to impose any upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. + +As mentioned before, for us to find the labelling [figs/img72.png] of the +vertices of [figs/img59.png] in linear time, +we require that [figs/img108.png]. +The crucial step now is to determine the value +of [figs/img1.png] (in [figs/img57.png]) to obtain a random +graph [figs/img71.png] with [figs/img109.png]. +Botelho, Menoti an Ziviani determinded emprically in [[1 #papers]] that +the value of [figs/img1.png] is //1.15//. This value is remarkably +close to the theoretical value determined in [[2 #papers]], +which is around [figs/img112.png]. + +---------------------------------------- + +===Ordering Step=== + +The procedure Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]) receives +as input the graph [figs/img32.png] and partitions [figs/img32.png] into the two +subgraphs [figs/img63.png] and [figs/img70.png], so that [figs/img71.png]. + +Figure 2 presents a sample graph with 9 vertices +and 8 edges, where the degree of a vertex is shown besides each vertex. +Initially, all vertices with degree 1 are added to a queue [figs/img136.png]. +For the example shown in Figure 2(a), [figs/img137.png] after the initialization step. + + | [figs/img138.png] + | **Figure 2:** Ordering step for a graph with 9 vertices and 8 edges. + +Next, we remove one vertex [figs/img139.png] from the queue, decrement its degree and +the degree of the vertices with degree greater than 0 in the adjacent +list of [figs/img139.png], as depicted in Figure 2(b) for [figs/img140.png]. +At this point, the adjacencies of [figs/img139.png] with degree 1 are +inserted into the queue, such as vertex 1. +This process is repeated until the queue becomes empty. +All vertices with degree 0 are non-critical vertices and the others are +critical vertices, as depicted in Figure 2(c). +Finally, to determine the vertices in [figs/img141.png] we collect all +vertices [figs/img142.png] with at least one vertex [figs/img143.png] that +is in Adj[figs/img144.png] and in [figs/img145.png], as the vertex 8 in Figure 2(c). + +---------------------------------------- + +===Searching Step=== + +In the searching step, the key part is +the //perfect assignment problem//: find [figs/img153.png] such that +the function [figs/img154.png] defined by + + | [figs/img155.png] + +is a bijection from [figs/img156.png] to [figs/img157.png] (recall [figs/img158.png]). +We are interested in a labelling [figs/img72.png] of +the vertices of the graph [figs/img59.png] with +the property that if [figs/img11.png] and [figs/img22.png] are keys +in [figs/img20.png], then [figs/img159.png]; that is, if we associate +to each edge the sum of the labels on its endpoints, then these values +should be all distinct. +Moreover, we require that all the sums [figs/img160.png] ([figs/img18.png]) +fall between [figs/img115.png] and [figs/img161.png], and thus we have a bijection +between [figs/img20.png] and [figs/img157.png]. + +The procedure Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]) +receives as input [figs/img32.png], [figs/img63.png], [figs/img70.png] and finds a +suitable [figs/img162.png] bit value for each vertex [figs/img74.png], stored in the +array [figs/img37.png]. +This step is first performed for the vertices in the +critical subgraph [figs/img63.png] of [figs/img32.png] (the 2-core of [figs/img32.png]) +and then it is performed for the vertices in [figs/img70.png] (the non-critical subgraph +of [figs/img32.png] that contains the "acyclic part" of [figs/img32.png]). +The reason the assignment of the [figs/img37.png] values is first +performed on the vertices in [figs/img63.png] is to resolve reassignments +as early as possible (such reassignments are consequences of the cycles +in [figs/img63.png] and are depicted hereinafter). + +---------------------------------------- + +====Assignment of Values to Critical Vertices==== + +The labels [figs/img73.png] ([figs/img142.png]) +are assigned in increasing order following a greedy +strategy where the critical vertices [figs/img139.png] are considered one at a time, +according to a breadth-first search on [figs/img63.png]. +If a candidate value [figs/img11.png] for [figs/img73.png] is forbidden +because setting [figs/img163.png] would create two edges with the same sum, +we try [figs/img164.png] for [figs/img73.png]. This fact is referred to +as a //reassignment//. + +Let [figs/img165.png] be the set of addresses assigned to edges in [figs/img166.png]. +Initially [figs/img167.png]. +Let [figs/img11.png] be a candidate value for [figs/img73.png]. +Initially [figs/img168.png]. +Considering the subgraph [figs/img63.png] in Figure 2(c), +a step by step example of the assignment of values to vertices in [figs/img63.png] is +presented in Figure 3. +Initially, a vertex [figs/img139.png] is chosen, the assignment [figs/img163.png] is made +and [figs/img11.png] is set to [figs/img164.png]. +For example, suppose that vertex [figs/img169.png] in Figure 3(a) is +chosen, the assignment [figs/img170.png] is made and [figs/img11.png] is set to [figs/img96.png]. + + | [figs/img171.png] + | **Figure 3:** Example of the assignment of values to critical vertices. + +In Figure 3(b), following the adjacent list of vertex [figs/img169.png], +the unassigned vertex [figs/img115.png] is reached. +At this point, we collect in the temporary variable [figs/img172.png] all adjacencies +of vertex [figs/img115.png] that have been assigned an [figs/img11.png] value, +and [figs/img173.png]. +Next, for all [figs/img174.png], we check if [figs/img175.png]. +Since [figs/img176.png], then [figs/img177.png] is set +to [figs/img96.png], [figs/img11.png] is incremented +by 1 (now [figs/img178.png]) and [figs/img179.png]. +Next, vertex [figs/img180.png] is reached, [figs/img181.png] is set +to [figs/img62.png], [figs/img11.png] is set to [figs/img180.png] and [figs/img182.png]. +Next, vertex [figs/img183.png] is reached and [figs/img184.png]. +Since [figs/img185.png] and [figs/img186.png], then [figs/img187.png] is +set to [figs/img180.png], [figs/img11.png] is set to [figs/img183.png] and [figs/img188.png]. +Finally, vertex [figs/img189.png] is reached and [figs/img190.png]. +Since [figs/img191.png], [figs/img11.png] is incremented by 1 and set to 5, as depicted in +Figure 3(c). +Since [figs/img192.png], [figs/img11.png] is again incremented by 1 and set to 6, +as depicted in Figure 3(d). +These two reassignments are indicated by the arrows in Figure 3. +Since [figs/img193.png] and [figs/img194.png], then [figs/img195.png] is set +to [figs/img196.png] and [figs/img197.png]. This finishes the algorithm. + +---------------------------------------- + +====Assignment of Values to Non-Critical Vertices==== + +As [figs/img70.png] is acyclic, we can impose the order in which addresses are +associated with edges in [figs/img70.png], making this step simple to solve +by a standard depth first search algorithm. +Therefore, in the assignment of values to vertices in [figs/img70.png] we +benefit from the unused addresses in the gaps left by the assignment of values +to vertices in [figs/img63.png]. +For that, we start the depth-first search from the vertices in [figs/img141.png] because +the [figs/img37.png] values for these critical vertices were already assigned +and cannot be changed. + +Considering the subgraph [figs/img70.png] in Figure 2(c), +a step by step example of the assignment of values to vertices in [figs/img70.png] is +presented in Figure 4. +Figure 4(a) presents the initial state of the algorithm. +The critical vertex 8 is the only one that has non-critical vertices as +adjacent. +In the example presented in Figure 3, the addresses [figs/img198.png] were not used. +So, taking the first unused address [figs/img115.png] and the vertex [figs/img96.png], +which is reached from the vertex [figs/img169.png], [figs/img199.png] is set +to [figs/img200.png], as shown in Figure 4(b). +The only vertex that is reached from vertex [figs/img96.png] is vertex [figs/img62.png], so +taking the unused address [figs/img183.png] we set [figs/img201.png] to [figs/img202.png], +as shown in Figure 4(c). +This process is repeated until the UnAssignedAddresses list becomes empty. + + | [figs/img203.png] + | **Figure 4:** Example of the assignment of values to non-critical vertices. + +---------------------------------------- + +==The Heuristic==[heuristic] + +We now present an heuristic for BMZ algorithm that +reduces the value of [figs/img1.png] to any given value between //1.15// and //0.93//. +This reduces the space requirement to store the resulting function +to any given value between [figs/img12.png] words and [figs/img13.png] words. +The heuristic reuses, when possible, the set +of [figs/img11.png] values that caused reassignments, just before +trying [figs/img164.png]. +Decreasing the value of [figs/img1.png] leads to an increase in the number of +iterations to generate [figs/img32.png]. +For example, for [figs/img244.png] and [figs/img6.png], the analytical expected number +of iterations are [figs/img245.png] and [figs/img246.png], respectively (see [[2 #papers]] +for details), +while for [figs/img128.png] the same value is around //2.13//. ---------------------------------------- @@ -121,9 +331,10 @@ following: of 4 bytes that represent the vertices. As there are //n// edges, the vector edges is stored in //8n// bytes. - + **next**: given a vertex //v//, we can discover the edges that contain //v// - following its list of edges, which starts on first[//v//] and the next - edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + + **next**: given a vertex [figs/img139.png], we can discover the edges that + contain [figs/img139.png] following its list of edges, + which starts on first[[figs/img139.png]] and the next + edges are given by next[...first[[figs/img139.png]]...]. Therefore, the vectors first and next represent the linked lists of edges of each vertex. As there are two vertices for each edge, when an edge is iserted in the graph, it must be inserted in the two linked lists of the vertices in its composition. Therefore, there are //2n// entries of integer @@ -140,8 +351,8 @@ following: - Other auxiliary structures + **queue**: is a queue of integer numbers used in the breadth-first search of the assignment of values to critical vertices. There is an entry in the queue for - each two critical vertices. Let //|Vcrit|// be the expected number of critical - vertices. Therefore, the queue is stored in //4*0.5*|Vcrit|=2|Vcrit|//. + each two critical vertices. Let [figs/img110.png] be the expected number of critical + vertices. Therefore, the queue is stored in //4*0.5*[figs/img110.png]=2[figs/img110.png]//. + **visited**: is a vector of //cn// bits, where each bit indicates if the g value of a given vertex was already defined. Therefore, the vector visited is stored @@ -153,12 +364,15 @@ following: Thus, the total memory consumption of BMZ algorithm for generating a minimal -perfect hash function (MPHF) is: //(8.25c + 16.125)n +2|Vcrit| + O(1)// bytes. +perfect hash function (MPHF) is: //(8.25c + 16.125)n +2[figs/img110.png] + O(1)// bytes. As the value of constant //c// may be 1.15 and 0.93 we have: - || //c// | //|Vcrit|// | Memory consumption to generate a MPHF | + || //c// | [figs/img110.png] | Memory consumption to generate a MPHF | | 0.93 | //0.497n// | //24.80n + O(1)// | | 1.15 | //0.401n// | //26.42n + O(1)// | -The values of |Vcrit| were calculated using Eq.(1) presented in [2]. + + | **Table 1:** Memory consumption to generate a MPHF using the BMZ algorithm. + +The values of [figs/img110.png] were calculated using Eq.(1) presented in [[2 #papers]]. Now we present the memory consumption to store the resulting function. We only need to store the //g// function. Thus, we need //4cn// bytes. @@ -166,10 +380,17 @@ Again we have: || //c// | Memory consumption to store a MPHF | | 0.93 | //3.72n// | | 1.15 | //4.60n// | - + + | **Table 2:** Memory consumption to store a MPHF generated by the BMZ algorithm. ---------------------------------------- -==Papers== +==Experimental Results== + +[CHM x BMZ comparison.html] + +---------------------------------------- + +==Papers==[papers] + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. @@ -177,7 +398,7 @@ Again we have: ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index 8859eff..e3090dc 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -4,8 +4,11 @@ CHM Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- + ==The Algorithm== +---------------------------------------- + ==Memory Consumption== Now we detail the memory consumption to generate and to store minimal perfect hash functions @@ -23,9 +26,11 @@ following: of 4 bytes that represent the vertices. As there are //n// edges, the vector edges is stored in //8n// bytes. - + **next**: given a vertex //v//, we can discover the edges that contain //v// - following its list of edges, which starts on first[//v//] and the next - edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + + **next**: given a vertex [figs/img139.png], we can discover the edges that + contain [figs/img139.png] following its list of edges, which starts on + first[[figs/img139.png]] and the next + edges are given by next[...first[[figs/img139.png]]...]. Therefore, + the vectors first and next represent the linked lists of edges of each vertex. As there are two vertices for each edge, when an edge is iserted in the graph, it must be inserted in the two linked lists of the vertices in its composition. Therefore, there are //2n// entries of integer @@ -47,12 +52,23 @@ As the value of constant //c// must be at least 2.09 we have: || //c// | Memory consumption to generate a MPHF | | 2.09 | //33.00n + O(1)// | + | **Table 1:** Memory consumption to generate a MPHF using the CHM algorithm. + Now we present the memory consumption to store the resulting function. We only need to store the //g// function. Thus, we need //4cn// bytes. Again we have: || //c// | Memory consumption to store a MPHF | | 2.09 | //8.36n// | + | **Table 2:** Memory consumption to store a MPHF generated by the CHM algorithm. + +---------------------------------------- + +==Experimental Results== + +[CHM x BMZ comparison.html] + +---------------------------------------- ==Papers== @@ -66,7 +82,7 @@ Again we have: ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index a6ff823..1a6e328 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -5,17 +5,106 @@ Comparison Between BMZ And CHM Algorithms ---------------------------------------- -==Features== +==Characteristics== +Table 1 presents the main characteristics of the two algorithms. +The number of edges in the graph [figs/img27.png] is [figs/img236.png], +the number of keys in the input set [figs/img20.png]. +The number of vertices of [figs/img32.png] is equal +to [figs/img12.png] and [figs/img237.png] for BMZ algorithm and the CHM algorithm, respectively. +This measure is related to the amount of space to store the array [figs/img37.png]. +This improves the space required to store a function in BMZ algorithm to [figs/img238.png] of the space required by the CHM algorithm. +The number of critical edges is [figs/img76.png] and 0, for BMZ algorithm and the CHM algorithm, +respectively. +BMZ algorithm generates random graphs that necessarily contains cycles and the +CHM algorithm +generates +acyclic random graphs. +Finally, the CHM algorithm generates [order preserving functions concepts.html] +while BMZ algorithm does not preserve order. -==Constructing Minimal Perfect Hash Functions== - -==Memory Consumption== - - -==Run times== +%!include(html): ''TABLE1.t2t'' + | **Table 1:** Main characteristics of the algorithms. ---------------------------------------- -[Home index.html] + +==Memory Consumption== + +- Memory consumption to generate the minimal perfect hash function (MPHF): + || Algorithm | //c// | Memory consumption to generate a MPHF | + | BMZ | 0.93 | //24.80n + O(1)// | + | BMZ | 1.15 | //26.42n + O(1)// | + | CHM | 2.09 | //33.00n + O(1)// | + + | **Table 2:** Memory consumption to generate a MPHF using the algorithms BMZ and CHM. + +- Memory consumption to store the resulting minimal perfect hash function (MPHF): + || Algorithm | //c// | Memory consumption to store a MPHF | + | BMZ | 0.93 | //3.72n// | + | BMZ | 1.15 | //4.60n// | + | CHM | 2.09 | //8.36n// | + + | **Table 3:** Memory consumption to store a MPHF generated by the algorithms BMZ and CHM. + +---------------------------------------- + +==Run times== +We now present some experimental results to compare the BMZ and CHM algorithms. +The data consists of a collection of 100 million universe resource locations +(URLs) collected from the Web. +The average length of a URL in the collection is 63 bytes. +All experiments were carried on +a computer running the Linux operating system, version 2.6.7, +with a 2.4 gigahertz processor and +4 gigabytes of main memory. + +Table 4 presents time measurements. +All times are in seconds. +The table entries represent averages over 50 trials. +The column labelled as [figs/img243.png] represents +the number of iterations to generate the random graph [figs/img32.png] in the +mapping step of the algorithms. +The next columns represent the run times +for the mapping plus ordering steps together and the searching +step for each algorithm. +The last column represents the percent gain of our algorithm +over the CHM algorithm. + +%!include(html): ''TABLE4.t2t'' + | **Table 4:** Time measurements for BMZ and the CHM algorithm. + +The mapping step of the BMZ algorithm is faster because +the expected number of iterations in the mapping step to generate [figs/img32.png] are +2.13 and 2.92 for BMZ algorithm and the CHM algorithm, respectively +(see [[2 bmz.html#papers]] for details). +The graph [figs/img32.png] generated by BMZ algorithm +has [figs/img12.png] vertices, against [figs/img237.png] for the CHM algorithm. +These two facts make BMZ algorithm faster in the mapping step. +The ordering step of BMZ algorithm is approximately equal to +the time to check if [figs/img32.png] is acyclic for the CHM algorithm. +The searching step of the CHM algorithm is faster, but the total +time of BMZ algorithm is, on average, approximately 59 % faster +than the CHM algorithm. +It is important to notice the times for the searching step: +for both algorithms they are not the dominant times, +and the experimental results clearly show +a linear behavior for the searching step. + +We now present run times for BMZ algorithm using a [heuristic bmz.html#heuristic] that +reduces the space requirement +to any given value between [figs/img12.png] words and [figs/img13.png] words. +For example, for [figs/img244.png] and [figs/img6.png], the analytical expected number +of iterations are [figs/img245.png] and [figs/img246.png], respectively +(for [figs/img247.png], the number of iterations are 2.78 for [figs/img244.png] and 3.04 +for [figs/img6.png]). +Table 5 presents the total times to construct a +function for [figs/img247.png], with an increase from [figs/img248.png] seconds +for [figs/img128.png] (see Table 4) to [figs/img249.png] seconds for [figs/img244.png] and +to [figs/img250.png] seconds for [figs/img6.png]. + +%!include(html): ''TABLE5.t2t'' + | **Table 5:** Time measurements for BMZ tuned algorithm with [figs/img5.png] and [figs/img6.png]. +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/CONCEPTS.t2t b/CONCEPTS.t2t new file mode 100644 index 0000000..49bedde --- /dev/null +++ b/CONCEPTS.t2t @@ -0,0 +1,56 @@ +Minimal Perfect Hash Functions - Introduction + + +%!includeconf: CONFIG.t2t + +---------------------------------------- +==Basic Concepts== + +Suppose [figs/img14.png] is a universe of //keys//. +Let [figs/img15.png] be a //hash function// that maps the keys from [figs/img14.png] to a given interval of integers [figs/img16.png]. +Let [figs/img17.png] be a set of [figs/img8.png] keys from [figs/img14.png]. +Given a key [figs/img18.png], the hash function [figs/img7.png] computes an +integer in [figs/img19.png] for the storage or retrieval of [figs/img11.png] in +a //hash table//. +Hashing methods for //non-static sets// of keys can be used to construct +data structures storing [figs/img20.png] and supporting membership queries +"[figs/img18.png]?" in expected time [figs/img21.png]. +However, they involve a certain amount of wasted space owing to unused +locations in the table and waisted time to resolve collisions when +two keys are hashed to the same table location. + +For //static sets// of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +//perfect//. +More precisely, given a set of keys [figs/img20.png], we shall say that a +hash function [figs/img15.png] is a //perfect hash function// +for [figs/img20.png] if [figs/img7.png] is an injection on [figs/img20.png], +that is, there are no //collisions// among the keys in [figs/img20.png]: +if [figs/img11.png] and [figs/img22.png] are in [figs/img20.png] and [figs/img23.png], +then [figs/img24.png]. +Figure 1(a) illustrates a perfect hash function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If [figs/img25.png], that is, the table has the same size as [figs/img20.png], +then we say that [figs/img7.png] is a //minimal perfect hash function// +for [figs/img20.png]. +Figure 1(b) illustrates a minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. A perfect hash function [figs/img7.png] is //order preserving// +if the keys in [figs/img20.png] are arranged in some given order +and [figs/img7.png] preserves this order in the hash table. + + | [figs/img26.png] + | **Figure 1:** (a) Perfect hash function. (b) Minimal perfect hash function. + +Minimal perfect hash functions are widely used for memory efficient +storage and fast retrieval of items from static sets, such as words in natural +languages, reserved words in programming languages or interactive systems, +universal resource locations (URLs) in Web search engines, or item sets in +data mining techniques. + +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] +---------------------------------------- + +%!include: FOOTER.t2t diff --git a/CONFIG.t2t b/CONFIG.t2t index 19dd4e9..cf391eb 100644 --- a/CONFIG.t2t +++ b/CONFIG.t2t @@ -1,4 +1,46 @@ +%! style(html): DOC.css %! PreProc(html): '^%html% ' '' %! PreProc(txt): '^%txt% ' '' %! PostProc(html): "&" "&" %! PostProc(txt): " " " " +%! PostProc(html): 'ALIGN="middle" SRC="figs/img7.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img7.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img57.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img57.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img32.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img32.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img20.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img20.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img60.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img60.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img62.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img62.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img79.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img79.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img139.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img139.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img140.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img140.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img143.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img143.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img115.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img115.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img11.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img11.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img169.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img169.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img96.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img96.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img178.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img178.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img180.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img180.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img183.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img183.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img189.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img189.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img196.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img196.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img172.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img172.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img8.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img8.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img1.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img1.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img14.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img14.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img128.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img128.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img112.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img112.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img12.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img12.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img13.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img13.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img244.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img244.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img245.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img245.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img246.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img246.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img15.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img15.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img25.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img25.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img168.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img168.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img6.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img6.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img5.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img5.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img28.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img28.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img237.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img237.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img248.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img237.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img248.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img237.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img249.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img249.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img250.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img250.png"\1>' diff --git a/DOC.css b/DOC.css new file mode 100644 index 0000000..db09b2d --- /dev/null +++ b/DOC.css @@ -0,0 +1,33 @@ +/* implement both fixed-size and relative sizes */ +SMALL.XTINY { } +SMALL.TINY { } +SMALL.SCRIPTSIZE { } +BODY { font-size: 13 } +TD { font-size: 13 } +SMALL.FOOTNOTESIZE { font-size: 13 } +SMALL.SMALL { } +BIG.LARGE { } +BIG.XLARGE { } +BIG.XXLARGE { } +BIG.HUGE { } +BIG.XHUGE { } + +/* heading styles */ +H1 { } +H2 { } +H3 { } +H4 { } +H5 { } + + +/* mathematics styles */ +DIV.displaymath { } /* math displays */ +TD.eqno { } /* equation-number cells */ + + +/* document-specific styles come next */ +DIV.navigation { } +DIV.center { } +SPAN.textit { font-style: italic } +SPAN.arabic { } +SPAN.eqn-number { } diff --git a/FAQ.t2t b/FAQ.t2t index 1ce1774..05ca410 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -1,6 +1,7 @@ CMPH FAQ +%!includeconf: CONFIG.t2t - How do I define the ids of the keys? - You don't. The ids will be assigned by the algorithm creating the minimal @@ -26,7 +27,7 @@ one is executed? ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/GPERF.t2t b/GPERF.t2t index 61190b9..67d5d40 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -1,6 +1,7 @@ GPERF versus CMPH +%!includeconf: CONFIG.t2t You might ask why cmph if [gperf http://www.gnu.org/software/gperf/gperf.html] already works perfectly. Actually, gperf and cmph have different goals. @@ -32,7 +33,7 @@ assigning ids to millions of documents), while the former is usually found in the compiler programming area (detect reserved keywords). ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/LOGO.t2t b/LOGO.t2t new file mode 100644 index 0000000..dc245a8 --- /dev/null +++ b/LOGO.t2t @@ -0,0 +1 @@ +SourceForge.net Logo diff --git a/README.t2t b/README.t2t index e491c32..7ddc1ec 100644 --- a/README.t2t +++ b/README.t2t @@ -8,7 +8,8 @@ CMPH - C Minimal Perfect Hashing Library ==Description== C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hash functions. The cmph library encapsulates the newest +to work with [minimal perfect hash functions concepts.html]. +The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that can not fit in the main memory. It has been used successfully for constructing minimal perfect @@ -54,7 +55,7 @@ of the distinguishable features of cmph: - New heuristic added to the bmz algorithm permits to generate a mphf with only //24.6n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. -%html% [click here bmz.html] for details. +%html% [click here bmz.html#heuristic] for details. ---------------------------------------- @@ -173,5 +174,5 @@ Code is under the LGPL. %!include: FOOTER.t2t -%!include(html): ''LOGO.html'' +%!include(html): ''LOGO.t2t'' Last Updated: %%date(%c) diff --git a/TABLE1.t2t b/TABLE1.t2t new file mode 100644 index 0000000..402a854 --- /dev/null +++ b/TABLE1.t2t @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Characteristics Algorithms
+ + BMZ CHM
+ +$c$ 1.15 2.09
+$\vert E(G)\vert$ $n$ $n$
+$\vert V(G)\vert=\vert g\vert$ $cn$ $cn$
+ +$\vert E(G_{\rm crit})\vert$ $0.5\vert E(G)\vert$ 0
+$G$ cyclic acyclic
+Order preserving no yes
\ No newline at end of file diff --git a/TABLE4.t2t b/TABLE4.t2t new file mode 100644 index 0000000..350fa1e --- /dev/null +++ b/TABLE4.t2t @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$n$ BMZ +CHM algorithm Gain
+ $N_i$ Map+Ord +Search Total +$N_i$ Map+Ord Search +Total (%)
1,562,500 2.28 8.54 2.37 10.91 2.70 14.56 1.57 16.13 48
3,125,000 2.16 15.92 4.88 20.80 2.85 30.36 3.20 33.56 61
6,250,000 2.20 33.09 10.48 43.57 2.90 62.26 6.76 69.02 58
12,500,000 2.00 63.26 23.04 86.30 2.60 117.99 14.94 132.92 54
25,000,000 2.00 130.79 51.55 182.34 2.80 262.05 33.68 295.73 62
50,000,000 2.07 273.75 114.12 387.87 2.90 577.59 73.97 651.56 68
100,000,000 2.07 567.47 243.13 810.60 2.80 1,131.06 157.23 1,288.29 59
diff --git a/TABLE5.t2t b/TABLE5.t2t new file mode 100644 index 0000000..8cf966a --- /dev/null +++ b/TABLE5.t2t @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
$n$ BMZ $c=1.00$ + BMZ $c=0.93$
+ $N_i$ Map+Ord +Search Total +$N_i$ Map+Ord Search +Total
12,500,000 2.78 76.68 25.06 101.74 3.04 76.39 25.80 102.19
\ No newline at end of file From 9abc48f91ca7070223fa38ae2f83bb19e5a8d81d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 31 Jan 2005 18:50:58 +0000 Subject: [PATCH 088/739] BMZ documentation was finished --- BMZ.t2t | 309 ++++++++++++++++++++++++++++++++++++++++++------- CHM.t2t | 24 +++- COMPARISON.t2t | 105 +++++++++++++++-- CONCEPTS.t2t | 56 +++++++++ CONFIG.t2t | 42 +++++++ DOC.css | 33 ++++++ FAQ.t2t | 3 +- GPERF.t2t | 3 +- LOGO.t2t | 1 + README.t2t | 7 +- TABLE1.t2t | 76 ++++++++++++ TABLE4.t2t | 109 +++++++++++++++++ TABLE5.t2t | 46 ++++++++ 13 files changed, 753 insertions(+), 61 deletions(-) create mode 100644 CONCEPTS.t2t create mode 100644 DOC.css create mode 100644 LOGO.t2t create mode 100644 TABLE1.t2t create mode 100644 TABLE4.t2t create mode 100644 TABLE5.t2t diff --git a/BMZ.t2t b/BMZ.t2t index 37e3101..08c8ce2 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -9,15 +9,17 @@ BMZ Algorithm At the end of 2003, professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] was finishing the second edition of his [book http://www.dcc.ufmg.br/algoritmos/]. During the [book http://www.dcc.ufmg.br/algoritmos/] writing, -professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] studied the problem of generating minimal perfect hash -functions (if you are not familiarized with this problem, see [1][2]). +professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] studied the problem of generating +[minimal perfect hash functions concepts.html] +(if you are not familiarized with this problem, see [[1 #papers]][[2 #papers]]). Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] coded a modified version of the [CHM algorithm chm.html], which was proposed by -Czech, Havas and Majewski and put it in his [book http://www.dcc.ufmg.br/algoritmos/]. -The [CHM algorithm chm.html] is based on acyclic random graphs to generate order preserving -minimal perfect hash functions in linear time. Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] +Czech, Havas and Majewski, and put it in his [book http://www.dcc.ufmg.br/algoritmos/]. +The [CHM algorithm chm.html] is based on acyclic random graphs to generate +[order preserving minimal perfect hash functions concepts.html] in linear time. +Professor [Nivio Ziviani http://www.dcc.ufmg.br/~nivio] argued himself, why must the random graph -be acyclic? In the modified version availalbe in his [book http://www.dcc.ufmg.br/algoritmos/] he got rid of such restriction. +be acyclic? In the modified version availalbe in his [book http://www.dcc.ufmg.br/algoritmos/] he got rid of this restriction. The modification presented a problem, it was impossible to generate minimal perfect hash functions for sets with more than 1000 keys. @@ -32,19 +34,38 @@ During the master, [Fabiano http://www.dcc.ufmg.br/~fbotelho] and In april of 2004, [Fabiano http://www.dcc.ufmg.br/~fbotelho] was talking with a friend of him (David Menoti) about the problems and many ideas appeared. -The ideas were implemented and we noticed that a very fast algorithm to generate +The ideas were implemented and a very fast algorithm to generate minimal perfect hash functions had been designed. -We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho -David **M**enoti and Nivio **Z**iviani. The algorithm is described in [1]. +We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho, +David **M**enoti and Nivio **Z**iviani. The algorithm is described in [[1 #papers]]. To analyse BMZ algorithm we needed some results from the random graph theory, so we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. -The final description and analysis of BMZ algorithm is presented in [2]. +The final description and analysis of BMZ algorithm is presented in [[2 #papers]]. ---------------------------------------- ==The Algorithm== -Let us show how the minimal perfect hash function [figs/img7.png] will be constructed. +The BMZ algorithm shares several features with the [CHM algorithm chm.html]. +In particular, BMZ algorithm is also +based on the generation of random graphs [figs/img27.png], where [figs/img28.png] is in +one-to-one correspondence with the key set [figs/img20.png] for which we wish to +generate a [minimal perfect hash function concepts.html]. +The two main differences between BMZ algorithm and CHM algorithm +are as follows: (//i//) BMZ algorithm generates random +graphs [figs/img27.png] with [figs/img29.png] and [figs/img30.png], where [figs/img31.png], +and hence [figs/img32.png] necessarily contains cycles, +while CHM algorithm generates //acyclic// random +graphs [figs/img27.png] with [figs/img29.png] and [figs/img30.png], +with a greater number of vertices: [figs/img33.png]; +(//ii//) CHM algorithm generates [order preserving minimal perfect hash functions concepts.html] +while BMZ algorithm does not preserve order. Thus, BMZ algorithm improves +the space requirement at the expense of generating functions that are not +order preserving. + +Suppose [figs/img14.png] is a universe of //keys//. +Let [figs/img17.png] be a set of [figs/img8.png] keys from [figs/img14.png]. +Let us show how the BMZ algorithm constructs a minimal perfect hash function [figs/img7.png]. We make use of two auxiliary random functions [figs/img41.png] and [figs/img55.png], where [figs/img56.png] for some suitably chosen integer [figs/img57.png], where [figs/img58.png].We build a random graph [figs/img59.png] on [figs/img60.png], @@ -54,7 +75,7 @@ key in the set of keys [figs/img20.png]. In what follows, we shall be interested in the //2-core// of the random graph [figs/img32.png], that is, the maximal subgraph of [figs/img32.png] with minimal degree at -least 2 (see, e.g., [2] for details). +least 2 (see [[2 #papers]] for details). Because of its importance in our context, we call the 2-core the //critical// subgraph of [figs/img32.png] and denote it by [figs/img63.png]. The vertices and edges in [figs/img63.png] are said to be //critical//. @@ -65,7 +86,7 @@ We also let [figs/img67.png] be the set of all critical vertices that have at least one non-critical vertex as a neighbour. Let [figs/img68.png] be the set of //non-critical// edges in [figs/img32.png]. Finally, we let [figs/img69.png] be the //non-critical// subgraph -of [figs/img32.png. +of [figs/img32.png]. The non-critical subgraph [figs/img70.png] corresponds to the //acyclic part// of [figs/img32.png]. We have [figs/img71.png]. @@ -74,33 +95,222 @@ We then construct a suitable labelling [figs/img72.png] of the vertices of [figs/img32.png]: we choose [figs/img73.png] for each [figs/img74.png] in such a way that [figs/img75.png] ([figs/img18.png]) is a minimal perfect hash function for [figs/img20.png]. -We will see later on that this labelling [figs/img37.png] can be found in linear time -if the number of edges in [figs/img63.png] is at most [figs/img76.png]. +This labelling [figs/img37.png] can be found in linear time +if the number of edges in [figs/img63.png] is at most [figs/img76.png] (see [[2 #papers]] +for details). -Figure 2 presents a pseudo code for the algorithm. -The procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) receives as input the set of +Figure 1 presents a pseudo code for the BMZ algorithm. +The procedure BMZ ([figs/img20.png], [figs/img37.png]) receives as input the set of keys [figs/img20.png] and produces the labelling [figs/img37.png]. The method uses a mapping, ordering and searching approach. We now describe each step. -| procedure GenerateMPHF ([figs/img20.png], [figs/img37.png]) -|     Mapping ([figs/img20.png], [figs/img32.png]); -|     Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]); -|     Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]); -**Figure 2**: Main steps of the algorithm for constructing a minimal perfect hash function - -===Mapping Step=== - -===Ordering Step=== - -===Searching Step=== - -====Assignment of Values to Critical Vertices==== - -====Assignment of Values to Non-Critical Vertices==== + | procedure BMZ ([figs/img20.png], [figs/img37.png]) + |     Mapping ([figs/img20.png], [figs/img32.png]); + |     Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]); + |     Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]); + | **Figure 1**: Main steps of BMZ algorithm for constructing a minimal perfect hash function ---------------------------------------- -==The Heuristic== +===Mapping Step=== + +The procedure Mapping ([figs/img20.png], [figs/img32.png]) receives as input the set +of keys [figs/img20.png] and generates the random graph [figs/img59.png], by generating +two auxiliary functions [figs/img41.png], [figs/img78.png]. + +The functions [figs/img41.png] and [figs/img42.png] are constructed as follows. +We impose some upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. +To define [figs/img80.png] ([figs/img81.png], [figs/img62.png]), we generate +an [figs/img82.png] table of random integers [figs/img83.png]. +For a key [figs/img18.png] of length [figs/img84.png] and [figs/img85.png], we let + + | [figs/img86.png] + +The random graph [figs/img59.png] has vertex set [figs/img56.png] and +edge set [figs/img61.png]. We need [figs/img32.png] to be +simple, i.e., [figs/img32.png] should have neither loops nor multiple edges. +A loop occurs when [figs/img87.png] for some [figs/img18.png]. +We solve this in an ad hoc manner: we simply let [figs/img88.png] in this case. +If we still find a loop after this, we generate another pair [figs/img89.png]. +When a multiple edge occurs we abort and generate a new pair [figs/img89.png]. +Although the function above causes [collisions concepts.html] with probability //1/t//, +in [cmph library index.html] we use faster hash +functions ([DJB2 hash http://], [FNV hash http://], [Jenkins hash http://] +and [SDBM hash http://]) in which we do not need to impose any upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. + +As mentioned before, for us to find the labelling [figs/img72.png] of the +vertices of [figs/img59.png] in linear time, +we require that [figs/img108.png]. +The crucial step now is to determine the value +of [figs/img1.png] (in [figs/img57.png]) to obtain a random +graph [figs/img71.png] with [figs/img109.png]. +Botelho, Menoti an Ziviani determinded emprically in [[1 #papers]] that +the value of [figs/img1.png] is //1.15//. This value is remarkably +close to the theoretical value determined in [[2 #papers]], +which is around [figs/img112.png]. + +---------------------------------------- + +===Ordering Step=== + +The procedure Ordering ([figs/img32.png], [figs/img63.png], [figs/img70.png]) receives +as input the graph [figs/img32.png] and partitions [figs/img32.png] into the two +subgraphs [figs/img63.png] and [figs/img70.png], so that [figs/img71.png]. + +Figure 2 presents a sample graph with 9 vertices +and 8 edges, where the degree of a vertex is shown besides each vertex. +Initially, all vertices with degree 1 are added to a queue [figs/img136.png]. +For the example shown in Figure 2(a), [figs/img137.png] after the initialization step. + + | [figs/img138.png] + | **Figure 2:** Ordering step for a graph with 9 vertices and 8 edges. + +Next, we remove one vertex [figs/img139.png] from the queue, decrement its degree and +the degree of the vertices with degree greater than 0 in the adjacent +list of [figs/img139.png], as depicted in Figure 2(b) for [figs/img140.png]. +At this point, the adjacencies of [figs/img139.png] with degree 1 are +inserted into the queue, such as vertex 1. +This process is repeated until the queue becomes empty. +All vertices with degree 0 are non-critical vertices and the others are +critical vertices, as depicted in Figure 2(c). +Finally, to determine the vertices in [figs/img141.png] we collect all +vertices [figs/img142.png] with at least one vertex [figs/img143.png] that +is in Adj[figs/img144.png] and in [figs/img145.png], as the vertex 8 in Figure 2(c). + +---------------------------------------- + +===Searching Step=== + +In the searching step, the key part is +the //perfect assignment problem//: find [figs/img153.png] such that +the function [figs/img154.png] defined by + + | [figs/img155.png] + +is a bijection from [figs/img156.png] to [figs/img157.png] (recall [figs/img158.png]). +We are interested in a labelling [figs/img72.png] of +the vertices of the graph [figs/img59.png] with +the property that if [figs/img11.png] and [figs/img22.png] are keys +in [figs/img20.png], then [figs/img159.png]; that is, if we associate +to each edge the sum of the labels on its endpoints, then these values +should be all distinct. +Moreover, we require that all the sums [figs/img160.png] ([figs/img18.png]) +fall between [figs/img115.png] and [figs/img161.png], and thus we have a bijection +between [figs/img20.png] and [figs/img157.png]. + +The procedure Searching ([figs/img32.png], [figs/img63.png], [figs/img70.png], [figs/img37.png]) +receives as input [figs/img32.png], [figs/img63.png], [figs/img70.png] and finds a +suitable [figs/img162.png] bit value for each vertex [figs/img74.png], stored in the +array [figs/img37.png]. +This step is first performed for the vertices in the +critical subgraph [figs/img63.png] of [figs/img32.png] (the 2-core of [figs/img32.png]) +and then it is performed for the vertices in [figs/img70.png] (the non-critical subgraph +of [figs/img32.png] that contains the "acyclic part" of [figs/img32.png]). +The reason the assignment of the [figs/img37.png] values is first +performed on the vertices in [figs/img63.png] is to resolve reassignments +as early as possible (such reassignments are consequences of the cycles +in [figs/img63.png] and are depicted hereinafter). + +---------------------------------------- + +====Assignment of Values to Critical Vertices==== + +The labels [figs/img73.png] ([figs/img142.png]) +are assigned in increasing order following a greedy +strategy where the critical vertices [figs/img139.png] are considered one at a time, +according to a breadth-first search on [figs/img63.png]. +If a candidate value [figs/img11.png] for [figs/img73.png] is forbidden +because setting [figs/img163.png] would create two edges with the same sum, +we try [figs/img164.png] for [figs/img73.png]. This fact is referred to +as a //reassignment//. + +Let [figs/img165.png] be the set of addresses assigned to edges in [figs/img166.png]. +Initially [figs/img167.png]. +Let [figs/img11.png] be a candidate value for [figs/img73.png]. +Initially [figs/img168.png]. +Considering the subgraph [figs/img63.png] in Figure 2(c), +a step by step example of the assignment of values to vertices in [figs/img63.png] is +presented in Figure 3. +Initially, a vertex [figs/img139.png] is chosen, the assignment [figs/img163.png] is made +and [figs/img11.png] is set to [figs/img164.png]. +For example, suppose that vertex [figs/img169.png] in Figure 3(a) is +chosen, the assignment [figs/img170.png] is made and [figs/img11.png] is set to [figs/img96.png]. + + | [figs/img171.png] + | **Figure 3:** Example of the assignment of values to critical vertices. + +In Figure 3(b), following the adjacent list of vertex [figs/img169.png], +the unassigned vertex [figs/img115.png] is reached. +At this point, we collect in the temporary variable [figs/img172.png] all adjacencies +of vertex [figs/img115.png] that have been assigned an [figs/img11.png] value, +and [figs/img173.png]. +Next, for all [figs/img174.png], we check if [figs/img175.png]. +Since [figs/img176.png], then [figs/img177.png] is set +to [figs/img96.png], [figs/img11.png] is incremented +by 1 (now [figs/img178.png]) and [figs/img179.png]. +Next, vertex [figs/img180.png] is reached, [figs/img181.png] is set +to [figs/img62.png], [figs/img11.png] is set to [figs/img180.png] and [figs/img182.png]. +Next, vertex [figs/img183.png] is reached and [figs/img184.png]. +Since [figs/img185.png] and [figs/img186.png], then [figs/img187.png] is +set to [figs/img180.png], [figs/img11.png] is set to [figs/img183.png] and [figs/img188.png]. +Finally, vertex [figs/img189.png] is reached and [figs/img190.png]. +Since [figs/img191.png], [figs/img11.png] is incremented by 1 and set to 5, as depicted in +Figure 3(c). +Since [figs/img192.png], [figs/img11.png] is again incremented by 1 and set to 6, +as depicted in Figure 3(d). +These two reassignments are indicated by the arrows in Figure 3. +Since [figs/img193.png] and [figs/img194.png], then [figs/img195.png] is set +to [figs/img196.png] and [figs/img197.png]. This finishes the algorithm. + +---------------------------------------- + +====Assignment of Values to Non-Critical Vertices==== + +As [figs/img70.png] is acyclic, we can impose the order in which addresses are +associated with edges in [figs/img70.png], making this step simple to solve +by a standard depth first search algorithm. +Therefore, in the assignment of values to vertices in [figs/img70.png] we +benefit from the unused addresses in the gaps left by the assignment of values +to vertices in [figs/img63.png]. +For that, we start the depth-first search from the vertices in [figs/img141.png] because +the [figs/img37.png] values for these critical vertices were already assigned +and cannot be changed. + +Considering the subgraph [figs/img70.png] in Figure 2(c), +a step by step example of the assignment of values to vertices in [figs/img70.png] is +presented in Figure 4. +Figure 4(a) presents the initial state of the algorithm. +The critical vertex 8 is the only one that has non-critical vertices as +adjacent. +In the example presented in Figure 3, the addresses [figs/img198.png] were not used. +So, taking the first unused address [figs/img115.png] and the vertex [figs/img96.png], +which is reached from the vertex [figs/img169.png], [figs/img199.png] is set +to [figs/img200.png], as shown in Figure 4(b). +The only vertex that is reached from vertex [figs/img96.png] is vertex [figs/img62.png], so +taking the unused address [figs/img183.png] we set [figs/img201.png] to [figs/img202.png], +as shown in Figure 4(c). +This process is repeated until the UnAssignedAddresses list becomes empty. + + | [figs/img203.png] + | **Figure 4:** Example of the assignment of values to non-critical vertices. + +---------------------------------------- + +==The Heuristic==[heuristic] + +We now present an heuristic for BMZ algorithm that +reduces the value of [figs/img1.png] to any given value between //1.15// and //0.93//. +This reduces the space requirement to store the resulting function +to any given value between [figs/img12.png] words and [figs/img13.png] words. +The heuristic reuses, when possible, the set +of [figs/img11.png] values that caused reassignments, just before +trying [figs/img164.png]. +Decreasing the value of [figs/img1.png] leads to an increase in the number of +iterations to generate [figs/img32.png]. +For example, for [figs/img244.png] and [figs/img6.png], the analytical expected number +of iterations are [figs/img245.png] and [figs/img246.png], respectively (see [[2 #papers]] +for details), +while for [figs/img128.png] the same value is around //2.13//. ---------------------------------------- @@ -121,9 +331,10 @@ following: of 4 bytes that represent the vertices. As there are //n// edges, the vector edges is stored in //8n// bytes. - + **next**: given a vertex //v//, we can discover the edges that contain //v// - following its list of edges, which starts on first[//v//] and the next - edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + + **next**: given a vertex [figs/img139.png], we can discover the edges that + contain [figs/img139.png] following its list of edges, + which starts on first[[figs/img139.png]] and the next + edges are given by next[...first[[figs/img139.png]]...]. Therefore, the vectors first and next represent the linked lists of edges of each vertex. As there are two vertices for each edge, when an edge is iserted in the graph, it must be inserted in the two linked lists of the vertices in its composition. Therefore, there are //2n// entries of integer @@ -140,8 +351,8 @@ following: - Other auxiliary structures + **queue**: is a queue of integer numbers used in the breadth-first search of the assignment of values to critical vertices. There is an entry in the queue for - each two critical vertices. Let //|Vcrit|// be the expected number of critical - vertices. Therefore, the queue is stored in //4*0.5*|Vcrit|=2|Vcrit|//. + each two critical vertices. Let [figs/img110.png] be the expected number of critical + vertices. Therefore, the queue is stored in //4*0.5*[figs/img110.png]=2[figs/img110.png]//. + **visited**: is a vector of //cn// bits, where each bit indicates if the g value of a given vertex was already defined. Therefore, the vector visited is stored @@ -153,12 +364,15 @@ following: Thus, the total memory consumption of BMZ algorithm for generating a minimal -perfect hash function (MPHF) is: //(8.25c + 16.125)n +2|Vcrit| + O(1)// bytes. +perfect hash function (MPHF) is: //(8.25c + 16.125)n +2[figs/img110.png] + O(1)// bytes. As the value of constant //c// may be 1.15 and 0.93 we have: - || //c// | //|Vcrit|// | Memory consumption to generate a MPHF | + || //c// | [figs/img110.png] | Memory consumption to generate a MPHF | | 0.93 | //0.497n// | //24.80n + O(1)// | | 1.15 | //0.401n// | //26.42n + O(1)// | -The values of |Vcrit| were calculated using Eq.(1) presented in [2]. + + | **Table 1:** Memory consumption to generate a MPHF using the BMZ algorithm. + +The values of [figs/img110.png] were calculated using Eq.(1) presented in [[2 #papers]]. Now we present the memory consumption to store the resulting function. We only need to store the //g// function. Thus, we need //4cn// bytes. @@ -166,10 +380,17 @@ Again we have: || //c// | Memory consumption to store a MPHF | | 0.93 | //3.72n// | | 1.15 | //4.60n// | - + + | **Table 2:** Memory consumption to store a MPHF generated by the BMZ algorithm. ---------------------------------------- -==Papers== +==Experimental Results== + +[CHM x BMZ comparison.html] + +---------------------------------------- + +==Papers==[papers] + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. @@ -177,7 +398,7 @@ Again we have: ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index 8859eff..e3090dc 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -4,8 +4,11 @@ CHM Algorithm %!includeconf: CONFIG.t2t ---------------------------------------- + ==The Algorithm== +---------------------------------------- + ==Memory Consumption== Now we detail the memory consumption to generate and to store minimal perfect hash functions @@ -23,9 +26,11 @@ following: of 4 bytes that represent the vertices. As there are //n// edges, the vector edges is stored in //8n// bytes. - + **next**: given a vertex //v//, we can discover the edges that contain //v// - following its list of edges, which starts on first[//v//] and the next - edges are given by next[...first[//v//]...]. Therefore, the vectors first and next represent + + **next**: given a vertex [figs/img139.png], we can discover the edges that + contain [figs/img139.png] following its list of edges, which starts on + first[[figs/img139.png]] and the next + edges are given by next[...first[[figs/img139.png]]...]. Therefore, + the vectors first and next represent the linked lists of edges of each vertex. As there are two vertices for each edge, when an edge is iserted in the graph, it must be inserted in the two linked lists of the vertices in its composition. Therefore, there are //2n// entries of integer @@ -47,12 +52,23 @@ As the value of constant //c// must be at least 2.09 we have: || //c// | Memory consumption to generate a MPHF | | 2.09 | //33.00n + O(1)// | + | **Table 1:** Memory consumption to generate a MPHF using the CHM algorithm. + Now we present the memory consumption to store the resulting function. We only need to store the //g// function. Thus, we need //4cn// bytes. Again we have: || //c// | Memory consumption to store a MPHF | | 2.09 | //8.36n// | + | **Table 2:** Memory consumption to store a MPHF generated by the CHM algorithm. + +---------------------------------------- + +==Experimental Results== + +[CHM x BMZ comparison.html] + +---------------------------------------- ==Papers== @@ -66,7 +82,7 @@ Again we have: ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index a6ff823..1a6e328 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -5,17 +5,106 @@ Comparison Between BMZ And CHM Algorithms ---------------------------------------- -==Features== +==Characteristics== +Table 1 presents the main characteristics of the two algorithms. +The number of edges in the graph [figs/img27.png] is [figs/img236.png], +the number of keys in the input set [figs/img20.png]. +The number of vertices of [figs/img32.png] is equal +to [figs/img12.png] and [figs/img237.png] for BMZ algorithm and the CHM algorithm, respectively. +This measure is related to the amount of space to store the array [figs/img37.png]. +This improves the space required to store a function in BMZ algorithm to [figs/img238.png] of the space required by the CHM algorithm. +The number of critical edges is [figs/img76.png] and 0, for BMZ algorithm and the CHM algorithm, +respectively. +BMZ algorithm generates random graphs that necessarily contains cycles and the +CHM algorithm +generates +acyclic random graphs. +Finally, the CHM algorithm generates [order preserving functions concepts.html] +while BMZ algorithm does not preserve order. -==Constructing Minimal Perfect Hash Functions== - -==Memory Consumption== - - -==Run times== +%!include(html): ''TABLE1.t2t'' + | **Table 1:** Main characteristics of the algorithms. ---------------------------------------- -[Home index.html] + +==Memory Consumption== + +- Memory consumption to generate the minimal perfect hash function (MPHF): + || Algorithm | //c// | Memory consumption to generate a MPHF | + | BMZ | 0.93 | //24.80n + O(1)// | + | BMZ | 1.15 | //26.42n + O(1)// | + | CHM | 2.09 | //33.00n + O(1)// | + + | **Table 2:** Memory consumption to generate a MPHF using the algorithms BMZ and CHM. + +- Memory consumption to store the resulting minimal perfect hash function (MPHF): + || Algorithm | //c// | Memory consumption to store a MPHF | + | BMZ | 0.93 | //3.72n// | + | BMZ | 1.15 | //4.60n// | + | CHM | 2.09 | //8.36n// | + + | **Table 3:** Memory consumption to store a MPHF generated by the algorithms BMZ and CHM. + +---------------------------------------- + +==Run times== +We now present some experimental results to compare the BMZ and CHM algorithms. +The data consists of a collection of 100 million universe resource locations +(URLs) collected from the Web. +The average length of a URL in the collection is 63 bytes. +All experiments were carried on +a computer running the Linux operating system, version 2.6.7, +with a 2.4 gigahertz processor and +4 gigabytes of main memory. + +Table 4 presents time measurements. +All times are in seconds. +The table entries represent averages over 50 trials. +The column labelled as [figs/img243.png] represents +the number of iterations to generate the random graph [figs/img32.png] in the +mapping step of the algorithms. +The next columns represent the run times +for the mapping plus ordering steps together and the searching +step for each algorithm. +The last column represents the percent gain of our algorithm +over the CHM algorithm. + +%!include(html): ''TABLE4.t2t'' + | **Table 4:** Time measurements for BMZ and the CHM algorithm. + +The mapping step of the BMZ algorithm is faster because +the expected number of iterations in the mapping step to generate [figs/img32.png] are +2.13 and 2.92 for BMZ algorithm and the CHM algorithm, respectively +(see [[2 bmz.html#papers]] for details). +The graph [figs/img32.png] generated by BMZ algorithm +has [figs/img12.png] vertices, against [figs/img237.png] for the CHM algorithm. +These two facts make BMZ algorithm faster in the mapping step. +The ordering step of BMZ algorithm is approximately equal to +the time to check if [figs/img32.png] is acyclic for the CHM algorithm. +The searching step of the CHM algorithm is faster, but the total +time of BMZ algorithm is, on average, approximately 59 % faster +than the CHM algorithm. +It is important to notice the times for the searching step: +for both algorithms they are not the dominant times, +and the experimental results clearly show +a linear behavior for the searching step. + +We now present run times for BMZ algorithm using a [heuristic bmz.html#heuristic] that +reduces the space requirement +to any given value between [figs/img12.png] words and [figs/img13.png] words. +For example, for [figs/img244.png] and [figs/img6.png], the analytical expected number +of iterations are [figs/img245.png] and [figs/img246.png], respectively +(for [figs/img247.png], the number of iterations are 2.78 for [figs/img244.png] and 3.04 +for [figs/img6.png]). +Table 5 presents the total times to construct a +function for [figs/img247.png], with an increase from [figs/img248.png] seconds +for [figs/img128.png] (see Table 4) to [figs/img249.png] seconds for [figs/img244.png] and +to [figs/img250.png] seconds for [figs/img6.png]. + +%!include(html): ''TABLE5.t2t'' + | **Table 5:** Time measurements for BMZ tuned algorithm with [figs/img5.png] and [figs/img6.png]. +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/CONCEPTS.t2t b/CONCEPTS.t2t new file mode 100644 index 0000000..49bedde --- /dev/null +++ b/CONCEPTS.t2t @@ -0,0 +1,56 @@ +Minimal Perfect Hash Functions - Introduction + + +%!includeconf: CONFIG.t2t + +---------------------------------------- +==Basic Concepts== + +Suppose [figs/img14.png] is a universe of //keys//. +Let [figs/img15.png] be a //hash function// that maps the keys from [figs/img14.png] to a given interval of integers [figs/img16.png]. +Let [figs/img17.png] be a set of [figs/img8.png] keys from [figs/img14.png]. +Given a key [figs/img18.png], the hash function [figs/img7.png] computes an +integer in [figs/img19.png] for the storage or retrieval of [figs/img11.png] in +a //hash table//. +Hashing methods for //non-static sets// of keys can be used to construct +data structures storing [figs/img20.png] and supporting membership queries +"[figs/img18.png]?" in expected time [figs/img21.png]. +However, they involve a certain amount of wasted space owing to unused +locations in the table and waisted time to resolve collisions when +two keys are hashed to the same table location. + +For //static sets// of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +//perfect//. +More precisely, given a set of keys [figs/img20.png], we shall say that a +hash function [figs/img15.png] is a //perfect hash function// +for [figs/img20.png] if [figs/img7.png] is an injection on [figs/img20.png], +that is, there are no //collisions// among the keys in [figs/img20.png]: +if [figs/img11.png] and [figs/img22.png] are in [figs/img20.png] and [figs/img23.png], +then [figs/img24.png]. +Figure 1(a) illustrates a perfect hash function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If [figs/img25.png], that is, the table has the same size as [figs/img20.png], +then we say that [figs/img7.png] is a //minimal perfect hash function// +for [figs/img20.png]. +Figure 1(b) illustrates a minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. A perfect hash function [figs/img7.png] is //order preserving// +if the keys in [figs/img20.png] are arranged in some given order +and [figs/img7.png] preserves this order in the hash table. + + | [figs/img26.png] + | **Figure 1:** (a) Perfect hash function. (b) Minimal perfect hash function. + +Minimal perfect hash functions are widely used for memory efficient +storage and fast retrieval of items from static sets, such as words in natural +languages, reserved words in programming languages or interactive systems, +universal resource locations (URLs) in Web search engines, or item sets in +data mining techniques. + +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] +---------------------------------------- + +%!include: FOOTER.t2t diff --git a/CONFIG.t2t b/CONFIG.t2t index 19dd4e9..cf391eb 100644 --- a/CONFIG.t2t +++ b/CONFIG.t2t @@ -1,4 +1,46 @@ +%! style(html): DOC.css %! PreProc(html): '^%html% ' '' %! PreProc(txt): '^%txt% ' '' %! PostProc(html): "&" "&" %! PostProc(txt): " " " " +%! PostProc(html): 'ALIGN="middle" SRC="figs/img7.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img7.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img57.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img57.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img32.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img32.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img20.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img20.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img60.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img60.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img62.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img62.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img79.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img79.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img139.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img139.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img140.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img140.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img143.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img143.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img115.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img115.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img11.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img11.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img169.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img169.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img96.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img96.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img178.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img178.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img180.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img180.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img183.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img183.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img189.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img189.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img196.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img196.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img172.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img172.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img8.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img8.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img1.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img1.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img14.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img14.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img128.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img128.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img112.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img112.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img12.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img12.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img13.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img13.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img244.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img244.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img245.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img245.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img246.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img246.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img15.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img15.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img25.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img25.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img168.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img168.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img6.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img6.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img5.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img5.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img28.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img28.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img237.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img237.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img248.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img237.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img248.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img237.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img249.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img249.png"\1>' +%! PostProc(html): 'ALIGN="middle" SRC="figs/img250.png"(.*?)>' 'ALIGN="bottom" SRC="figs/img250.png"\1>' diff --git a/DOC.css b/DOC.css new file mode 100644 index 0000000..db09b2d --- /dev/null +++ b/DOC.css @@ -0,0 +1,33 @@ +/* implement both fixed-size and relative sizes */ +SMALL.XTINY { } +SMALL.TINY { } +SMALL.SCRIPTSIZE { } +BODY { font-size: 13 } +TD { font-size: 13 } +SMALL.FOOTNOTESIZE { font-size: 13 } +SMALL.SMALL { } +BIG.LARGE { } +BIG.XLARGE { } +BIG.XXLARGE { } +BIG.HUGE { } +BIG.XHUGE { } + +/* heading styles */ +H1 { } +H2 { } +H3 { } +H4 { } +H5 { } + + +/* mathematics styles */ +DIV.displaymath { } /* math displays */ +TD.eqno { } /* equation-number cells */ + + +/* document-specific styles come next */ +DIV.navigation { } +DIV.center { } +SPAN.textit { font-style: italic } +SPAN.arabic { } +SPAN.eqn-number { } diff --git a/FAQ.t2t b/FAQ.t2t index 1ce1774..05ca410 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -1,6 +1,7 @@ CMPH FAQ +%!includeconf: CONFIG.t2t - How do I define the ids of the keys? - You don't. The ids will be assigned by the algorithm creating the minimal @@ -26,7 +27,7 @@ one is executed? ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/GPERF.t2t b/GPERF.t2t index 61190b9..67d5d40 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -1,6 +1,7 @@ GPERF versus CMPH +%!includeconf: CONFIG.t2t You might ask why cmph if [gperf http://www.gnu.org/software/gperf/gperf.html] already works perfectly. Actually, gperf and cmph have different goals. @@ -32,7 +33,7 @@ assigning ids to millions of documents), while the former is usually found in the compiler programming area (detect reserved keywords). ---------------------------------------- -[Home index.html] + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ---------------------------------------- %!include: FOOTER.t2t diff --git a/LOGO.t2t b/LOGO.t2t new file mode 100644 index 0000000..dc245a8 --- /dev/null +++ b/LOGO.t2t @@ -0,0 +1 @@ +SourceForge.net Logo diff --git a/README.t2t b/README.t2t index e491c32..7ddc1ec 100644 --- a/README.t2t +++ b/README.t2t @@ -8,7 +8,8 @@ CMPH - C Minimal Perfect Hashing Library ==Description== C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hash functions. The cmph library encapsulates the newest +to work with [minimal perfect hash functions concepts.html]. +The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that can not fit in the main memory. It has been used successfully for constructing minimal perfect @@ -54,7 +55,7 @@ of the distinguishable features of cmph: - New heuristic added to the bmz algorithm permits to generate a mphf with only //24.6n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. -%html% [click here bmz.html] for details. +%html% [click here bmz.html#heuristic] for details. ---------------------------------------- @@ -173,5 +174,5 @@ Code is under the LGPL. %!include: FOOTER.t2t -%!include(html): ''LOGO.html'' +%!include(html): ''LOGO.t2t'' Last Updated: %%date(%c) diff --git a/TABLE1.t2t b/TABLE1.t2t new file mode 100644 index 0000000..402a854 --- /dev/null +++ b/TABLE1.t2t @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Characteristics Algorithms
+ + BMZ CHM
+ +$c$ 1.15 2.09
+$\vert E(G)\vert$ $n$ $n$
+$\vert V(G)\vert=\vert g\vert$ $cn$ $cn$
+ +$\vert E(G_{\rm crit})\vert$ $0.5\vert E(G)\vert$ 0
+$G$ cyclic acyclic
+Order preserving no yes
\ No newline at end of file diff --git a/TABLE4.t2t b/TABLE4.t2t new file mode 100644 index 0000000..350fa1e --- /dev/null +++ b/TABLE4.t2t @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$n$ BMZ +CHM algorithm Gain
+ $N_i$ Map+Ord +Search Total +$N_i$ Map+Ord Search +Total (%)
1,562,500 2.28 8.54 2.37 10.91 2.70 14.56 1.57 16.13 48
3,125,000 2.16 15.92 4.88 20.80 2.85 30.36 3.20 33.56 61
6,250,000 2.20 33.09 10.48 43.57 2.90 62.26 6.76 69.02 58
12,500,000 2.00 63.26 23.04 86.30 2.60 117.99 14.94 132.92 54
25,000,000 2.00 130.79 51.55 182.34 2.80 262.05 33.68 295.73 62
50,000,000 2.07 273.75 114.12 387.87 2.90 577.59 73.97 651.56 68
100,000,000 2.07 567.47 243.13 810.60 2.80 1,131.06 157.23 1,288.29 59
diff --git a/TABLE5.t2t b/TABLE5.t2t new file mode 100644 index 0000000..8cf966a --- /dev/null +++ b/TABLE5.t2t @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
$n$ BMZ $c=1.00$ + BMZ $c=0.93$
+ $N_i$ Map+Ord +Search Total +$N_i$ Map+Ord Search +Total
12,500,000 2.78 76.68 25.06 101.74 3.04 76.39 25.80 102.19
\ No newline at end of file From 00c77e2038ef50697c6c364ce3656fe86bbd3517 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 31 Jan 2005 19:09:29 +0000 Subject: [PATCH 089/739] DJB2, SDBM, FNV and Jenkins hash link were added --- BMZ.t2t | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 08c8ce2..b7ec249 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -135,8 +135,9 @@ If we still find a loop after this, we generate another pair [figs/img89.png]. When a multiple edge occurs we abort and generate a new pair [figs/img89.png]. Although the function above causes [collisions concepts.html] with probability //1/t//, in [cmph library index.html] we use faster hash -functions ([DJB2 hash http://], [FNV hash http://], [Jenkins hash http://] -and [SDBM hash http://]) in which we do not need to impose any upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. +functions ([DJB2 hash http://www.cs.yorku.ca/~oz/hash.html], [FNV hash http://www.isthe.com/chongo/tech/comp/fnv/], + [Jenkins hash http://burtleburtle.net/bob/hash/doobs.html] and [SDBM hash http://www.cs.yorku.ca/~oz/hash.html]) + in which we do not need to impose any upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. As mentioned before, for us to find the labelling [figs/img72.png] of the vertices of [figs/img59.png] in linear time, From e2b4c10e743e19691ff6a63b60eaf9131c02c63e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 31 Jan 2005 19:09:29 +0000 Subject: [PATCH 090/739] DJB2, SDBM, FNV and Jenkins hash link were added --- BMZ.t2t | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 08c8ce2..b7ec249 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -135,8 +135,9 @@ If we still find a loop after this, we generate another pair [figs/img89.png]. When a multiple edge occurs we abort and generate a new pair [figs/img89.png]. Although the function above causes [collisions concepts.html] with probability //1/t//, in [cmph library index.html] we use faster hash -functions ([DJB2 hash http://], [FNV hash http://], [Jenkins hash http://] -and [SDBM hash http://]) in which we do not need to impose any upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. +functions ([DJB2 hash http://www.cs.yorku.ca/~oz/hash.html], [FNV hash http://www.isthe.com/chongo/tech/comp/fnv/], + [Jenkins hash http://burtleburtle.net/bob/hash/doobs.html] and [SDBM hash http://www.cs.yorku.ca/~oz/hash.html]) + in which we do not need to impose any upper bound [figs/img79.png] on the lengths of the keys in [figs/img20.png]. As mentioned before, for us to find the labelling [figs/img72.png] of the vertices of [figs/img59.png] in linear time, From 60819c778efa9e1b70a14f13360190bd3b573651 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 31 Jan 2005 19:13:56 +0000 Subject: [PATCH 091/739] Heuristic BMZ memory consumption was updated --- README.t2t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.t2t b/README.t2t index 7ddc1ec..d5fe5a9 100644 --- a/README.t2t +++ b/README.t2t @@ -54,7 +54,7 @@ of the distinguishable features of cmph: ==News for version 0.3== - New heuristic added to the bmz algorithm permits to generate a mphf with only - //24.6n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. + //24.80n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. %html% [click here bmz.html#heuristic] for details. From 1eac6fe7270af148cce86b481082cb2af4d359d2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 31 Jan 2005 19:13:56 +0000 Subject: [PATCH 092/739] Heuristic BMZ memory consumption was updated --- README.t2t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.t2t b/README.t2t index 7ddc1ec..d5fe5a9 100644 --- a/README.t2t +++ b/README.t2t @@ -54,7 +54,7 @@ of the distinguishable features of cmph: ==News for version 0.3== - New heuristic added to the bmz algorithm permits to generate a mphf with only - //24.6n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. + //24.80n + O(1)// bytes. The resulting function can be stored in //3.72n// bytes. %html% [click here bmz.html#heuristic] for details. From 670212dbf885edf1f8800edcd65ae8b6464cd3d4 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 17 Feb 2005 18:20:14 +0000 Subject: [PATCH 093/739] The way of calling the function cmph_search was fixed in the file README.t2t --- LOGO.html | 1 - README.t2t | 4 ++-- gendocs | 2 ++ 3 files changed, 4 insertions(+), 3 deletions(-) delete mode 100644 LOGO.html diff --git a/LOGO.html b/LOGO.html deleted file mode 100644 index dc245a8..0000000 --- a/LOGO.html +++ /dev/null @@ -1 +0,0 @@ -SourceForge.net Logo diff --git a/README.t2t b/README.t2t index d5fe5a9..00cd139 100644 --- a/README.t2t +++ b/README.t2t @@ -82,7 +82,7 @@ Using cmph is quite simple. Take a look. //Find key const char *key = "sample key"; - unsigned int id = cmph_search(hash, key); + unsigned int id = cmph_search(hash, key, strlen(key)); //Destroy hash cmph_destroy(hash); @@ -107,7 +107,7 @@ Using cmph is quite simple. Take a look. //Find key const char *key = "sample key"; - unsigned int id = cmph_search(hash, key); + unsigned int id = cmph_search(hash, key, strlen(key)); //Destroy hash cmph_destroy(hash); diff --git a/gendocs b/gendocs index e7c5e3e..7885281 100755 --- a/gendocs +++ b/gendocs @@ -4,6 +4,7 @@ txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html txt2tags -t html -i FAQ.t2t -o faq.html +txt2tags -t html -i CONCEPTS.t2t -o concepts.html txt2tags -t txt --mask-email -i README.t2t -o README txt2tags -t txt -i BMZ.t2t -o BMZ @@ -11,3 +12,4 @@ txt2tags -t txt -i CHM.t2t -o CHM txt2tags -t txt -i COMPARISON.t2t -o COMPARISON txt2tags -t txt -i GPERF.t2t -o GPERF txt2tags -t txt -i FAQ.t2t -o FAQ +txt2tags -t txt -i CONCEPTS.t2t -o CONCEPTS From 2a1914c0d8b37b06f38d62988e00d38073bd1141 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 17 Feb 2005 18:20:14 +0000 Subject: [PATCH 094/739] The way of calling the function cmph_search was fixed in the file README.t2t --- LOGO.html | 1 - README | 58 +++++++++++++++++++++++++++++++++--------------------- README.t2t | 4 ++-- gendocs | 2 ++ 4 files changed, 40 insertions(+), 25 deletions(-) delete mode 100644 LOGO.html diff --git a/LOGO.html b/LOGO.html deleted file mode 100644 index dc245a8..0000000 --- a/LOGO.html +++ /dev/null @@ -1 +0,0 @@ -SourceForge.net Logo diff --git a/README b/README index c133566..a84c3e9 100644 --- a/README +++ b/README @@ -2,14 +2,17 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- -Description + + Description + =========== C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hashing functions. The cmph library encapsulates the newest +to work with minimal perfect hash functions (concepts.html). +The cmph library encapsulates the newest and more efficient algorithms (available in the literature) in an easy-to-use, production-quality and fast API. The library is designed to work with big entries that can not fit in the main memory. It has been used successfully for constructing minimal perfect -hashing functions for sets with more than 100 million of keys. +hash functions for sets with more than 100 million of keys. Although there is a lack of similar libraries in the free software world (gperf is a bit different (gperf.html)), we can point out some of the distinguishable features of cmph: @@ -27,7 +30,9 @@ of the distinguishable features of cmph: ---------------------------------------- -Supported Algorithms + + Supported Algorithms + ==================== - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal @@ -40,15 +45,18 @@ Supported Algorithms ---------------------------------------- -News for version 0.3 + + News for version 0.3 + ==================== - New heuristic added to the bmz algorithm permits to generate a mphf with only - 24.61*n + O(1) bytes. The resulting function can be stored in 3.72*n bytes. - click here (bmz.html) for details. + 24.80n + O(1) bytes. The resulting function can be stored in 3.72n bytes. ---------------------------------------- -Examples + + Examples + ======== Using cmph is quite simple. Take a look. @@ -62,14 +70,14 @@ Using cmph is quite simple. Take a look. //Fill vector //... - //Create minimal perfect hashing function using the default(chm) algorithm. + //Create minimal perfect hash function using the default(chm) algorithm. cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); //Find key const char *key = "sample key"; - unsigned int id = cmph_search(hash, key); + unsigned int id = cmph_search(hash, key, strlen(key)); //Destroy hash cmph_destroy(hash); @@ -94,21 +102,23 @@ Using cmph is quite simple. Take a look. //Find key const char *key = "sample key"; - unsigned int id = cmph_search(hash, key); + unsigned int id = cmph_search(hash, key, strlen(key)); //Destroy hash cmph_destroy(hash); -------------------------------------- -The cmph application + + The cmph application + ==================== cmph is the name of both the library and the utility application that comes with this package. You can use the cmph -application for constructing minimal perfect hashing functions from the command line. +application for constructing minimal perfect hash functions from the command line. The cmph utility comes with a number of flags, but it is very simple to create and to query -minimal perfect hashing functions: +minimal perfect hash functions: $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file @@ -133,9 +143,7 @@ utility. -f hash function (may be used multiple times) - valid values are * djb2 * fnv - * glib * jenkins - * pjw * sdbm -V print version number and exit -v increase verbosity (may be used multiple times) @@ -146,15 +154,21 @@ utility. keysfile line separated file with keys -Additional Documentation + + Additional Documentation + ======================== FAQ (faq.html) -Downloads + + Downloads + ========= Use the project page at sourceforge: http://sf.net/projects/cmph -License Stuff + + License Stuff + ============= Code is under the LGPL. @@ -162,11 +176,11 @@ Code is under the LGPL. Enjoy! -Davi de Castro Reis +Davi de Castro Reis (davi@users.sourceforge.net) -Fabiano Cupertino Botelho +Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) -Last Updated: Thu Jan 27 10:54:36 2005 +Last Updated: Thu Feb 17 13:09:55 2005 diff --git a/README.t2t b/README.t2t index d5fe5a9..00cd139 100644 --- a/README.t2t +++ b/README.t2t @@ -82,7 +82,7 @@ Using cmph is quite simple. Take a look. //Find key const char *key = "sample key"; - unsigned int id = cmph_search(hash, key); + unsigned int id = cmph_search(hash, key, strlen(key)); //Destroy hash cmph_destroy(hash); @@ -107,7 +107,7 @@ Using cmph is quite simple. Take a look. //Find key const char *key = "sample key"; - unsigned int id = cmph_search(hash, key); + unsigned int id = cmph_search(hash, key, strlen(key)); //Destroy hash cmph_destroy(hash); diff --git a/gendocs b/gendocs index e7c5e3e..7885281 100755 --- a/gendocs +++ b/gendocs @@ -4,6 +4,7 @@ txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html txt2tags -t html -i FAQ.t2t -o faq.html +txt2tags -t html -i CONCEPTS.t2t -o concepts.html txt2tags -t txt --mask-email -i README.t2t -o README txt2tags -t txt -i BMZ.t2t -o BMZ @@ -11,3 +12,4 @@ txt2tags -t txt -i CHM.t2t -o CHM txt2tags -t txt -i COMPARISON.t2t -o COMPARISON txt2tags -t txt -i GPERF.t2t -o GPERF txt2tags -t txt -i FAQ.t2t -o FAQ +txt2tags -t txt -i CONCEPTS.t2t -o CONCEPTS From c3578666ac223055cec13c3950f3dc23dae0b44b Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 28 Feb 2005 22:53:40 +0000 Subject: [PATCH 095/739] Fixed off by one bug in chm. --- src/chm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chm.c b/src/chm.c index 486d438..983bc3b 100644 --- a/src/chm.c +++ b/src/chm.c @@ -279,7 +279,7 @@ cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > chm->n) h2 = 0; + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); return (chm->g[h1] + chm->g[h2]) % chm->m; } From 1a986bfbca4d5ddd54fd964095ceaa5919954c0f Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 28 Feb 2005 22:53:40 +0000 Subject: [PATCH 096/739] Fixed off by one bug in chm. --- src/chm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chm.c b/src/chm.c index 486d438..983bc3b 100644 --- a/src/chm.c +++ b/src/chm.c @@ -279,7 +279,7 @@ cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > chm->n) h2 = 0; + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); return (chm->g[h1] + chm->g[h2]) % chm->m; } From e7a99efa0e2bf37962356cda5b32478a76380df6 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 21:26:17 +0000 Subject: [PATCH 097/739] it was included a examples directory --- Makefile.am | 2 +- configure.ac | 2 +- examples/Makefile | 331 ++++++++++++++++++++++++++++++++++ examples/Makefile.am | 10 + examples/Makefile.in | 331 ++++++++++++++++++++++++++++++++++ examples/file_adapter_ex2.c | 32 ++++ examples/keys.txt | 10 + examples/vector_adapter_ex1.c | 26 +++ src/cmph.c | 29 ++- src/cmph.h | 2 +- 10 files changed, 771 insertions(+), 4 deletions(-) create mode 100644 examples/Makefile create mode 100755 examples/Makefile.am create mode 100755 examples/Makefile.in create mode 100644 examples/file_adapter_ex2.c create mode 100644 examples/keys.txt create mode 100755 examples/vector_adapter_ex1.c diff --git a/Makefile.am b/Makefile.am index c735106..a8d050c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = src tests +SUBDIRS = src tests examples EXTRA_DIST = cmph.spec configure.ac diff --git a/configure.ac b/configure.ac index 9986da0..f3b0bb1 100644 --- a/configure.ac +++ b/configure.ac @@ -35,4 +35,4 @@ dnl Checks for library functions. AC_CHECK_SPOON dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) -AC_OUTPUT(Makefile src/Makefile tests/Makefile) +AC_OUTPUT(Makefile src/Makefile tests/Makefile examples/Makefile) diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..f7bab29 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,331 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. + +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include +pkgdatadir = $(datadir)/cmph +pkglibdir = $(libdir)/cmph +pkgincludedir = $(includedir)/cmph +top_builddir = .. + +ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal +AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf +AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake +AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL} +INSTALL_HEADER = $(INSTALL_DATA) +transform = s,x,x, +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = +host_triplet = i686-pc-linux-gnu +AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar +AR = ar +AS = @AS@ +AWK = gawk +CC = gcc +CXX = g++ +CXXCPP = g++ -E +DEPDIR = .deps +DLLTOOL = @DLLTOOL@ +ECHO = echo +EGREP = grep -E +EXEEXT = +F77 = +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ +GETCONF = getconf +INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +OBJDUMP = @OBJDUMP@ +OBJEXT = o +PACKAGE = cmph +RANLIB = ranlib +RC = @RC@ +STRIP = strip +VERSION = 0.3 +am__include = include +am__quote = +install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh + +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c +subdir = examples +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) +file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) +file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la +file_adapter_ex2_LDFLAGS = +am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) +vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) +vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la +vector_adapter_ex1_LDFLAGS = + +DEFS = -DHAVE_CONFIG_H +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = +LDFLAGS = -lm +LIBS = +depcomp = $(SHELL) $(top_srcdir)/depcomp +DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ + $(DEPDIR)/vector_adapter_ex1.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 +DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +include $(DEPDIR)/file_adapter_ex2.Po +include $(DEPDIR)/vector_adapter_ex1.Po + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: + source='$<' object='$@' libtool=no \ + depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ + $(CCDEPMODE) $(depcomp) \ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: + source='$<' object='$@' libtool=no \ + depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ + $(CCDEPMODE) $(depcomp) \ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: + source='$<' object='$@' libtool=yes \ + depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ + $(CCDEPMODE) $(depcomp) \ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = depmode=gcc3 +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/Makefile.am b/examples/Makefile.am new file mode 100755 index 0000000..812919f --- /dev/null +++ b/examples/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c + diff --git a/examples/Makefile.in b/examples/Makefile.in new file mode 100755 index 0000000..513ea93 --- /dev/null +++ b/examples/Makefile.in @@ -0,0 +1,331 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ +GETCONF = @GETCONF@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +RC = @RC@ +STRIP = @STRIP@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c +subdir = examples +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) +file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) +file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la +file_adapter_ex2_LDFLAGS = +am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) +vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) +vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la +vector_adapter_ex1_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ +@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c new file mode 100644 index 0000000..57ec5b6 --- /dev/null +++ b/examples/file_adapter_ex2.c @@ -0,0 +1,32 @@ +#include +#include + + // Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} diff --git a/examples/keys.txt b/examples/keys.txt new file mode 100644 index 0000000..e1edd7c --- /dev/null +++ b/examples/keys.txt @@ -0,0 +1,10 @@ +aaaaaaaaaa +bbbbbbbbbb +cccccccccc +dddddddddd +eeeeeeeeee +ffffffffff +gggggggggg +hhhhhhhhhh +iiiiiiiiii +jjjjjjjjjj diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c new file mode 100755 index 0000000..1ae8abb --- /dev/null +++ b/examples/vector_adapter_ex1.c @@ -0,0 +1,26 @@ +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} diff --git a/src/cmph.c b/src/cmph.c index 490db0e..18ac502 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -12,6 +12,8 @@ const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +static cmph_uint32 position; // access position when data is a vector + static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { FILE *fd = (FILE *)data; @@ -37,16 +39,34 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + char **keys = (char **)data; + if (keys + position == NULL) return -1; + *keylen = strlen(*(keys + position)); + *key = (char *)malloc(*keylen); + strcpy(*key, *(keys + position)); + position ++; + return *keylen; +} + + static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) { free(key); } + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; rewind(fd); } +static void key_vector_rewind(void *data) +{ + position = 0; +} + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -89,7 +109,14 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) { - return NULL; + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)vector; + key_source->nkeys = nkeys; + key_source->read = key_vector_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_vector_rewind; + return key_source; } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index f457736..a7de997 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -/*cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys);*/ +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); From 6aeb1033ed85fc95ab6a255f8c3884caca65f718 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 21:26:17 +0000 Subject: [PATCH 098/739] it was included a examples directory --- Makefile.am | 2 +- configure.ac | 2 +- examples/Makefile.am | 10 ++++++++++ examples/file_adapter_ex2.c | 32 ++++++++++++++++++++++++++++++++ examples/keys.txt | 10 ++++++++++ examples/vector_adapter_ex1.c | 26 ++++++++++++++++++++++++++ src/cmph.c | 29 ++++++++++++++++++++++++++++- src/cmph.h | 2 +- 8 files changed, 109 insertions(+), 4 deletions(-) create mode 100755 examples/Makefile.am create mode 100644 examples/file_adapter_ex2.c create mode 100644 examples/keys.txt create mode 100755 examples/vector_adapter_ex1.c diff --git a/Makefile.am b/Makefile.am index c735106..a8d050c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = src tests +SUBDIRS = src tests examples EXTRA_DIST = cmph.spec configure.ac diff --git a/configure.ac b/configure.ac index 9986da0..f3b0bb1 100644 --- a/configure.ac +++ b/configure.ac @@ -35,4 +35,4 @@ dnl Checks for library functions. AC_CHECK_SPOON dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) -AC_OUTPUT(Makefile src/Makefile tests/Makefile) +AC_OUTPUT(Makefile src/Makefile tests/Makefile examples/Makefile) diff --git a/examples/Makefile.am b/examples/Makefile.am new file mode 100755 index 0000000..812919f --- /dev/null +++ b/examples/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c + diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c new file mode 100644 index 0000000..57ec5b6 --- /dev/null +++ b/examples/file_adapter_ex2.c @@ -0,0 +1,32 @@ +#include +#include + + // Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} diff --git a/examples/keys.txt b/examples/keys.txt new file mode 100644 index 0000000..e1edd7c --- /dev/null +++ b/examples/keys.txt @@ -0,0 +1,10 @@ +aaaaaaaaaa +bbbbbbbbbb +cccccccccc +dddddddddd +eeeeeeeeee +ffffffffff +gggggggggg +hhhhhhhhhh +iiiiiiiiii +jjjjjjjjjj diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c new file mode 100755 index 0000000..1ae8abb --- /dev/null +++ b/examples/vector_adapter_ex1.c @@ -0,0 +1,26 @@ +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} diff --git a/src/cmph.c b/src/cmph.c index 490db0e..18ac502 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -12,6 +12,8 @@ const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +static cmph_uint32 position; // access position when data is a vector + static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { FILE *fd = (FILE *)data; @@ -37,16 +39,34 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + char **keys = (char **)data; + if (keys + position == NULL) return -1; + *keylen = strlen(*(keys + position)); + *key = (char *)malloc(*keylen); + strcpy(*key, *(keys + position)); + position ++; + return *keylen; +} + + static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) { free(key); } + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; rewind(fd); } +static void key_vector_rewind(void *data) +{ + position = 0; +} + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -89,7 +109,14 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) { - return NULL; + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)vector; + key_source->nkeys = nkeys; + key_source->read = key_vector_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_vector_rewind; + return key_source; } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index f457736..a7de997 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -/*cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys);*/ +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); From 5555a422847027bc7336c9197538b0a36df98cc8 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 21:26:17 +0000 Subject: [PATCH 099/739] it was included a examples directory --- INSTALL | 161 +++++-------- Makefile.am | 2 +- configure.ac | 2 +- examples/.deps/file_adapter_ex2.Po | 80 +++++++ examples/.deps/vector_adapter_ex1.Po | 80 +++++++ examples/Makefile | 331 +++++++++++++++++++++++++++ examples/Makefile.am | 10 + examples/Makefile.in | 331 +++++++++++++++++++++++++++ examples/file_adapter_ex2.c | 32 +++ examples/keys.txt | 10 + examples/vector_adapter_ex1.c | 26 +++ src/cmph.c | 29 ++- src/cmph.h | 2 +- 13 files changed, 987 insertions(+), 109 deletions(-) create mode 100644 examples/.deps/file_adapter_ex2.Po create mode 100644 examples/.deps/vector_adapter_ex1.Po create mode 100644 examples/Makefile create mode 100755 examples/Makefile.am create mode 100755 examples/Makefile.in create mode 100644 examples/file_adapter_ex2.c create mode 100644 examples/keys.txt create mode 100755 examples/vector_adapter_ex1.c diff --git a/INSTALL b/INSTALL index 095b1eb..b42a17a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,43 +1,27 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: @@ -70,22 +54,20 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -93,28 +75,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +107,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,80 +122,47 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If +See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't -need to know the machine type. +need to know the host type. - If you are _building_ compiler tools for cross-compiling, you should + If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Defining Variables +Operation Controls ================== -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. + `configure' recognizes the following options to control how it +operates. `--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +`--help' + Print a summary of the options to `configure', and exit. `--quiet' `--silent' @@ -226,6 +175,8 @@ overridden in the site shell script). Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. +`configure' also accepts some other, not widely useful, options. diff --git a/Makefile.am b/Makefile.am index c735106..a8d050c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = src tests +SUBDIRS = src tests examples EXTRA_DIST = cmph.spec configure.ac diff --git a/configure.ac b/configure.ac index 9986da0..f3b0bb1 100644 --- a/configure.ac +++ b/configure.ac @@ -35,4 +35,4 @@ dnl Checks for library functions. AC_CHECK_SPOON dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) -AC_OUTPUT(Makefile src/Makefile tests/Makefile) +AC_OUTPUT(Makefile src/Makefile tests/Makefile examples/Makefile) diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po new file mode 100644 index 0000000..ab68e18 --- /dev/null +++ b/examples/.deps/file_adapter_ex2.Po @@ -0,0 +1,80 @@ +file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ + /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/gnu/stubs.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ + /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/sigset.h /usr/include/bits/time.h \ + /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/include/bits/wchar.h /usr/include/gconv.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h ../src/cmph_types.h + +../src/cmph.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/sys/cdefs.h: + +/usr/include/gnu/stubs.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: + +/usr/include/sys/types.h: + +/usr/include/bits/types.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/endian.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/select.h: + +/usr/include/bits/select.h: + +/usr/include/bits/sigset.h: + +/usr/include/bits/time.h: + +/usr/include/sys/sysmacros.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/bits/sched.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/include/bits/wchar.h: + +/usr/include/gconv.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/sys_errlist.h: + +/usr/include/bits/stdio.h: + +../src/cmph_types.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po new file mode 100644 index 0000000..9a9118b --- /dev/null +++ b/examples/.deps/vector_adapter_ex1.Po @@ -0,0 +1,80 @@ +vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ + /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/gnu/stubs.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ + /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/sigset.h /usr/include/bits/time.h \ + /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/include/bits/wchar.h /usr/include/gconv.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h ../src/cmph_types.h + +../src/cmph.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/sys/cdefs.h: + +/usr/include/gnu/stubs.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: + +/usr/include/sys/types.h: + +/usr/include/bits/types.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/endian.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/select.h: + +/usr/include/bits/select.h: + +/usr/include/bits/sigset.h: + +/usr/include/bits/time.h: + +/usr/include/sys/sysmacros.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/bits/sched.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/include/bits/wchar.h: + +/usr/include/gconv.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/sys_errlist.h: + +/usr/include/bits/stdio.h: + +../src/cmph_types.h: diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..f7bab29 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,331 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. + +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include +pkgdatadir = $(datadir)/cmph +pkglibdir = $(libdir)/cmph +pkgincludedir = $(includedir)/cmph +top_builddir = .. + +ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal +AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf +AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake +AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL} +INSTALL_HEADER = $(INSTALL_DATA) +transform = s,x,x, +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = +host_triplet = i686-pc-linux-gnu +AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar +AR = ar +AS = @AS@ +AWK = gawk +CC = gcc +CXX = g++ +CXXCPP = g++ -E +DEPDIR = .deps +DLLTOOL = @DLLTOOL@ +ECHO = echo +EGREP = grep -E +EXEEXT = +F77 = +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ +GETCONF = getconf +INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +OBJDUMP = @OBJDUMP@ +OBJEXT = o +PACKAGE = cmph +RANLIB = ranlib +RC = @RC@ +STRIP = strip +VERSION = 0.3 +am__include = include +am__quote = +install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh + +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c +subdir = examples +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) +file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) +file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la +file_adapter_ex2_LDFLAGS = +am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) +vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) +vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la +vector_adapter_ex1_LDFLAGS = + +DEFS = -DHAVE_CONFIG_H +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = +LDFLAGS = -lm +LIBS = +depcomp = $(SHELL) $(top_srcdir)/depcomp +DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ + $(DEPDIR)/vector_adapter_ex1.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 +DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +include $(DEPDIR)/file_adapter_ex2.Po +include $(DEPDIR)/vector_adapter_ex1.Po + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: + source='$<' object='$@' libtool=no \ + depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ + $(CCDEPMODE) $(depcomp) \ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: + source='$<' object='$@' libtool=no \ + depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ + $(CCDEPMODE) $(depcomp) \ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: + source='$<' object='$@' libtool=yes \ + depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ + $(CCDEPMODE) $(depcomp) \ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = depmode=gcc3 +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/Makefile.am b/examples/Makefile.am new file mode 100755 index 0000000..812919f --- /dev/null +++ b/examples/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c + diff --git a/examples/Makefile.in b/examples/Makefile.in new file mode 100755 index 0000000..513ea93 --- /dev/null +++ b/examples/Makefile.in @@ -0,0 +1,331 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ +GETCONF = @GETCONF@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +RC = @RC@ +STRIP = @STRIP@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c +subdir = examples +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) +file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) +file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la +file_adapter_ex2_LDFLAGS = +am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) +vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) +vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la +vector_adapter_ex1_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ +@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + +GTAGS: + here=`CDPATH=: && cd $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + tags uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c new file mode 100644 index 0000000..57ec5b6 --- /dev/null +++ b/examples/file_adapter_ex2.c @@ -0,0 +1,32 @@ +#include +#include + + // Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} diff --git a/examples/keys.txt b/examples/keys.txt new file mode 100644 index 0000000..e1edd7c --- /dev/null +++ b/examples/keys.txt @@ -0,0 +1,10 @@ +aaaaaaaaaa +bbbbbbbbbb +cccccccccc +dddddddddd +eeeeeeeeee +ffffffffff +gggggggggg +hhhhhhhhhh +iiiiiiiiii +jjjjjjjjjj diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c new file mode 100755 index 0000000..1ae8abb --- /dev/null +++ b/examples/vector_adapter_ex1.c @@ -0,0 +1,26 @@ +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} diff --git a/src/cmph.c b/src/cmph.c index 490db0e..18ac502 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -12,6 +12,8 @@ const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +static cmph_uint32 position; // access position when data is a vector + static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { FILE *fd = (FILE *)data; @@ -37,16 +39,34 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + char **keys = (char **)data; + if (keys + position == NULL) return -1; + *keylen = strlen(*(keys + position)); + *key = (char *)malloc(*keylen); + strcpy(*key, *(keys + position)); + position ++; + return *keylen; +} + + static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) { free(key); } + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; rewind(fd); } +static void key_vector_rewind(void *data) +{ + position = 0; +} + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -89,7 +109,14 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) { - return NULL; + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)vector; + key_source->nkeys = nkeys; + key_source->read = key_vector_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_vector_rewind; + return key_source; } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index f457736..a7de997 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -/*cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys);*/ +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); From ba0fd4d0ae9aa385684bb8b35e206016f07fbc3c Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 21:26:17 +0000 Subject: [PATCH 100/739] it was included a examples directory --- INSTALL | 161 ++++++++++----------------- Makefile.am | 2 +- configure.ac | 2 +- examples/.deps/file_adapter_ex2.Po | 80 +++++++++++++ examples/.deps/vector_adapter_ex1.Po | 80 +++++++++++++ examples/Makefile.am | 10 ++ examples/file_adapter_ex2.c | 32 ++++++ examples/keys.txt | 10 ++ examples/vector_adapter_ex1.c | 26 +++++ src/cmph.c | 29 ++++- src/cmph.h | 2 +- 11 files changed, 325 insertions(+), 109 deletions(-) create mode 100644 examples/.deps/file_adapter_ex2.Po create mode 100644 examples/.deps/vector_adapter_ex1.Po create mode 100755 examples/Makefile.am create mode 100644 examples/file_adapter_ex2.c create mode 100644 examples/keys.txt create mode 100755 examples/vector_adapter_ex1.c diff --git a/INSTALL b/INSTALL index 095b1eb..b42a17a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,43 +1,27 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: @@ -70,22 +54,20 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -93,28 +75,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +107,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,80 +122,47 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If +See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't -need to know the machine type. +need to know the host type. - If you are _building_ compiler tools for cross-compiling, you should + If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Defining Variables +Operation Controls ================== -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. + `configure' recognizes the following options to control how it +operates. `--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +`--help' + Print a summary of the options to `configure', and exit. `--quiet' `--silent' @@ -226,6 +175,8 @@ overridden in the site shell script). Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. +`configure' also accepts some other, not widely useful, options. diff --git a/Makefile.am b/Makefile.am index c735106..a8d050c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = src tests +SUBDIRS = src tests examples EXTRA_DIST = cmph.spec configure.ac diff --git a/configure.ac b/configure.ac index 9986da0..f3b0bb1 100644 --- a/configure.ac +++ b/configure.ac @@ -35,4 +35,4 @@ dnl Checks for library functions. AC_CHECK_SPOON dnl AC_OUTPUT(Makefile tests/Makefile samples/Makefile) -AC_OUTPUT(Makefile src/Makefile tests/Makefile) +AC_OUTPUT(Makefile src/Makefile tests/Makefile examples/Makefile) diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po new file mode 100644 index 0000000..ab68e18 --- /dev/null +++ b/examples/.deps/file_adapter_ex2.Po @@ -0,0 +1,80 @@ +file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ + /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/gnu/stubs.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ + /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/sigset.h /usr/include/bits/time.h \ + /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/include/bits/wchar.h /usr/include/gconv.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h ../src/cmph_types.h + +../src/cmph.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/sys/cdefs.h: + +/usr/include/gnu/stubs.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: + +/usr/include/sys/types.h: + +/usr/include/bits/types.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/endian.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/select.h: + +/usr/include/bits/select.h: + +/usr/include/bits/sigset.h: + +/usr/include/bits/time.h: + +/usr/include/sys/sysmacros.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/bits/sched.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/include/bits/wchar.h: + +/usr/include/gconv.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/sys_errlist.h: + +/usr/include/bits/stdio.h: + +../src/cmph_types.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po new file mode 100644 index 0000000..9a9118b --- /dev/null +++ b/examples/.deps/vector_adapter_ex1.Po @@ -0,0 +1,80 @@ +vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ + /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/gnu/stubs.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ + /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/sigset.h /usr/include/bits/time.h \ + /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/include/bits/wchar.h /usr/include/gconv.h \ + /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h ../src/cmph_types.h + +../src/cmph.h: + +/usr/include/stdlib.h: + +/usr/include/features.h: + +/usr/include/sys/cdefs.h: + +/usr/include/gnu/stubs.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: + +/usr/include/sys/types.h: + +/usr/include/bits/types.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/typesizes.h: + +/usr/include/time.h: + +/usr/include/endian.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/select.h: + +/usr/include/bits/select.h: + +/usr/include/bits/sigset.h: + +/usr/include/bits/time.h: + +/usr/include/sys/sysmacros.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/bits/sched.h: + +/usr/include/alloca.h: + +/usr/include/stdio.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/include/bits/wchar.h: + +/usr/include/gconv.h: + +/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/sys_errlist.h: + +/usr/include/bits/stdio.h: + +../src/cmph_types.h: diff --git a/examples/Makefile.am b/examples/Makefile.am new file mode 100755 index 0000000..812919f --- /dev/null +++ b/examples/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + +INCLUDES = -I../src/ + +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c + diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c new file mode 100644 index 0000000..57ec5b6 --- /dev/null +++ b/examples/file_adapter_ex2.c @@ -0,0 +1,32 @@ +#include +#include + + // Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} diff --git a/examples/keys.txt b/examples/keys.txt new file mode 100644 index 0000000..e1edd7c --- /dev/null +++ b/examples/keys.txt @@ -0,0 +1,10 @@ +aaaaaaaaaa +bbbbbbbbbb +cccccccccc +dddddddddd +eeeeeeeeee +ffffffffff +gggggggggg +hhhhhhhhhh +iiiiiiiiii +jjjjjjjjjj diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c new file mode 100755 index 0000000..1ae8abb --- /dev/null +++ b/examples/vector_adapter_ex1.c @@ -0,0 +1,26 @@ +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} diff --git a/src/cmph.c b/src/cmph.c index 490db0e..18ac502 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -12,6 +12,8 @@ const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +static cmph_uint32 position; // access position when data is a vector + static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { FILE *fd = (FILE *)data; @@ -37,16 +39,34 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + char **keys = (char **)data; + if (keys + position == NULL) return -1; + *keylen = strlen(*(keys + position)); + *key = (char *)malloc(*keylen); + strcpy(*key, *(keys + position)); + position ++; + return *keylen; +} + + static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) { free(key); } + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; rewind(fd); } +static void key_vector_rewind(void *data) +{ + position = 0; +} + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -89,7 +109,14 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) { - return NULL; + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)vector; + key_source->nkeys = nkeys; + key_source->read = key_vector_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_vector_rewind; + return key_source; } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index f457736..a7de997 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -/*cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys);*/ +cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); From 877cf9fd38f5aafa9dd8c14859ffcdddca8f8b18 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 22:18:45 +0000 Subject: [PATCH 101/739] it was included an examples directory --- README.t2t | 130 ++++++++++++++++++++++++++++++++--------------------- scpscript | 2 + 2 files changed, 80 insertions(+), 52 deletions(-) create mode 100755 scpscript diff --git a/README.t2t b/README.t2t index 00cd139..231718d 100644 --- a/README.t2t +++ b/README.t2t @@ -5,25 +5,32 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- +==Motivation== + +A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. + +[Minimal perfect hash functions concepts.html] are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. + +The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. + +Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers [database applications http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299]. + +For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. + +As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library ([gperf is a bit different gperf.html], since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. + +------------------------------------------------------------------- + ==Description== -C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with [minimal perfect hash functions concepts.html]. -The cmph library encapsulates the newest -and more efficient algorithms (available in the literature) in an easy-to-use, -production-quality and fast API. The library is designed to work with big entries that -can not fit in the main memory. It has been used successfully for constructing minimal perfect -hash functions for sets with more than 100 million of keys. -Although there is a lack of similar libraries -in the free software world ([gperf is a bit different gperf.html]), we can point out some -of the distinguishable features of cmph: +The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - Fast. - Space-efficient with main memory usage carefully documented. - The best modern algorithms are available (or at least scheduled for implementation :-)). - Works with in-disk key sets through of using the adapter pattern. - Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32). +- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). - Object oriented implementation. - Easily extensible. - Well encapsulated API aiming binary compatibility through releases. @@ -66,52 +73,71 @@ Using cmph is quite simple. Take a look. ``` - // Create minimal perfect hash function from in-memory vector - #include - ... - - const char **vector; - unsigned int nkeys; - //Fill vector - //... - - //Create minimal perfect hash function using the default(chm) algorithm. - cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} ``` +Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does not work in version 0.3. You need to update the sources from CVS to make it works. ------------------------------- ``` - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - #include - ... - - //Open file with newline separated list of keys - FILE *fd = fopen("keysfile_newline_separated", "r"); - //check for errors - //... - - cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - fclose(fd); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include +#include + +// Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} ``` +Download [file_adapter_ex2.c examples/file_adapter_ex2.c] and [keys.txt examples/keys.txt] -------------------------------------- ==The cmph application== diff --git a/scpscript b/scpscript new file mode 100755 index 0000000..dd30fbb --- /dev/null +++ b/scpscript @@ -0,0 +1,2 @@ +scp -r *.html fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs +scp -r examples/*.c examples/keys.txt fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs/examples From 9a12ab1456600d7dff9770ccfba416e41d74a187 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 22:18:45 +0000 Subject: [PATCH 102/739] it was included an examples directory --- README.t2t | 130 ++++++++++++++++++++++++++++++++--------------------- scpscript | 2 + 2 files changed, 80 insertions(+), 52 deletions(-) create mode 100755 scpscript diff --git a/README.t2t b/README.t2t index 00cd139..231718d 100644 --- a/README.t2t +++ b/README.t2t @@ -5,25 +5,32 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- +==Motivation== + +A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. + +[Minimal perfect hash functions concepts.html] are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. + +The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. + +Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers [database applications http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299]. + +For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. + +As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library ([gperf is a bit different gperf.html], since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. + +------------------------------------------------------------------- + ==Description== -C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with [minimal perfect hash functions concepts.html]. -The cmph library encapsulates the newest -and more efficient algorithms (available in the literature) in an easy-to-use, -production-quality and fast API. The library is designed to work with big entries that -can not fit in the main memory. It has been used successfully for constructing minimal perfect -hash functions for sets with more than 100 million of keys. -Although there is a lack of similar libraries -in the free software world ([gperf is a bit different gperf.html]), we can point out some -of the distinguishable features of cmph: +The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - Fast. - Space-efficient with main memory usage carefully documented. - The best modern algorithms are available (or at least scheduled for implementation :-)). - Works with in-disk key sets through of using the adapter pattern. - Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32). +- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). - Object oriented implementation. - Easily extensible. - Well encapsulated API aiming binary compatibility through releases. @@ -66,52 +73,71 @@ Using cmph is quite simple. Take a look. ``` - // Create minimal perfect hash function from in-memory vector - #include - ... - - const char **vector; - unsigned int nkeys; - //Fill vector - //... - - //Create minimal perfect hash function using the default(chm) algorithm. - cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} ``` +Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does not work in version 0.3. You need to update the sources from CVS to make it works. ------------------------------- ``` - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - #include - ... - - //Open file with newline separated list of keys - FILE *fd = fopen("keysfile_newline_separated", "r"); - //check for errors - //... - - cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - fclose(fd); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include +#include + +// Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} ``` +Download [file_adapter_ex2.c examples/file_adapter_ex2.c] and [keys.txt examples/keys.txt] -------------------------------------- ==The cmph application== diff --git a/scpscript b/scpscript new file mode 100755 index 0000000..dd30fbb --- /dev/null +++ b/scpscript @@ -0,0 +1,2 @@ +scp -r *.html fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs +scp -r examples/*.c examples/keys.txt fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs/examples From 3914ba8d734462d07bc874271ae207b311e26e44 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 22:18:45 +0000 Subject: [PATCH 103/739] it was included an examples directory --- README | 136 ++++++++++++++++++++++++++++++++--------------------- README.t2t | 130 ++++++++++++++++++++++++++++++-------------------- scpscript | 2 + 3 files changed, 163 insertions(+), 105 deletions(-) create mode 100755 scpscript diff --git a/README b/README index a84c3e9..9e84f05 100644 --- a/README +++ b/README @@ -1,28 +1,37 @@ CMPH - C Minimal Perfect Hashing Library +------------------------------------------------------------------- + + + Motivation + ========== + +A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. + +Minimal perfect hash functions (concepts.html) are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. + +The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. + +Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers database applications (http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299). + +For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. + +As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library (gperf is a bit different (gperf.html), since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. + ------------------------------------------------------------------- Description =========== -C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hash functions (concepts.html). -The cmph library encapsulates the newest -and more efficient algorithms (available in the literature) in an easy-to-use, -production-quality and fast API. The library is designed to work with big entries that -can not fit in the main memory. It has been used successfully for constructing minimal perfect -hash functions for sets with more than 100 million of keys. -Although there is a lack of similar libraries -in the free software world (gperf is a bit different (gperf.html)), we can point out some -of the distinguishable features of cmph: +The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - Fast. - Space-efficient with main memory usage carefully documented. - The best modern algorithms are available (or at least scheduled for implementation :-)). - Works with in-disk key sets through of using the adapter pattern. - Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32). +- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). - Object oriented implementation. - Easily extensible. - Well encapsulated API aiming binary compatibility through releases. @@ -61,51 +70,72 @@ of the distinguishable features of cmph: Using cmph is quite simple. Take a look. - // Create minimal perfect hash function from in-memory vector - #include - ... - - const char **vector; - unsigned int nkeys; - //Fill vector - //... - - //Create minimal perfect hash function using the default(chm) algorithm. - cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); + #include + + // Create minimal perfect hash function from in-memory vector + int main(int argc, char **argv) + { + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; + } + +Download vector_adapter_ex1.c (examples/vector_adapter_ex1.c). This example does not work in version 0.3. You need to update the sources from CVS to make it works. ------------------------------- - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - #include - ... - - //Open file with newline separated list of keys - FILE *fd = fopen("keysfile_newline_separated", "r"); - //check for errors - //... - - cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - fclose(fd); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); + #include + #include + + // Create minimal perfect hash function from in-disk keys using BMZ algorithm + int main(int argc, char **argv) + { + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; + } + +Download file_adapter_ex2.c (examples/file_adapter_ex2.c) and keys.txt (examples/keys.txt) -------------------------------------- @@ -180,7 +210,7 @@ Davi de Castro Reis (davi@users.sourceforge.net) Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) -Last Updated: Thu Feb 17 13:09:55 2005 +Last Updated: Mon Jul 25 19:14:42 2005 diff --git a/README.t2t b/README.t2t index 00cd139..231718d 100644 --- a/README.t2t +++ b/README.t2t @@ -5,25 +5,32 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- +==Motivation== + +A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. + +[Minimal perfect hash functions concepts.html] are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. + +The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. + +Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers [database applications http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299]. + +For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. + +As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library ([gperf is a bit different gperf.html], since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. + +------------------------------------------------------------------- + ==Description== -C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with [minimal perfect hash functions concepts.html]. -The cmph library encapsulates the newest -and more efficient algorithms (available in the literature) in an easy-to-use, -production-quality and fast API. The library is designed to work with big entries that -can not fit in the main memory. It has been used successfully for constructing minimal perfect -hash functions for sets with more than 100 million of keys. -Although there is a lack of similar libraries -in the free software world ([gperf is a bit different gperf.html]), we can point out some -of the distinguishable features of cmph: +The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - Fast. - Space-efficient with main memory usage carefully documented. - The best modern algorithms are available (or at least scheduled for implementation :-)). - Works with in-disk key sets through of using the adapter pattern. - Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32). +- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). - Object oriented implementation. - Easily extensible. - Well encapsulated API aiming binary compatibility through releases. @@ -66,52 +73,71 @@ Using cmph is quite simple. Take a look. ``` - // Create minimal perfect hash function from in-memory vector - #include - ... - - const char **vector; - unsigned int nkeys; - //Fill vector - //... - - //Create minimal perfect hash function using the default(chm) algorithm. - cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} ``` +Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does not work in version 0.3. You need to update the sources from CVS to make it works. ------------------------------- ``` - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - #include - ... - - //Open file with newline separated list of keys - FILE *fd = fopen("keysfile_newline_separated", "r"); - //check for errors - //... - - cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - fclose(fd); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include +#include + +// Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} ``` +Download [file_adapter_ex2.c examples/file_adapter_ex2.c] and [keys.txt examples/keys.txt] -------------------------------------- ==The cmph application== diff --git a/scpscript b/scpscript new file mode 100755 index 0000000..dd30fbb --- /dev/null +++ b/scpscript @@ -0,0 +1,2 @@ +scp -r *.html fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs +scp -r examples/*.c examples/keys.txt fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs/examples From 652565a1a489e0704e23da41c03d8f1e6cc0bc0c Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 25 Jul 2005 22:18:45 +0000 Subject: [PATCH 104/739] it was included an examples directory --- README | 136 ++++++++++++++++++++++++++++++++--------------------- README.t2t | 130 ++++++++++++++++++++++++++++++-------------------- scpscript | 2 + 3 files changed, 163 insertions(+), 105 deletions(-) create mode 100755 scpscript diff --git a/README b/README index a84c3e9..9e84f05 100644 --- a/README +++ b/README @@ -1,28 +1,37 @@ CMPH - C Minimal Perfect Hashing Library +------------------------------------------------------------------- + + + Motivation + ========== + +A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. + +Minimal perfect hash functions (concepts.html) are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. + +The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. + +Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers database applications (http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299). + +For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. + +As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library (gperf is a bit different (gperf.html), since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. + ------------------------------------------------------------------- Description =========== -C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with minimal perfect hash functions (concepts.html). -The cmph library encapsulates the newest -and more efficient algorithms (available in the literature) in an easy-to-use, -production-quality and fast API. The library is designed to work with big entries that -can not fit in the main memory. It has been used successfully for constructing minimal perfect -hash functions for sets with more than 100 million of keys. -Although there is a lack of similar libraries -in the free software world (gperf is a bit different (gperf.html)), we can point out some -of the distinguishable features of cmph: +The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - Fast. - Space-efficient with main memory usage carefully documented. - The best modern algorithms are available (or at least scheduled for implementation :-)). - Works with in-disk key sets through of using the adapter pattern. - Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32). +- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). - Object oriented implementation. - Easily extensible. - Well encapsulated API aiming binary compatibility through releases. @@ -61,51 +70,72 @@ of the distinguishable features of cmph: Using cmph is quite simple. Take a look. - // Create minimal perfect hash function from in-memory vector - #include - ... - - const char **vector; - unsigned int nkeys; - //Fill vector - //... - - //Create minimal perfect hash function using the default(chm) algorithm. - cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); + #include + + // Create minimal perfect hash function from in-memory vector + int main(int argc, char **argv) + { + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; + } + +Download vector_adapter_ex1.c (examples/vector_adapter_ex1.c). This example does not work in version 0.3. You need to update the sources from CVS to make it works. ------------------------------- - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - #include - ... - - //Open file with newline separated list of keys - FILE *fd = fopen("keysfile_newline_separated", "r"); - //check for errors - //... - - cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - fclose(fd); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); + #include + #include + + // Create minimal perfect hash function from in-disk keys using BMZ algorithm + int main(int argc, char **argv) + { + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; + } + +Download file_adapter_ex2.c (examples/file_adapter_ex2.c) and keys.txt (examples/keys.txt) -------------------------------------- @@ -180,7 +210,7 @@ Davi de Castro Reis (davi@users.sourceforge.net) Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) -Last Updated: Thu Feb 17 13:09:55 2005 +Last Updated: Mon Jul 25 19:14:42 2005 diff --git a/README.t2t b/README.t2t index 00cd139..231718d 100644 --- a/README.t2t +++ b/README.t2t @@ -5,25 +5,32 @@ CMPH - C Minimal Perfect Hashing Library ------------------------------------------------------------------- +==Motivation== + +A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. + +[Minimal perfect hash functions concepts.html] are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. + +The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. + +Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers [database applications http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299]. + +For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. + +As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library ([gperf is a bit different gperf.html], since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. + +------------------------------------------------------------------- + ==Description== -C Minimal Perfect Hashing Library is a portable LGPLed library to create and -to work with [minimal perfect hash functions concepts.html]. -The cmph library encapsulates the newest -and more efficient algorithms (available in the literature) in an easy-to-use, -production-quality and fast API. The library is designed to work with big entries that -can not fit in the main memory. It has been used successfully for constructing minimal perfect -hash functions for sets with more than 100 million of keys. -Although there is a lack of similar libraries -in the free software world ([gperf is a bit different gperf.html]), we can point out some -of the distinguishable features of cmph: +The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - Fast. - Space-efficient with main memory usage carefully documented. - The best modern algorithms are available (or at least scheduled for implementation :-)). - Works with in-disk key sets through of using the adapter pattern. - Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32). +- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). - Object oriented implementation. - Easily extensible. - Well encapsulated API aiming binary compatibility through releases. @@ -66,52 +73,71 @@ Using cmph is quite simple. Take a look. ``` - // Create minimal perfect hash function from in-memory vector - #include - ... - - const char **vector; - unsigned int nkeys; - //Fill vector - //... - - //Create minimal perfect hash function using the default(chm) algorithm. - cmph_config_t *config = cmph_config_new(cmph_io_vector_adapter(vector, nkeys)); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include + +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + // Creating a filled vector + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + + //Create minimal perfect hash function using the default (chm) algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + return 0; +} ``` +Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does not work in version 0.3. You need to update the sources from CVS to make it works. ------------------------------- ``` - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - #include - ... - - //Open file with newline separated list of keys - FILE *fd = fopen("keysfile_newline_separated", "r"); - //check for errors - //... - - cmph_config_t *config = cmph_config_new(cmph_io_nlfile_adapter(fd)); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - fclose(fd); - - //Find key - const char *key = "sample key"; - unsigned int id = cmph_search(hash, key, strlen(key)); - - //Destroy hash - cmph_destroy(hash); +#include +#include + +// Create minimal perfect hash function from in-disk keys using BMZ algorithm +int main(int argc, char **argv) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen("keys.txt", "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + hash = cmph_new(config); + cmph_config_destroy(config); + + //Find key + const char *key = "jjjjjjjjjj"; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "Id:%u\n", id); + //Destroy hash + cmph_destroy(hash); + free(source); + fclose(keys_fd); + return 0; +} ``` +Download [file_adapter_ex2.c examples/file_adapter_ex2.c] and [keys.txt examples/keys.txt] -------------------------------------- ==The cmph application== diff --git a/scpscript b/scpscript new file mode 100755 index 0000000..dd30fbb --- /dev/null +++ b/scpscript @@ -0,0 +1,2 @@ +scp -r *.html fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs +scp -r examples/*.c examples/keys.txt fc_botelho@shell.sourceforge.net:/home/groups/c/cm/cmph/htdocs/examples From 8c60d7b436e844531959fb6a8084749f6ae5ea00 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 21:13:02 +0000 Subject: [PATCH 105/739] Algorithm BRZ included --- src/Makefile.am | 3 +- src/bmz.c | 2 +- src/bmz_structs.h | 1 + src/brz.c | 408 ++++++++++++++++++++++++++++++++++++++++++++++ src/brz.h | 18 ++ src/brz_structs.h | 31 ++++ src/chm.c | 2 +- src/cmph.c | 58 +++++-- src/cmph.h | 2 +- src/cmph_types.h | 2 +- 10 files changed, 508 insertions(+), 19 deletions(-) create mode 100755 src/brz.c create mode 100644 src/brz.h create mode 100755 src/brz_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 3b01af4..73ee4ae 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,8 @@ libcmph_la_SOURCES = debug.h\ cmph.h cmph.c\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ - bmz.h bmz_structs.h bmz.c + bmz.h bmz_structs.h bmz.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 895f2bd..2861085 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -175,7 +175,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) if (iterations_map == 0) return NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - bmzf = (bmz_data_t *)malloc(sizeof(bmz_config_data_t)); + bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; diff --git a/src/bmz_structs.h b/src/bmz_structs.h index 63378e5..67065a0 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -11,6 +11,7 @@ struct __bmz_data_t hash_state_t **hashes; }; + struct __bmz_config_data_t { CMPH_HASH hashfuncs[2]; diff --git a/src/brz.c b/src/brz.c new file mode 100755 index 0000000..4229d9c --- /dev/null +++ b/src/brz.c @@ -0,0 +1,408 @@ +#include "graph.h" +#include "bmz.h" +#include "bmz_structs.h" +#include "brz.h" +#include "cmph_structs.h" +#include "brz_structs.h" +#include "cmph.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); + +brz_config_data_t *brz_config_new() +{ + brz_config_data_t *brz = NULL; + brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->hashfuncs[0] = CMPH_HASH_JENKINS; + brz->hashfuncs[1] = CMPH_HASH_JENKINS; + brz->hashfuncs[2] = CMPH_HASH_JENKINS; + brz->size = NULL; + brz->offset = NULL; + brz->g = NULL; + brz->h1 = NULL; + brz->h2 = NULL; + brz->h3 = NULL; + assert(brz); + return brz; +} + +void brz_config_destroy(cmph_config_t *mph) +{ + brz_config_data_t *data = (brz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 3) break; //brz only uses three hash functions + brz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *brz_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + brz_data_t *brzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL; + + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + char ** keys_vd = NULL; + + FILE * graphs_fd = NULL; + + DEBUGP("c: %f\n", c); + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->m = mph->key_source->nkeys; + DEBUGP("m: %f\n", brz->m); + brz->k = ceil(brz->m/128); + DEBUGP("k: %f\n", brz->k); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + for(i = 0; i < brz->k; ++i) + { + brz->size[i] = 0; + brz->offset[i] = 0; + disksize[i] = 0; + diskoffset[i] = 0; + } + + // Creating the external graphs. + while(1) + { + int ok; + DEBUGP("hash function 3\n"); + brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + DEBUGP("Generating graphs\n"); + ok = brz_before_gen_graphs(mph, disksize, diskoffset); + if (!ok) + { + --iterations; + hash_state_destroy(brz->h3); + brz->h3 = NULL; + DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Failure: A graph with more than 255 keys was created - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + + if (iterations == 0) + { + DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + return NULL; + } + + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + if (graphs_fd == NULL) + { + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); + return NULL; + } + + // Clustering the keys by graph id. + brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); + free(disksize); + free(diskoffset); + + // codigo do algoritmo... + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + + for(i = 0; i < brz->k; i++) + { + bmz_data_t * bmzf = NULL; + if (brz->size[i] == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + // Source of keys + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, c); + mphf_tmp = cmph_new(config); + + bmzf = (bmz_data_t *)mphf_tmp->data; + brz_copy_partial_mphf(brz, bmzf, i); // implementar + + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, brz->size[i]); + free(keys_vd); + cmph_destroy(mphf_tmp); + free(source); + } + + fclose(graphs_fd); + + + // Generating a mphf + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + brzf = (brz_data_t *)malloc(sizeof(brz_data_t)); + brzf->g = brz->g; + brz->g = NULL; //transfer memory ownership + brzf->h1 = brz->h1; + brz->h1 = NULL; //transfer memory ownership + brzf->h2 = brz->h2; + brz->h2 = NULL; //transfer memory ownership + brzf->h3 = brz->h3; + brz->h3 = NULL; //transfer memory ownership + brzf->size = brz->size; + brz->size = NULL; //transfer memory ownership + brzf->offset = brz->offset; + brz->offset = NULL; //transfer memory ownership + brzf->k = brz->k; + brzf->m = brz->m; + mphf->data = brzf; + mphf->size = brz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating information before the keys partition\n"); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + if (brz->size[h3] == 255) return 0; + brz->size[h3] = brz->size[h3] + 1; + disksize[h3] = disksize[h3] + keylen + 1; + } + for (e = 1; e < brz->k; ++e) + { + brz->offset[e] = brz->size[e-1] + brz->size[e]; + diskoffset[e] = disksize[e-1] + disksize[e]; + } + return 1; +} + +// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating graphs from %u keys\n", brz->m); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + fseek(graphs_fd, diskoffset[h3], SEEK_SET); + fwrite(key, sizeof(char), keylen + 1, graphs_fd); + diskoffset[h3] = diskoffset[h3] + keylen + 1; + } +} + +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +{ + char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); + cmph_uint8 i; + + for(i = 0; i < nkeys; i++) + { + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + + fread(&c, sizeof(char), 1, graphs_fd); + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + keys_vd[i] = (char *)malloc(strlen(buf) + 1); + strcpy(keys_vd[i], buf); + free(buf); + } + return keys_vd; +} + +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +{ + cmph_uint8 i; + for(i = 0; i < nkeys; i++) free(keys_vd[i]); +} + +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +{ + cmph_uint32 i; + brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); + for(i = 0; i < bmzf->m; i++) + { + brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + } + brz->h1[index] = bmzf->hashes[0]; + brz->h2[index] = bmzf->hashes[1]; +} + +int brz_dump(cmph_t *mphf, FILE *fd) +{ + /*char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = 2; //number of hash functions + brz_data_t *data = (brz_data_t *)mphf->data; + cmph_uint32 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif +*/ + return 1; +} + +void brz_load(FILE *f, cmph_t *mphf) +{ +/* cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); + + DEBUGP("Loading brz mphf\n"); + mphf->data = brz; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + brz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + brz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(brz->n), sizeof(cmph_uint32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + + brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); + fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +*/ +} + + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ +/* brz_data_t *brz = mphf->data; + cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; + cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > brz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); + return brz->g[h1] + brz->g[h2]; +*/ + return 0; +} +void brz_destroy(cmph_t *mphf) +{ + cmph_uint32 i; + brz_data_t *data = (brz_data_t *)mphf->data; + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + + hash_state_destroy(data->h3); + free(data->g); + free(data->h1); + free(data->h2); + free(data->size); + free(data->offset); + free(data); + free(mphf); +} diff --git a/src/brz.h b/src/brz.h new file mode 100644 index 0000000..a1ed145 --- /dev/null +++ b/src/brz.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BRZ_H__ +#define __CMPH_BRZ_H__ + +#include "cmph.h" + +typedef struct __brz_data_t brz_data_t; +typedef struct __brz_config_data_t brz_config_data_t; + +brz_config_data_t *brz_config_new(); +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_destroy(cmph_config_t *mph); +cmph_t *brz_new(cmph_config_t *mph, float c); + +void brz_load(FILE *f, cmph_t *mphf); +int brz_dump(cmph_t *mphf, FILE *f); +void brz_destroy(cmph_t *mphf); +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/brz_structs.h b/src/brz_structs.h new file mode 100755 index 0000000..bd2a8f6 --- /dev/null +++ b/src/brz_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_BRZ_STRUCTS_H__ +#define __CMPH_BRZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __brz_data_t +{ + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +struct __brz_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +#endif diff --git a/src/chm.c b/src/chm.c index 983bc3b..89648d8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -124,7 +124,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_config_data_t)); + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); chmf->g = chm->g; chm->g = NULL; //transfer memory ownership chmf->hashes = chm->hashes; diff --git a/src/cmph.c b/src/cmph.c index 18ac502..32c1790 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,7 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" -//#include "bmz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -107,7 +107,7 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); assert(key_source); @@ -136,24 +136,30 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); - break; + chm_config_destroy(mph->data); + break; case CMPH_BMZ: - bmz_config_destroy(mph->data); - break; + bmz_config_destroy(mph->data); + break; + case CMPH_BRZ: + brz_config_destroy(mph->data); + break; default: - assert(0); + assert(0); } switch(algo) { case CMPH_CHM: - mph->data = chm_config_new(); - break; + mph->data = chm_config_new(); + break; case CMPH_BMZ: - mph->data = bmz_config_new(); - break; + mph->data = bmz_config_new(); + break; + case CMPH_BRZ: + mph->data = brz_config_new(); + break; default: - assert(0); + assert(0); } } mph->algo = algo; @@ -168,7 +174,10 @@ void cmph_config_destroy(cmph_config_t *mph) chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - bmz_config_destroy(mph); + bmz_config_destroy(mph); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_destroy(mph); break; default: assert(0); @@ -191,6 +200,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -220,6 +232,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Creating brz hash\n"); + if (c == 0) c = 1.15; + mphf = brz_new(mph, c); + break; default: assert(0); } @@ -236,6 +253,9 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); break; + case CMPH_BRZ: /* included -- Fabiano */ + return brz_dump(mphf, f); + break; default: assert(0); } @@ -259,6 +279,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); + break; default: assert(0); } @@ -277,6 +301,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -299,6 +326,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BRZ: /* included -- Fabiano */ + brz_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph.h b/src/cmph.h index a7de997..d30fb51 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/src/cmph_types.h b/src/cmph_types.h index 3fad22d..76d09a5 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -8,7 +8,7 @@ typedef unsigned int cmph_uint32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From 2948f675d5112db382b4aa8164704226627a0b85 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 21:13:02 +0000 Subject: [PATCH 106/739] Algorithm BRZ included --- src/Makefile.am | 3 +- src/bmz.c | 2 +- src/bmz_structs.h | 1 + src/brz.c | 408 ++++++++++++++++++++++++++++++++++++++++++++++ src/brz.h | 18 ++ src/brz_structs.h | 31 ++++ src/chm.c | 2 +- src/cmph.c | 58 +++++-- src/cmph.h | 2 +- src/cmph_types.h | 2 +- 10 files changed, 508 insertions(+), 19 deletions(-) create mode 100755 src/brz.c create mode 100644 src/brz.h create mode 100755 src/brz_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 3b01af4..73ee4ae 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,8 @@ libcmph_la_SOURCES = debug.h\ cmph.h cmph.c\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ - bmz.h bmz_structs.h bmz.c + bmz.h bmz_structs.h bmz.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 895f2bd..2861085 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -175,7 +175,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) if (iterations_map == 0) return NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - bmzf = (bmz_data_t *)malloc(sizeof(bmz_config_data_t)); + bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; diff --git a/src/bmz_structs.h b/src/bmz_structs.h index 63378e5..67065a0 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -11,6 +11,7 @@ struct __bmz_data_t hash_state_t **hashes; }; + struct __bmz_config_data_t { CMPH_HASH hashfuncs[2]; diff --git a/src/brz.c b/src/brz.c new file mode 100755 index 0000000..4229d9c --- /dev/null +++ b/src/brz.c @@ -0,0 +1,408 @@ +#include "graph.h" +#include "bmz.h" +#include "bmz_structs.h" +#include "brz.h" +#include "cmph_structs.h" +#include "brz_structs.h" +#include "cmph.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); + +brz_config_data_t *brz_config_new() +{ + brz_config_data_t *brz = NULL; + brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->hashfuncs[0] = CMPH_HASH_JENKINS; + brz->hashfuncs[1] = CMPH_HASH_JENKINS; + brz->hashfuncs[2] = CMPH_HASH_JENKINS; + brz->size = NULL; + brz->offset = NULL; + brz->g = NULL; + brz->h1 = NULL; + brz->h2 = NULL; + brz->h3 = NULL; + assert(brz); + return brz; +} + +void brz_config_destroy(cmph_config_t *mph) +{ + brz_config_data_t *data = (brz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 3) break; //brz only uses three hash functions + brz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *brz_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + brz_data_t *brzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL; + + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + char ** keys_vd = NULL; + + FILE * graphs_fd = NULL; + + DEBUGP("c: %f\n", c); + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->m = mph->key_source->nkeys; + DEBUGP("m: %f\n", brz->m); + brz->k = ceil(brz->m/128); + DEBUGP("k: %f\n", brz->k); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + for(i = 0; i < brz->k; ++i) + { + brz->size[i] = 0; + brz->offset[i] = 0; + disksize[i] = 0; + diskoffset[i] = 0; + } + + // Creating the external graphs. + while(1) + { + int ok; + DEBUGP("hash function 3\n"); + brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + DEBUGP("Generating graphs\n"); + ok = brz_before_gen_graphs(mph, disksize, diskoffset); + if (!ok) + { + --iterations; + hash_state_destroy(brz->h3); + brz->h3 = NULL; + DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Failure: A graph with more than 255 keys was created - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + + if (iterations == 0) + { + DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + return NULL; + } + + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + if (graphs_fd == NULL) + { + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); + return NULL; + } + + // Clustering the keys by graph id. + brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); + free(disksize); + free(diskoffset); + + // codigo do algoritmo... + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + + for(i = 0; i < brz->k; i++) + { + bmz_data_t * bmzf = NULL; + if (brz->size[i] == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + // Source of keys + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, c); + mphf_tmp = cmph_new(config); + + bmzf = (bmz_data_t *)mphf_tmp->data; + brz_copy_partial_mphf(brz, bmzf, i); // implementar + + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, brz->size[i]); + free(keys_vd); + cmph_destroy(mphf_tmp); + free(source); + } + + fclose(graphs_fd); + + + // Generating a mphf + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + brzf = (brz_data_t *)malloc(sizeof(brz_data_t)); + brzf->g = brz->g; + brz->g = NULL; //transfer memory ownership + brzf->h1 = brz->h1; + brz->h1 = NULL; //transfer memory ownership + brzf->h2 = brz->h2; + brz->h2 = NULL; //transfer memory ownership + brzf->h3 = brz->h3; + brz->h3 = NULL; //transfer memory ownership + brzf->size = brz->size; + brz->size = NULL; //transfer memory ownership + brzf->offset = brz->offset; + brz->offset = NULL; //transfer memory ownership + brzf->k = brz->k; + brzf->m = brz->m; + mphf->data = brzf; + mphf->size = brz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating information before the keys partition\n"); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + if (brz->size[h3] == 255) return 0; + brz->size[h3] = brz->size[h3] + 1; + disksize[h3] = disksize[h3] + keylen + 1; + } + for (e = 1; e < brz->k; ++e) + { + brz->offset[e] = brz->size[e-1] + brz->size[e]; + diskoffset[e] = disksize[e-1] + disksize[e]; + } + return 1; +} + +// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating graphs from %u keys\n", brz->m); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + fseek(graphs_fd, diskoffset[h3], SEEK_SET); + fwrite(key, sizeof(char), keylen + 1, graphs_fd); + diskoffset[h3] = diskoffset[h3] + keylen + 1; + } +} + +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +{ + char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); + cmph_uint8 i; + + for(i = 0; i < nkeys; i++) + { + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + + fread(&c, sizeof(char), 1, graphs_fd); + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + keys_vd[i] = (char *)malloc(strlen(buf) + 1); + strcpy(keys_vd[i], buf); + free(buf); + } + return keys_vd; +} + +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +{ + cmph_uint8 i; + for(i = 0; i < nkeys; i++) free(keys_vd[i]); +} + +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +{ + cmph_uint32 i; + brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); + for(i = 0; i < bmzf->m; i++) + { + brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + } + brz->h1[index] = bmzf->hashes[0]; + brz->h2[index] = bmzf->hashes[1]; +} + +int brz_dump(cmph_t *mphf, FILE *fd) +{ + /*char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = 2; //number of hash functions + brz_data_t *data = (brz_data_t *)mphf->data; + cmph_uint32 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif +*/ + return 1; +} + +void brz_load(FILE *f, cmph_t *mphf) +{ +/* cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); + + DEBUGP("Loading brz mphf\n"); + mphf->data = brz; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + brz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + brz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(brz->n), sizeof(cmph_uint32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + + brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); + fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +*/ +} + + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ +/* brz_data_t *brz = mphf->data; + cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; + cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > brz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); + return brz->g[h1] + brz->g[h2]; +*/ + return 0; +} +void brz_destroy(cmph_t *mphf) +{ + cmph_uint32 i; + brz_data_t *data = (brz_data_t *)mphf->data; + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + + hash_state_destroy(data->h3); + free(data->g); + free(data->h1); + free(data->h2); + free(data->size); + free(data->offset); + free(data); + free(mphf); +} diff --git a/src/brz.h b/src/brz.h new file mode 100644 index 0000000..a1ed145 --- /dev/null +++ b/src/brz.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BRZ_H__ +#define __CMPH_BRZ_H__ + +#include "cmph.h" + +typedef struct __brz_data_t brz_data_t; +typedef struct __brz_config_data_t brz_config_data_t; + +brz_config_data_t *brz_config_new(); +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_destroy(cmph_config_t *mph); +cmph_t *brz_new(cmph_config_t *mph, float c); + +void brz_load(FILE *f, cmph_t *mphf); +int brz_dump(cmph_t *mphf, FILE *f); +void brz_destroy(cmph_t *mphf); +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/brz_structs.h b/src/brz_structs.h new file mode 100755 index 0000000..bd2a8f6 --- /dev/null +++ b/src/brz_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_BRZ_STRUCTS_H__ +#define __CMPH_BRZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __brz_data_t +{ + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +struct __brz_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +#endif diff --git a/src/chm.c b/src/chm.c index 983bc3b..89648d8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -124,7 +124,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_config_data_t)); + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); chmf->g = chm->g; chm->g = NULL; //transfer memory ownership chmf->hashes = chm->hashes; diff --git a/src/cmph.c b/src/cmph.c index 18ac502..32c1790 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,7 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" -//#include "bmz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -107,7 +107,7 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); assert(key_source); @@ -136,24 +136,30 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); - break; + chm_config_destroy(mph->data); + break; case CMPH_BMZ: - bmz_config_destroy(mph->data); - break; + bmz_config_destroy(mph->data); + break; + case CMPH_BRZ: + brz_config_destroy(mph->data); + break; default: - assert(0); + assert(0); } switch(algo) { case CMPH_CHM: - mph->data = chm_config_new(); - break; + mph->data = chm_config_new(); + break; case CMPH_BMZ: - mph->data = bmz_config_new(); - break; + mph->data = bmz_config_new(); + break; + case CMPH_BRZ: + mph->data = brz_config_new(); + break; default: - assert(0); + assert(0); } } mph->algo = algo; @@ -168,7 +174,10 @@ void cmph_config_destroy(cmph_config_t *mph) chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - bmz_config_destroy(mph); + bmz_config_destroy(mph); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_destroy(mph); break; default: assert(0); @@ -191,6 +200,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -220,6 +232,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Creating brz hash\n"); + if (c == 0) c = 1.15; + mphf = brz_new(mph, c); + break; default: assert(0); } @@ -236,6 +253,9 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); break; + case CMPH_BRZ: /* included -- Fabiano */ + return brz_dump(mphf, f); + break; default: assert(0); } @@ -259,6 +279,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); + break; default: assert(0); } @@ -277,6 +301,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -299,6 +326,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BRZ: /* included -- Fabiano */ + brz_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph.h b/src/cmph.h index a7de997..d30fb51 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/src/cmph_types.h b/src/cmph_types.h index 3fad22d..76d09a5 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -8,7 +8,7 @@ typedef unsigned int cmph_uint32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From 347c6753622cba99294e094d28181ea10f4f7f1a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 21:13:02 +0000 Subject: [PATCH 107/739] Algorithm BRZ included --- src/Makefile.am | 3 +- src/bmz.c | 2 +- src/bmz_structs.h | 1 + src/brz.c | 408 ++++++++++++++++++++++++++++++++++++++++++++++ src/brz.h | 18 ++ src/brz_structs.h | 31 ++++ src/chm.c | 2 +- src/cmph.c | 58 +++++-- src/cmph.h | 2 +- src/cmph_types.h | 2 +- 10 files changed, 508 insertions(+), 19 deletions(-) create mode 100755 src/brz.c create mode 100644 src/brz.h create mode 100755 src/brz_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 3b01af4..73ee4ae 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,8 @@ libcmph_la_SOURCES = debug.h\ cmph.h cmph.c\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ - bmz.h bmz_structs.h bmz.c + bmz.h bmz_structs.h bmz.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 895f2bd..2861085 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -175,7 +175,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) if (iterations_map == 0) return NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - bmzf = (bmz_data_t *)malloc(sizeof(bmz_config_data_t)); + bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; diff --git a/src/bmz_structs.h b/src/bmz_structs.h index 63378e5..67065a0 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -11,6 +11,7 @@ struct __bmz_data_t hash_state_t **hashes; }; + struct __bmz_config_data_t { CMPH_HASH hashfuncs[2]; diff --git a/src/brz.c b/src/brz.c new file mode 100755 index 0000000..4229d9c --- /dev/null +++ b/src/brz.c @@ -0,0 +1,408 @@ +#include "graph.h" +#include "bmz.h" +#include "bmz_structs.h" +#include "brz.h" +#include "cmph_structs.h" +#include "brz_structs.h" +#include "cmph.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); + +brz_config_data_t *brz_config_new() +{ + brz_config_data_t *brz = NULL; + brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->hashfuncs[0] = CMPH_HASH_JENKINS; + brz->hashfuncs[1] = CMPH_HASH_JENKINS; + brz->hashfuncs[2] = CMPH_HASH_JENKINS; + brz->size = NULL; + brz->offset = NULL; + brz->g = NULL; + brz->h1 = NULL; + brz->h2 = NULL; + brz->h3 = NULL; + assert(brz); + return brz; +} + +void brz_config_destroy(cmph_config_t *mph) +{ + brz_config_data_t *data = (brz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 3) break; //brz only uses three hash functions + brz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *brz_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + brz_data_t *brzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL; + + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + char ** keys_vd = NULL; + + FILE * graphs_fd = NULL; + + DEBUGP("c: %f\n", c); + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->m = mph->key_source->nkeys; + DEBUGP("m: %f\n", brz->m); + brz->k = ceil(brz->m/128); + DEBUGP("k: %f\n", brz->k); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + for(i = 0; i < brz->k; ++i) + { + brz->size[i] = 0; + brz->offset[i] = 0; + disksize[i] = 0; + diskoffset[i] = 0; + } + + // Creating the external graphs. + while(1) + { + int ok; + DEBUGP("hash function 3\n"); + brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + DEBUGP("Generating graphs\n"); + ok = brz_before_gen_graphs(mph, disksize, diskoffset); + if (!ok) + { + --iterations; + hash_state_destroy(brz->h3); + brz->h3 = NULL; + DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Failure: A graph with more than 255 keys was created - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + + if (iterations == 0) + { + DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + return NULL; + } + + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + if (graphs_fd == NULL) + { + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); + return NULL; + } + + // Clustering the keys by graph id. + brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); + free(disksize); + free(diskoffset); + + // codigo do algoritmo... + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + + for(i = 0; i < brz->k; i++) + { + bmz_data_t * bmzf = NULL; + if (brz->size[i] == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + // Source of keys + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, c); + mphf_tmp = cmph_new(config); + + bmzf = (bmz_data_t *)mphf_tmp->data; + brz_copy_partial_mphf(brz, bmzf, i); // implementar + + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, brz->size[i]); + free(keys_vd); + cmph_destroy(mphf_tmp); + free(source); + } + + fclose(graphs_fd); + + + // Generating a mphf + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + brzf = (brz_data_t *)malloc(sizeof(brz_data_t)); + brzf->g = brz->g; + brz->g = NULL; //transfer memory ownership + brzf->h1 = brz->h1; + brz->h1 = NULL; //transfer memory ownership + brzf->h2 = brz->h2; + brz->h2 = NULL; //transfer memory ownership + brzf->h3 = brz->h3; + brz->h3 = NULL; //transfer memory ownership + brzf->size = brz->size; + brz->size = NULL; //transfer memory ownership + brzf->offset = brz->offset; + brz->offset = NULL; //transfer memory ownership + brzf->k = brz->k; + brzf->m = brz->m; + mphf->data = brzf; + mphf->size = brz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating information before the keys partition\n"); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + if (brz->size[h3] == 255) return 0; + brz->size[h3] = brz->size[h3] + 1; + disksize[h3] = disksize[h3] + keylen + 1; + } + for (e = 1; e < brz->k; ++e) + { + brz->offset[e] = brz->size[e-1] + brz->size[e]; + diskoffset[e] = disksize[e-1] + disksize[e]; + } + return 1; +} + +// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating graphs from %u keys\n", brz->m); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + fseek(graphs_fd, diskoffset[h3], SEEK_SET); + fwrite(key, sizeof(char), keylen + 1, graphs_fd); + diskoffset[h3] = diskoffset[h3] + keylen + 1; + } +} + +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +{ + char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); + cmph_uint8 i; + + for(i = 0; i < nkeys; i++) + { + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + + fread(&c, sizeof(char), 1, graphs_fd); + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + keys_vd[i] = (char *)malloc(strlen(buf) + 1); + strcpy(keys_vd[i], buf); + free(buf); + } + return keys_vd; +} + +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +{ + cmph_uint8 i; + for(i = 0; i < nkeys; i++) free(keys_vd[i]); +} + +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +{ + cmph_uint32 i; + brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); + for(i = 0; i < bmzf->m; i++) + { + brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + } + brz->h1[index] = bmzf->hashes[0]; + brz->h2[index] = bmzf->hashes[1]; +} + +int brz_dump(cmph_t *mphf, FILE *fd) +{ + /*char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = 2; //number of hash functions + brz_data_t *data = (brz_data_t *)mphf->data; + cmph_uint32 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif +*/ + return 1; +} + +void brz_load(FILE *f, cmph_t *mphf) +{ +/* cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); + + DEBUGP("Loading brz mphf\n"); + mphf->data = brz; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + brz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + brz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(brz->n), sizeof(cmph_uint32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + + brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); + fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +*/ +} + + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ +/* brz_data_t *brz = mphf->data; + cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; + cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > brz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); + return brz->g[h1] + brz->g[h2]; +*/ + return 0; +} +void brz_destroy(cmph_t *mphf) +{ + cmph_uint32 i; + brz_data_t *data = (brz_data_t *)mphf->data; + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + + hash_state_destroy(data->h3); + free(data->g); + free(data->h1); + free(data->h2); + free(data->size); + free(data->offset); + free(data); + free(mphf); +} diff --git a/src/brz.h b/src/brz.h new file mode 100644 index 0000000..a1ed145 --- /dev/null +++ b/src/brz.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BRZ_H__ +#define __CMPH_BRZ_H__ + +#include "cmph.h" + +typedef struct __brz_data_t brz_data_t; +typedef struct __brz_config_data_t brz_config_data_t; + +brz_config_data_t *brz_config_new(); +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_destroy(cmph_config_t *mph); +cmph_t *brz_new(cmph_config_t *mph, float c); + +void brz_load(FILE *f, cmph_t *mphf); +int brz_dump(cmph_t *mphf, FILE *f); +void brz_destroy(cmph_t *mphf); +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/brz_structs.h b/src/brz_structs.h new file mode 100755 index 0000000..bd2a8f6 --- /dev/null +++ b/src/brz_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_BRZ_STRUCTS_H__ +#define __CMPH_BRZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __brz_data_t +{ + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +struct __brz_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +#endif diff --git a/src/chm.c b/src/chm.c index 983bc3b..89648d8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -124,7 +124,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_config_data_t)); + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); chmf->g = chm->g; chm->g = NULL; //transfer memory ownership chmf->hashes = chm->hashes; diff --git a/src/cmph.c b/src/cmph.c index 18ac502..32c1790 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,7 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" -//#include "bmz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -107,7 +107,7 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); assert(key_source); @@ -136,24 +136,30 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); - break; + chm_config_destroy(mph->data); + break; case CMPH_BMZ: - bmz_config_destroy(mph->data); - break; + bmz_config_destroy(mph->data); + break; + case CMPH_BRZ: + brz_config_destroy(mph->data); + break; default: - assert(0); + assert(0); } switch(algo) { case CMPH_CHM: - mph->data = chm_config_new(); - break; + mph->data = chm_config_new(); + break; case CMPH_BMZ: - mph->data = bmz_config_new(); - break; + mph->data = bmz_config_new(); + break; + case CMPH_BRZ: + mph->data = brz_config_new(); + break; default: - assert(0); + assert(0); } } mph->algo = algo; @@ -168,7 +174,10 @@ void cmph_config_destroy(cmph_config_t *mph) chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - bmz_config_destroy(mph); + bmz_config_destroy(mph); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_destroy(mph); break; default: assert(0); @@ -191,6 +200,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -220,6 +232,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Creating brz hash\n"); + if (c == 0) c = 1.15; + mphf = brz_new(mph, c); + break; default: assert(0); } @@ -236,6 +253,9 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); break; + case CMPH_BRZ: /* included -- Fabiano */ + return brz_dump(mphf, f); + break; default: assert(0); } @@ -259,6 +279,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); + break; default: assert(0); } @@ -277,6 +301,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -299,6 +326,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BRZ: /* included -- Fabiano */ + brz_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph.h b/src/cmph.h index a7de997..d30fb51 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/src/cmph_types.h b/src/cmph_types.h index 3fad22d..76d09a5 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -8,7 +8,7 @@ typedef unsigned int cmph_uint32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From 426dfe2a633c7566045a191e62beafab40a3b523 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 21:13:02 +0000 Subject: [PATCH 108/739] Algorithm BRZ included --- src/Makefile.am | 3 +- src/bmz.c | 2 +- src/bmz_structs.h | 1 + src/brz.c | 408 ++++++++++++++++++++++++++++++++++++++++++++++ src/brz.h | 18 ++ src/brz_structs.h | 31 ++++ src/chm.c | 2 +- src/cmph.c | 58 +++++-- src/cmph.h | 2 +- src/cmph_types.h | 2 +- 10 files changed, 508 insertions(+), 19 deletions(-) create mode 100755 src/brz.c create mode 100644 src/brz.h create mode 100755 src/brz_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 3b01af4..73ee4ae 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,8 @@ libcmph_la_SOURCES = debug.h\ cmph.h cmph.c\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ - bmz.h bmz_structs.h bmz.c + bmz.h bmz_structs.h bmz.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 895f2bd..2861085 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -175,7 +175,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) if (iterations_map == 0) return NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - bmzf = (bmz_data_t *)malloc(sizeof(bmz_config_data_t)); + bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); bmzf->g = bmz->g; bmz->g = NULL; //transfer memory ownership bmzf->hashes = bmz->hashes; diff --git a/src/bmz_structs.h b/src/bmz_structs.h index 63378e5..67065a0 100644 --- a/src/bmz_structs.h +++ b/src/bmz_structs.h @@ -11,6 +11,7 @@ struct __bmz_data_t hash_state_t **hashes; }; + struct __bmz_config_data_t { CMPH_HASH hashfuncs[2]; diff --git a/src/brz.c b/src/brz.c new file mode 100755 index 0000000..4229d9c --- /dev/null +++ b/src/brz.c @@ -0,0 +1,408 @@ +#include "graph.h" +#include "bmz.h" +#include "bmz_structs.h" +#include "brz.h" +#include "cmph_structs.h" +#include "brz_structs.h" +#include "cmph.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); + +brz_config_data_t *brz_config_new() +{ + brz_config_data_t *brz = NULL; + brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->hashfuncs[0] = CMPH_HASH_JENKINS; + brz->hashfuncs[1] = CMPH_HASH_JENKINS; + brz->hashfuncs[2] = CMPH_HASH_JENKINS; + brz->size = NULL; + brz->offset = NULL; + brz->g = NULL; + brz->h1 = NULL; + brz->h2 = NULL; + brz->h3 = NULL; + assert(brz); + return brz; +} + +void brz_config_destroy(cmph_config_t *mph) +{ + brz_config_data_t *data = (brz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 3) break; //brz only uses three hash functions + brz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *brz_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + brz_data_t *brzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL; + + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + char ** keys_vd = NULL; + + FILE * graphs_fd = NULL; + + DEBUGP("c: %f\n", c); + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->m = mph->key_source->nkeys; + DEBUGP("m: %f\n", brz->m); + brz->k = ceil(brz->m/128); + DEBUGP("k: %f\n", brz->k); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + + for(i = 0; i < brz->k; ++i) + { + brz->size[i] = 0; + brz->offset[i] = 0; + disksize[i] = 0; + diskoffset[i] = 0; + } + + // Creating the external graphs. + while(1) + { + int ok; + DEBUGP("hash function 3\n"); + brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + DEBUGP("Generating graphs\n"); + ok = brz_before_gen_graphs(mph, disksize, diskoffset); + if (!ok) + { + --iterations; + hash_state_destroy(brz->h3); + brz->h3 = NULL; + DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Failure: A graph with more than 255 keys was created - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + + if (iterations == 0) + { + DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + return NULL; + } + + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + if (graphs_fd == NULL) + { + free(brz->size); + free(brz->offset); + free(disksize); + free(diskoffset); + fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); + return NULL; + } + + // Clustering the keys by graph id. + brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); + free(disksize); + free(diskoffset); + + // codigo do algoritmo... + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + + for(i = 0; i < brz->k; i++) + { + bmz_data_t * bmzf = NULL; + if (brz->size[i] == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + // Source of keys + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, c); + mphf_tmp = cmph_new(config); + + bmzf = (bmz_data_t *)mphf_tmp->data; + brz_copy_partial_mphf(brz, bmzf, i); // implementar + + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, brz->size[i]); + free(keys_vd); + cmph_destroy(mphf_tmp); + free(source); + } + + fclose(graphs_fd); + + + // Generating a mphf + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + brzf = (brz_data_t *)malloc(sizeof(brz_data_t)); + brzf->g = brz->g; + brz->g = NULL; //transfer memory ownership + brzf->h1 = brz->h1; + brz->h1 = NULL; //transfer memory ownership + brzf->h2 = brz->h2; + brz->h2 = NULL; //transfer memory ownership + brzf->h3 = brz->h3; + brz->h3 = NULL; //transfer memory ownership + brzf->size = brz->size; + brz->size = NULL; //transfer memory ownership + brzf->offset = brz->offset; + brz->offset = NULL; //transfer memory ownership + brzf->k = brz->k; + brzf->m = brz->m; + mphf->data = brzf; + mphf->size = brz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating information before the keys partition\n"); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + if (brz->size[h3] == 255) return 0; + brz->size[h3] = brz->size[h3] + 1; + disksize[h3] = disksize[h3] + keylen + 1; + } + for (e = 1; e < brz->k; ++e) + { + brz->offset[e] = brz->size[e-1] + brz->size[e]; + diskoffset[e] = disksize[e-1] + disksize[e]; + } + return 1; +} + +// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. +static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) +{ + cmph_uint32 e; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating graphs from %u keys\n", brz->m); + for (e = 0; e < brz->m; ++e) + { + cmph_uint32 h3; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h3 = hash(brz->h3, key, keylen) % brz->k; + mph->key_source->dispose(mph->key_source->data, key, keylen); + fseek(graphs_fd, diskoffset[h3], SEEK_SET); + fwrite(key, sizeof(char), keylen + 1, graphs_fd); + diskoffset[h3] = diskoffset[h3] + keylen + 1; + } +} + +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +{ + char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); + cmph_uint8 i; + + for(i = 0; i < nkeys; i++) + { + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + + fread(&c, sizeof(char), 1, graphs_fd); + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + keys_vd[i] = (char *)malloc(strlen(buf) + 1); + strcpy(keys_vd[i], buf); + free(buf); + } + return keys_vd; +} + +static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +{ + cmph_uint8 i; + for(i = 0; i < nkeys; i++) free(keys_vd[i]); +} + +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +{ + cmph_uint32 i; + brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); + for(i = 0; i < bmzf->m; i++) + { + brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + } + brz->h1[index] = bmzf->hashes[0]; + brz->h2[index] = bmzf->hashes[1]; +} + +int brz_dump(cmph_t *mphf, FILE *fd) +{ + /*char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 nbuflen; + cmph_uint32 i; + cmph_uint32 two = 2; //number of hash functions + brz_data_t *data = (brz_data_t *)mphf->data; + cmph_uint32 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif +*/ + return 1; +} + +void brz_load(FILE *f, cmph_t *mphf) +{ +/* cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); + + DEBUGP("Loading brz mphf\n"); + mphf->data = brz; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + brz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + brz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(brz->n), sizeof(cmph_uint32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + + brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); + fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +*/ +} + + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ +/* brz_data_t *brz = mphf->data; + cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; + cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > brz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); + return brz->g[h1] + brz->g[h2]; +*/ + return 0; +} +void brz_destroy(cmph_t *mphf) +{ + cmph_uint32 i; + brz_data_t *data = (brz_data_t *)mphf->data; + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + + hash_state_destroy(data->h3); + free(data->g); + free(data->h1); + free(data->h2); + free(data->size); + free(data->offset); + free(data); + free(mphf); +} diff --git a/src/brz.h b/src/brz.h new file mode 100644 index 0000000..a1ed145 --- /dev/null +++ b/src/brz.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BRZ_H__ +#define __CMPH_BRZ_H__ + +#include "cmph.h" + +typedef struct __brz_data_t brz_data_t; +typedef struct __brz_config_data_t brz_config_data_t; + +brz_config_data_t *brz_config_new(); +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_destroy(cmph_config_t *mph); +cmph_t *brz_new(cmph_config_t *mph, float c); + +void brz_load(FILE *f, cmph_t *mphf); +int brz_dump(cmph_t *mphf, FILE *f); +void brz_destroy(cmph_t *mphf); +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/brz_structs.h b/src/brz_structs.h new file mode 100755 index 0000000..bd2a8f6 --- /dev/null +++ b/src/brz_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_BRZ_STRUCTS_H__ +#define __CMPH_BRZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __brz_data_t +{ + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +struct __brz_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h3; +}; + +#endif diff --git a/src/chm.c b/src/chm.c index 983bc3b..89648d8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -124,7 +124,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_config_data_t)); + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); chmf->g = chm->g; chm->g = NULL; //transfer memory ownership chmf->hashes = chm->hashes; diff --git a/src/cmph.c b/src/cmph.c index 18ac502..32c1790 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,7 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" -//#include "bmz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include @@ -10,7 +10,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -107,7 +107,7 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys) +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); assert(key_source); @@ -136,24 +136,30 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); - break; + chm_config_destroy(mph->data); + break; case CMPH_BMZ: - bmz_config_destroy(mph->data); - break; + bmz_config_destroy(mph->data); + break; + case CMPH_BRZ: + brz_config_destroy(mph->data); + break; default: - assert(0); + assert(0); } switch(algo) { case CMPH_CHM: - mph->data = chm_config_new(); - break; + mph->data = chm_config_new(); + break; case CMPH_BMZ: - mph->data = bmz_config_new(); - break; + mph->data = bmz_config_new(); + break; + case CMPH_BRZ: + mph->data = brz_config_new(); + break; default: - assert(0); + assert(0); } } mph->algo = algo; @@ -168,7 +174,10 @@ void cmph_config_destroy(cmph_config_t *mph) chm_config_destroy(mph); break; case CMPH_BMZ: /* included -- Fabiano */ - bmz_config_destroy(mph); + bmz_config_destroy(mph); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_destroy(mph); break; default: assert(0); @@ -191,6 +200,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -220,6 +232,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Creating brz hash\n"); + if (c == 0) c = 1.15; + mphf = brz_new(mph, c); + break; default: assert(0); } @@ -236,6 +253,9 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); break; + case CMPH_BRZ: /* included -- Fabiano */ + return brz_dump(mphf, f); + break; default: assert(0); } @@ -259,6 +279,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); + break; default: assert(0); } @@ -277,6 +301,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -299,6 +326,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BRZ: /* included -- Fabiano */ + brz_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph.h b/src/cmph.h index a7de997..d30fb51 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -27,7 +27,7 @@ typedef struct /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); -cmph_io_adapter_t *cmph_io_vector_adapter(const char ** vector, cmph_uint32 nkeys); +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/src/cmph_types.h b/src/cmph_types.h index 3fad22d..76d09a5 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -8,7 +8,7 @@ typedef unsigned int cmph_uint32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From dfd23b84ff3860e56205005e4976dc71c37846bb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 22:13:25 +0000 Subject: [PATCH 109/739] algorithm BRZ included --- src/brz.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4229d9c..4ef8bea 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,7 +14,7 @@ #include #include -//#define DEBUG +#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); @@ -75,7 +75,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) char ** keys_vd = NULL; FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; @@ -144,7 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); - + DEBUGP("Graphs generated\n"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From 0bf7615f53fb6158e95bd2174533bb6977f4e2fb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 22:13:25 +0000 Subject: [PATCH 110/739] algorithm BRZ included --- src/brz.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4229d9c..4ef8bea 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,7 +14,7 @@ #include #include -//#define DEBUG +#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); @@ -75,7 +75,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) char ** keys_vd = NULL; FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; @@ -144,7 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); - + DEBUGP("Graphs generated\n"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From 3e4b8fdfcbd42fed49271252ff02ed5bfc050626 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 22:13:25 +0000 Subject: [PATCH 111/739] algorithm BRZ included --- src/brz.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4229d9c..4ef8bea 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,7 +14,7 @@ #include #include -//#define DEBUG +#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); @@ -75,7 +75,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) char ** keys_vd = NULL; FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; @@ -144,7 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); - + DEBUGP("Graphs generated\n"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From 7f38f249a956ce728480c221a16d45d2efd7c510 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 27 Jul 2005 22:13:25 +0000 Subject: [PATCH 112/739] algorithm BRZ included --- src/brz.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4229d9c..4ef8bea 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,7 +14,7 @@ #include #include -//#define DEBUG +#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); @@ -75,7 +75,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) char ** keys_vd = NULL; FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; @@ -144,7 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); - + DEBUGP("Graphs generated\n"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From 38f66219782db1c96db16439db08f7a2cab3fc25 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 00:00:01 +0000 Subject: [PATCH 113/739] fixed some mistakes in BRZ algorithm --- src/bmz.c | 8 ++++--- src/brz.c | 69 +++++++++++++++++++++++++++++++++++++----------------- src/cmph.c | 31 +++++++++++++++++------- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 2861085..efa42f6 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -99,7 +99,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -413,7 +413,6 @@ static int bmz_gen_edges(cmph_config_t *mph) cmph_uint32 e; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; cmph_uint8 multiple_edges = 0; - DEBUGP("Generating edges for %u vertices\n", bmz->n); graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); @@ -421,8 +420,10 @@ static int bmz_gen_edges(cmph_config_t *mph) { cmph_uint32 h1, h2; cmph_uint32 keylen; - char *key; + char *key = NULL; mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; @@ -434,6 +435,7 @@ static int bmz_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. diff --git a/src/brz.c b/src/brz.c index 4ef8bea..4c0756d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -78,9 +78,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; - DEBUGP("m: %f\n", brz->m); + DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); - DEBUGP("k: %f\n", brz->k); + DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); @@ -128,7 +128,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -138,12 +138,13 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); return NULL; } - // Clustering the keys by graph id. brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); DEBUGP("Graphs generated\n"); + fclose(graphs_fd); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -151,29 +152,26 @@ cmph_t *brz_new(cmph_config_t *mph, float c) for(i = 0; i < brz->k; i++) { + cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); - config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar - + brz_copy_partial_mphf(brz, bmzf, i); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, brz->size[i]); free(keys_vd); cmph_destroy(mphf_tmp); free(source); } - fclose(graphs_fd); - + fclose(graphs_fd); // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); @@ -216,15 +214,29 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } + mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; brz->size[h3] = brz->size[h3] + 1; disksize[h3] = disksize[h3] + keylen + 1; +// if(h3 == 6) +// { +// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); +// } + } + fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { - brz->offset[e] = brz->size[e-1] + brz->size[e]; - diskoffset[e] = disksize[e-1] + disksize[e]; + brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; + diskoffset[e] = disksize[e-1] + diskoffset[e-1]; + DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); } return 1; } @@ -243,14 +255,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - mph->key_source->dispose(mph->key_source->data, key, keylen); + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); + if(h3 == 6) + { + DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); + } diskoffset[h3] = diskoffset[h3] + keylen + 1; + mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -270,8 +291,9 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); + free(buf); + } return keys_vd; } @@ -389,14 +411,19 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); + fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); + fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); + fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - - hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); + hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/cmph.c b/src/cmph.c index 32c1790..f7f4acb 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -41,12 +41,19 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys = (char **)data; - if (keys + position == NULL) return -1; - *keylen = strlen(*(keys + position)); - *key = (char *)malloc(*keylen); - strcpy(*key, *(keys + position)); + char **keys_vd = (char **)data; + if (keys_vd + position == NULL) return -1; + *keylen = strlen(*(keys_vd + position)); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, *(keys_vd + position)); position ++; + +/* char **keys_vd = (char **)data; + if (keys_vd[position] == NULL) return -1; + *keylen = strlen(keys_vd[position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[position]); + position ++;*/ return *keylen; } @@ -56,6 +63,11 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) free(key); } +static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; @@ -67,6 +79,7 @@ static void key_vector_rewind(void *data) position = 0; } + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -114,7 +127,7 @@ cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) key_source->data = (void *)vector; key_source->nkeys = nkeys; key_source->read = key_vector_read; - key_source->dispose = key_nlfile_dispose; + key_source->dispose = key_vector_dispose; key_source->rewind = key_vector_rewind; return key_source; } @@ -136,13 +149,13 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); + chm_config_destroy(mph); break; case CMPH_BMZ: - bmz_config_destroy(mph->data); + bmz_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph->data); + brz_config_destroy(mph); break; default: assert(0); From 5212c7d5f36c143cb106cfaff332e0dc63bc864d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 00:00:01 +0000 Subject: [PATCH 114/739] fixed some mistakes in BRZ algorithm --- src/bmz.c | 8 ++++--- src/brz.c | 69 +++++++++++++++++++++++++++++++++++++----------------- src/cmph.c | 31 +++++++++++++++++------- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 2861085..efa42f6 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -99,7 +99,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -413,7 +413,6 @@ static int bmz_gen_edges(cmph_config_t *mph) cmph_uint32 e; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; cmph_uint8 multiple_edges = 0; - DEBUGP("Generating edges for %u vertices\n", bmz->n); graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); @@ -421,8 +420,10 @@ static int bmz_gen_edges(cmph_config_t *mph) { cmph_uint32 h1, h2; cmph_uint32 keylen; - char *key; + char *key = NULL; mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; @@ -434,6 +435,7 @@ static int bmz_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. diff --git a/src/brz.c b/src/brz.c index 4ef8bea..4c0756d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -78,9 +78,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; - DEBUGP("m: %f\n", brz->m); + DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); - DEBUGP("k: %f\n", brz->k); + DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); @@ -128,7 +128,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -138,12 +138,13 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); return NULL; } - // Clustering the keys by graph id. brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); DEBUGP("Graphs generated\n"); + fclose(graphs_fd); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -151,29 +152,26 @@ cmph_t *brz_new(cmph_config_t *mph, float c) for(i = 0; i < brz->k; i++) { + cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); - config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar - + brz_copy_partial_mphf(brz, bmzf, i); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, brz->size[i]); free(keys_vd); cmph_destroy(mphf_tmp); free(source); } - fclose(graphs_fd); - + fclose(graphs_fd); // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); @@ -216,15 +214,29 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } + mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; brz->size[h3] = brz->size[h3] + 1; disksize[h3] = disksize[h3] + keylen + 1; +// if(h3 == 6) +// { +// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); +// } + } + fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { - brz->offset[e] = brz->size[e-1] + brz->size[e]; - diskoffset[e] = disksize[e-1] + disksize[e]; + brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; + diskoffset[e] = disksize[e-1] + diskoffset[e-1]; + DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); } return 1; } @@ -243,14 +255,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - mph->key_source->dispose(mph->key_source->data, key, keylen); + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); + if(h3 == 6) + { + DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); + } diskoffset[h3] = diskoffset[h3] + keylen + 1; + mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -270,8 +291,9 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); + free(buf); + } return keys_vd; } @@ -389,14 +411,19 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); + fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); + fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); + fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - - hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); + hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/cmph.c b/src/cmph.c index 32c1790..f7f4acb 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -41,12 +41,19 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys = (char **)data; - if (keys + position == NULL) return -1; - *keylen = strlen(*(keys + position)); - *key = (char *)malloc(*keylen); - strcpy(*key, *(keys + position)); + char **keys_vd = (char **)data; + if (keys_vd + position == NULL) return -1; + *keylen = strlen(*(keys_vd + position)); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, *(keys_vd + position)); position ++; + +/* char **keys_vd = (char **)data; + if (keys_vd[position] == NULL) return -1; + *keylen = strlen(keys_vd[position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[position]); + position ++;*/ return *keylen; } @@ -56,6 +63,11 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) free(key); } +static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; @@ -67,6 +79,7 @@ static void key_vector_rewind(void *data) position = 0; } + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -114,7 +127,7 @@ cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) key_source->data = (void *)vector; key_source->nkeys = nkeys; key_source->read = key_vector_read; - key_source->dispose = key_nlfile_dispose; + key_source->dispose = key_vector_dispose; key_source->rewind = key_vector_rewind; return key_source; } @@ -136,13 +149,13 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); + chm_config_destroy(mph); break; case CMPH_BMZ: - bmz_config_destroy(mph->data); + bmz_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph->data); + brz_config_destroy(mph); break; default: assert(0); From 77d05871bffd428863fbb0e0dc1d69f8c14756dc Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 00:00:01 +0000 Subject: [PATCH 115/739] fixed some mistakes in BRZ algorithm --- src/bmz.c | 8 ++++--- src/brz.c | 69 +++++++++++++++++++++++++++++++++++++----------------- src/cmph.c | 31 +++++++++++++++++------- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 2861085..efa42f6 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -99,7 +99,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -413,7 +413,6 @@ static int bmz_gen_edges(cmph_config_t *mph) cmph_uint32 e; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; cmph_uint8 multiple_edges = 0; - DEBUGP("Generating edges for %u vertices\n", bmz->n); graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); @@ -421,8 +420,10 @@ static int bmz_gen_edges(cmph_config_t *mph) { cmph_uint32 h1, h2; cmph_uint32 keylen; - char *key; + char *key = NULL; mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; @@ -434,6 +435,7 @@ static int bmz_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. diff --git a/src/brz.c b/src/brz.c index 4ef8bea..4c0756d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -78,9 +78,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; - DEBUGP("m: %f\n", brz->m); + DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); - DEBUGP("k: %f\n", brz->k); + DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); @@ -128,7 +128,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -138,12 +138,13 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); return NULL; } - // Clustering the keys by graph id. brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); DEBUGP("Graphs generated\n"); + fclose(graphs_fd); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -151,29 +152,26 @@ cmph_t *brz_new(cmph_config_t *mph, float c) for(i = 0; i < brz->k; i++) { + cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); - config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar - + brz_copy_partial_mphf(brz, bmzf, i); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, brz->size[i]); free(keys_vd); cmph_destroy(mphf_tmp); free(source); } - fclose(graphs_fd); - + fclose(graphs_fd); // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); @@ -216,15 +214,29 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } + mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; brz->size[h3] = brz->size[h3] + 1; disksize[h3] = disksize[h3] + keylen + 1; +// if(h3 == 6) +// { +// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); +// } + } + fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { - brz->offset[e] = brz->size[e-1] + brz->size[e]; - diskoffset[e] = disksize[e-1] + disksize[e]; + brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; + diskoffset[e] = disksize[e-1] + diskoffset[e-1]; + DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); } return 1; } @@ -243,14 +255,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - mph->key_source->dispose(mph->key_source->data, key, keylen); + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); + if(h3 == 6) + { + DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); + } diskoffset[h3] = diskoffset[h3] + keylen + 1; + mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -270,8 +291,9 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); + free(buf); + } return keys_vd; } @@ -389,14 +411,19 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); + fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); + fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); + fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - - hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); + hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/cmph.c b/src/cmph.c index 32c1790..f7f4acb 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -41,12 +41,19 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys = (char **)data; - if (keys + position == NULL) return -1; - *keylen = strlen(*(keys + position)); - *key = (char *)malloc(*keylen); - strcpy(*key, *(keys + position)); + char **keys_vd = (char **)data; + if (keys_vd + position == NULL) return -1; + *keylen = strlen(*(keys_vd + position)); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, *(keys_vd + position)); position ++; + +/* char **keys_vd = (char **)data; + if (keys_vd[position] == NULL) return -1; + *keylen = strlen(keys_vd[position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[position]); + position ++;*/ return *keylen; } @@ -56,6 +63,11 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) free(key); } +static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; @@ -67,6 +79,7 @@ static void key_vector_rewind(void *data) position = 0; } + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -114,7 +127,7 @@ cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) key_source->data = (void *)vector; key_source->nkeys = nkeys; key_source->read = key_vector_read; - key_source->dispose = key_nlfile_dispose; + key_source->dispose = key_vector_dispose; key_source->rewind = key_vector_rewind; return key_source; } @@ -136,13 +149,13 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); + chm_config_destroy(mph); break; case CMPH_BMZ: - bmz_config_destroy(mph->data); + bmz_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph->data); + brz_config_destroy(mph); break; default: assert(0); From 699e9b46171f7b29f79496052aeac2d651a7b73d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 00:00:01 +0000 Subject: [PATCH 116/739] fixed some mistakes in BRZ algorithm --- src/bmz.c | 8 ++++--- src/brz.c | 69 +++++++++++++++++++++++++++++++++++++----------------- src/cmph.c | 31 +++++++++++++++++------- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 2861085..efa42f6 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -99,7 +99,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -413,7 +413,6 @@ static int bmz_gen_edges(cmph_config_t *mph) cmph_uint32 e; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; cmph_uint8 multiple_edges = 0; - DEBUGP("Generating edges for %u vertices\n", bmz->n); graph_clear_edges(bmz->graph); mph->key_source->rewind(mph->key_source->data); @@ -421,8 +420,10 @@ static int bmz_gen_edges(cmph_config_t *mph) { cmph_uint32 h1, h2; cmph_uint32 keylen; - char *key; + char *key = NULL; mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; @@ -434,6 +435,7 @@ static int bmz_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); if (multiple_edges) return 0; // checking multiple edge restriction. diff --git a/src/brz.c b/src/brz.c index 4ef8bea..4c0756d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -78,9 +78,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; brz->m = mph->key_source->nkeys; - DEBUGP("m: %f\n", brz->m); + DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); - DEBUGP("k: %f\n", brz->k); + DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); @@ -128,7 +128,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb+"); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -138,12 +138,13 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); return NULL; } - // Clustering the keys by graph id. brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); free(disksize); free(diskoffset); DEBUGP("Graphs generated\n"); + fclose(graphs_fd); + graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -151,29 +152,26 @@ cmph_t *brz_new(cmph_config_t *mph, float c) for(i = 0; i < brz->k; i++) { + cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); - config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar - + brz_copy_partial_mphf(brz, bmzf, i); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, brz->size[i]); free(keys_vd); cmph_destroy(mphf_tmp); free(source); } - fclose(graphs_fd); - + fclose(graphs_fd); // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); @@ -216,15 +214,29 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } + mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; brz->size[h3] = brz->size[h3] + 1; disksize[h3] = disksize[h3] + keylen + 1; +// if(h3 == 6) +// { +// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); +// } + } + fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { - brz->offset[e] = brz->size[e-1] + brz->size[e]; - diskoffset[e] = disksize[e-1] + disksize[e]; + brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; + diskoffset[e] = disksize[e-1] + diskoffset[e-1]; + DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); } return 1; } @@ -243,14 +255,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - mph->key_source->dispose(mph->key_source->data, key, keylen); + if(h3 == 6) + { + DEBUGP("key = %s\n", key); + DEBUGP("keylen = %u\n", keylen + 1); + } fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); + if(h3 == 6) + { + DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); + } diskoffset[h3] = diskoffset[h3] + keylen + 1; + mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -270,8 +291,9 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); + free(buf); + } return keys_vd; } @@ -389,14 +411,19 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); + fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); + fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); + fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - - hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); + hash_state_destroy(data->h3); + fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/cmph.c b/src/cmph.c index 32c1790..f7f4acb 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -41,12 +41,19 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys = (char **)data; - if (keys + position == NULL) return -1; - *keylen = strlen(*(keys + position)); - *key = (char *)malloc(*keylen); - strcpy(*key, *(keys + position)); + char **keys_vd = (char **)data; + if (keys_vd + position == NULL) return -1; + *keylen = strlen(*(keys_vd + position)); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, *(keys_vd + position)); position ++; + +/* char **keys_vd = (char **)data; + if (keys_vd[position] == NULL) return -1; + *keylen = strlen(keys_vd[position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[position]); + position ++;*/ return *keylen; } @@ -56,6 +63,11 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) free(key); } +static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} + static void key_nlfile_rewind(void *data) { FILE *fd = (FILE *)data; @@ -67,6 +79,7 @@ static void key_vector_rewind(void *data) position = 0; } + static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -114,7 +127,7 @@ cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) key_source->data = (void *)vector; key_source->nkeys = nkeys; key_source->read = key_vector_read; - key_source->dispose = key_nlfile_dispose; + key_source->dispose = key_vector_dispose; key_source->rewind = key_vector_rewind; return key_source; } @@ -136,13 +149,13 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) switch (mph->algo) { case CMPH_CHM: - chm_config_destroy(mph->data); + chm_config_destroy(mph); break; case CMPH_BMZ: - bmz_config_destroy(mph->data); + bmz_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph->data); + brz_config_destroy(mph); break; default: assert(0); From e88b0312ecd2c52d3b3b7832514fbf586b4fe798 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 03:09:31 +0000 Subject: [PATCH 117/739] it was fixed more mistakes in BRZ algorithm --- src/brz.c | 47 +++++++++++++++++++++------------------------- src/djb2_hash.c | 7 +++++++ src/djb2_hash.h | 1 + src/fnv_hash.c | 7 +++++++ src/fnv_hash.h | 1 + src/hash.c | 24 +++++++++++++++++++++++ src/hash.h | 1 + src/jenkins_hash.c | 11 +++++++++++ src/jenkins_hash.h | 1 + src/sdbm_hash.c | 7 +++++++ src/sdbm_hash.h | 1 + 11 files changed, 82 insertions(+), 26 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4c0756d..fb27277 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -128,7 +128,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); + graphs_fd = fopen("cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -144,7 +145,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) free(diskoffset); DEBUGP("Graphs generated\n"); fclose(graphs_fd); - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); + graphs_fd = fopen("cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -155,7 +157,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); config = cmph_config_new(source); @@ -214,11 +216,11 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) - { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - } +// if(h3 == 6) +// { +// DEBUGP("key = %s\n", key); +// DEBUGP("keylen = %u\n", keylen + 1); +// } mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; @@ -230,13 +232,13 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp // } } - fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); +// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; diskoffset[e] = disksize[e-1] + diskoffset[e-1]; - DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); +/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ } return 1; } @@ -255,23 +257,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("key = %s\n", key); DEBUGP("keylen = %u\n", keylen + 1); - } + }*/ fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - } + }*/ diskoffset[h3] = diskoffset[h3] + keylen + 1; mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -291,7 +293,6 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); free(buf); } return keys_vd; @@ -311,8 +312,8 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; } - brz->h1[index] = bmzf->hashes[0]; - brz->h2[index] = bmzf->hashes[1]; + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -411,19 +412,13 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); - fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); - fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); - fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); hash_state_destroy(data->h3); - fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 5bbd9bd..923bbd8 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -34,6 +34,13 @@ void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) return; } +djb2_state_t *djb2_state_copy(djb2_state_t *src_state) +{ + djb2_state_t *dest_state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) { djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 3fef71d..dda97e3 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -11,6 +11,7 @@ typedef struct __djb2_state_t djb2_state_t *djb2_state_new(); cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_copy(djb2_state_t *src_state); djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); void djb2_state_destroy(djb2_state_t *state); diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 5bf8db2..aeaca8f 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -38,6 +38,13 @@ void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) return; } +fnv_state_t * fnv_state_copy(fnv_state_t *src_state) +{ + fnv_state_t *dest_state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) { fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); diff --git a/src/fnv_hash.h b/src/fnv_hash.h index e73e0f6..7f57946 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -11,6 +11,7 @@ typedef struct __fnv_state_t fnv_state_t *fnv_state_new(); cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_copy(fnv_state_t *src_state); fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); void fnv_state_destroy(fnv_state_t *state); diff --git a/src/hash.c b/src/hash.c index 868e25c..f09c47b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -86,6 +86,30 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) return; } +hash_state_t * hash_state_copy(hash_state_t *src_state) +{ + hash_state_t *dest_state = NULL; + switch (src_state->hashfunc) + { + case CMPH_HASH_JENKINS: + dest_state = (hash_state_t *)jenkins_state_copy((jenkins_state_t *)src_state); + break; + case CMPH_HASH_DJB2: + dest_state = (hash_state_t *)djb2_state_copy((djb2_state_t *)src_state); + break; + case CMPH_HASH_SDBM: + dest_state = (hash_state_t *)sdbm_state_copy((sdbm_state_t *)src_state); + break; + case CMPH_HASH_FNV: + dest_state = (hash_state_t *)fnv_state_copy((fnv_state_t *)src_state); + break; + default: + assert(0); + } + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) { cmph_uint32 i; diff --git a/src/hash.h b/src/hash.h index 2397c33..2735a22 100644 --- a/src/hash.h +++ b/src/hash.h @@ -8,6 +8,7 @@ typedef union __hash_state_t hash_state_t; hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); +hash_state_t * hash_state_copy(hash_state_t *src_state); hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); void hash_state_destroy(hash_state_t *state); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index c849ec8..4ed64f5 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -178,6 +178,17 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } + +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) +{ + jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + dest_state->hashfunc = src_state->hashfunc; + dest_state->seed = src_state->seed; + dest_state->nbits = src_state->nbits; + dest_state->size = src_state->size; + return dest_state; +} + jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index baa6209..e259ee2 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -14,6 +14,7 @@ typedef struct __jenkins_state_t jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state); jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); void jenkins_state_destroy(jenkins_state_t *state); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index bddcce6..b854478 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -34,6 +34,13 @@ void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) return; } +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state) +{ + sdbm_state_t *dest_state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) { sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index a05daae..f44b2f1 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -11,6 +11,7 @@ typedef struct __sdbm_state_t sdbm_state_t *sdbm_state_new(); cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state); sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); void sdbm_state_destroy(sdbm_state_t *state); From be73e6b2a4876f1d30bda6b1267d0dd08b892c10 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 03:09:31 +0000 Subject: [PATCH 118/739] it was fixed more mistakes in BRZ algorithm --- src/brz.c | 47 +++++++++++++++++++++------------------------- src/djb2_hash.c | 7 +++++++ src/djb2_hash.h | 1 + src/fnv_hash.c | 7 +++++++ src/fnv_hash.h | 1 + src/hash.c | 24 +++++++++++++++++++++++ src/hash.h | 1 + src/jenkins_hash.c | 11 +++++++++++ src/jenkins_hash.h | 1 + src/sdbm_hash.c | 7 +++++++ src/sdbm_hash.h | 1 + 11 files changed, 82 insertions(+), 26 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4c0756d..fb27277 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -128,7 +128,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); + graphs_fd = fopen("cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -144,7 +145,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) free(diskoffset); DEBUGP("Graphs generated\n"); fclose(graphs_fd); - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); + graphs_fd = fopen("cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -155,7 +157,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); config = cmph_config_new(source); @@ -214,11 +216,11 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) - { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - } +// if(h3 == 6) +// { +// DEBUGP("key = %s\n", key); +// DEBUGP("keylen = %u\n", keylen + 1); +// } mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; @@ -230,13 +232,13 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp // } } - fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); +// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; diskoffset[e] = disksize[e-1] + diskoffset[e-1]; - DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); +/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ } return 1; } @@ -255,23 +257,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("key = %s\n", key); DEBUGP("keylen = %u\n", keylen + 1); - } + }*/ fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - } + }*/ diskoffset[h3] = diskoffset[h3] + keylen + 1; mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -291,7 +293,6 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); free(buf); } return keys_vd; @@ -311,8 +312,8 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; } - brz->h1[index] = bmzf->hashes[0]; - brz->h2[index] = bmzf->hashes[1]; + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -411,19 +412,13 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); - fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); - fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); - fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); hash_state_destroy(data->h3); - fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 5bbd9bd..923bbd8 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -34,6 +34,13 @@ void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) return; } +djb2_state_t *djb2_state_copy(djb2_state_t *src_state) +{ + djb2_state_t *dest_state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) { djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 3fef71d..dda97e3 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -11,6 +11,7 @@ typedef struct __djb2_state_t djb2_state_t *djb2_state_new(); cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_copy(djb2_state_t *src_state); djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); void djb2_state_destroy(djb2_state_t *state); diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 5bf8db2..aeaca8f 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -38,6 +38,13 @@ void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) return; } +fnv_state_t * fnv_state_copy(fnv_state_t *src_state) +{ + fnv_state_t *dest_state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) { fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); diff --git a/src/fnv_hash.h b/src/fnv_hash.h index e73e0f6..7f57946 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -11,6 +11,7 @@ typedef struct __fnv_state_t fnv_state_t *fnv_state_new(); cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_copy(fnv_state_t *src_state); fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); void fnv_state_destroy(fnv_state_t *state); diff --git a/src/hash.c b/src/hash.c index 868e25c..f09c47b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -86,6 +86,30 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) return; } +hash_state_t * hash_state_copy(hash_state_t *src_state) +{ + hash_state_t *dest_state = NULL; + switch (src_state->hashfunc) + { + case CMPH_HASH_JENKINS: + dest_state = (hash_state_t *)jenkins_state_copy((jenkins_state_t *)src_state); + break; + case CMPH_HASH_DJB2: + dest_state = (hash_state_t *)djb2_state_copy((djb2_state_t *)src_state); + break; + case CMPH_HASH_SDBM: + dest_state = (hash_state_t *)sdbm_state_copy((sdbm_state_t *)src_state); + break; + case CMPH_HASH_FNV: + dest_state = (hash_state_t *)fnv_state_copy((fnv_state_t *)src_state); + break; + default: + assert(0); + } + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) { cmph_uint32 i; diff --git a/src/hash.h b/src/hash.h index 2397c33..2735a22 100644 --- a/src/hash.h +++ b/src/hash.h @@ -8,6 +8,7 @@ typedef union __hash_state_t hash_state_t; hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); +hash_state_t * hash_state_copy(hash_state_t *src_state); hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); void hash_state_destroy(hash_state_t *state); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index c849ec8..4ed64f5 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -178,6 +178,17 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } + +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) +{ + jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + dest_state->hashfunc = src_state->hashfunc; + dest_state->seed = src_state->seed; + dest_state->nbits = src_state->nbits; + dest_state->size = src_state->size; + return dest_state; +} + jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index baa6209..e259ee2 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -14,6 +14,7 @@ typedef struct __jenkins_state_t jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state); jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); void jenkins_state_destroy(jenkins_state_t *state); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index bddcce6..b854478 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -34,6 +34,13 @@ void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) return; } +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state) +{ + sdbm_state_t *dest_state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) { sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index a05daae..f44b2f1 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -11,6 +11,7 @@ typedef struct __sdbm_state_t sdbm_state_t *sdbm_state_new(); cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state); sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); void sdbm_state_destroy(sdbm_state_t *state); From c98912e0aec64f91108b89b917c68cbc761a5dc1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 03:09:31 +0000 Subject: [PATCH 119/739] it was fixed more mistakes in BRZ algorithm --- src/brz.c | 47 +++++++++++++++++++++------------------------- src/djb2_hash.c | 7 +++++++ src/djb2_hash.h | 1 + src/fnv_hash.c | 7 +++++++ src/fnv_hash.h | 1 + src/hash.c | 24 +++++++++++++++++++++++ src/hash.h | 1 + src/jenkins_hash.c | 11 +++++++++++ src/jenkins_hash.h | 1 + src/sdbm_hash.c | 7 +++++++ src/sdbm_hash.h | 1 + 11 files changed, 82 insertions(+), 26 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4c0756d..fb27277 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -128,7 +128,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); + graphs_fd = fopen("cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -144,7 +145,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) free(diskoffset); DEBUGP("Graphs generated\n"); fclose(graphs_fd); - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); + graphs_fd = fopen("cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -155,7 +157,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); config = cmph_config_new(source); @@ -214,11 +216,11 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) - { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - } +// if(h3 == 6) +// { +// DEBUGP("key = %s\n", key); +// DEBUGP("keylen = %u\n", keylen + 1); +// } mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; @@ -230,13 +232,13 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp // } } - fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); +// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; diskoffset[e] = disksize[e-1] + diskoffset[e-1]; - DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); +/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ } return 1; } @@ -255,23 +257,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("key = %s\n", key); DEBUGP("keylen = %u\n", keylen + 1); - } + }*/ fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - } + }*/ diskoffset[h3] = diskoffset[h3] + keylen + 1; mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -291,7 +293,6 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); free(buf); } return keys_vd; @@ -311,8 +312,8 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; } - brz->h1[index] = bmzf->hashes[0]; - brz->h2[index] = bmzf->hashes[1]; + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -411,19 +412,13 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); - fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); - fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); - fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); hash_state_destroy(data->h3); - fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 5bbd9bd..923bbd8 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -34,6 +34,13 @@ void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) return; } +djb2_state_t *djb2_state_copy(djb2_state_t *src_state) +{ + djb2_state_t *dest_state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) { djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 3fef71d..dda97e3 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -11,6 +11,7 @@ typedef struct __djb2_state_t djb2_state_t *djb2_state_new(); cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_copy(djb2_state_t *src_state); djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); void djb2_state_destroy(djb2_state_t *state); diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 5bf8db2..aeaca8f 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -38,6 +38,13 @@ void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) return; } +fnv_state_t * fnv_state_copy(fnv_state_t *src_state) +{ + fnv_state_t *dest_state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) { fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); diff --git a/src/fnv_hash.h b/src/fnv_hash.h index e73e0f6..7f57946 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -11,6 +11,7 @@ typedef struct __fnv_state_t fnv_state_t *fnv_state_new(); cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_copy(fnv_state_t *src_state); fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); void fnv_state_destroy(fnv_state_t *state); diff --git a/src/hash.c b/src/hash.c index 868e25c..f09c47b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -86,6 +86,30 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) return; } +hash_state_t * hash_state_copy(hash_state_t *src_state) +{ + hash_state_t *dest_state = NULL; + switch (src_state->hashfunc) + { + case CMPH_HASH_JENKINS: + dest_state = (hash_state_t *)jenkins_state_copy((jenkins_state_t *)src_state); + break; + case CMPH_HASH_DJB2: + dest_state = (hash_state_t *)djb2_state_copy((djb2_state_t *)src_state); + break; + case CMPH_HASH_SDBM: + dest_state = (hash_state_t *)sdbm_state_copy((sdbm_state_t *)src_state); + break; + case CMPH_HASH_FNV: + dest_state = (hash_state_t *)fnv_state_copy((fnv_state_t *)src_state); + break; + default: + assert(0); + } + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) { cmph_uint32 i; diff --git a/src/hash.h b/src/hash.h index 2397c33..2735a22 100644 --- a/src/hash.h +++ b/src/hash.h @@ -8,6 +8,7 @@ typedef union __hash_state_t hash_state_t; hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); +hash_state_t * hash_state_copy(hash_state_t *src_state); hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); void hash_state_destroy(hash_state_t *state); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index c849ec8..4ed64f5 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -178,6 +178,17 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } + +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) +{ + jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + dest_state->hashfunc = src_state->hashfunc; + dest_state->seed = src_state->seed; + dest_state->nbits = src_state->nbits; + dest_state->size = src_state->size; + return dest_state; +} + jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index baa6209..e259ee2 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -14,6 +14,7 @@ typedef struct __jenkins_state_t jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state); jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); void jenkins_state_destroy(jenkins_state_t *state); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index bddcce6..b854478 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -34,6 +34,13 @@ void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) return; } +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state) +{ + sdbm_state_t *dest_state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) { sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index a05daae..f44b2f1 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -11,6 +11,7 @@ typedef struct __sdbm_state_t sdbm_state_t *sdbm_state_new(); cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state); sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); void sdbm_state_destroy(sdbm_state_t *state); From f5dc722c5470cfb82e82f2c93cd6dae387700a2a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 03:09:31 +0000 Subject: [PATCH 120/739] it was fixed more mistakes in BRZ algorithm --- src/brz.c | 47 +++++++++++++++++++++------------------------- src/djb2_hash.c | 7 +++++++ src/djb2_hash.h | 1 + src/fnv_hash.c | 7 +++++++ src/fnv_hash.h | 1 + src/hash.c | 24 +++++++++++++++++++++++ src/hash.h | 1 + src/jenkins_hash.c | 11 +++++++++++ src/jenkins_hash.h | 1 + src/sdbm_hash.c | 7 +++++++ src/sdbm_hash.h | 1 + 11 files changed, 82 insertions(+), 26 deletions(-) diff --git a/src/brz.c b/src/brz.c index 4c0756d..fb27277 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3); +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); @@ -128,7 +128,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return NULL; } - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); + graphs_fd = fopen("cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -144,7 +145,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) free(diskoffset); DEBUGP("Graphs generated\n"); fclose(graphs_fd); - graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); +// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); + graphs_fd = fopen("cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); @@ -155,7 +157,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 j; bmz_data_t * bmzf = NULL; if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i], i); + keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); config = cmph_config_new(source); @@ -214,11 +216,11 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) - { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - } +// if(h3 == 6) +// { +// DEBUGP("key = %s\n", key); +// DEBUGP("keylen = %u\n", keylen + 1); +// } mph->key_source->dispose(mph->key_source->data, key, keylen); if (brz->size[h3] == 255) return 0; @@ -230,13 +232,13 @@ static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmp // } } - fprintf(stderr, "size:%u offset: %u\n", brz->size[0], brz->offset[0]); +// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); for (e = 1; e < brz->k; ++e) { brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; diskoffset[e] = disksize[e-1] + diskoffset[e-1]; - DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]); +/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); + DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ } return 1; } @@ -255,23 +257,23 @@ static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); h3 = hash(brz->h3, key, keylen) % brz->k; - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("key = %s\n", key); DEBUGP("keylen = %u\n", keylen + 1); - } + }*/ fseek(graphs_fd, diskoffset[h3], SEEK_SET); fwrite(key, sizeof(char), keylen + 1, graphs_fd); - if(h3 == 6) +/* if(h3 == 6) { DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - } + }*/ diskoffset[h3] = diskoffset[h3] + keylen + 1; mph->key_source->dispose(mph->key_source->data, key, keylen); } } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 h3) +static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); cmph_uint8 i; @@ -291,7 +293,6 @@ static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys, cmph_uint32 } keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - if(h3 == 6) DEBUGP("key = %s\n", keys_vd[i]); free(buf); } return keys_vd; @@ -311,8 +312,8 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; } - brz->h1[index] = bmzf->hashes[0]; - brz->h2[index] = bmzf->hashes[1]; + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -411,19 +412,13 @@ void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); for(i = 0; i < data->k; i++) { free(data->g[i]); - fprintf(stderr, "MERDAAAAAA1 %u\n", data->h3->hashfunc); hash_state_destroy(data->h1[i]); - fprintf(stderr, "MERDAAAAAA2 %u\n", data->h3->hashfunc); hash_state_destroy(data->h2[i]); - fprintf(stderr, "MERDAAAAAA3 %u\n", data->h3->hashfunc); } - fprintf(stderr, "MERDAAAAAA %u\n", data->h3->hashfunc); hash_state_destroy(data->h3); - fprintf(stderr, "MERDAAAAAA1FAB\n"); free(data->g); free(data->h1); free(data->h2); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 5bbd9bd..923bbd8 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -34,6 +34,13 @@ void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) return; } +djb2_state_t *djb2_state_copy(djb2_state_t *src_state) +{ + djb2_state_t *dest_state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) { djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); diff --git a/src/djb2_hash.h b/src/djb2_hash.h index 3fef71d..dda97e3 100644 --- a/src/djb2_hash.h +++ b/src/djb2_hash.h @@ -11,6 +11,7 @@ typedef struct __djb2_state_t djb2_state_t *djb2_state_new(); cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_copy(djb2_state_t *src_state); djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); void djb2_state_destroy(djb2_state_t *state); diff --git a/src/fnv_hash.c b/src/fnv_hash.c index 5bf8db2..aeaca8f 100644 --- a/src/fnv_hash.c +++ b/src/fnv_hash.c @@ -38,6 +38,13 @@ void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) return; } +fnv_state_t * fnv_state_copy(fnv_state_t *src_state) +{ + fnv_state_t *dest_state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) { fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); diff --git a/src/fnv_hash.h b/src/fnv_hash.h index e73e0f6..7f57946 100644 --- a/src/fnv_hash.h +++ b/src/fnv_hash.h @@ -11,6 +11,7 @@ typedef struct __fnv_state_t fnv_state_t *fnv_state_new(); cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_copy(fnv_state_t *src_state); fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); void fnv_state_destroy(fnv_state_t *state); diff --git a/src/hash.c b/src/hash.c index 868e25c..f09c47b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -86,6 +86,30 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) return; } +hash_state_t * hash_state_copy(hash_state_t *src_state) +{ + hash_state_t *dest_state = NULL; + switch (src_state->hashfunc) + { + case CMPH_HASH_JENKINS: + dest_state = (hash_state_t *)jenkins_state_copy((jenkins_state_t *)src_state); + break; + case CMPH_HASH_DJB2: + dest_state = (hash_state_t *)djb2_state_copy((djb2_state_t *)src_state); + break; + case CMPH_HASH_SDBM: + dest_state = (hash_state_t *)sdbm_state_copy((sdbm_state_t *)src_state); + break; + case CMPH_HASH_FNV: + dest_state = (hash_state_t *)fnv_state_copy((fnv_state_t *)src_state); + break; + default: + assert(0); + } + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) { cmph_uint32 i; diff --git a/src/hash.h b/src/hash.h index 2397c33..2735a22 100644 --- a/src/hash.h +++ b/src/hash.h @@ -8,6 +8,7 @@ typedef union __hash_state_t hash_state_t; hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); +hash_state_t * hash_state_copy(hash_state_t *src_state); hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); void hash_state_destroy(hash_state_t *state); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index c849ec8..4ed64f5 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -178,6 +178,17 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } + +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) +{ + jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + dest_state->hashfunc = src_state->hashfunc; + dest_state->seed = src_state->seed; + dest_state->nbits = src_state->nbits; + dest_state->size = src_state->size; + return dest_state; +} + jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index baa6209..e259ee2 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -14,6 +14,7 @@ typedef struct __jenkins_state_t jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state); jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); void jenkins_state_destroy(jenkins_state_t *state); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index bddcce6..b854478 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -34,6 +34,13 @@ void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) return; } +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state) +{ + sdbm_state_t *dest_state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) { sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); diff --git a/src/sdbm_hash.h b/src/sdbm_hash.h index a05daae..f44b2f1 100644 --- a/src/sdbm_hash.h +++ b/src/sdbm_hash.h @@ -11,6 +11,7 @@ typedef struct __sdbm_state_t sdbm_state_t *sdbm_state_new(); cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state); sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); void sdbm_state_destroy(sdbm_state_t *state); From e796250cec0b7181c8a53eac121f959e1e519838 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 18:29:30 +0000 Subject: [PATCH 121/739] BRZ algorithm is almost stable --- src/bmz.c | 7 +- src/brz.c | 236 +++++++++++++++++++++++++++++++++------------- src/brz_structs.h | 2 + src/cmph_types.h | 1 + 4 files changed, 179 insertions(+), 67 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index efa42f6..4b6047d 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -368,12 +368,15 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; + cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; + else gvalue = *unused_edge_index; + bmz->g[neighbor] = gvalue - bmz->g[v]; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -530,7 +533,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return bmz->g[h1] + bmz->g[h2]; + return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/brz.c b/src/brz.c index fb27277..761f4b6 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,14 +14,14 @@ #include #include -#define DEBUG +//#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -59,6 +59,72 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } +static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); + source->rewind(source->data); + memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + h = cmph_search(mphf, buf, buflen); + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + } + free(hashtable); + return 1; +} + +static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); + source->rewind(source->data); + //memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h1_v; + cmph_uint32 h2_v; + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + + h1_v = hash(h1, buf, buflen) % n; + + h2_v = hash(h2, buf, buflen) % n; + + if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; + + h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; + + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + + } + free(hashtable); + return 1; +} cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -77,6 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) FILE * graphs_fd = NULL; DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); @@ -151,23 +218,25 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - + DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { cmph_uint32 j; bmz_data_t * bmzf = NULL; - if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + cmph_uint8 nkeys = brz->size[i]; + if (nkeys == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, nkeys); // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, i, source); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); cmph_destroy(mphf_tmp); free(source); @@ -192,7 +261,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership brzf->k = brz->k; - brzf->m = brz->m; + brzf->c = brz->c; + brzf->m = brz->m; mphf->data = brzf; mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); @@ -304,59 +374,75 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; - brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); - for(i = 0; i < bmzf->m; i++) + cmph_uint32 n = ceil(brz->c * brz->size[index]); + + brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + for(i = 0; i < n; i++) { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + //brz->size[index] = bmzf->n; + //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) { - /*char *buf = NULL; + char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; - cmph_uint32 two = 2; //number of hash functions brz_data_t *data = (brz_data_t *)mphf->data; - cmph_uint32 nn, nm; + DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); - fwrite(&two, sizeof(cmph_uint32), 1, fd); - - hash_state_dump(data->hashes[0], &buf, &buflen); + fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); + //dumping h1 and h2. + for(i = 0; i < data->k; i++) + { + // h1 + hash_state_dump(data->h1[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // h2 + hash_state_dump(data->h2[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + } + // Dumping h3. + hash_state_dump(data->h3, &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - - hash_state_dump(data->hashes[1], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); - fprintf(stderr, "\n"); - #endif -*/ + // Dumping c, m, size vector and offset vector. + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); + + // Dumping g function. + for(i = 0; i < data->k; i++) + { + cmph_uint32 n = ceil(data->c * data->size[i]); + fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + } return 1; } void brz_load(FILE *f, cmph_t *mphf) { -/* cmph_uint32 nhashes; + cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -364,49 +450,69 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; - fread(&nhashes, sizeof(cmph_uint32), 1, f); - brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - brz->hashes[nhashes] = NULL; - DEBUGP("Reading %u hashes\n", nhashes); - for (i = 0; i < nhashes; ++i) + fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + //loading h1 and h2. + for(i = 0; i < brz->k; i++) { - hash_state_t *state = NULL; + // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); - brz->hashes[i] = state; + brz->h1[i] = hash_state_load(buf, buflen); free(buf); + //h2 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h2[i] = hash_state_load(buf, buflen); + free(buf); } + //loading h3 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h3 = hash_state_load(buf, buflen); + free(buf); - DEBUGP("Reading m and n\n"); - fread(&(brz->n), sizeof(cmph_uint32), 1, f); - fread(&(brz->m), sizeof(cmph_uint32), 1, f); - - brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); - fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); - fprintf(stderr, "\n"); - #endif + //loading c, m, size vector and offset vector. + fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + + //loading g function. + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); + for(i = 0; i < brz->k; i++) + { + cmph_uint32 n = ceil(brz->c * brz->size[i]); + brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); + } return; -*/ } cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { -/* brz_data_t *brz = mphf->data; - cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; - cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; - DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > brz->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); - return brz->g[h1] + brz->g[h2]; -*/ - return 0; + brz_data_t *brz = mphf->data; + cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h3]; + cmph_uint32 n = ceil(brz->c * m); + cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + if (h1 == h2 && ++h2 >= n) h2 = 0; + DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); + DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); + return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index bd2a8f6..742a425 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -6,6 +6,7 @@ struct __brz_data_t { cmph_uint32 m; // edges (words) count + cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. @@ -18,6 +19,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. diff --git a/src/cmph_types.h b/src/cmph_types.h index 76d09a5..9359e33 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -4,6 +4,7 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; +typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; From f54cbcdfdc4af63b916be835038d98f7a6f6a0ba Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 18:29:30 +0000 Subject: [PATCH 122/739] BRZ algorithm is almost stable --- src/bmz.c | 7 +- src/brz.c | 236 +++++++++++++++++++++++++++++++++------------- src/brz_structs.h | 2 + src/cmph_types.h | 1 + 4 files changed, 179 insertions(+), 67 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index efa42f6..4b6047d 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -368,12 +368,15 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; + cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; + else gvalue = *unused_edge_index; + bmz->g[neighbor] = gvalue - bmz->g[v]; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -530,7 +533,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return bmz->g[h1] + bmz->g[h2]; + return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/brz.c b/src/brz.c index fb27277..761f4b6 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,14 +14,14 @@ #include #include -#define DEBUG +//#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -59,6 +59,72 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } +static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); + source->rewind(source->data); + memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + h = cmph_search(mphf, buf, buflen); + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + } + free(hashtable); + return 1; +} + +static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); + source->rewind(source->data); + //memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h1_v; + cmph_uint32 h2_v; + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + + h1_v = hash(h1, buf, buflen) % n; + + h2_v = hash(h2, buf, buflen) % n; + + if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; + + h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; + + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + + } + free(hashtable); + return 1; +} cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -77,6 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) FILE * graphs_fd = NULL; DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); @@ -151,23 +218,25 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - + DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { cmph_uint32 j; bmz_data_t * bmzf = NULL; - if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + cmph_uint8 nkeys = brz->size[i]; + if (nkeys == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, nkeys); // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, i, source); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); cmph_destroy(mphf_tmp); free(source); @@ -192,7 +261,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership brzf->k = brz->k; - brzf->m = brz->m; + brzf->c = brz->c; + brzf->m = brz->m; mphf->data = brzf; mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); @@ -304,59 +374,75 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; - brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); - for(i = 0; i < bmzf->m; i++) + cmph_uint32 n = ceil(brz->c * brz->size[index]); + + brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + for(i = 0; i < n; i++) { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + //brz->size[index] = bmzf->n; + //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) { - /*char *buf = NULL; + char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; - cmph_uint32 two = 2; //number of hash functions brz_data_t *data = (brz_data_t *)mphf->data; - cmph_uint32 nn, nm; + DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); - fwrite(&two, sizeof(cmph_uint32), 1, fd); - - hash_state_dump(data->hashes[0], &buf, &buflen); + fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); + //dumping h1 and h2. + for(i = 0; i < data->k; i++) + { + // h1 + hash_state_dump(data->h1[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // h2 + hash_state_dump(data->h2[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + } + // Dumping h3. + hash_state_dump(data->h3, &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - - hash_state_dump(data->hashes[1], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); - fprintf(stderr, "\n"); - #endif -*/ + // Dumping c, m, size vector and offset vector. + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); + + // Dumping g function. + for(i = 0; i < data->k; i++) + { + cmph_uint32 n = ceil(data->c * data->size[i]); + fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + } return 1; } void brz_load(FILE *f, cmph_t *mphf) { -/* cmph_uint32 nhashes; + cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -364,49 +450,69 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; - fread(&nhashes, sizeof(cmph_uint32), 1, f); - brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - brz->hashes[nhashes] = NULL; - DEBUGP("Reading %u hashes\n", nhashes); - for (i = 0; i < nhashes; ++i) + fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + //loading h1 and h2. + for(i = 0; i < brz->k; i++) { - hash_state_t *state = NULL; + // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); - brz->hashes[i] = state; + brz->h1[i] = hash_state_load(buf, buflen); free(buf); + //h2 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h2[i] = hash_state_load(buf, buflen); + free(buf); } + //loading h3 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h3 = hash_state_load(buf, buflen); + free(buf); - DEBUGP("Reading m and n\n"); - fread(&(brz->n), sizeof(cmph_uint32), 1, f); - fread(&(brz->m), sizeof(cmph_uint32), 1, f); - - brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); - fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); - fprintf(stderr, "\n"); - #endif + //loading c, m, size vector and offset vector. + fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + + //loading g function. + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); + for(i = 0; i < brz->k; i++) + { + cmph_uint32 n = ceil(brz->c * brz->size[i]); + brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); + } return; -*/ } cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { -/* brz_data_t *brz = mphf->data; - cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; - cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; - DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > brz->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); - return brz->g[h1] + brz->g[h2]; -*/ - return 0; + brz_data_t *brz = mphf->data; + cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h3]; + cmph_uint32 n = ceil(brz->c * m); + cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + if (h1 == h2 && ++h2 >= n) h2 = 0; + DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); + DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); + return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index bd2a8f6..742a425 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -6,6 +6,7 @@ struct __brz_data_t { cmph_uint32 m; // edges (words) count + cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. @@ -18,6 +19,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. diff --git a/src/cmph_types.h b/src/cmph_types.h index 76d09a5..9359e33 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -4,6 +4,7 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; +typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; From 2a56ec26d754a715ea19449c1b3c84abb302b4c9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 18:29:30 +0000 Subject: [PATCH 123/739] BRZ algorithm is almost stable --- src/bmz.c | 7 +- src/brz.c | 236 +++++++++++++++++++++++++++++++++------------- src/brz_structs.h | 2 + src/cmph_types.h | 1 + 4 files changed, 179 insertions(+), 67 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index efa42f6..4b6047d 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -368,12 +368,15 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; + cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; + else gvalue = *unused_edge_index; + bmz->g[neighbor] = gvalue - bmz->g[v]; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -530,7 +533,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return bmz->g[h1] + bmz->g[h2]; + return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/brz.c b/src/brz.c index fb27277..761f4b6 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,14 +14,14 @@ #include #include -#define DEBUG +//#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -59,6 +59,72 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } +static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); + source->rewind(source->data); + memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + h = cmph_search(mphf, buf, buflen); + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + } + free(hashtable); + return 1; +} + +static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); + source->rewind(source->data); + //memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h1_v; + cmph_uint32 h2_v; + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + + h1_v = hash(h1, buf, buflen) % n; + + h2_v = hash(h2, buf, buflen) % n; + + if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; + + h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; + + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + + } + free(hashtable); + return 1; +} cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -77,6 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) FILE * graphs_fd = NULL; DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); @@ -151,23 +218,25 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - + DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { cmph_uint32 j; bmz_data_t * bmzf = NULL; - if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + cmph_uint8 nkeys = brz->size[i]; + if (nkeys == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, nkeys); // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, i, source); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); cmph_destroy(mphf_tmp); free(source); @@ -192,7 +261,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership brzf->k = brz->k; - brzf->m = brz->m; + brzf->c = brz->c; + brzf->m = brz->m; mphf->data = brzf; mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); @@ -304,59 +374,75 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; - brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); - for(i = 0; i < bmzf->m; i++) + cmph_uint32 n = ceil(brz->c * brz->size[index]); + + brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + for(i = 0; i < n; i++) { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + //brz->size[index] = bmzf->n; + //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) { - /*char *buf = NULL; + char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; - cmph_uint32 two = 2; //number of hash functions brz_data_t *data = (brz_data_t *)mphf->data; - cmph_uint32 nn, nm; + DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); - fwrite(&two, sizeof(cmph_uint32), 1, fd); - - hash_state_dump(data->hashes[0], &buf, &buflen); + fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); + //dumping h1 and h2. + for(i = 0; i < data->k; i++) + { + // h1 + hash_state_dump(data->h1[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // h2 + hash_state_dump(data->h2[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + } + // Dumping h3. + hash_state_dump(data->h3, &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - - hash_state_dump(data->hashes[1], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); - fprintf(stderr, "\n"); - #endif -*/ + // Dumping c, m, size vector and offset vector. + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); + + // Dumping g function. + for(i = 0; i < data->k; i++) + { + cmph_uint32 n = ceil(data->c * data->size[i]); + fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + } return 1; } void brz_load(FILE *f, cmph_t *mphf) { -/* cmph_uint32 nhashes; + cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -364,49 +450,69 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; - fread(&nhashes, sizeof(cmph_uint32), 1, f); - brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - brz->hashes[nhashes] = NULL; - DEBUGP("Reading %u hashes\n", nhashes); - for (i = 0; i < nhashes; ++i) + fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + //loading h1 and h2. + for(i = 0; i < brz->k; i++) { - hash_state_t *state = NULL; + // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); - brz->hashes[i] = state; + brz->h1[i] = hash_state_load(buf, buflen); free(buf); + //h2 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h2[i] = hash_state_load(buf, buflen); + free(buf); } + //loading h3 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h3 = hash_state_load(buf, buflen); + free(buf); - DEBUGP("Reading m and n\n"); - fread(&(brz->n), sizeof(cmph_uint32), 1, f); - fread(&(brz->m), sizeof(cmph_uint32), 1, f); - - brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); - fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); - fprintf(stderr, "\n"); - #endif + //loading c, m, size vector and offset vector. + fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + + //loading g function. + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); + for(i = 0; i < brz->k; i++) + { + cmph_uint32 n = ceil(brz->c * brz->size[i]); + brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); + } return; -*/ } cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { -/* brz_data_t *brz = mphf->data; - cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; - cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; - DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > brz->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); - return brz->g[h1] + brz->g[h2]; -*/ - return 0; + brz_data_t *brz = mphf->data; + cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h3]; + cmph_uint32 n = ceil(brz->c * m); + cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + if (h1 == h2 && ++h2 >= n) h2 = 0; + DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); + DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); + return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index bd2a8f6..742a425 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -6,6 +6,7 @@ struct __brz_data_t { cmph_uint32 m; // edges (words) count + cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. @@ -18,6 +19,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. diff --git a/src/cmph_types.h b/src/cmph_types.h index 76d09a5..9359e33 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -4,6 +4,7 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; +typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; From 2fa5457c27ad0e8119949e9ace81bce1fe0cce45 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 18:29:30 +0000 Subject: [PATCH 124/739] BRZ algorithm is almost stable --- src/bmz.c | 7 +- src/brz.c | 236 +++++++++++++++++++++++++++++++++------------- src/brz_structs.h | 2 + src/cmph_types.h | 1 + 4 files changed, 179 insertions(+), 67 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index efa42f6..4b6047d 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -368,12 +368,15 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; + cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; + else gvalue = *unused_edge_index; + bmz->g[neighbor] = gvalue - bmz->g[v]; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -530,7 +533,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return bmz->g[h1] + bmz->g[h2]; + return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/brz.c b/src/brz.c index fb27277..761f4b6 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,14 +14,14 @@ #include #include -#define DEBUG +//#define DEBUG #include "debug.h" static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -59,6 +59,72 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } +static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); + source->rewind(source->data); + memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + h = cmph_search(mphf, buf, buflen); + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + } + free(hashtable); + return 1; +} + +static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +{ + cmph_uint8 * hashtable = NULL; + cmph_uint32 i; + hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); + source->rewind(source->data); + //memset(hashtable, 0, source->nkeys); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h1_v; + cmph_uint32 h2_v; + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + + h1_v = hash(h1, buf, buflen) % n; + + h2_v = hash(h2, buf, buflen) % n; + + if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; + + h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; + + if(hashtable[h]) + { + fprintf(stderr, "collision: %u\n",h); + return 0; + } + //assert(hashtable[h]==0); + hashtable[h] = 1; + source->dispose(source->data, buf, buflen); + + } + free(hashtable); + return 1; +} cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -77,6 +143,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) FILE * graphs_fd = NULL; DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/128); @@ -151,23 +218,25 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - + DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { cmph_uint32 j; bmz_data_t * bmzf = NULL; - if (brz->size[i] == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, brz->size[i]); + cmph_uint8 nkeys = brz->size[i]; + if (nkeys == 0) continue; + keys_vd = brz_read_keys_vd(graphs_fd, nkeys); // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)brz->size[i]); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, i); // implementar + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, i, source); // implementar cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, brz->size[i]); + brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); cmph_destroy(mphf_tmp); free(source); @@ -192,7 +261,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership brzf->k = brz->k; - brzf->m = brz->m; + brzf->c = brz->c; + brzf->m = brz->m; mphf->data = brzf; mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); @@ -304,59 +374,75 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; - brz->g[index] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmzf->m); - for(i = 0; i < bmzf->m; i++) + cmph_uint32 n = ceil(brz->c * brz->size[index]); + + brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + for(i = 0; i < n; i++) { brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + //brz->size[index] = bmzf->n; + //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) { - /*char *buf = NULL; + char *buf = NULL; cmph_uint32 buflen; cmph_uint32 nbuflen; cmph_uint32 i; - cmph_uint32 two = 2; //number of hash functions brz_data_t *data = (brz_data_t *)mphf->data; - cmph_uint32 nn, nm; + DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); - fwrite(&two, sizeof(cmph_uint32), 1, fd); - - hash_state_dump(data->hashes[0], &buf, &buflen); + fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); + //dumping h1 and h2. + for(i = 0; i < data->k; i++) + { + // h1 + hash_state_dump(data->h1[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // h2 + hash_state_dump(data->h2[i], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + } + // Dumping h3. + hash_state_dump(data->h3, &buf, &buflen); DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); fwrite(&buflen, sizeof(cmph_uint32), 1, fd); fwrite(buf, buflen, 1, fd); free(buf); - - hash_state_dump(data->hashes[1], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); - fprintf(stderr, "\n"); - #endif -*/ + // Dumping c, m, size vector and offset vector. + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); + + // Dumping g function. + for(i = 0; i < data->k; i++) + { + cmph_uint32 n = ceil(data->c * data->size[i]); + fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + } return 1; } void brz_load(FILE *f, cmph_t *mphf) { -/* cmph_uint32 nhashes; + cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -364,49 +450,69 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; - fread(&nhashes, sizeof(cmph_uint32), 1, f); - brz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - brz->hashes[nhashes] = NULL; - DEBUGP("Reading %u hashes\n", nhashes); - for (i = 0; i < nhashes; ++i) + fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + //loading h1 and h2. + for(i = 0; i < brz->k; i++) { - hash_state_t *state = NULL; + // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - state = hash_state_load(buf, buflen); - brz->hashes[i] = state; + brz->h1[i] = hash_state_load(buf, buflen); free(buf); + //h2 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h2[i] = hash_state_load(buf, buflen); + free(buf); } + //loading h3 + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + brz->h3 = hash_state_load(buf, buflen); + free(buf); - DEBUGP("Reading m and n\n"); - fread(&(brz->n), sizeof(cmph_uint32), 1, f); - fread(&(brz->m), sizeof(cmph_uint32), 1, f); - - brz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->n); - fread(brz->g, brz->n*sizeof(cmph_uint32), 1, f); - #ifdef DEBUG - fprintf(stderr, "G: "); - for (i = 0; i < brz->n; ++i) fprintf(stderr, "%u ", brz->g[i]); - fprintf(stderr, "\n"); - #endif + //loading c, m, size vector and offset vector. + fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->m), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + + //loading g function. + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); + for(i = 0; i < brz->k; i++) + { + cmph_uint32 n = ceil(brz->c * brz->size[i]); + brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); + } return; -*/ } cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { -/* brz_data_t *brz = mphf->data; - cmph_uint32 h1 = hash(brz->hashes[0], key, keylen) % brz->n; - cmph_uint32 h2 = hash(brz->hashes[1], key, keylen) % brz->n; - DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 > brz->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, brz->g[h1], brz->g[h2], brz->m); - return brz->g[h1] + brz->g[h2]; -*/ - return 0; + brz_data_t *brz = mphf->data; + cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h3]; + cmph_uint32 n = ceil(brz->c * m); + cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + if (h1 == h2 && ++h2 >= n) h2 = 0; + DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); + DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); + return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index bd2a8f6..742a425 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -6,6 +6,7 @@ struct __brz_data_t { cmph_uint32 m; // edges (words) count + cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. @@ -18,6 +19,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. diff --git a/src/cmph_types.h b/src/cmph_types.h index 76d09a5..9359e33 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -4,6 +4,7 @@ typedef unsigned char cmph_uint8; typedef unsigned short cmph_uint16; typedef unsigned int cmph_uint32; +typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; From a1a8bb868131b0d4239172e6d4b68e973c69b93b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 19:43:21 +0000 Subject: [PATCH 125/739] BRZ algorithm is almost stable --- src/brz.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/brz.c b/src/brz.c index 761f4b6..17b7b68 100755 --- a/src/brz.c +++ b/src/brz.c @@ -196,7 +196,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); - graphs_fd = fopen("cmph.tmp", "wb"); +/* graphs_fd = fopen("cmph.tmp", "wb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -213,7 +214,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("Graphs generated\n"); fclose(graphs_fd); // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); - graphs_fd = fopen("cmph.tmp", "rb"); +/* graphs_fd = fopen("cmph.tmp", "rb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From fc61796452b31858b24f25ad9b546a9c8b14cc49 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 19:43:21 +0000 Subject: [PATCH 126/739] BRZ algorithm is almost stable --- src/brz.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/brz.c b/src/brz.c index 761f4b6..17b7b68 100755 --- a/src/brz.c +++ b/src/brz.c @@ -196,7 +196,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); - graphs_fd = fopen("cmph.tmp", "wb"); +/* graphs_fd = fopen("cmph.tmp", "wb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -213,7 +214,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("Graphs generated\n"); fclose(graphs_fd); // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); - graphs_fd = fopen("cmph.tmp", "rb"); +/* graphs_fd = fopen("cmph.tmp", "rb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From b95fd8234a9cef514c96dff3b50065b624178fe9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 19:43:21 +0000 Subject: [PATCH 127/739] BRZ algorithm is almost stable --- src/brz.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/brz.c b/src/brz.c index 761f4b6..17b7b68 100755 --- a/src/brz.c +++ b/src/brz.c @@ -196,7 +196,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); - graphs_fd = fopen("cmph.tmp", "wb"); +/* graphs_fd = fopen("cmph.tmp", "wb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -213,7 +214,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("Graphs generated\n"); fclose(graphs_fd); // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); - graphs_fd = fopen("cmph.tmp", "rb"); +/* graphs_fd = fopen("cmph.tmp", "rb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From 0db620e9cd8b5588304677a6c2d836bd8bcd0165 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 29 Jul 2005 19:43:21 +0000 Subject: [PATCH 128/739] BRZ algorithm is almost stable --- src/brz.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/brz.c b/src/brz.c index 761f4b6..17b7b68 100755 --- a/src/brz.c +++ b/src/brz.c @@ -196,7 +196,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); - graphs_fd = fopen("cmph.tmp", "wb"); +/* graphs_fd = fopen("cmph.tmp", "wb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); if (graphs_fd == NULL) { free(brz->size); @@ -213,7 +214,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("Graphs generated\n"); fclose(graphs_fd); // graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); - graphs_fd = fopen("cmph.tmp", "rb"); +/* graphs_fd = fopen("cmph.tmp", "rb");*/ + graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); From b67c58a108c437a6eb1f4f19a621862f48cc0287 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sat, 6 Aug 2005 20:20:04 +0000 Subject: [PATCH 129/739] *** empty log message *** --- src/bmz.c | 15 +- src/brz.c | 391 +++++++++++++++++++++++++++++++++++++---------------- src/main.c | 1 + 3 files changed, 286 insertions(+), 121 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 4b6047d..27df260 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -87,7 +87,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) // Mapping step cmph_uint32 biggest_g_value = 0; cmph_uint32 biggest_edge_value = 1; - iterations = 20; + iterations = 100; if (mph->verbosity) { fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); @@ -143,7 +143,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(cmph_uint32)); + bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -172,7 +172,10 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) }while(restart_mapping && iterations_map > 0); graph_destroy(bmz->graph); bmz->graph = NULL; - if (iterations_map == 0) return NULL; + if (iterations_map == 0) + { + return NULL; + } mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); @@ -368,15 +371,13 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; - cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; - else gvalue = *unused_edge_index; - bmz->g[neighbor] = gvalue - bmz->g[v]; + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); diff --git a/src/brz.c b/src/brz.c index 17b7b68..c496a3b 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,3 +1,4 @@ + #include "graph.h" #include "bmz.h" #include "bmz_structs.h" @@ -17,8 +18,11 @@ //#define DEBUG #include "debug.h" -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); +static char * brz_read_key(FILE * fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -83,6 +87,7 @@ static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) hashtable[h] = 1; source->dispose(source->data, buf, buflen); } + fprintf(stderr, "\n===============================================================================\n"); free(hashtable); return 1; } @@ -132,8 +137,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; - cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL; +/* cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL;*/ cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; @@ -146,30 +151,30 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/128); + brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); - brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); - disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - - for(i = 0; i < brz->k; ++i) + // Clustering the keys by graph id. + if (mph->verbosity) { - brz->size[i] = 0; - brz->offset[i] = 0; - disksize[i] = 0; - diskoffset[i] = 0; + fprintf(stderr, "Partioning the set of keys.\n"); + } + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); + if (graphs_fd == NULL) + { + free(brz->size); + fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); + return NULL; } - // Creating the external graphs. while(1) { int ok; DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_before_gen_graphs(mph, disksize, diskoffset); + ok = brz_gen_graphs(mph, graphs_fd); if (!ok) { --iterations; @@ -184,59 +189,50 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - + fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); return NULL; } + DEBUGP("Graphs generated\n"); + + brz->offset = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + for (i = 1; i < brz->k; ++i) + { + brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; + } -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); -/* graphs_fd = fopen("cmph.tmp", "wb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); - fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); - return NULL; - } - // Clustering the keys by graph id. - brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); - free(disksize); - free(diskoffset); - DEBUGP("Graphs generated\n"); - fclose(graphs_fd); -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); -/* graphs_fd = fopen("cmph.tmp", "rb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + if (mph->verbosity) + { + fprintf(stderr, "\nGenerating mphf.\n"); + } DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { + if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); cmph_uint32 j; bmz_data_t * bmzf = NULL; cmph_uint8 nkeys = brz->size[i]; if (nkeys == 0) continue; keys_vd = brz_read_keys_vd(graphs_fd, nkeys); + // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); + //cmph_config_set_verbosity(config, 1); mphf_tmp = cmph_new(config); bmzf = (bmz_data_t *)mphf_tmp->data; //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); // implementar + brz_copy_partial_mphf(brz, bmzf, i, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); @@ -275,98 +271,265 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { - cmph_uint32 e; - brz_config_data_t *brz = (brz_config_data_t *)mph->data; - mph->key_source->rewind(mph->key_source->data); - DEBUGP("Generating information before the keys partition\n"); - for (e = 0; e < brz->m; ++e) - { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; - mph->key_source->read(mph->key_source->data, &key, &keylen); - h3 = hash(brz->h3, key, keylen) % brz->k; -// if(h3 == 6) -// { -// DEBUGP("key = %s\n", key); -// DEBUGP("keylen = %u\n", keylen + 1); -// } - - mph->key_source->dispose(mph->key_source->data, key, keylen); - if (brz->size[h3] == 255) return 0; - brz->size[h3] = brz->size[h3] + 1; - disksize[h3] = disksize[h3] + keylen + 1; -// if(h3 == 6) -// { -// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); -// } - - } -// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); - for (e = 1; e < brz->k; ++e) - { - brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; - diskoffset[e] = disksize[e-1] + diskoffset[e-1]; -/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ - } - return 1; -} - -// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) -{ - cmph_uint32 e; +#pragma pack(1) + cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_usage = 0; + cmph_uint32 nkeys_in_buffer = 0; + cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *keys_index = NULL; + cmph_uint8 **buffer_merge = NULL; + cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 nflushes = 0; + cmph_uint32 h3; + FILE * tmp_fd = NULL; + FILE ** tmp_fds = NULL; + char filename[100]; + char *key = NULL; + cmph_uint32 keylen; + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); + // Partitioning for (e = 0; e < brz->m; ++e) { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); + + /* Buffers management */ + if (memory_usage + keylen + 1 > memory_availability) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + //fprintf(stderr, "Storing read Key\n"); + memcpy(buffer + memory_usage, key, keylen + 1); + memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; -/* if(h3 == 6) + if (brz->size[h3] == 255) { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - }*/ - fseek(graphs_fd, diskoffset[h3], SEEK_SET); - fwrite(key, sizeof(char), keylen + 1, graphs_fd); -/* if(h3 == 6) - { - DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - }*/ - diskoffset[h3] = diskoffset[h3] + keylen + 1; + free(buffer); + free(buckets_size); + return 0; + } + brz->size[h3] = brz->size[h3] + 1; + buckets_size[h3] ++; + nkeys_in_buffer++; + mph->key_source->dispose(mph->key_source->data, key, keylen); } + + if (memory_usage != 0) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + free(buffer); + free(buckets_size); + if(nflushes > 1024) return 0; // Too many files generated. + + // Merging + fprintf(stderr, "\nMerging files\n"); + tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); + buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + + for(i = 0; i < nflushes; i++) + { + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + tmp_fds[i] = fopen(filename, "rb"); + key = brz_read_key(tmp_fds[i]); + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + buffer_h3[i] = h3; + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + e = 0; + buffer = (cmph_uint8 *)malloc(memory_availability); + while(e < brz->m) + { + i = brz_min_index(buffer_h3, nflushes); + key = brz_read_key(tmp_fds[i]); + if(key) + { + while(key) + { + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; + save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + //fwrite(key, 1, keylen + 1, graphs_fd); + e++; + free(key); + key = brz_read_key(tmp_fds[i]); + } + if (key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = h3; + free(buffer_merge[i]); + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + } +/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ + if(!key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = UINT_MAX; + free(buffer_merge[i]); + buffer_merge[i] = NULL; + } + } + for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); + flush_buffer(buffer, &memory_usage, graphs_fd); + free(tmp_fds); + free(buffer); + free(buffer_merge); + free(buffer_h3); + return 1; +#pragma pack() +} + +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) +{ + fwrite(buffer, 1, *memory_usage, graphs_fd); + *memory_usage = 0; +} + +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, + cmph_uint32 memory_availability, FILE * graphs_fd) +{ + if(*memory_usage + keylen + 1 > memory_availability) + { + flush_buffer(buffer, memory_usage, graphs_fd); + } + memcpy(buffer + *memory_usage, key, keylen + 1); + *memory_usage = *memory_usage + keylen + 1; +} + +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, min_index = 0; + for(i = 1; i < n; i++) + { + if(vector[i] < vector[min_index]) min_index = i; + } + return min_index; +} + +static char * brz_read_key(FILE * fd) +{ + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + fread(&c, sizeof(char), 1, fd); + if(feof(fd)) + { + free(buf); + return NULL; + } + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; } static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; + cmph_uint8 i; for(i = 0; i < nkeys; i++) { - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - - fread(&c, sizeof(char), 1, graphs_fd); - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } + char * buf = brz_read_key(graphs_fd); keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + free(buf); + } return keys_vd; } diff --git a/src/main.c b/src/main.c index c010123..ed24a72 100644 --- a/src/main.c +++ b/src/main.c @@ -248,6 +248,7 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); + assert(h < source->nkeys); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; From 1d07882eb33ac75c68312356afd4af6232c5bc3a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sat, 6 Aug 2005 20:20:04 +0000 Subject: [PATCH 130/739] *** empty log message *** --- src/bmz.c | 15 +- src/brz.c | 391 +++++++++++++++++++++++++++++++++++++---------------- src/main.c | 1 + 3 files changed, 286 insertions(+), 121 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 4b6047d..27df260 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -87,7 +87,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) // Mapping step cmph_uint32 biggest_g_value = 0; cmph_uint32 biggest_edge_value = 1; - iterations = 20; + iterations = 100; if (mph->verbosity) { fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); @@ -143,7 +143,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(cmph_uint32)); + bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -172,7 +172,10 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) }while(restart_mapping && iterations_map > 0); graph_destroy(bmz->graph); bmz->graph = NULL; - if (iterations_map == 0) return NULL; + if (iterations_map == 0) + { + return NULL; + } mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); @@ -368,15 +371,13 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; - cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; - else gvalue = *unused_edge_index; - bmz->g[neighbor] = gvalue - bmz->g[v]; + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); diff --git a/src/brz.c b/src/brz.c index 17b7b68..c496a3b 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,3 +1,4 @@ + #include "graph.h" #include "bmz.h" #include "bmz_structs.h" @@ -17,8 +18,11 @@ //#define DEBUG #include "debug.h" -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); +static char * brz_read_key(FILE * fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -83,6 +87,7 @@ static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) hashtable[h] = 1; source->dispose(source->data, buf, buflen); } + fprintf(stderr, "\n===============================================================================\n"); free(hashtable); return 1; } @@ -132,8 +137,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; - cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL; +/* cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL;*/ cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; @@ -146,30 +151,30 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/128); + brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); - brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); - disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - - for(i = 0; i < brz->k; ++i) + // Clustering the keys by graph id. + if (mph->verbosity) { - brz->size[i] = 0; - brz->offset[i] = 0; - disksize[i] = 0; - diskoffset[i] = 0; + fprintf(stderr, "Partioning the set of keys.\n"); + } + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); + if (graphs_fd == NULL) + { + free(brz->size); + fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); + return NULL; } - // Creating the external graphs. while(1) { int ok; DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_before_gen_graphs(mph, disksize, diskoffset); + ok = brz_gen_graphs(mph, graphs_fd); if (!ok) { --iterations; @@ -184,59 +189,50 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - + fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); return NULL; } + DEBUGP("Graphs generated\n"); + + brz->offset = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + for (i = 1; i < brz->k; ++i) + { + brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; + } -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); -/* graphs_fd = fopen("cmph.tmp", "wb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); - fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); - return NULL; - } - // Clustering the keys by graph id. - brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); - free(disksize); - free(diskoffset); - DEBUGP("Graphs generated\n"); - fclose(graphs_fd); -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); -/* graphs_fd = fopen("cmph.tmp", "rb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + if (mph->verbosity) + { + fprintf(stderr, "\nGenerating mphf.\n"); + } DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { + if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); cmph_uint32 j; bmz_data_t * bmzf = NULL; cmph_uint8 nkeys = brz->size[i]; if (nkeys == 0) continue; keys_vd = brz_read_keys_vd(graphs_fd, nkeys); + // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); + //cmph_config_set_verbosity(config, 1); mphf_tmp = cmph_new(config); bmzf = (bmz_data_t *)mphf_tmp->data; //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); // implementar + brz_copy_partial_mphf(brz, bmzf, i, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); @@ -275,98 +271,265 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { - cmph_uint32 e; - brz_config_data_t *brz = (brz_config_data_t *)mph->data; - mph->key_source->rewind(mph->key_source->data); - DEBUGP("Generating information before the keys partition\n"); - for (e = 0; e < brz->m; ++e) - { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; - mph->key_source->read(mph->key_source->data, &key, &keylen); - h3 = hash(brz->h3, key, keylen) % brz->k; -// if(h3 == 6) -// { -// DEBUGP("key = %s\n", key); -// DEBUGP("keylen = %u\n", keylen + 1); -// } - - mph->key_source->dispose(mph->key_source->data, key, keylen); - if (brz->size[h3] == 255) return 0; - brz->size[h3] = brz->size[h3] + 1; - disksize[h3] = disksize[h3] + keylen + 1; -// if(h3 == 6) -// { -// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); -// } - - } -// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); - for (e = 1; e < brz->k; ++e) - { - brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; - diskoffset[e] = disksize[e-1] + diskoffset[e-1]; -/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ - } - return 1; -} - -// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) -{ - cmph_uint32 e; +#pragma pack(1) + cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_usage = 0; + cmph_uint32 nkeys_in_buffer = 0; + cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *keys_index = NULL; + cmph_uint8 **buffer_merge = NULL; + cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 nflushes = 0; + cmph_uint32 h3; + FILE * tmp_fd = NULL; + FILE ** tmp_fds = NULL; + char filename[100]; + char *key = NULL; + cmph_uint32 keylen; + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); + // Partitioning for (e = 0; e < brz->m; ++e) { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); + + /* Buffers management */ + if (memory_usage + keylen + 1 > memory_availability) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + //fprintf(stderr, "Storing read Key\n"); + memcpy(buffer + memory_usage, key, keylen + 1); + memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; -/* if(h3 == 6) + if (brz->size[h3] == 255) { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - }*/ - fseek(graphs_fd, diskoffset[h3], SEEK_SET); - fwrite(key, sizeof(char), keylen + 1, graphs_fd); -/* if(h3 == 6) - { - DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - }*/ - diskoffset[h3] = diskoffset[h3] + keylen + 1; + free(buffer); + free(buckets_size); + return 0; + } + brz->size[h3] = brz->size[h3] + 1; + buckets_size[h3] ++; + nkeys_in_buffer++; + mph->key_source->dispose(mph->key_source->data, key, keylen); } + + if (memory_usage != 0) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + free(buffer); + free(buckets_size); + if(nflushes > 1024) return 0; // Too many files generated. + + // Merging + fprintf(stderr, "\nMerging files\n"); + tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); + buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + + for(i = 0; i < nflushes; i++) + { + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + tmp_fds[i] = fopen(filename, "rb"); + key = brz_read_key(tmp_fds[i]); + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + buffer_h3[i] = h3; + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + e = 0; + buffer = (cmph_uint8 *)malloc(memory_availability); + while(e < brz->m) + { + i = brz_min_index(buffer_h3, nflushes); + key = brz_read_key(tmp_fds[i]); + if(key) + { + while(key) + { + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; + save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + //fwrite(key, 1, keylen + 1, graphs_fd); + e++; + free(key); + key = brz_read_key(tmp_fds[i]); + } + if (key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = h3; + free(buffer_merge[i]); + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + } +/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ + if(!key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = UINT_MAX; + free(buffer_merge[i]); + buffer_merge[i] = NULL; + } + } + for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); + flush_buffer(buffer, &memory_usage, graphs_fd); + free(tmp_fds); + free(buffer); + free(buffer_merge); + free(buffer_h3); + return 1; +#pragma pack() +} + +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) +{ + fwrite(buffer, 1, *memory_usage, graphs_fd); + *memory_usage = 0; +} + +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, + cmph_uint32 memory_availability, FILE * graphs_fd) +{ + if(*memory_usage + keylen + 1 > memory_availability) + { + flush_buffer(buffer, memory_usage, graphs_fd); + } + memcpy(buffer + *memory_usage, key, keylen + 1); + *memory_usage = *memory_usage + keylen + 1; +} + +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, min_index = 0; + for(i = 1; i < n; i++) + { + if(vector[i] < vector[min_index]) min_index = i; + } + return min_index; +} + +static char * brz_read_key(FILE * fd) +{ + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + fread(&c, sizeof(char), 1, fd); + if(feof(fd)) + { + free(buf); + return NULL; + } + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; } static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; + cmph_uint8 i; for(i = 0; i < nkeys; i++) { - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - - fread(&c, sizeof(char), 1, graphs_fd); - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } + char * buf = brz_read_key(graphs_fd); keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + free(buf); + } return keys_vd; } diff --git a/src/main.c b/src/main.c index c010123..ed24a72 100644 --- a/src/main.c +++ b/src/main.c @@ -248,6 +248,7 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); + assert(h < source->nkeys); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; From 33a669055eea5d36337d4aa3ffcc909d740a7571 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sat, 6 Aug 2005 20:20:04 +0000 Subject: [PATCH 131/739] *** empty log message *** --- src/bmz.c | 15 +- src/brz.c | 391 +++++++++++++++++++++++++++++++++++++---------------- src/main.c | 1 + 3 files changed, 286 insertions(+), 121 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 4b6047d..27df260 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -87,7 +87,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) // Mapping step cmph_uint32 biggest_g_value = 0; cmph_uint32 biggest_edge_value = 1; - iterations = 20; + iterations = 100; if (mph->verbosity) { fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); @@ -143,7 +143,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(cmph_uint32)); + bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -172,7 +172,10 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) }while(restart_mapping && iterations_map > 0); graph_destroy(bmz->graph); bmz->graph = NULL; - if (iterations_map == 0) return NULL; + if (iterations_map == 0) + { + return NULL; + } mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); @@ -368,15 +371,13 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; - cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; - else gvalue = *unused_edge_index; - bmz->g[neighbor] = gvalue - bmz->g[v]; + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); diff --git a/src/brz.c b/src/brz.c index 17b7b68..c496a3b 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,3 +1,4 @@ + #include "graph.h" #include "bmz.h" #include "bmz_structs.h" @@ -17,8 +18,11 @@ //#define DEBUG #include "debug.h" -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); +static char * brz_read_key(FILE * fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -83,6 +87,7 @@ static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) hashtable[h] = 1; source->dispose(source->data, buf, buflen); } + fprintf(stderr, "\n===============================================================================\n"); free(hashtable); return 1; } @@ -132,8 +137,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; - cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL; +/* cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL;*/ cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; @@ -146,30 +151,30 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/128); + brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); - brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); - disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - - for(i = 0; i < brz->k; ++i) + // Clustering the keys by graph id. + if (mph->verbosity) { - brz->size[i] = 0; - brz->offset[i] = 0; - disksize[i] = 0; - diskoffset[i] = 0; + fprintf(stderr, "Partioning the set of keys.\n"); + } + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); + if (graphs_fd == NULL) + { + free(brz->size); + fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); + return NULL; } - // Creating the external graphs. while(1) { int ok; DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_before_gen_graphs(mph, disksize, diskoffset); + ok = brz_gen_graphs(mph, graphs_fd); if (!ok) { --iterations; @@ -184,59 +189,50 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - + fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); return NULL; } + DEBUGP("Graphs generated\n"); + + brz->offset = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + for (i = 1; i < brz->k; ++i) + { + brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; + } -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); -/* graphs_fd = fopen("cmph.tmp", "wb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); - fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); - return NULL; - } - // Clustering the keys by graph id. - brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); - free(disksize); - free(diskoffset); - DEBUGP("Graphs generated\n"); - fclose(graphs_fd); -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); -/* graphs_fd = fopen("cmph.tmp", "rb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + if (mph->verbosity) + { + fprintf(stderr, "\nGenerating mphf.\n"); + } DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { + if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); cmph_uint32 j; bmz_data_t * bmzf = NULL; cmph_uint8 nkeys = brz->size[i]; if (nkeys == 0) continue; keys_vd = brz_read_keys_vd(graphs_fd, nkeys); + // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); + //cmph_config_set_verbosity(config, 1); mphf_tmp = cmph_new(config); bmzf = (bmz_data_t *)mphf_tmp->data; //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); // implementar + brz_copy_partial_mphf(brz, bmzf, i, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); @@ -275,98 +271,265 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { - cmph_uint32 e; - brz_config_data_t *brz = (brz_config_data_t *)mph->data; - mph->key_source->rewind(mph->key_source->data); - DEBUGP("Generating information before the keys partition\n"); - for (e = 0; e < brz->m; ++e) - { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; - mph->key_source->read(mph->key_source->data, &key, &keylen); - h3 = hash(brz->h3, key, keylen) % brz->k; -// if(h3 == 6) -// { -// DEBUGP("key = %s\n", key); -// DEBUGP("keylen = %u\n", keylen + 1); -// } - - mph->key_source->dispose(mph->key_source->data, key, keylen); - if (brz->size[h3] == 255) return 0; - brz->size[h3] = brz->size[h3] + 1; - disksize[h3] = disksize[h3] + keylen + 1; -// if(h3 == 6) -// { -// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); -// } - - } -// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); - for (e = 1; e < brz->k; ++e) - { - brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; - diskoffset[e] = disksize[e-1] + diskoffset[e-1]; -/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ - } - return 1; -} - -// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) -{ - cmph_uint32 e; +#pragma pack(1) + cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_usage = 0; + cmph_uint32 nkeys_in_buffer = 0; + cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *keys_index = NULL; + cmph_uint8 **buffer_merge = NULL; + cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 nflushes = 0; + cmph_uint32 h3; + FILE * tmp_fd = NULL; + FILE ** tmp_fds = NULL; + char filename[100]; + char *key = NULL; + cmph_uint32 keylen; + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); + // Partitioning for (e = 0; e < brz->m; ++e) { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); + + /* Buffers management */ + if (memory_usage + keylen + 1 > memory_availability) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + //fprintf(stderr, "Storing read Key\n"); + memcpy(buffer + memory_usage, key, keylen + 1); + memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; -/* if(h3 == 6) + if (brz->size[h3] == 255) { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - }*/ - fseek(graphs_fd, diskoffset[h3], SEEK_SET); - fwrite(key, sizeof(char), keylen + 1, graphs_fd); -/* if(h3 == 6) - { - DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - }*/ - diskoffset[h3] = diskoffset[h3] + keylen + 1; + free(buffer); + free(buckets_size); + return 0; + } + brz->size[h3] = brz->size[h3] + 1; + buckets_size[h3] ++; + nkeys_in_buffer++; + mph->key_source->dispose(mph->key_source->data, key, keylen); } + + if (memory_usage != 0) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + free(buffer); + free(buckets_size); + if(nflushes > 1024) return 0; // Too many files generated. + + // Merging + fprintf(stderr, "\nMerging files\n"); + tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); + buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + + for(i = 0; i < nflushes; i++) + { + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + tmp_fds[i] = fopen(filename, "rb"); + key = brz_read_key(tmp_fds[i]); + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + buffer_h3[i] = h3; + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + e = 0; + buffer = (cmph_uint8 *)malloc(memory_availability); + while(e < brz->m) + { + i = brz_min_index(buffer_h3, nflushes); + key = brz_read_key(tmp_fds[i]); + if(key) + { + while(key) + { + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; + save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + //fwrite(key, 1, keylen + 1, graphs_fd); + e++; + free(key); + key = brz_read_key(tmp_fds[i]); + } + if (key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = h3; + free(buffer_merge[i]); + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + } +/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ + if(!key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = UINT_MAX; + free(buffer_merge[i]); + buffer_merge[i] = NULL; + } + } + for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); + flush_buffer(buffer, &memory_usage, graphs_fd); + free(tmp_fds); + free(buffer); + free(buffer_merge); + free(buffer_h3); + return 1; +#pragma pack() +} + +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) +{ + fwrite(buffer, 1, *memory_usage, graphs_fd); + *memory_usage = 0; +} + +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, + cmph_uint32 memory_availability, FILE * graphs_fd) +{ + if(*memory_usage + keylen + 1 > memory_availability) + { + flush_buffer(buffer, memory_usage, graphs_fd); + } + memcpy(buffer + *memory_usage, key, keylen + 1); + *memory_usage = *memory_usage + keylen + 1; +} + +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, min_index = 0; + for(i = 1; i < n; i++) + { + if(vector[i] < vector[min_index]) min_index = i; + } + return min_index; +} + +static char * brz_read_key(FILE * fd) +{ + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + fread(&c, sizeof(char), 1, fd); + if(feof(fd)) + { + free(buf); + return NULL; + } + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; } static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; + cmph_uint8 i; for(i = 0; i < nkeys; i++) { - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - - fread(&c, sizeof(char), 1, graphs_fd); - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } + char * buf = brz_read_key(graphs_fd); keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + free(buf); + } return keys_vd; } diff --git a/src/main.c b/src/main.c index c010123..ed24a72 100644 --- a/src/main.c +++ b/src/main.c @@ -248,6 +248,7 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); + assert(h < source->nkeys); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; From 508ef470c891e38544bd425b887d3567ffe39f3f Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sat, 6 Aug 2005 20:20:04 +0000 Subject: [PATCH 132/739] *** empty log message *** --- src/bmz.c | 15 +- src/brz.c | 391 +++++++++++++++++++++++++++++++++++++---------------- src/main.c | 1 + 3 files changed, 286 insertions(+), 121 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 4b6047d..27df260 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -87,7 +87,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) // Mapping step cmph_uint32 biggest_g_value = 0; cmph_uint32 biggest_edge_value = 1; - iterations = 20; + iterations = 100; if (mph->verbosity) { fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); @@ -143,7 +143,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = malloc(bmz->n * sizeof(cmph_uint32)); + bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -172,7 +172,10 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) }while(restart_mapping && iterations_map > 0); graph_destroy(bmz->graph); bmz->graph = NULL; - if (iterations_map == 0) return NULL; + if (iterations_map == 0) + { + return NULL; + } mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); @@ -368,15 +371,13 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u { graph_iterator_t it = graph_neighbors_it(bmz->graph, v); cmph_uint32 neighbor = 0; - cmph_uint32 gvalue; while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); - if(*unused_edge_index < bmz->g[v]) gvalue = *unused_edge_index + bmz->m; - else gvalue = *unused_edge_index; - bmz->g[neighbor] = gvalue - bmz->g[v]; + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); diff --git a/src/brz.c b/src/brz.c index 17b7b68..c496a3b 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,3 +1,4 @@ + #include "graph.h" #include "bmz.h" #include "bmz_structs.h" @@ -17,8 +18,11 @@ //#define DEBUG #include "debug.h" -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset); -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); +static char * brz_read_key(FILE * fd); static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -83,6 +87,7 @@ static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) hashtable[h] = 1; source->dispose(source->data, buf, buflen); } + fprintf(stderr, "\n===============================================================================\n"); free(hashtable); return 1; } @@ -132,8 +137,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; - cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL; +/* cmph_uint32 * disksize = NULL; + cmph_uint32 * diskoffset = NULL;*/ cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; @@ -146,30 +151,30 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/128); + brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); - brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); - disksize = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - diskoffset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - - for(i = 0; i < brz->k; ++i) + // Clustering the keys by graph id. + if (mph->verbosity) { - brz->size[i] = 0; - brz->offset[i] = 0; - disksize[i] = 0; - diskoffset[i] = 0; + fprintf(stderr, "Partioning the set of keys.\n"); + } + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); + if (graphs_fd == NULL) + { + free(brz->size); + fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); + return NULL; } - // Creating the external graphs. while(1) { int ok; DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_before_gen_graphs(mph, disksize, diskoffset); + ok = brz_gen_graphs(mph, graphs_fd); if (!ok) { --iterations; @@ -184,59 +189,50 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - + fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); return NULL; } + DEBUGP("Graphs generated\n"); + + brz->offset = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + for (i = 1; i < brz->k; ++i) + { + brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; + } -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "wb"); -/* graphs_fd = fopen("cmph.tmp", "wb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - free(brz->offset); - free(disksize); - free(diskoffset); - fprintf(stderr, "Unable to open file %s\n", "/colecao/fbotelho/cmph.tmp"); - return NULL; - } - // Clustering the keys by graph id. - brz_gen_graphs(mph, disksize, diskoffset, graphs_fd); - free(disksize); - free(diskoffset); - DEBUGP("Graphs generated\n"); - fclose(graphs_fd); -// graphs_fd = fopen("/colecao/fbotelho/cmph.tmp", "rb"); -/* graphs_fd = fopen("cmph.tmp", "rb");*/ - graphs_fd = fopen("/var/tmp/cmph.tmp", "rb"); // codigo do algoritmo... + graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); + if (mph->verbosity) + { + fprintf(stderr, "\nGenerating mphf.\n"); + } DEBUGP("Generating mphf\n"); for(i = 0; i < brz->k; i++) { + if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); cmph_uint32 j; bmz_data_t * bmzf = NULL; cmph_uint8 nkeys = brz->size[i]; if (nkeys == 0) continue; keys_vd = brz_read_keys_vd(graphs_fd, nkeys); + // Source of keys source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); cmph_config_set_graphsize(config, c); + //cmph_config_set_verbosity(config, 1); mphf_tmp = cmph_new(config); bmzf = (bmz_data_t *)mphf_tmp->data; //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); // implementar + brz_copy_partial_mphf(brz, bmzf, i, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys); free(keys_vd); @@ -275,98 +271,265 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_before_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset) +static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { - cmph_uint32 e; - brz_config_data_t *brz = (brz_config_data_t *)mph->data; - mph->key_source->rewind(mph->key_source->data); - DEBUGP("Generating information before the keys partition\n"); - for (e = 0; e < brz->m; ++e) - { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; - mph->key_source->read(mph->key_source->data, &key, &keylen); - h3 = hash(brz->h3, key, keylen) % brz->k; -// if(h3 == 6) -// { -// DEBUGP("key = %s\n", key); -// DEBUGP("keylen = %u\n", keylen + 1); -// } - - mph->key_source->dispose(mph->key_source->data, key, keylen); - if (brz->size[h3] == 255) return 0; - brz->size[h3] = brz->size[h3] + 1; - disksize[h3] = disksize[h3] + keylen + 1; -// if(h3 == 6) -// { -// DEBUGP("disksize[%u]=%u \n", h3, disksize[h3]); -// } - - } -// DEBUGP("size:%u offset: %u\n", brz->size[0], brz->offset[0]); - for (e = 1; e < brz->k; ++e) - { - brz->offset[e] = brz->size[e-1] + brz->offset[e-1]; - diskoffset[e] = disksize[e-1] + diskoffset[e-1]; -/* DEBUGP("disksize[%u]=%u diskoffset[%u]: %u\n", e, disksize[e], e, diskoffset[e]); - DEBUGP("size[%u]=%u offset[%u]: %u\n", e, brz->size[e], e, brz->offset[e]);*/ - } - return 1; -} - -// disksize nao esta sendo usado ainda. Sera usado qd incluir os buffers. -static void brz_gen_graphs(cmph_config_t *mph, cmph_uint32 * disksize, cmph_uint32 * diskoffset, FILE * graphs_fd) -{ - cmph_uint32 e; +#pragma pack(1) + cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_usage = 0; + cmph_uint32 nkeys_in_buffer = 0; + cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *keys_index = NULL; + cmph_uint8 **buffer_merge = NULL; + cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 nflushes = 0; + cmph_uint32 h3; + FILE * tmp_fd = NULL; + FILE ** tmp_fds = NULL; + char filename[100]; + char *key = NULL; + cmph_uint32 keylen; + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); + // Partitioning for (e = 0; e < brz->m; ++e) { - cmph_uint32 h3; - cmph_uint32 keylen; - char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); + + /* Buffers management */ + if (memory_usage + keylen + 1 > memory_availability) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + //fprintf(stderr, "Storing read Key\n"); + memcpy(buffer + memory_usage, key, keylen + 1); + memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; -/* if(h3 == 6) + if (brz->size[h3] == 255) { - DEBUGP("key = %s\n", key); - DEBUGP("keylen = %u\n", keylen + 1); - }*/ - fseek(graphs_fd, diskoffset[h3], SEEK_SET); - fwrite(key, sizeof(char), keylen + 1, graphs_fd); -/* if(h3 == 6) - { - DEBUGP("diskoffset[%u]=%u \n", h3, diskoffset[h3]); - }*/ - diskoffset[h3] = diskoffset[h3] + keylen + 1; + free(buffer); + free(buckets_size); + return 0; + } + brz->size[h3] = brz->size[h3] + 1; + buckets_size[h3] ++; + nkeys_in_buffer++; + mph->key_source->dispose(mph->key_source->data, key, keylen); } + + if (memory_usage != 0) // flush buffers + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + cmph_uint32 value = buckets_size[0]; + cmph_uint32 sum = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + memory_usage); + h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; + keys_index[buckets_size[h3]] = memory_usage; + buckets_size[h3]++; + memory_usage = memory_usage + keylen1 + 1; + } + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + tmp_fd = fopen(filename, "wb"); + for(i = 0; i < nkeys_in_buffer; i++) + { + keylen1 = strlen(buffer + keys_index[i]) + 1; + fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + fprintf(stderr, "Flushing is over\n"); + } + free(buffer); + free(buckets_size); + if(nflushes > 1024) return 0; // Too many files generated. + + // Merging + fprintf(stderr, "\nMerging files\n"); + tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); + buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + + for(i = 0; i < nflushes; i++) + { + sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + tmp_fds[i] = fopen(filename, "rb"); + key = brz_read_key(tmp_fds[i]); + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + buffer_h3[i] = h3; + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + e = 0; + buffer = (cmph_uint8 *)malloc(memory_availability); + while(e < brz->m) + { + i = brz_min_index(buffer_h3, nflushes); + key = brz_read_key(tmp_fds[i]); + if(key) + { + while(key) + { + keylen = strlen(key); + h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; + save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + //fwrite(key, 1, keylen + 1, graphs_fd); + e++; + free(key); + key = brz_read_key(tmp_fds[i]); + } + if (key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = h3; + free(buffer_merge[i]); + buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); + memcpy(buffer_merge[i], key, keylen + 1); + free(key); + } + } +/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ + if(!key) + { + save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); + e++; + buffer_h3[i] = UINT_MAX; + free(buffer_merge[i]); + buffer_merge[i] = NULL; + } + } + for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); + flush_buffer(buffer, &memory_usage, graphs_fd); + free(tmp_fds); + free(buffer); + free(buffer_merge); + free(buffer_h3); + return 1; +#pragma pack() +} + +static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) +{ + fwrite(buffer, 1, *memory_usage, graphs_fd); + *memory_usage = 0; +} + +static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, + cmph_uint32 memory_availability, FILE * graphs_fd) +{ + if(*memory_usage + keylen + 1 > memory_availability) + { + flush_buffer(buffer, memory_usage, graphs_fd); + } + memcpy(buffer + *memory_usage, key, keylen + 1); + *memory_usage = *memory_usage + keylen + 1; +} + +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, min_index = 0; + for(i = 1; i < n; i++) + { + if(vector[i] < vector[min_index]) min_index = i; + } + return min_index; +} + +static char * brz_read_key(FILE * fd) +{ + char * buf = (char *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + char c; + while(1) + { + fread(&c, sizeof(char), 1, fd); + if(feof(fd)) + { + free(buf); + return NULL; + } + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; } static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) { char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; + cmph_uint8 i; for(i = 0; i < nkeys; i++) { - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - - fread(&c, sizeof(char), 1, graphs_fd); - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } + char * buf = brz_read_key(graphs_fd); keys_vd[i] = (char *)malloc(strlen(buf) + 1); strcpy(keys_vd[i], buf); - free(buf); - } + free(buf); + } return keys_vd; } diff --git a/src/main.c b/src/main.c index c010123..ed24a72 100644 --- a/src/main.c +++ b/src/main.c @@ -248,6 +248,7 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); + assert(h < source->nkeys); if(hashtable[h])fprintf(stderr, "collision: %u\n",h); assert(hashtable[h]==0); hashtable[h] = 1; From 93010977df1e15b4157d59b0a7bd1bb5a3b00bf2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 00:45:39 +0000 Subject: [PATCH 133/739] fastest version of BRZ --- src/brz.c | 160 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/brz.c b/src/brz.c index c496a3b..0c9543a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,11 +14,11 @@ #include #include #include - +#define MAX_BUCKET_SIZE 255 //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); @@ -137,19 +137,11 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; -/* cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL;*/ - - cmph_io_adapter_t *source = NULL; - cmph_config_t *config = NULL; - cmph_t *mphf_tmp = NULL; - char ** keys_vd = NULL; - - FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); + + DEBUGP("c: %f\n"); brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->c = c; - brz->m = mph->key_source->nkeys; + brz->c = c; + brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); @@ -160,13 +152,10 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); - return NULL; - } + + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); while(1) { @@ -174,7 +163,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph, graphs_fd); + ok = brz_gen_graphs(mph); if (!ok) { --iterations; @@ -189,7 +178,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); @@ -204,44 +192,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // codigo do algoritmo... - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - if (mph->verbosity) - { - fprintf(stderr, "\nGenerating mphf.\n"); - } - DEBUGP("Generating mphf\n"); - for(i = 0; i < brz->k; i++) - { - if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); - cmph_uint32 j; - bmz_data_t * bmzf = NULL; - cmph_uint8 nkeys = brz->size[i]; - if (nkeys == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, nkeys); - - // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); - config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_config_set_graphsize(config, c); - //cmph_config_set_verbosity(config, 1); - mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); - cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys); - free(keys_vd); - cmph_destroy(mphf_tmp); - free(source); - } - - fclose(graphs_fd); - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -271,12 +221,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) +static int brz_gen_graphs(cmph_config_t *mph) { #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -292,6 +242,11 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) char *key = NULL; cmph_uint32 keylen; + cmph_uint32 cur_bucket = 0; + cmph_uint8 nkeys_vd = 0; + char ** keys_vd = NULL; + + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning @@ -299,10 +254,13 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { mph->key_source->read(mph->key_source->data, &key, &keylen); - /* Buffers management */ + /* Buffers management */ if (memory_usage + keylen + 1 > memory_availability) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; @@ -327,6 +285,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -339,13 +298,12 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == 255) + if (brz->size[h3] == MAX_BUCKET_SIZE) { free(buffer); free(buckets_size); @@ -360,7 +318,10 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) if (memory_usage != 0) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; cmph_uint32 keylen1 = 0; @@ -383,6 +344,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -395,14 +357,16 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // Merging - fprintf(stderr, "\nMerging files\n"); + // mphf generation + if(mph->verbosity) + { + fprintf(stderr, "\nMPHF generation \n"); + } tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -410,6 +374,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) for(i = 0; i < nflushes; i++) { sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +/* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); keylen = strlen(key); @@ -419,11 +384,15 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memcpy(buffer_merge[i], key, keylen + 1); free(key); } + e = 0; - buffer = (cmph_uint8 *)malloc(memory_availability); + keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + nkeys_vd = 0; + //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); + cur_bucket = buffer_h3[i]; key = brz_read_key(tmp_fds[i]); if(key) { @@ -431,20 +400,26 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; - save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + + keys_vd[nkeys_vd++] = key; + + //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); //fwrite(key, 1, keylen + 1, graphs_fd); e++; - free(key); + //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -453,18 +428,43 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) /* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = NULL; } + + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + { + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + bmz_data_t * bmzf = NULL; + // Source of keys + //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, brz->c); + mphf_tmp = cmph_new(config); + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_destroy(mphf_tmp); + free(source); + nkeys_vd = 0; + } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - flush_buffer(buffer, &memory_usage, graphs_fd); + //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); - free(buffer); + free(keys_vd); free(buffer_merge); free(buffer_h3); return 1; From 1dad589c004d7f0f343b4d52b55f18d00432e289 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 00:45:39 +0000 Subject: [PATCH 134/739] fastest version of BRZ --- src/brz.c | 160 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/brz.c b/src/brz.c index c496a3b..0c9543a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,11 +14,11 @@ #include #include #include - +#define MAX_BUCKET_SIZE 255 //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); @@ -137,19 +137,11 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; -/* cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL;*/ - - cmph_io_adapter_t *source = NULL; - cmph_config_t *config = NULL; - cmph_t *mphf_tmp = NULL; - char ** keys_vd = NULL; - - FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); + + DEBUGP("c: %f\n"); brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->c = c; - brz->m = mph->key_source->nkeys; + brz->c = c; + brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); @@ -160,13 +152,10 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); - return NULL; - } + + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); while(1) { @@ -174,7 +163,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph, graphs_fd); + ok = brz_gen_graphs(mph); if (!ok) { --iterations; @@ -189,7 +178,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); @@ -204,44 +192,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // codigo do algoritmo... - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - if (mph->verbosity) - { - fprintf(stderr, "\nGenerating mphf.\n"); - } - DEBUGP("Generating mphf\n"); - for(i = 0; i < brz->k; i++) - { - if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); - cmph_uint32 j; - bmz_data_t * bmzf = NULL; - cmph_uint8 nkeys = brz->size[i]; - if (nkeys == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, nkeys); - - // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); - config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_config_set_graphsize(config, c); - //cmph_config_set_verbosity(config, 1); - mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); - cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys); - free(keys_vd); - cmph_destroy(mphf_tmp); - free(source); - } - - fclose(graphs_fd); - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -271,12 +221,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) +static int brz_gen_graphs(cmph_config_t *mph) { #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -292,6 +242,11 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) char *key = NULL; cmph_uint32 keylen; + cmph_uint32 cur_bucket = 0; + cmph_uint8 nkeys_vd = 0; + char ** keys_vd = NULL; + + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning @@ -299,10 +254,13 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { mph->key_source->read(mph->key_source->data, &key, &keylen); - /* Buffers management */ + /* Buffers management */ if (memory_usage + keylen + 1 > memory_availability) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; @@ -327,6 +285,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -339,13 +298,12 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == 255) + if (brz->size[h3] == MAX_BUCKET_SIZE) { free(buffer); free(buckets_size); @@ -360,7 +318,10 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) if (memory_usage != 0) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; cmph_uint32 keylen1 = 0; @@ -383,6 +344,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -395,14 +357,16 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // Merging - fprintf(stderr, "\nMerging files\n"); + // mphf generation + if(mph->verbosity) + { + fprintf(stderr, "\nMPHF generation \n"); + } tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -410,6 +374,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) for(i = 0; i < nflushes; i++) { sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +/* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); keylen = strlen(key); @@ -419,11 +384,15 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memcpy(buffer_merge[i], key, keylen + 1); free(key); } + e = 0; - buffer = (cmph_uint8 *)malloc(memory_availability); + keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + nkeys_vd = 0; + //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); + cur_bucket = buffer_h3[i]; key = brz_read_key(tmp_fds[i]); if(key) { @@ -431,20 +400,26 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; - save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + + keys_vd[nkeys_vd++] = key; + + //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); //fwrite(key, 1, keylen + 1, graphs_fd); e++; - free(key); + //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -453,18 +428,43 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) /* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = NULL; } + + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + { + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + bmz_data_t * bmzf = NULL; + // Source of keys + //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, brz->c); + mphf_tmp = cmph_new(config); + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_destroy(mphf_tmp); + free(source); + nkeys_vd = 0; + } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - flush_buffer(buffer, &memory_usage, graphs_fd); + //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); - free(buffer); + free(keys_vd); free(buffer_merge); free(buffer_h3); return 1; From 7432524608621cc14bb1806e13cc9062a3578947 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 00:45:39 +0000 Subject: [PATCH 135/739] fastest version of BRZ --- src/brz.c | 160 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/brz.c b/src/brz.c index c496a3b..0c9543a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,11 +14,11 @@ #include #include #include - +#define MAX_BUCKET_SIZE 255 //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); @@ -137,19 +137,11 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; -/* cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL;*/ - - cmph_io_adapter_t *source = NULL; - cmph_config_t *config = NULL; - cmph_t *mphf_tmp = NULL; - char ** keys_vd = NULL; - - FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); + + DEBUGP("c: %f\n"); brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->c = c; - brz->m = mph->key_source->nkeys; + brz->c = c; + brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); @@ -160,13 +152,10 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); - return NULL; - } + + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); while(1) { @@ -174,7 +163,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph, graphs_fd); + ok = brz_gen_graphs(mph); if (!ok) { --iterations; @@ -189,7 +178,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); @@ -204,44 +192,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // codigo do algoritmo... - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - if (mph->verbosity) - { - fprintf(stderr, "\nGenerating mphf.\n"); - } - DEBUGP("Generating mphf\n"); - for(i = 0; i < brz->k; i++) - { - if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); - cmph_uint32 j; - bmz_data_t * bmzf = NULL; - cmph_uint8 nkeys = brz->size[i]; - if (nkeys == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, nkeys); - - // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); - config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_config_set_graphsize(config, c); - //cmph_config_set_verbosity(config, 1); - mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); - cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys); - free(keys_vd); - cmph_destroy(mphf_tmp); - free(source); - } - - fclose(graphs_fd); - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -271,12 +221,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) +static int brz_gen_graphs(cmph_config_t *mph) { #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -292,6 +242,11 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) char *key = NULL; cmph_uint32 keylen; + cmph_uint32 cur_bucket = 0; + cmph_uint8 nkeys_vd = 0; + char ** keys_vd = NULL; + + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning @@ -299,10 +254,13 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { mph->key_source->read(mph->key_source->data, &key, &keylen); - /* Buffers management */ + /* Buffers management */ if (memory_usage + keylen + 1 > memory_availability) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; @@ -327,6 +285,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -339,13 +298,12 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == 255) + if (brz->size[h3] == MAX_BUCKET_SIZE) { free(buffer); free(buckets_size); @@ -360,7 +318,10 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) if (memory_usage != 0) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; cmph_uint32 keylen1 = 0; @@ -383,6 +344,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -395,14 +357,16 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // Merging - fprintf(stderr, "\nMerging files\n"); + // mphf generation + if(mph->verbosity) + { + fprintf(stderr, "\nMPHF generation \n"); + } tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -410,6 +374,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) for(i = 0; i < nflushes; i++) { sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +/* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); keylen = strlen(key); @@ -419,11 +384,15 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memcpy(buffer_merge[i], key, keylen + 1); free(key); } + e = 0; - buffer = (cmph_uint8 *)malloc(memory_availability); + keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + nkeys_vd = 0; + //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); + cur_bucket = buffer_h3[i]; key = brz_read_key(tmp_fds[i]); if(key) { @@ -431,20 +400,26 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; - save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + + keys_vd[nkeys_vd++] = key; + + //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); //fwrite(key, 1, keylen + 1, graphs_fd); e++; - free(key); + //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -453,18 +428,43 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) /* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = NULL; } + + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + { + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + bmz_data_t * bmzf = NULL; + // Source of keys + //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, brz->c); + mphf_tmp = cmph_new(config); + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_destroy(mphf_tmp); + free(source); + nkeys_vd = 0; + } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - flush_buffer(buffer, &memory_usage, graphs_fd); + //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); - free(buffer); + free(keys_vd); free(buffer_merge); free(buffer_h3); return 1; From 57126668ec412f14849984577d447d0e15366828 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 00:45:39 +0000 Subject: [PATCH 136/739] fastest version of BRZ --- src/brz.c | 160 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/brz.c b/src/brz.c index c496a3b..0c9543a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -14,11 +14,11 @@ #include #include #include - +#define MAX_BUCKET_SIZE 255 //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd); +static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); @@ -137,19 +137,11 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz_data_t *brzf = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; -/* cmph_uint32 * disksize = NULL; - cmph_uint32 * diskoffset = NULL;*/ - - cmph_io_adapter_t *source = NULL; - cmph_config_t *config = NULL; - cmph_t *mphf_tmp = NULL; - char ** keys_vd = NULL; - - FILE * graphs_fd = NULL; - DEBUGP("c: %f\n", c); + + DEBUGP("c: %f\n"); brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->c = c; - brz->m = mph->key_source->nkeys; + brz->c = c; + brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); brz->k = ceil(brz->m/170); DEBUGP("k: %u\n", brz->k); @@ -160,13 +152,10 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "wb"); - if (graphs_fd == NULL) - { - free(brz->size); - fprintf(stderr, "Unable to open file %s\n", "/mnt/hd4/fbotelho/cmph.tmp"); - return NULL; - } + + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); while(1) { @@ -174,7 +163,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) DEBUGP("hash function 3\n"); brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph, graphs_fd); + ok = brz_gen_graphs(mph); if (!ok) { --iterations; @@ -189,7 +178,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) } else break; } - fclose(graphs_fd); if (iterations == 0) { DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); @@ -204,44 +192,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // codigo do algoritmo... - graphs_fd = fopen("/mnt/hd4/fbotelho/cmph.tmp", "rb"); - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); - if (mph->verbosity) - { - fprintf(stderr, "\nGenerating mphf.\n"); - } - DEBUGP("Generating mphf\n"); - for(i = 0; i < brz->k; i++) - { - if (mph->verbosity) fprintf(stderr, "\tMPHF %u in %u was generated.\n", i+1, brz->k); - cmph_uint32 j; - bmz_data_t * bmzf = NULL; - cmph_uint8 nkeys = brz->size[i]; - if (nkeys == 0) continue; - keys_vd = brz_read_keys_vd(graphs_fd, nkeys); - - // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys); - config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); - cmph_config_set_graphsize(config, c); - //cmph_config_set_verbosity(config, 1); - mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); - brz_copy_partial_mphf(brz, bmzf, i, source); - cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys); - free(keys_vd); - cmph_destroy(mphf_tmp); - free(source); - } - - fclose(graphs_fd); - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -271,12 +221,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) +static int brz_gen_graphs(cmph_config_t *mph) { #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -292,6 +242,11 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) char *key = NULL; cmph_uint32 keylen; + cmph_uint32 cur_bucket = 0; + cmph_uint8 nkeys_vd = 0; + char ** keys_vd = NULL; + + mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning @@ -299,10 +254,13 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { mph->key_source->read(mph->key_source->data, &key, &keylen); - /* Buffers management */ + /* Buffers management */ if (memory_usage + keylen + 1 > memory_availability) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; @@ -327,6 +285,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -339,13 +298,12 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == 255) + if (brz->size[h3] == MAX_BUCKET_SIZE) { free(buffer); free(buckets_size); @@ -360,7 +318,10 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) if (memory_usage != 0) // flush buffers { - fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; cmph_uint32 keylen1 = 0; @@ -383,6 +344,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memory_usage = memory_usage + keylen1 + 1; } sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +/* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) { @@ -395,14 +357,16 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) nflushes++; free(keys_index); fclose(tmp_fd); - fprintf(stderr, "Flushing is over\n"); } free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // Merging - fprintf(stderr, "\nMerging files\n"); + // mphf generation + if(mph->verbosity) + { + fprintf(stderr, "\nMPHF generation \n"); + } tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -410,6 +374,7 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) for(i = 0; i < nflushes; i++) { sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +/* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); keylen = strlen(key); @@ -419,11 +384,15 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) memcpy(buffer_merge[i], key, keylen + 1); free(key); } + e = 0; - buffer = (cmph_uint8 *)malloc(memory_availability); + keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + nkeys_vd = 0; + //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); + cur_bucket = buffer_h3[i]; key = brz_read_key(tmp_fds[i]); if(key) { @@ -431,20 +400,26 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) { keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; + if (h3 != buffer_h3[i]) break; - save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); + + keys_vd[nkeys_vd++] = key; + + //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); //fwrite(key, 1, keylen + 1, graphs_fd); e++; - free(key); + //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -453,18 +428,43 @@ static int brz_gen_graphs(cmph_config_t *mph, FILE * graphs_fd) /* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { - save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; + //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - free(buffer_merge[i]); + //free(buffer_merge[i]); buffer_merge[i] = NULL; } + + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + { + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + bmz_data_t * bmzf = NULL; + // Source of keys + //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_graphsize(config, brz->c); + mphf_tmp = cmph_new(config); + bmzf = (bmz_data_t *)mphf_tmp->data; + //assert(brz_verify_mphf(mphf_tmp, source)); + brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_destroy(mphf_tmp); + free(source); + nkeys_vd = 0; + } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - flush_buffer(buffer, &memory_usage, graphs_fd); + //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); - free(buffer); + free(keys_vd); free(buffer_merge); free(buffer_h3); return 1; From 360cf99794ff5abc926ee2a4674872131c51a7a7 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:02:49 +0000 Subject: [PATCH 137/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 27df260..8b6d4e9 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From cc66c831c0cb37bdbde1830b8d6ced40ae9a9004 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:02:49 +0000 Subject: [PATCH 138/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 27df260..8b6d4e9 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From fb2a18974e798ea649f97a5a983fc3b712054f97 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:02:49 +0000 Subject: [PATCH 139/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 27df260..8b6d4e9 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From c983eec983c10370b3e2c66fbb4862bafde8e73e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:02:49 +0000 Subject: [PATCH 140/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 27df260..8b6d4e9 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From ca6e4355d9a7eb80c4de2153b85044fbf9c5d9ae Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:09:14 +0000 Subject: [PATCH 141/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 8b6d4e9..a201cc1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From dbfb67831673661aa83a4b1668f19e784382dfc1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:09:14 +0000 Subject: [PATCH 142/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 8b6d4e9..a201cc1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From 9ae51473a36469f9db36fc45cc2477c092617a47 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:09:14 +0000 Subject: [PATCH 143/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 8b6d4e9..a201cc1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From abb193e618659370ffd56992dfea648488088e28 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 01:09:14 +0000 Subject: [PATCH 144/739] no message --- src/bmz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmz.c b/src/bmz.c index 8b6d4e9..a201cc1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -201,7 +201,7 @@ static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint3 cmph_uint32 u; /* Auxiliary vertex */ cmph_uint32 lav; /* lookahead vertex */ cmph_uint8 collision; - vqueue_t * q = vqueue_new((cmph_uint32)(0.6*graph_ncritical_nodes(bmz->graph)) + 1); + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz->graph)) + 1); graph_iterator_t it, it1; DEBUGP("Labelling critical vertices\n"); From da4ca77b9c09d2e58da68249cc658254fc644369 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 23:22:32 +0000 Subject: [PATCH 145/739] stable version of BRZ --- src/brz.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/brz.c b/src/brz.c index 0c9543a..6269d30 100755 --- a/src/brz.c +++ b/src/brz.c @@ -226,7 +226,7 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -284,7 +284,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -343,7 +344,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -373,7 +375,8 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); /* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); From 3a486da2ec1d578ef96bdf309c1c20d67c1a69ad Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 23:22:32 +0000 Subject: [PATCH 146/739] stable version of BRZ --- src/brz.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/brz.c b/src/brz.c index 0c9543a..6269d30 100755 --- a/src/brz.c +++ b/src/brz.c @@ -226,7 +226,7 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -284,7 +284,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -343,7 +344,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -373,7 +375,8 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); /* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); From d334b15512982671c9a623a632ef1c00ae992510 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 23:22:32 +0000 Subject: [PATCH 147/739] stable version of BRZ --- src/brz.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/brz.c b/src/brz.c index 0c9543a..6269d30 100755 --- a/src/brz.c +++ b/src/brz.c @@ -226,7 +226,7 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -284,7 +284,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -343,7 +344,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -373,7 +375,8 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); /* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); From 114c4e1c63ee558346935e7a3fee595851bf67c7 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 7 Aug 2005 23:22:32 +0000 Subject: [PATCH 148/739] stable version of BRZ --- src/brz.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/brz.c b/src/brz.c index 0c9543a..6269d30 100755 --- a/src/brz.c +++ b/src/brz.c @@ -226,7 +226,7 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 10485760; //10MB 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); @@ -284,7 +284,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -343,7 +344,8 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); /* sprintf(filename, "%u.cmph",nflushes);*/ tmp_fd = fopen(filename, "wb"); for(i = 0; i < nkeys_in_buffer; i++) @@ -373,7 +375,8 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { - sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); +// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); + sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); /* sprintf(filename, "%u.cmph",i);*/ tmp_fds[i] = fopen(filename, "rb"); key = brz_read_key(tmp_fds[i]); From 9553f655370a381a78a714d894e0504accd1dfd6 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 01:00:27 +0000 Subject: [PATCH 149/739] temporary directory passed by command line --- src/brz.c | 201 +++++++++++++++++++++++----------------------- src/brz.h | 1 + src/brz_structs.h | 1 + src/cmph.c | 17 ++++ src/cmph.h | 1 + src/main.c | 14 +++- 6 files changed, 129 insertions(+), 106 deletions(-) diff --git a/src/brz.c b/src/brz.c index 6269d30..c69ad17 100755 --- a/src/brz.c +++ b/src/brz.c @@ -20,10 +20,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); static char * brz_read_key(FILE * fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -40,6 +37,8 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); + strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); return brz; } @@ -48,6 +47,7 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); + free(data->tmp_dir); free(data); } @@ -63,73 +63,94 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } -static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) + +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); - source->rewind(source->data); - memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(tmp_dir) { - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - h = cmph_search(mphf, buf, buflen); - if(hashtable[h]) + cmph_uint32 len = strlen(tmp_dir); + free(brz->tmp_dir); + if(tmp_dir[len-1] != '/') { - fprintf(stderr, "collision: %u\n",h); - return 0; + brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + } + else + { + brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s\0", tmp_dir); } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - fprintf(stderr, "\n===============================================================================\n"); - free(hashtable); - return 1; -} - -static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -{ - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); - source->rewind(source->data); - //memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) - { - cmph_uint32 h1_v; - cmph_uint32 h2_v; - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - - h1_v = hash(h1, buf, buflen) % n; - - h2_v = hash(h2, buf, buflen) % n; - - if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; - h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; - - if(hashtable[h]) - { - fprintf(stderr, "collision: %u\n",h); - return 0; - } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - free(hashtable); - return 1; } +// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); +// source->rewind(source->data); +// memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// h = cmph_search(mphf, buf, buflen); +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// } +// fprintf(stderr, "\n===============================================================================\n"); +// free(hashtable); +// return 1; +// } +// +// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); +// source->rewind(source->data); +// //memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h1_v; +// cmph_uint32 h2_v; +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// +// h1_v = hash(h1, buf, buflen) % n; +// +// h2_v = hash(h2, buf, buflen) % n; +// +// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; +// +// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; +// +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// +// } +// free(hashtable); +// return 1; +// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -238,7 +259,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 h3; FILE * tmp_fd = NULL; FILE ** tmp_fds = NULL; - char filename[100]; + char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -285,9 +306,11 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -345,9 +368,12 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -376,9 +402,12 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); -/* sprintf(filename, "%u.cmph",i);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); + free(filename); + filename = NULL; key = brz_read_key(tmp_fds[i]); keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; @@ -474,23 +503,6 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack() } -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) -{ - fwrite(buffer, 1, *memory_usage, graphs_fd); - *memory_usage = 0; -} - -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, - cmph_uint32 memory_availability, FILE * graphs_fd) -{ - if(*memory_usage + keylen + 1 > memory_availability) - { - flush_buffer(buffer, memory_usage, graphs_fd); - } - memcpy(buffer + *memory_usage, key, keylen + 1); - *memory_usage = *memory_usage + keylen + 1; -} - static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, min_index = 0; @@ -521,21 +533,6 @@ static char * brz_read_key(FILE * fd) return buf; } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) -{ - char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; - - for(i = 0; i < nkeys; i++) - { - char * buf = brz_read_key(graphs_fd); - keys_vd[i] = (char *)malloc(strlen(buf) + 1); - strcpy(keys_vd[i], buf); - free(buf); - } - return keys_vd; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; diff --git a/src/brz.h b/src/brz.h index a1ed145..886eab2 100644 --- a/src/brz.h +++ b/src/brz.h @@ -8,6 +8,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index 742a425..f6af310 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; #endif diff --git a/src/cmph.c b/src/cmph.c index f7f4acb..203d60d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -178,6 +178,23 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->algo = algo; } +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_tmp_dir(mph, tmp_dir); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index d30fb51..c301a91 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -35,6 +35,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index ed24a72..6416359 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -62,12 +63,12 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - + cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -107,6 +108,9 @@ int main(int argc, char **argv) case 'm': mphf_file = strdup(optarg); break; + case 'd': + tmp_dir = strdup(optarg); + break; case 'v': ++verbosity; break; @@ -197,6 +201,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); + cmph_config_set_tmp_dir(config, tmp_dir); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); @@ -263,6 +268,7 @@ int main(int argc, char **argv) } fclose(keys_fd); free(mphf_file); + free(tmp_dir); free(source); return 0; } From 5f3d477c1f7818b94da115cda7f9b7d02ee47d3a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 01:00:27 +0000 Subject: [PATCH 150/739] temporary directory passed by command line --- src/brz.c | 201 +++++++++++++++++++++++----------------------- src/brz.h | 1 + src/brz_structs.h | 1 + src/cmph.c | 17 ++++ src/cmph.h | 1 + src/main.c | 14 +++- 6 files changed, 129 insertions(+), 106 deletions(-) diff --git a/src/brz.c b/src/brz.c index 6269d30..c69ad17 100755 --- a/src/brz.c +++ b/src/brz.c @@ -20,10 +20,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); static char * brz_read_key(FILE * fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -40,6 +37,8 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); + strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); return brz; } @@ -48,6 +47,7 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); + free(data->tmp_dir); free(data); } @@ -63,73 +63,94 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } -static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) + +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); - source->rewind(source->data); - memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(tmp_dir) { - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - h = cmph_search(mphf, buf, buflen); - if(hashtable[h]) + cmph_uint32 len = strlen(tmp_dir); + free(brz->tmp_dir); + if(tmp_dir[len-1] != '/') { - fprintf(stderr, "collision: %u\n",h); - return 0; + brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + } + else + { + brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s\0", tmp_dir); } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - fprintf(stderr, "\n===============================================================================\n"); - free(hashtable); - return 1; -} - -static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -{ - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); - source->rewind(source->data); - //memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) - { - cmph_uint32 h1_v; - cmph_uint32 h2_v; - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - - h1_v = hash(h1, buf, buflen) % n; - - h2_v = hash(h2, buf, buflen) % n; - - if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; - h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; - - if(hashtable[h]) - { - fprintf(stderr, "collision: %u\n",h); - return 0; - } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - free(hashtable); - return 1; } +// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); +// source->rewind(source->data); +// memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// h = cmph_search(mphf, buf, buflen); +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// } +// fprintf(stderr, "\n===============================================================================\n"); +// free(hashtable); +// return 1; +// } +// +// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); +// source->rewind(source->data); +// //memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h1_v; +// cmph_uint32 h2_v; +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// +// h1_v = hash(h1, buf, buflen) % n; +// +// h2_v = hash(h2, buf, buflen) % n; +// +// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; +// +// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; +// +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// +// } +// free(hashtable); +// return 1; +// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -238,7 +259,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 h3; FILE * tmp_fd = NULL; FILE ** tmp_fds = NULL; - char filename[100]; + char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -285,9 +306,11 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -345,9 +368,12 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -376,9 +402,12 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); -/* sprintf(filename, "%u.cmph",i);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); + free(filename); + filename = NULL; key = brz_read_key(tmp_fds[i]); keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; @@ -474,23 +503,6 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack() } -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) -{ - fwrite(buffer, 1, *memory_usage, graphs_fd); - *memory_usage = 0; -} - -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, - cmph_uint32 memory_availability, FILE * graphs_fd) -{ - if(*memory_usage + keylen + 1 > memory_availability) - { - flush_buffer(buffer, memory_usage, graphs_fd); - } - memcpy(buffer + *memory_usage, key, keylen + 1); - *memory_usage = *memory_usage + keylen + 1; -} - static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, min_index = 0; @@ -521,21 +533,6 @@ static char * brz_read_key(FILE * fd) return buf; } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) -{ - char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; - - for(i = 0; i < nkeys; i++) - { - char * buf = brz_read_key(graphs_fd); - keys_vd[i] = (char *)malloc(strlen(buf) + 1); - strcpy(keys_vd[i], buf); - free(buf); - } - return keys_vd; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; diff --git a/src/brz.h b/src/brz.h index a1ed145..886eab2 100644 --- a/src/brz.h +++ b/src/brz.h @@ -8,6 +8,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index 742a425..f6af310 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; #endif diff --git a/src/cmph.c b/src/cmph.c index f7f4acb..203d60d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -178,6 +178,23 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->algo = algo; } +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_tmp_dir(mph, tmp_dir); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index d30fb51..c301a91 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -35,6 +35,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index ed24a72..6416359 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -62,12 +63,12 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - + cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -107,6 +108,9 @@ int main(int argc, char **argv) case 'm': mphf_file = strdup(optarg); break; + case 'd': + tmp_dir = strdup(optarg); + break; case 'v': ++verbosity; break; @@ -197,6 +201,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); + cmph_config_set_tmp_dir(config, tmp_dir); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); @@ -263,6 +268,7 @@ int main(int argc, char **argv) } fclose(keys_fd); free(mphf_file); + free(tmp_dir); free(source); return 0; } From 5e22ae4934e8c54e6dd2513bd6236a5944955c84 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 01:00:27 +0000 Subject: [PATCH 151/739] temporary directory passed by command line --- src/brz.c | 201 +++++++++++++++++++++++----------------------- src/brz.h | 1 + src/brz_structs.h | 1 + src/cmph.c | 17 ++++ src/cmph.h | 1 + src/main.c | 14 +++- 6 files changed, 129 insertions(+), 106 deletions(-) diff --git a/src/brz.c b/src/brz.c index 6269d30..c69ad17 100755 --- a/src/brz.c +++ b/src/brz.c @@ -20,10 +20,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); static char * brz_read_key(FILE * fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -40,6 +37,8 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); + strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); return brz; } @@ -48,6 +47,7 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); + free(data->tmp_dir); free(data); } @@ -63,73 +63,94 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } -static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) + +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); - source->rewind(source->data); - memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(tmp_dir) { - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - h = cmph_search(mphf, buf, buflen); - if(hashtable[h]) + cmph_uint32 len = strlen(tmp_dir); + free(brz->tmp_dir); + if(tmp_dir[len-1] != '/') { - fprintf(stderr, "collision: %u\n",h); - return 0; + brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + } + else + { + brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s\0", tmp_dir); } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - fprintf(stderr, "\n===============================================================================\n"); - free(hashtable); - return 1; -} - -static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -{ - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); - source->rewind(source->data); - //memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) - { - cmph_uint32 h1_v; - cmph_uint32 h2_v; - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - - h1_v = hash(h1, buf, buflen) % n; - - h2_v = hash(h2, buf, buflen) % n; - - if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; - h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; - - if(hashtable[h]) - { - fprintf(stderr, "collision: %u\n",h); - return 0; - } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - free(hashtable); - return 1; } +// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); +// source->rewind(source->data); +// memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// h = cmph_search(mphf, buf, buflen); +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// } +// fprintf(stderr, "\n===============================================================================\n"); +// free(hashtable); +// return 1; +// } +// +// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); +// source->rewind(source->data); +// //memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h1_v; +// cmph_uint32 h2_v; +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// +// h1_v = hash(h1, buf, buflen) % n; +// +// h2_v = hash(h2, buf, buflen) % n; +// +// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; +// +// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; +// +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// +// } +// free(hashtable); +// return 1; +// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -238,7 +259,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 h3; FILE * tmp_fd = NULL; FILE ** tmp_fds = NULL; - char filename[100]; + char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -285,9 +306,11 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -345,9 +368,12 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -376,9 +402,12 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); -/* sprintf(filename, "%u.cmph",i);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); + free(filename); + filename = NULL; key = brz_read_key(tmp_fds[i]); keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; @@ -474,23 +503,6 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack() } -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) -{ - fwrite(buffer, 1, *memory_usage, graphs_fd); - *memory_usage = 0; -} - -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, - cmph_uint32 memory_availability, FILE * graphs_fd) -{ - if(*memory_usage + keylen + 1 > memory_availability) - { - flush_buffer(buffer, memory_usage, graphs_fd); - } - memcpy(buffer + *memory_usage, key, keylen + 1); - *memory_usage = *memory_usage + keylen + 1; -} - static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, min_index = 0; @@ -521,21 +533,6 @@ static char * brz_read_key(FILE * fd) return buf; } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) -{ - char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; - - for(i = 0; i < nkeys; i++) - { - char * buf = brz_read_key(graphs_fd); - keys_vd[i] = (char *)malloc(strlen(buf) + 1); - strcpy(keys_vd[i], buf); - free(buf); - } - return keys_vd; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; diff --git a/src/brz.h b/src/brz.h index a1ed145..886eab2 100644 --- a/src/brz.h +++ b/src/brz.h @@ -8,6 +8,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index 742a425..f6af310 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; #endif diff --git a/src/cmph.c b/src/cmph.c index f7f4acb..203d60d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -178,6 +178,23 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->algo = algo; } +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_tmp_dir(mph, tmp_dir); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index d30fb51..c301a91 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -35,6 +35,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index ed24a72..6416359 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -62,12 +63,12 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - + cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -107,6 +108,9 @@ int main(int argc, char **argv) case 'm': mphf_file = strdup(optarg); break; + case 'd': + tmp_dir = strdup(optarg); + break; case 'v': ++verbosity; break; @@ -197,6 +201,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); + cmph_config_set_tmp_dir(config, tmp_dir); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); @@ -263,6 +268,7 @@ int main(int argc, char **argv) } fclose(keys_fd); free(mphf_file); + free(tmp_dir); free(source); return 0; } From 987870bc59efe2517fcee518bd9701c2e372e4ee Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 01:00:27 +0000 Subject: [PATCH 152/739] temporary directory passed by command line --- src/brz.c | 201 +++++++++++++++++++++++----------------------- src/brz.h | 1 + src/brz_structs.h | 1 + src/cmph.c | 17 ++++ src/cmph.h | 1 + src/main.c | 14 +++- 6 files changed, 129 insertions(+), 106 deletions(-) diff --git a/src/brz.c b/src/brz.c index 6269d30..c69ad17 100755 --- a/src/brz.c +++ b/src/brz.c @@ -20,10 +20,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd); -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 *memory_usage, cmph_uint32 memory_availability, FILE * graphs_fd); static char * brz_read_key(FILE * fd); -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); @@ -40,6 +37,8 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); + strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); return brz; } @@ -48,6 +47,7 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); + free(data->tmp_dir); free(data); } @@ -63,73 +63,94 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) ++i, ++hashptr; } } -static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) + +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); - source->rewind(source->data); - memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(tmp_dir) { - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - h = cmph_search(mphf, buf, buflen); - if(hashtable[h]) + cmph_uint32 len = strlen(tmp_dir); + free(brz->tmp_dir); + if(tmp_dir[len-1] != '/') { - fprintf(stderr, "collision: %u\n",h); - return 0; + brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + } + else + { + brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + sprintf(brz->tmp_dir, "%s\0", tmp_dir); } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - fprintf(stderr, "\n===============================================================================\n"); - free(hashtable); - return 1; -} - -static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -{ - cmph_uint8 * hashtable = NULL; - cmph_uint32 i; - hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); - source->rewind(source->data); - //memset(hashtable, 0, source->nkeys); - //check all keys - for (i = 0; i < source->nkeys; ++i) - { - cmph_uint32 h1_v; - cmph_uint32 h2_v; - cmph_uint32 h; - char *buf; - cmph_uint32 buflen = 0; - source->read(source->data, &buf, &buflen); - - h1_v = hash(h1, buf, buflen) % n; - - h2_v = hash(h2, buf, buflen) % n; - - if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; - h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; - - if(hashtable[h]) - { - fprintf(stderr, "collision: %u\n",h); - return 0; - } - //assert(hashtable[h]==0); - hashtable[h] = 1; - source->dispose(source->data, buf, buflen); - } - free(hashtable); - return 1; } +// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); +// source->rewind(source->data); +// memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// h = cmph_search(mphf, buf, buflen); +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// } +// fprintf(stderr, "\n===============================================================================\n"); +// free(hashtable); +// return 1; +// } +// +// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) +// { +// cmph_uint8 * hashtable = NULL; +// cmph_uint32 i; +// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); +// source->rewind(source->data); +// //memset(hashtable, 0, source->nkeys); +// //check all keys +// for (i = 0; i < source->nkeys; ++i) +// { +// cmph_uint32 h1_v; +// cmph_uint32 h2_v; +// cmph_uint32 h; +// char *buf; +// cmph_uint32 buflen = 0; +// source->read(source->data, &buf, &buflen); +// +// h1_v = hash(h1, buf, buflen) % n; +// +// h2_v = hash(h2, buf, buflen) % n; +// +// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; +// +// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; +// +// if(hashtable[h]) +// { +// fprintf(stderr, "collision: %u\n",h); +// return 0; +// } +// //assert(hashtable[h]==0); +// hashtable[h] = 1; +// source->dispose(source->data, buf, buflen); +// +// } +// free(hashtable); +// return 1; +// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -238,7 +259,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 h3; FILE * tmp_fd = NULL; FILE ** tmp_fds = NULL; - char filename[100]; + char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -285,9 +306,11 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -345,9 +368,12 @@ static int brz_gen_graphs(cmph_config_t *mph) memory_usage = memory_usage + keylen1 + 1; } // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); -/* sprintf(filename, "%u.cmph",nflushes);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { keylen1 = strlen(buffer + keys_index[i]) + 1; @@ -376,9 +402,12 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { // sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); - sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); -/* sprintf(filename, "%u.cmph",i);*/ +// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); + free(filename); + filename = NULL; key = brz_read_key(tmp_fds[i]); keylen = strlen(key); h3 = hash(brz->h3, key, keylen) % brz->k; @@ -474,23 +503,6 @@ static int brz_gen_graphs(cmph_config_t *mph) #pragma pack() } -static void flush_buffer(cmph_uint8 *buffer, cmph_uint32 *memory_usage, FILE * graphs_fd) -{ - fwrite(buffer, 1, *memory_usage, graphs_fd); - *memory_usage = 0; -} - -static void save_in_disk(cmph_uint8 *buffer, cmph_uint8 * key, cmph_uint32 keylen, cmph_uint32 * memory_usage, - cmph_uint32 memory_availability, FILE * graphs_fd) -{ - if(*memory_usage + keylen + 1 > memory_availability) - { - flush_buffer(buffer, memory_usage, graphs_fd); - } - memcpy(buffer + *memory_usage, key, keylen + 1); - *memory_usage = *memory_usage + keylen + 1; -} - static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, min_index = 0; @@ -521,21 +533,6 @@ static char * brz_read_key(FILE * fd) return buf; } -static char ** brz_read_keys_vd(FILE * graphs_fd, cmph_uint8 nkeys) -{ - char ** keys_vd = (char **)malloc(sizeof(char *)*nkeys); - cmph_uint8 i; - - for(i = 0; i < nkeys; i++) - { - char * buf = brz_read_key(graphs_fd); - keys_vd[i] = (char *)malloc(strlen(buf) + 1); - strcpy(keys_vd[i], buf); - free(buf); - } - return keys_vd; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; diff --git a/src/brz.h b/src/brz.h index a1ed145..886eab2 100644 --- a/src/brz.h +++ b/src/brz.h @@ -8,6 +8,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index 742a425..f6af310 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; #endif diff --git a/src/cmph.c b/src/cmph.c index f7f4acb..203d60d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -178,6 +178,23 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->algo = algo; } +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_tmp_dir(mph, tmp_dir); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index d30fb51..c301a91 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -35,6 +35,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index ed24a72..6416359 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -62,12 +63,12 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - + cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -107,6 +108,9 @@ int main(int argc, char **argv) case 'm': mphf_file = strdup(optarg); break; + case 'd': + tmp_dir = strdup(optarg); + break; case 'v': ++verbosity; break; @@ -197,6 +201,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); + cmph_config_set_tmp_dir(config, tmp_dir); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); @@ -263,6 +268,7 @@ int main(int argc, char **argv) } fclose(keys_fd); free(mphf_file); + free(tmp_dir); free(source); return 0; } From 275bb81d06a297d949a689dc1c9f5dbfa332866d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 21:34:22 +0000 Subject: [PATCH 153/739] *** empty log message *** --- examples/Makefile | 442 ++++++++++++++++++++++++++----------------- examples/Makefile.in | 440 ++++++++++++++++++++++++++---------------- src/brz.c | 4 +- 3 files changed, 548 insertions(+), 338 deletions(-) diff --git a/examples/Makefile b/examples/Makefile index f7bab29..04bee77 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. +# examples/Makefile. Generated from Makefile.in by configure. -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,129 +14,245 @@ -SHELL = /bin/sh +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) srcdir = . top_srcdir = .. -prefix = /usr/local -exec_prefix = ${prefix} - -bindir = ${exec_prefix}/bin -sbindir = ${exec_prefix}/sbin -libexecdir = ${exec_prefix}/libexec -datadir = ${prefix}/share -sysconfdir = ${prefix}/etc -sharedstatedir = ${prefix}/com -localstatedir = ${prefix}/var -libdir = ${exec_prefix}/lib -infodir = ${prefix}/info -mandir = ${prefix}/man -includedir = ${prefix}/include -oldincludedir = /usr/include pkgdatadir = $(datadir)/cmph pkglibdir = $(libdir)/cmph pkgincludedir = $(includedir)/cmph top_builddir = .. - -ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal -AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf -AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake -AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = /usr/bin/install -c -INSTALL_PROGRAM = ${INSTALL} -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_SCRIPT = ${INSTALL} +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = s,x,x, +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -host_alias = -host_triplet = i686-pc-linux-gnu -AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar -AR = ar -AS = @AS@ -AWK = gawk -CC = gcc -CXX = g++ -CXXCPP = g++ -E -DEPDIR = .deps -DLLTOOL = @DLLTOOL@ -ECHO = echo -EGREP = grep -E -EXEEXT = -F77 = -GCJ = @GCJ@ -GCJFLAGS = @GCJFLAGS@ -GETCONF = getconf -INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LN_S = ln -s -OBJDUMP = @OBJDUMP@ -OBJEXT = o -PACKAGE = cmph -RANLIB = ranlib -RC = @RC@ -STRIP = strip -VERSION = 0.3 -am__include = include -am__quote = -install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh - -noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 - -INCLUDES = -I../src/ - -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c - -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c +build_triplet = i686-suse-linux +host_triplet = i686-suse-linux +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ + file_adapter_ex2$(EXEEXT) subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) - am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -file_adapter_ex2_LDFLAGS = am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -vector_adapter_ex1_LDFLAGS = - -DEFS = -DHAVE_CONFIG_H -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = -LDFLAGS = -lm -LIBS = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp -DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ - $(DEPDIR)/vector_adapter_ex1.Po +am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_COMMON = Makefile.am Makefile.in SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - +DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ + $(vector_adapter_ex1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal-1.9 +AMDEP_FALSE = # +AMDEP_TRUE = +AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar +AR = ar +AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf +AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader +AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake-1.9 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = /lib/cpp +CXXDEPMODE = depmode=none +CXXFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO = echo +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = grep -E +EXEEXT = +F77 = +FFLAGS = +GETCONF = getconf +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s +LDFLAGS = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run makeinfo +OBJEXT = o +PACKAGE = cmph +PACKAGE_BUGREPORT = +PACKAGE_NAME = +PACKAGE_STRING = +PACKAGE_TARNAME = +PACKAGE_VERSION = +PATH_SEPARATOR = : +RANLIB = ranlib +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +VERSION = 0.3 +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_F77 = +ac_ct_GETCONF = getconf +ac_ct_RANLIB = ranlib +ac_ct_STRIP = strip +am__fastdepCC_FALSE = # +am__fastdepCC_TRUE = +am__fastdepCXX_FALSE = +am__fastdepCXX_TRUE = # +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build = i686-suse-linux +build_alias = +build_cpu = i686 +build_os = linux +build_vendor = suse +datadir = ${prefix}/share +exec_prefix = ${prefix} +host = i686-suse-linux +host_alias = +host_cpu = i686 +host_os = linux +host_vendor = suse +includedir = ${prefix}/include +infodir = ${prefix}/info +install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localstatedir = ${prefix}/var +mandir = ${prefix}/man +mkdir_p = mkdir -p -- +oldincludedir = /usr/include +prefix = /usr/local +program_transform_name = s,x,x, +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +sysconfdir = ${prefix}/etc +target_alias = +INCLUDES = -I../src/ +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/file_adapter_ex2.Po +include ./$(DEPDIR)/vector_adapter_ex1.Po + +.c.o: + if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ + then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ + then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: + if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ + then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +# source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -145,102 +262,77 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core - -distclean-compile: - -rm -f *.tab.c - -include $(DEPDIR)/file_adapter_ex2.Po -include $(DEPDIR)/vector_adapter_ex1.Po - -distclean-depend: - -rm -rf $(DEPDIR) - -.c.o: - source='$<' object='$@' libtool=no \ - depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ - $(CCDEPMODE) $(depcomp) \ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< - -.c.obj: - source='$<' object='$@' libtool=no \ - depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ - $(CCDEPMODE) $(depcomp) \ - $(COMPILE) -c `cygpath -w $<` - -.c.lo: - source='$<' object='$@' libtool=yes \ - depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ - $(CCDEPMODE) $(depcomp) \ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = depmode=gcc3 uninstall-info-am: -tags: TAGS - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -250,9 +342,7 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -264,6 +354,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -271,7 +362,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -282,14 +373,17 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -305,7 +399,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -313,18 +408,27 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - tags uninstall uninstall-am uninstall-info-am + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/examples/Makefile.in b/examples/Makefile.in index 513ea93..2cf84b1 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,129 +14,245 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -host_alias = @host_alias@ +build_triplet = @build@ host_triplet = @host@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AWK = @AWK@ -CC = @CC@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -ECHO = @ECHO@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -GCJ = @GCJ@ -GCJFLAGS = @GCJFLAGS@ -GETCONF = @GETCONF@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -RC = @RC@ -STRIP = @STRIP@ -VERSION = @VERSION@ -am__include = @am__include@ -am__quote = @am__quote@ -install_sh = @install_sh@ - -noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 - -INCLUDES = -I../src/ - -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c - -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ + file_adapter_ex2$(EXEEXT) subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) - am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -file_adapter_ex2_LDFLAGS = am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -vector_adapter_ex1_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ -@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po +am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_COMMON = Makefile.am Makefile.in SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - +DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ + $(vector_adapter_ex1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GETCONF = @GETCONF@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_GETCONF = @ac_ct_GETCONF@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +INCLUDES = -I../src/ +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_adapter_ex2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -145,102 +262,77 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) - -.c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< - -.c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` - -.c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ uninstall-info-am: -tags: TAGS - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -250,9 +342,7 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -264,6 +354,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -271,7 +362,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -282,14 +373,17 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -305,7 +399,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -313,18 +408,27 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - tags uninstall uninstall-am uninstall-info-am + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/src/brz.c b/src/brz.c index c69ad17..3e15711 100755 --- a/src/brz.c +++ b/src/brz.c @@ -262,7 +262,7 @@ static int brz_gen_graphs(cmph_config_t *mph) char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - + cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; char ** keys_vd = NULL; @@ -478,6 +478,7 @@ static int brz_gen_graphs(cmph_config_t *mph) bmz_data_t * bmzf = NULL; // Source of keys //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); @@ -499,6 +500,7 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_vd); free(buffer_merge); free(buffer_h3); + fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; #pragma pack() } From 51be86814b4bdae7ae5300029dc981718eb55641 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 21:34:22 +0000 Subject: [PATCH 154/739] *** empty log message *** --- src/brz.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/brz.c b/src/brz.c index c69ad17..3e15711 100755 --- a/src/brz.c +++ b/src/brz.c @@ -262,7 +262,7 @@ static int brz_gen_graphs(cmph_config_t *mph) char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - + cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; char ** keys_vd = NULL; @@ -478,6 +478,7 @@ static int brz_gen_graphs(cmph_config_t *mph) bmz_data_t * bmzf = NULL; // Source of keys //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); @@ -499,6 +500,7 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_vd); free(buffer_merge); free(buffer_h3); + fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; #pragma pack() } From 7f62bf4837e930234b783ad54febf05ae94d455e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 21:34:22 +0000 Subject: [PATCH 155/739] *** empty log message *** --- INSTALL | 133 +++++--- examples/.deps/file_adapter_ex2.Po | 10 +- examples/.deps/vector_adapter_ex1.Po | 14 +- examples/Makefile | 442 +++++++++++++++++---------- examples/Makefile.in | 440 ++++++++++++++++---------- src/brz.c | 4 +- 6 files changed, 650 insertions(+), 393 deletions(-) diff --git a/INSTALL b/INSTALL index b42a17a..54caf7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,3 +1,9 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + Basic Installation ================== @@ -8,20 +14,27 @@ various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. The simplest way to compile this package is: @@ -55,14 +68,16 @@ Compilers and Options ===================== Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== @@ -75,11 +90,11 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. Installation Names ================== @@ -122,22 +137,32 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + CPU-COMPANY-SYSTEM -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. +where SYSTEM can have one of these forms: - If you are building compiler tools for cross-compiling, you can also + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. Sharing Defaults ================ @@ -150,20 +175,44 @@ default values for variables like `CC', `cache_file', and `prefix'. `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Operation Controls +Defining Variables ================== + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + `configure' recognizes the following options to control how it operates. -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - `--help' +`-h' Print a summary of the options to `configure', and exit. +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + `--quiet' `--silent' `-q' @@ -175,8 +224,6 @@ operates. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. -`configure' also accepts some other, not widely useful, options. diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po index ab68e18..5aa5200 100644 --- a/examples/.deps/file_adapter_ex2.Po +++ b/examples/.deps/file_adapter_ex2.Po @@ -1,7 +1,7 @@ -file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ +file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po index 9a9118b..73271e2 100644 --- a/examples/.deps/vector_adapter_ex1.Po +++ b/examples/.deps/vector_adapter_ex1.Po @@ -1,7 +1,7 @@ -vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ - /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ - /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ +vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ + ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ + /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/Makefile b/examples/Makefile index f7bab29..04bee77 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. +# examples/Makefile. Generated from Makefile.in by configure. -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,129 +14,245 @@ -SHELL = /bin/sh +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) srcdir = . top_srcdir = .. -prefix = /usr/local -exec_prefix = ${prefix} - -bindir = ${exec_prefix}/bin -sbindir = ${exec_prefix}/sbin -libexecdir = ${exec_prefix}/libexec -datadir = ${prefix}/share -sysconfdir = ${prefix}/etc -sharedstatedir = ${prefix}/com -localstatedir = ${prefix}/var -libdir = ${exec_prefix}/lib -infodir = ${prefix}/info -mandir = ${prefix}/man -includedir = ${prefix}/include -oldincludedir = /usr/include pkgdatadir = $(datadir)/cmph pkglibdir = $(libdir)/cmph pkgincludedir = $(includedir)/cmph top_builddir = .. - -ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal -AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf -AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake -AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = /usr/bin/install -c -INSTALL_PROGRAM = ${INSTALL} -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_SCRIPT = ${INSTALL} +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = s,x,x, +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -host_alias = -host_triplet = i686-pc-linux-gnu -AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar -AR = ar -AS = @AS@ -AWK = gawk -CC = gcc -CXX = g++ -CXXCPP = g++ -E -DEPDIR = .deps -DLLTOOL = @DLLTOOL@ -ECHO = echo -EGREP = grep -E -EXEEXT = -F77 = -GCJ = @GCJ@ -GCJFLAGS = @GCJFLAGS@ -GETCONF = getconf -INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LN_S = ln -s -OBJDUMP = @OBJDUMP@ -OBJEXT = o -PACKAGE = cmph -RANLIB = ranlib -RC = @RC@ -STRIP = strip -VERSION = 0.3 -am__include = include -am__quote = -install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh - -noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 - -INCLUDES = -I../src/ - -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c - -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c +build_triplet = i686-suse-linux +host_triplet = i686-suse-linux +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ + file_adapter_ex2$(EXEEXT) subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) - am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -file_adapter_ex2_LDFLAGS = am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -vector_adapter_ex1_LDFLAGS = - -DEFS = -DHAVE_CONFIG_H -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = -LDFLAGS = -lm -LIBS = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp -DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ - $(DEPDIR)/vector_adapter_ex1.Po +am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_COMMON = Makefile.am Makefile.in SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - +DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ + $(vector_adapter_ex1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal-1.9 +AMDEP_FALSE = # +AMDEP_TRUE = +AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar +AR = ar +AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf +AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader +AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake-1.9 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = /lib/cpp +CXXDEPMODE = depmode=none +CXXFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO = echo +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = grep -E +EXEEXT = +F77 = +FFLAGS = +GETCONF = getconf +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s +LDFLAGS = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run makeinfo +OBJEXT = o +PACKAGE = cmph +PACKAGE_BUGREPORT = +PACKAGE_NAME = +PACKAGE_STRING = +PACKAGE_TARNAME = +PACKAGE_VERSION = +PATH_SEPARATOR = : +RANLIB = ranlib +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +VERSION = 0.3 +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_F77 = +ac_ct_GETCONF = getconf +ac_ct_RANLIB = ranlib +ac_ct_STRIP = strip +am__fastdepCC_FALSE = # +am__fastdepCC_TRUE = +am__fastdepCXX_FALSE = +am__fastdepCXX_TRUE = # +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build = i686-suse-linux +build_alias = +build_cpu = i686 +build_os = linux +build_vendor = suse +datadir = ${prefix}/share +exec_prefix = ${prefix} +host = i686-suse-linux +host_alias = +host_cpu = i686 +host_os = linux +host_vendor = suse +includedir = ${prefix}/include +infodir = ${prefix}/info +install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localstatedir = ${prefix}/var +mandir = ${prefix}/man +mkdir_p = mkdir -p -- +oldincludedir = /usr/include +prefix = /usr/local +program_transform_name = s,x,x, +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +sysconfdir = ${prefix}/etc +target_alias = +INCLUDES = -I../src/ +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/file_adapter_ex2.Po +include ./$(DEPDIR)/vector_adapter_ex1.Po + +.c.o: + if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ + then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ + then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: + if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ + then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +# source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -145,102 +262,77 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core - -distclean-compile: - -rm -f *.tab.c - -include $(DEPDIR)/file_adapter_ex2.Po -include $(DEPDIR)/vector_adapter_ex1.Po - -distclean-depend: - -rm -rf $(DEPDIR) - -.c.o: - source='$<' object='$@' libtool=no \ - depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ - $(CCDEPMODE) $(depcomp) \ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< - -.c.obj: - source='$<' object='$@' libtool=no \ - depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ - $(CCDEPMODE) $(depcomp) \ - $(COMPILE) -c `cygpath -w $<` - -.c.lo: - source='$<' object='$@' libtool=yes \ - depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ - $(CCDEPMODE) $(depcomp) \ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = depmode=gcc3 uninstall-info-am: -tags: TAGS - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -250,9 +342,7 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -264,6 +354,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -271,7 +362,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -282,14 +373,17 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -305,7 +399,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -313,18 +408,27 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - tags uninstall uninstall-am uninstall-info-am + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/examples/Makefile.in b/examples/Makefile.in index 513ea93..2cf84b1 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,7 +1,8 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. +# @configure_input@ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,129 +14,245 @@ @SET_MAKE@ -SHELL = @SHELL@ +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ +transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -host_alias = @host_alias@ +build_triplet = @build@ host_triplet = @host@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AWK = @AWK@ -CC = @CC@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -ECHO = @ECHO@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -GCJ = @GCJ@ -GCJFLAGS = @GCJFLAGS@ -GETCONF = @GETCONF@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -RC = @RC@ -STRIP = @STRIP@ -VERSION = @VERSION@ -am__include = @am__include@ -am__quote = @am__quote@ -install_sh = @install_sh@ - -noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 - -INCLUDES = -I../src/ - -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c - -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ + file_adapter_ex2$(EXEEXT) subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) - am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -file_adapter_ex2_LDFLAGS = am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -vector_adapter_ex1_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ -@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po +am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_COMMON = Makefile.am Makefile.in SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - +DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ + $(vector_adapter_ex1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GETCONF = @GETCONF@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_GETCONF = @ac_ct_GETCONF@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +INCLUDES = -I../src/ +vector_adapter_ex1_LDADD = ../src/libcmph.la +vector_adapter_ex1_SOURCES = vector_adapter_ex1.c +file_adapter_ex2_LDADD = ../src/libcmph.la +file_adapter_ex2_SOURCES = file_adapter_ex2.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_adapter_ex2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -145,102 +262,77 @@ clean-libtool: distclean-libtool: -rm -f libtool -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) - -.c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< - -.c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` - -.c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ uninstall-info-am: -tags: TAGS - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) + mkid -fID $$unique +tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ + here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ fi; \ if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -250,9 +342,7 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) - installdirs: - install: install-am install-exec: install-exec-am install-data: install-data-am @@ -264,6 +354,7 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -271,7 +362,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -282,14 +373,17 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags dvi: dvi-am dvi-am: +html: html-am + info: info-am info-am: @@ -305,7 +399,8 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - + -rm -rf ./$(DEPDIR) + -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -313,18 +408,27 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + uninstall-am: uninstall-info-am -.PHONY: GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - tags uninstall uninstall-am uninstall-info-am + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/src/brz.c b/src/brz.c index c69ad17..3e15711 100755 --- a/src/brz.c +++ b/src/brz.c @@ -262,7 +262,7 @@ static int brz_gen_graphs(cmph_config_t *mph) char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - + cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; char ** keys_vd = NULL; @@ -478,6 +478,7 @@ static int brz_gen_graphs(cmph_config_t *mph) bmz_data_t * bmzf = NULL; // Source of keys //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); @@ -499,6 +500,7 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_vd); free(buffer_merge); free(buffer_h3); + fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; #pragma pack() } From 2a1a7f98969a44a7576860517924653867d0d50e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 8 Aug 2005 21:34:22 +0000 Subject: [PATCH 156/739] *** empty log message *** --- INSTALL | 133 ++++++++++++++++++--------- examples/.deps/file_adapter_ex2.Po | 10 +- examples/.deps/vector_adapter_ex1.Po | 14 +-- src/brz.c | 4 +- 4 files changed, 105 insertions(+), 56 deletions(-) diff --git a/INSTALL b/INSTALL index b42a17a..54caf7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,3 +1,9 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + Basic Installation ================== @@ -8,20 +14,27 @@ various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. The simplest way to compile this package is: @@ -55,14 +68,16 @@ Compilers and Options ===================== Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== @@ -75,11 +90,11 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. Installation Names ================== @@ -122,22 +137,32 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + CPU-COMPANY-SYSTEM -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. +where SYSTEM can have one of these forms: - If you are building compiler tools for cross-compiling, you can also + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. Sharing Defaults ================ @@ -150,20 +175,44 @@ default values for variables like `CC', `cache_file', and `prefix'. `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Operation Controls +Defining Variables ================== + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + `configure' recognizes the following options to control how it operates. -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - `--help' +`-h' Print a summary of the options to `configure', and exit. +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + `--quiet' `--silent' `-q' @@ -175,8 +224,6 @@ operates. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. -`configure' also accepts some other, not widely useful, options. diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po index ab68e18..5aa5200 100644 --- a/examples/.deps/file_adapter_ex2.Po +++ b/examples/.deps/file_adapter_ex2.Po @@ -1,7 +1,7 @@ -file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ +file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po index 9a9118b..73271e2 100644 --- a/examples/.deps/vector_adapter_ex1.Po +++ b/examples/.deps/vector_adapter_ex1.Po @@ -1,7 +1,7 @@ -vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ - /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ - /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h \ +vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ + ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ + /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ vector_adapter_ex1.o: vector_adapter_ex1.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/src/brz.c b/src/brz.c index c69ad17..3e15711 100755 --- a/src/brz.c +++ b/src/brz.c @@ -262,7 +262,7 @@ static int brz_gen_graphs(cmph_config_t *mph) char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - + cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; char ** keys_vd = NULL; @@ -478,6 +478,7 @@ static int brz_gen_graphs(cmph_config_t *mph) bmz_data_t * bmzf = NULL; // Source of keys //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); + if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); @@ -499,6 +500,7 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_vd); free(buffer_merge); free(buffer_h3); + fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; #pragma pack() } From 7721b027e237049254059d3f134a771e2d3d9d1e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:24:39 +0000 Subject: [PATCH 157/739] Fixed: gcc 2.95 problem and initialzes memory --- src/bmz.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index a201cc1..87c3aeb 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -29,8 +29,9 @@ static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * bmz_config_data_t *bmz_config_new() { - bmz_config_data_t *bmz = NULL; + bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; @@ -71,8 +72,8 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - DEBUGP("c: %f\n", c); bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); From 01912bbe07b1f184f16ffc6dcb358872de7a80dc Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:24:39 +0000 Subject: [PATCH 158/739] Fixed: gcc 2.95 problem and initialzes memory --- src/bmz.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index a201cc1..87c3aeb 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -29,8 +29,9 @@ static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * bmz_config_data_t *bmz_config_new() { - bmz_config_data_t *bmz = NULL; + bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; @@ -71,8 +72,8 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - DEBUGP("c: %f\n", c); bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); From 1d6ef167f61cd05303dde2b4a19cd083f9bd6826 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:24:39 +0000 Subject: [PATCH 159/739] Fixed: gcc 2.95 problem and initialzes memory --- src/bmz.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index a201cc1..87c3aeb 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -29,8 +29,9 @@ static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * bmz_config_data_t *bmz_config_new() { - bmz_config_data_t *bmz = NULL; + bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; @@ -71,8 +72,8 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - DEBUGP("c: %f\n", c); bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); From c9ca8dbc28fe9bbc9ada31427b9da49e5575846a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:24:39 +0000 Subject: [PATCH 160/739] Fixed: gcc 2.95 problem and initialzes memory --- src/bmz.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index a201cc1..87c3aeb 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -29,8 +29,9 @@ static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * bmz_config_data_t *bmz_config_new() { - bmz_config_data_t *bmz = NULL; + bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; @@ -71,8 +72,8 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - DEBUGP("c: %f\n", c); bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); From 72dfef8a95a869f4ae355588bd7bbc52b79ab062 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:31:23 +0000 Subject: [PATCH 161/739] Fixed: gcc 2.95 problem and initialzes memory --- src/chm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chm.c b/src/chm.c index 89648d8..3458577 100644 --- a/src/chm.c +++ b/src/chm.c @@ -19,14 +19,15 @@ static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint3 chm_config_data_t *chm_config_new() { - chm_config_data_t *chm = NULL; + chm_config_data_t *chm; chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); chm->hashfuncs[0] = CMPH_HASH_JENKINS; chm->hashfuncs[1] = CMPH_HASH_JENKINS; chm->g = NULL; chm->graph = NULL; chm->hashes = NULL; - assert(chm); return chm; } void chm_config_destroy(cmph_config_t *mph) From 41cd24604c048bb1ef2bd92e023dc5dd6e635125 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:31:23 +0000 Subject: [PATCH 162/739] Fixed: gcc 2.95 problem and initialzes memory --- src/chm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chm.c b/src/chm.c index 89648d8..3458577 100644 --- a/src/chm.c +++ b/src/chm.c @@ -19,14 +19,15 @@ static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint3 chm_config_data_t *chm_config_new() { - chm_config_data_t *chm = NULL; + chm_config_data_t *chm; chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); chm->hashfuncs[0] = CMPH_HASH_JENKINS; chm->hashfuncs[1] = CMPH_HASH_JENKINS; chm->g = NULL; chm->graph = NULL; chm->hashes = NULL; - assert(chm); return chm; } void chm_config_destroy(cmph_config_t *mph) From 1d9e0c2c814bd337405bb57e2142cb48a02aa609 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:31:23 +0000 Subject: [PATCH 163/739] Fixed: gcc 2.95 problem and initialzes memory --- src/chm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chm.c b/src/chm.c index 89648d8..3458577 100644 --- a/src/chm.c +++ b/src/chm.c @@ -19,14 +19,15 @@ static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint3 chm_config_data_t *chm_config_new() { - chm_config_data_t *chm = NULL; + chm_config_data_t *chm; chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); chm->hashfuncs[0] = CMPH_HASH_JENKINS; chm->hashfuncs[1] = CMPH_HASH_JENKINS; chm->g = NULL; chm->graph = NULL; chm->hashes = NULL; - assert(chm); return chm; } void chm_config_destroy(cmph_config_t *mph) From 8f5f6084267adcae5f4e1279b936f5e1a9c72cbf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:31:23 +0000 Subject: [PATCH 164/739] Fixed: gcc 2.95 problem and initialzes memory --- src/chm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chm.c b/src/chm.c index 89648d8..3458577 100644 --- a/src/chm.c +++ b/src/chm.c @@ -19,14 +19,15 @@ static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint3 chm_config_data_t *chm_config_new() { - chm_config_data_t *chm = NULL; + chm_config_data_t *chm; chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); chm->hashfuncs[0] = CMPH_HASH_JENKINS; chm->hashfuncs[1] = CMPH_HASH_JENKINS; chm->g = NULL; chm->graph = NULL; chm->hashes = NULL; - assert(chm); return chm; } void chm_config_destroy(cmph_config_t *mph) From b9303638558fedc83476375c417991c8f5bee962 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:51:17 +0000 Subject: [PATCH 165/739] Fixed: gcc 2.95 problem and initialzes memory --- src/cmph_structs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 553db3d..30790bf 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -8,12 +8,13 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); + memset(mph, 0, sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; mph->data = NULL; - float c = 0; + mph->c = 0; return mph; } From eb3afb8e8e47c968ac3f4de71506b3acc0de7eb5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:51:17 +0000 Subject: [PATCH 166/739] Fixed: gcc 2.95 problem and initialzes memory --- src/cmph_structs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 553db3d..30790bf 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -8,12 +8,13 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); + memset(mph, 0, sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; mph->data = NULL; - float c = 0; + mph->c = 0; return mph; } From 5473b2f124021bbf0ba2854f3ef595d017004bcb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:51:17 +0000 Subject: [PATCH 167/739] Fixed: gcc 2.95 problem and initialzes memory --- src/cmph_structs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 553db3d..30790bf 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -8,12 +8,13 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); + memset(mph, 0, sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; mph->data = NULL; - float c = 0; + mph->c = 0; return mph; } From e9a300f189fdf0bc1ccb29d794f1401fc9c25ed3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 2 Sep 2005 17:51:17 +0000 Subject: [PATCH 168/739] Fixed: gcc 2.95 problem and initialzes memory --- src/cmph_structs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 553db3d..30790bf 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -8,12 +8,13 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); + memset(mph, 0, sizeof(cmph_config_t)); DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; mph->data = NULL; - float c = 0; + mph->c = 0; return mph; } From 3324db06000233ce50467527faeaf7d89d6a6008 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 5 Sep 2005 17:32:21 +0000 Subject: [PATCH 169/739] BMZ8 - A 8 bit version of BMZ has been added --- src/Makefile.am | 1 + src/bmz.c | 6 +- src/bmz8.c | 547 +++++++++++++++++++++++++++++++++++++++++++++ src/bmz8.h | 18 ++ src/bmz8_structs.h | 25 +++ src/cmph.c | 39 +++- src/cmph_types.h | 2 +- 7 files changed, 628 insertions(+), 10 deletions(-) create mode 100644 src/bmz8.c create mode 100644 src/bmz8.h create mode 100644 src/bmz8_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 73ee4ae..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,6 +16,7 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ + bmz8.h bmz8_structs.h bmz8.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 87c3aeb..7a3d069 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -31,13 +31,13 @@ bmz_config_data_t *bmz_config_new() { bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + assert(bmz); memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; - assert(bmz); return bmz; } @@ -378,7 +378,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; - if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; + //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -535,7 +535,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); + return (bmz->g[h1] + bmz->g[h2]); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c new file mode 100644 index 0000000..65de52f --- /dev/null +++ b/src/bmz8.c @@ -0,0 +1,547 @@ +#include "graph.h" +#include "bmz8.h" +#include "cmph_structs.h" +#include "bmz8_structs.h" +#include "hash.h" +#include "vqueue.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int bmz8_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited); + +bmz8_config_data_t *bmz8_config_new() +{ + bmz8_config_data_t *bmz8; + bmz8 = (bmz8_config_data_t *)malloc(sizeof(bmz8_config_data_t)); + assert(bmz8); + memset(bmz8, 0, sizeof(bmz8_config_data_t)); + bmz8->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz8->hashfuncs[1] = CMPH_HASH_JENKINS; + bmz8->g = NULL; + bmz8->graph = NULL; + bmz8->hashes = NULL; + return bmz8; +} + +void bmz8_config_destroy(cmph_config_t *mph) +{ + bmz8_config_data_t *data = (bmz8_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint8 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //bmz8 only uses two hash functions + bmz8->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bmz8_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + bmz8_data_t *bmz8f = NULL; + cmph_uint8 i; + cmph_uint8 iterations; + cmph_uint8 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + + + if (mph->key_source->nkeys >= 256) + { + if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); + return NULL; + } + + DEBUGP("c: %f\n", c); + bmz8->m = mph->key_source->nkeys; + bmz8->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz8->m, bmz8->n, c); + bmz8->graph = graph_new(bmz8->n, bmz8->m); + DEBUGP("Created graph\n"); + + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz8->hashes[i] = NULL; + + do + { + // Mapping step + cmph_uint8 biggest_g_value = 0; + cmph_uint8 biggest_edge_value = 1; + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz8->m, bmz8->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); + DEBUGP("hash function 2\n"); + bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); + DEBUGP("Generating edges\n"); + ok = bmz8_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz8->hashes[0]); + bmz8->hashes[0] = NULL; + hash_state_destroy(bmz8->hashes[1]); + bmz8->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz8->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz8->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step.\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + visited = (char *)malloc(bmz8->n/8 + 1); + memset(visited, 0, bmz8->n/8 + 1); + used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); + memset(used_edges, 0, bmz8->m/8 + 1); + free(bmz8->g); + bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + assert(bmz8->g); + for (i = 0; i < bmz8->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz8->graph, i) && (!GETBIT(visited,i))) + { + if(c > 1.14) restart_mapping = bmz8_traverse_critical_nodes(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz8_traverse_critical_nodes_heuristic(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; + } + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz8_traverse_non_critical_nodes(bmz8, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); + graph_destroy(bmz8->graph); + bmz8->graph = NULL; + if (iterations_map == 0) + { + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bmz8f = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + bmz8f->g = bmz8->g; + bmz8->g = NULL; //transfer memory ownership + bmz8f->hashes = bmz8->hashes; + bmz8->hashes = NULL; //transfer memory ownership + bmz8f->n = bmz8->n; + bmz8f->m = bmz8->m; + mphf->data = bmz8f; + mphf->size = bmz8->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + return 0; +} + +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint8 * unused_g_values = NULL; + cmph_uint8 unused_g_values_capacity = 0; + cmph_uint8 nunused_g_values = 0; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + cmph_uint8 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = 255;//UINT_MAX; + } + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; +} + +static cmph_uint8 next_unused_edge(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz8->m); + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 v, cmph_uint8 * unused_edge_index, cmph_uint8 * visited) +{ + graph_iterator_t it = graph_neighbors_it(bmz8->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); + bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + SETBIT(visited, neighbor); + (*unused_edge_index)++; + bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); + + } +} + +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + + cmph_uint8 i, v1, v2, unused_edge_index = 0; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz8->m; i++) + { + v1 = graph_vertex_id(bmz8->graph, i, 0); + v2 = graph_vertex_id(bmz8->graph, i, 1); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz8_traverse(bmz8, used_edges, v1, &unused_edge_index, visited); + else bmz8_traverse(bmz8, used_edges, v2, &unused_edge_index, visited); + + } + + for(i = 0; i < bmz8->n; i++) + { + if(!GETBIT(visited,i)) + { + bmz8->g[i] = 0; + SETBIT(visited, i); + bmz8_traverse(bmz8, used_edges, i, &unused_edge_index, visited); + } + } + +} + +static int bmz8_gen_edges(cmph_config_t *mph) +{ + cmph_uint8 e; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; + DEBUGP("Generating edges for %u vertices\n", bmz8->n); + graph_clear_edges(bmz8->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint8 h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); + h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + if (h1 == h2) if (++h2 >= bmz8->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); + multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz8->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz8_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + cmph_uint8 two = 2; //number of hash functions + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + cmph_uint8 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint8), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint8), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint8), 1, fd); + + fwrite(data->g, sizeof(cmph_uint8)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz8_load(FILE *f, cmph_t *mphf) +{ + cmph_uint8 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + bmz8_data_t *bmz8 = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + + DEBUGP("Loading bmz8 mphf\n"); + mphf->data = bmz8; + fread(&nhashes, sizeof(cmph_uint8), 1, f); + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz8->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + bmz8->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(bmz8->n), sizeof(cmph_uint8), 1, f); + fread(&(bmz8->m), sizeof(cmph_uint8), 1, f); + + bmz8->g = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmz8->n); + fread(bmz8->g, bmz8->n*sizeof(cmph_uint8), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz8->n; ++i) fprintf(stderr, "%u ", bmz8->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bmz8_data_t *bmz8 = mphf->data; + cmph_uint8 h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + cmph_uint8 h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz8->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz8->g[h1], bmz8->g[h2], bmz8->m); + return (bmz8->g[h1] + bmz8->g[h2]); +} +void bmz8_destroy(cmph_t *mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/bmz8.h b/src/bmz8.h new file mode 100644 index 0000000..cb35cd4 --- /dev/null +++ b/src/bmz8.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BMZ8_H__ +#define __CMPH_BMZ8_H__ + +#include "cmph.h" + +typedef struct __bmz8_data_t bmz8_data_t; +typedef struct __bmz8_config_data_t bmz8_config_data_t; + +bmz8_config_data_t *bmz8_config_new(); +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz8_config_destroy(cmph_config_t *mph); +cmph_t *bmz8_new(cmph_config_t *mph, float c); + +void bmz8_load(FILE *f, cmph_t *mphf); +int bmz8_dump(cmph_t *mphf, FILE *f); +void bmz8_destroy(cmph_t *mphf); +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/bmz8_structs.h b/src/bmz8_structs.h new file mode 100644 index 0000000..408b529 --- /dev/null +++ b/src/bmz8_structs.h @@ -0,0 +1,25 @@ +#ifndef __CMPH_BMZ8_STRUCTS_H__ +#define __CMPH_BMZ8_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz8_data_t +{ + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + cmph_uint8 *g; + hash_state_t **hashes; +}; + + +struct __bmz8_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + graph_t *graph; + cmph_uint8 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c index 203d60d..8f86f4e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,6 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" +#include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ #include @@ -10,7 +11,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -154,6 +155,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: bmz_config_destroy(mph); break; + case CMPH_BMZ8: + bmz8_config_destroy(mph); + break; case CMPH_BRZ: brz_config_destroy(mph); break; @@ -168,9 +172,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: mph->data = bmz_config_new(); break; + case CMPH_BMZ8: + mph->data = (void*)bmz8_config_new(); + break; case CMPH_BRZ: mph->data = brz_config_new(); - break; default: assert(0); } @@ -186,6 +192,8 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) break; case CMPH_BMZ: /* included -- Fabiano */ break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_tmp_dir(mph, tmp_dir); break; @@ -206,9 +214,11 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_destroy(mph); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_destroy(mph); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); - break; default: assert(0); } @@ -230,6 +240,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_set_hashfuncs(mph, hashfuncs); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; @@ -262,6 +275,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Creating bmz8 hash\n"); + if (c == 0) c = 1.15; + mphf = bmz8_new(mph, c); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; @@ -279,13 +297,12 @@ int cmph_dump(cmph_t *mphf, FILE *f) { case CMPH_CHM: return chm_dump(mphf, f); - break; case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); - break; + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); - break; default: assert(0); } @@ -309,6 +326,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Loading bmz8 algorithm dependent parts\n"); + bmz8_load(f, mphf); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); @@ -331,6 +352,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("bmz8 algorithm search\n"); + return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); @@ -356,6 +380,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_destroy(mphf); + return; case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; diff --git a/src/cmph_types.h b/src/cmph_types.h index 9359e33..be976ee 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From 0bd5ad5d1ac47c66771706e7187228a342b3ce3d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 5 Sep 2005 17:32:21 +0000 Subject: [PATCH 170/739] BMZ8 - A 8 bit version of BMZ has been added --- src/Makefile.am | 1 + src/bmz.c | 6 +- src/bmz8.c | 547 +++++++++++++++++++++++++++++++++++++++++++++ src/bmz8.h | 18 ++ src/bmz8_structs.h | 25 +++ src/cmph.c | 39 +++- src/cmph_types.h | 2 +- 7 files changed, 628 insertions(+), 10 deletions(-) create mode 100644 src/bmz8.c create mode 100644 src/bmz8.h create mode 100644 src/bmz8_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 73ee4ae..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,6 +16,7 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ + bmz8.h bmz8_structs.h bmz8.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 87c3aeb..7a3d069 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -31,13 +31,13 @@ bmz_config_data_t *bmz_config_new() { bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + assert(bmz); memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; - assert(bmz); return bmz; } @@ -378,7 +378,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; - if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; + //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -535,7 +535,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); + return (bmz->g[h1] + bmz->g[h2]); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c new file mode 100644 index 0000000..65de52f --- /dev/null +++ b/src/bmz8.c @@ -0,0 +1,547 @@ +#include "graph.h" +#include "bmz8.h" +#include "cmph_structs.h" +#include "bmz8_structs.h" +#include "hash.h" +#include "vqueue.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int bmz8_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited); + +bmz8_config_data_t *bmz8_config_new() +{ + bmz8_config_data_t *bmz8; + bmz8 = (bmz8_config_data_t *)malloc(sizeof(bmz8_config_data_t)); + assert(bmz8); + memset(bmz8, 0, sizeof(bmz8_config_data_t)); + bmz8->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz8->hashfuncs[1] = CMPH_HASH_JENKINS; + bmz8->g = NULL; + bmz8->graph = NULL; + bmz8->hashes = NULL; + return bmz8; +} + +void bmz8_config_destroy(cmph_config_t *mph) +{ + bmz8_config_data_t *data = (bmz8_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint8 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //bmz8 only uses two hash functions + bmz8->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bmz8_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + bmz8_data_t *bmz8f = NULL; + cmph_uint8 i; + cmph_uint8 iterations; + cmph_uint8 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + + + if (mph->key_source->nkeys >= 256) + { + if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); + return NULL; + } + + DEBUGP("c: %f\n", c); + bmz8->m = mph->key_source->nkeys; + bmz8->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz8->m, bmz8->n, c); + bmz8->graph = graph_new(bmz8->n, bmz8->m); + DEBUGP("Created graph\n"); + + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz8->hashes[i] = NULL; + + do + { + // Mapping step + cmph_uint8 biggest_g_value = 0; + cmph_uint8 biggest_edge_value = 1; + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz8->m, bmz8->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); + DEBUGP("hash function 2\n"); + bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); + DEBUGP("Generating edges\n"); + ok = bmz8_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz8->hashes[0]); + bmz8->hashes[0] = NULL; + hash_state_destroy(bmz8->hashes[1]); + bmz8->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz8->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz8->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step.\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + visited = (char *)malloc(bmz8->n/8 + 1); + memset(visited, 0, bmz8->n/8 + 1); + used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); + memset(used_edges, 0, bmz8->m/8 + 1); + free(bmz8->g); + bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + assert(bmz8->g); + for (i = 0; i < bmz8->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz8->graph, i) && (!GETBIT(visited,i))) + { + if(c > 1.14) restart_mapping = bmz8_traverse_critical_nodes(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz8_traverse_critical_nodes_heuristic(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; + } + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz8_traverse_non_critical_nodes(bmz8, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); + graph_destroy(bmz8->graph); + bmz8->graph = NULL; + if (iterations_map == 0) + { + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bmz8f = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + bmz8f->g = bmz8->g; + bmz8->g = NULL; //transfer memory ownership + bmz8f->hashes = bmz8->hashes; + bmz8->hashes = NULL; //transfer memory ownership + bmz8f->n = bmz8->n; + bmz8f->m = bmz8->m; + mphf->data = bmz8f; + mphf->size = bmz8->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + return 0; +} + +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint8 * unused_g_values = NULL; + cmph_uint8 unused_g_values_capacity = 0; + cmph_uint8 nunused_g_values = 0; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + cmph_uint8 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = 255;//UINT_MAX; + } + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; +} + +static cmph_uint8 next_unused_edge(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz8->m); + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 v, cmph_uint8 * unused_edge_index, cmph_uint8 * visited) +{ + graph_iterator_t it = graph_neighbors_it(bmz8->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); + bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + SETBIT(visited, neighbor); + (*unused_edge_index)++; + bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); + + } +} + +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + + cmph_uint8 i, v1, v2, unused_edge_index = 0; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz8->m; i++) + { + v1 = graph_vertex_id(bmz8->graph, i, 0); + v2 = graph_vertex_id(bmz8->graph, i, 1); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz8_traverse(bmz8, used_edges, v1, &unused_edge_index, visited); + else bmz8_traverse(bmz8, used_edges, v2, &unused_edge_index, visited); + + } + + for(i = 0; i < bmz8->n; i++) + { + if(!GETBIT(visited,i)) + { + bmz8->g[i] = 0; + SETBIT(visited, i); + bmz8_traverse(bmz8, used_edges, i, &unused_edge_index, visited); + } + } + +} + +static int bmz8_gen_edges(cmph_config_t *mph) +{ + cmph_uint8 e; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; + DEBUGP("Generating edges for %u vertices\n", bmz8->n); + graph_clear_edges(bmz8->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint8 h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); + h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + if (h1 == h2) if (++h2 >= bmz8->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); + multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz8->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz8_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + cmph_uint8 two = 2; //number of hash functions + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + cmph_uint8 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint8), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint8), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint8), 1, fd); + + fwrite(data->g, sizeof(cmph_uint8)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz8_load(FILE *f, cmph_t *mphf) +{ + cmph_uint8 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + bmz8_data_t *bmz8 = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + + DEBUGP("Loading bmz8 mphf\n"); + mphf->data = bmz8; + fread(&nhashes, sizeof(cmph_uint8), 1, f); + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz8->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + bmz8->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(bmz8->n), sizeof(cmph_uint8), 1, f); + fread(&(bmz8->m), sizeof(cmph_uint8), 1, f); + + bmz8->g = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmz8->n); + fread(bmz8->g, bmz8->n*sizeof(cmph_uint8), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz8->n; ++i) fprintf(stderr, "%u ", bmz8->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bmz8_data_t *bmz8 = mphf->data; + cmph_uint8 h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + cmph_uint8 h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz8->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz8->g[h1], bmz8->g[h2], bmz8->m); + return (bmz8->g[h1] + bmz8->g[h2]); +} +void bmz8_destroy(cmph_t *mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/bmz8.h b/src/bmz8.h new file mode 100644 index 0000000..cb35cd4 --- /dev/null +++ b/src/bmz8.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BMZ8_H__ +#define __CMPH_BMZ8_H__ + +#include "cmph.h" + +typedef struct __bmz8_data_t bmz8_data_t; +typedef struct __bmz8_config_data_t bmz8_config_data_t; + +bmz8_config_data_t *bmz8_config_new(); +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz8_config_destroy(cmph_config_t *mph); +cmph_t *bmz8_new(cmph_config_t *mph, float c); + +void bmz8_load(FILE *f, cmph_t *mphf); +int bmz8_dump(cmph_t *mphf, FILE *f); +void bmz8_destroy(cmph_t *mphf); +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/bmz8_structs.h b/src/bmz8_structs.h new file mode 100644 index 0000000..408b529 --- /dev/null +++ b/src/bmz8_structs.h @@ -0,0 +1,25 @@ +#ifndef __CMPH_BMZ8_STRUCTS_H__ +#define __CMPH_BMZ8_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz8_data_t +{ + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + cmph_uint8 *g; + hash_state_t **hashes; +}; + + +struct __bmz8_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + graph_t *graph; + cmph_uint8 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c index 203d60d..8f86f4e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,6 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" +#include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ #include @@ -10,7 +11,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -154,6 +155,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: bmz_config_destroy(mph); break; + case CMPH_BMZ8: + bmz8_config_destroy(mph); + break; case CMPH_BRZ: brz_config_destroy(mph); break; @@ -168,9 +172,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: mph->data = bmz_config_new(); break; + case CMPH_BMZ8: + mph->data = (void*)bmz8_config_new(); + break; case CMPH_BRZ: mph->data = brz_config_new(); - break; default: assert(0); } @@ -186,6 +192,8 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) break; case CMPH_BMZ: /* included -- Fabiano */ break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_tmp_dir(mph, tmp_dir); break; @@ -206,9 +214,11 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_destroy(mph); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_destroy(mph); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); - break; default: assert(0); } @@ -230,6 +240,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_set_hashfuncs(mph, hashfuncs); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; @@ -262,6 +275,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Creating bmz8 hash\n"); + if (c == 0) c = 1.15; + mphf = bmz8_new(mph, c); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; @@ -279,13 +297,12 @@ int cmph_dump(cmph_t *mphf, FILE *f) { case CMPH_CHM: return chm_dump(mphf, f); - break; case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); - break; + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); - break; default: assert(0); } @@ -309,6 +326,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Loading bmz8 algorithm dependent parts\n"); + bmz8_load(f, mphf); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); @@ -331,6 +352,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("bmz8 algorithm search\n"); + return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); @@ -356,6 +380,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_destroy(mphf); + return; case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; diff --git a/src/cmph_types.h b/src/cmph_types.h index 9359e33..be976ee 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From 3181ab91f257a3c974e538c28235fee0bf32988e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 5 Sep 2005 17:32:21 +0000 Subject: [PATCH 171/739] BMZ8 - A 8 bit version of BMZ has been added --- src/Makefile.am | 1 + src/bmz.c | 6 +- src/bmz8.c | 547 +++++++++++++++++++++++++++++++++++++++++++++ src/bmz8.h | 18 ++ src/bmz8_structs.h | 25 +++ src/cmph.c | 39 +++- src/cmph_types.h | 2 +- 7 files changed, 628 insertions(+), 10 deletions(-) create mode 100644 src/bmz8.c create mode 100644 src/bmz8.h create mode 100644 src/bmz8_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 73ee4ae..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,6 +16,7 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ + bmz8.h bmz8_structs.h bmz8.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 87c3aeb..7a3d069 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -31,13 +31,13 @@ bmz_config_data_t *bmz_config_new() { bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + assert(bmz); memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; - assert(bmz); return bmz; } @@ -378,7 +378,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; - if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; + //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -535,7 +535,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); + return (bmz->g[h1] + bmz->g[h2]); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c new file mode 100644 index 0000000..65de52f --- /dev/null +++ b/src/bmz8.c @@ -0,0 +1,547 @@ +#include "graph.h" +#include "bmz8.h" +#include "cmph_structs.h" +#include "bmz8_structs.h" +#include "hash.h" +#include "vqueue.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int bmz8_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited); + +bmz8_config_data_t *bmz8_config_new() +{ + bmz8_config_data_t *bmz8; + bmz8 = (bmz8_config_data_t *)malloc(sizeof(bmz8_config_data_t)); + assert(bmz8); + memset(bmz8, 0, sizeof(bmz8_config_data_t)); + bmz8->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz8->hashfuncs[1] = CMPH_HASH_JENKINS; + bmz8->g = NULL; + bmz8->graph = NULL; + bmz8->hashes = NULL; + return bmz8; +} + +void bmz8_config_destroy(cmph_config_t *mph) +{ + bmz8_config_data_t *data = (bmz8_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint8 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //bmz8 only uses two hash functions + bmz8->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bmz8_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + bmz8_data_t *bmz8f = NULL; + cmph_uint8 i; + cmph_uint8 iterations; + cmph_uint8 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + + + if (mph->key_source->nkeys >= 256) + { + if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); + return NULL; + } + + DEBUGP("c: %f\n", c); + bmz8->m = mph->key_source->nkeys; + bmz8->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz8->m, bmz8->n, c); + bmz8->graph = graph_new(bmz8->n, bmz8->m); + DEBUGP("Created graph\n"); + + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz8->hashes[i] = NULL; + + do + { + // Mapping step + cmph_uint8 biggest_g_value = 0; + cmph_uint8 biggest_edge_value = 1; + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz8->m, bmz8->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); + DEBUGP("hash function 2\n"); + bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); + DEBUGP("Generating edges\n"); + ok = bmz8_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz8->hashes[0]); + bmz8->hashes[0] = NULL; + hash_state_destroy(bmz8->hashes[1]); + bmz8->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz8->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz8->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step.\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + visited = (char *)malloc(bmz8->n/8 + 1); + memset(visited, 0, bmz8->n/8 + 1); + used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); + memset(used_edges, 0, bmz8->m/8 + 1); + free(bmz8->g); + bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + assert(bmz8->g); + for (i = 0; i < bmz8->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz8->graph, i) && (!GETBIT(visited,i))) + { + if(c > 1.14) restart_mapping = bmz8_traverse_critical_nodes(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz8_traverse_critical_nodes_heuristic(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; + } + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz8_traverse_non_critical_nodes(bmz8, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); + graph_destroy(bmz8->graph); + bmz8->graph = NULL; + if (iterations_map == 0) + { + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bmz8f = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + bmz8f->g = bmz8->g; + bmz8->g = NULL; //transfer memory ownership + bmz8f->hashes = bmz8->hashes; + bmz8->hashes = NULL; //transfer memory ownership + bmz8f->n = bmz8->n; + bmz8f->m = bmz8->m; + mphf->data = bmz8f; + mphf->size = bmz8->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + return 0; +} + +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint8 * unused_g_values = NULL; + cmph_uint8 unused_g_values_capacity = 0; + cmph_uint8 nunused_g_values = 0; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + cmph_uint8 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = 255;//UINT_MAX; + } + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; +} + +static cmph_uint8 next_unused_edge(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz8->m); + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 v, cmph_uint8 * unused_edge_index, cmph_uint8 * visited) +{ + graph_iterator_t it = graph_neighbors_it(bmz8->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); + bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + SETBIT(visited, neighbor); + (*unused_edge_index)++; + bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); + + } +} + +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + + cmph_uint8 i, v1, v2, unused_edge_index = 0; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz8->m; i++) + { + v1 = graph_vertex_id(bmz8->graph, i, 0); + v2 = graph_vertex_id(bmz8->graph, i, 1); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz8_traverse(bmz8, used_edges, v1, &unused_edge_index, visited); + else bmz8_traverse(bmz8, used_edges, v2, &unused_edge_index, visited); + + } + + for(i = 0; i < bmz8->n; i++) + { + if(!GETBIT(visited,i)) + { + bmz8->g[i] = 0; + SETBIT(visited, i); + bmz8_traverse(bmz8, used_edges, i, &unused_edge_index, visited); + } + } + +} + +static int bmz8_gen_edges(cmph_config_t *mph) +{ + cmph_uint8 e; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; + DEBUGP("Generating edges for %u vertices\n", bmz8->n); + graph_clear_edges(bmz8->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint8 h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); + h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + if (h1 == h2) if (++h2 >= bmz8->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); + multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz8->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz8_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + cmph_uint8 two = 2; //number of hash functions + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + cmph_uint8 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint8), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint8), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint8), 1, fd); + + fwrite(data->g, sizeof(cmph_uint8)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz8_load(FILE *f, cmph_t *mphf) +{ + cmph_uint8 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + bmz8_data_t *bmz8 = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + + DEBUGP("Loading bmz8 mphf\n"); + mphf->data = bmz8; + fread(&nhashes, sizeof(cmph_uint8), 1, f); + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz8->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + bmz8->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(bmz8->n), sizeof(cmph_uint8), 1, f); + fread(&(bmz8->m), sizeof(cmph_uint8), 1, f); + + bmz8->g = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmz8->n); + fread(bmz8->g, bmz8->n*sizeof(cmph_uint8), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz8->n; ++i) fprintf(stderr, "%u ", bmz8->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bmz8_data_t *bmz8 = mphf->data; + cmph_uint8 h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + cmph_uint8 h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz8->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz8->g[h1], bmz8->g[h2], bmz8->m); + return (bmz8->g[h1] + bmz8->g[h2]); +} +void bmz8_destroy(cmph_t *mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/bmz8.h b/src/bmz8.h new file mode 100644 index 0000000..cb35cd4 --- /dev/null +++ b/src/bmz8.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BMZ8_H__ +#define __CMPH_BMZ8_H__ + +#include "cmph.h" + +typedef struct __bmz8_data_t bmz8_data_t; +typedef struct __bmz8_config_data_t bmz8_config_data_t; + +bmz8_config_data_t *bmz8_config_new(); +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz8_config_destroy(cmph_config_t *mph); +cmph_t *bmz8_new(cmph_config_t *mph, float c); + +void bmz8_load(FILE *f, cmph_t *mphf); +int bmz8_dump(cmph_t *mphf, FILE *f); +void bmz8_destroy(cmph_t *mphf); +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/bmz8_structs.h b/src/bmz8_structs.h new file mode 100644 index 0000000..408b529 --- /dev/null +++ b/src/bmz8_structs.h @@ -0,0 +1,25 @@ +#ifndef __CMPH_BMZ8_STRUCTS_H__ +#define __CMPH_BMZ8_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz8_data_t +{ + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + cmph_uint8 *g; + hash_state_t **hashes; +}; + + +struct __bmz8_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + graph_t *graph; + cmph_uint8 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c index 203d60d..8f86f4e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,6 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" +#include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ #include @@ -10,7 +11,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -154,6 +155,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: bmz_config_destroy(mph); break; + case CMPH_BMZ8: + bmz8_config_destroy(mph); + break; case CMPH_BRZ: brz_config_destroy(mph); break; @@ -168,9 +172,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: mph->data = bmz_config_new(); break; + case CMPH_BMZ8: + mph->data = (void*)bmz8_config_new(); + break; case CMPH_BRZ: mph->data = brz_config_new(); - break; default: assert(0); } @@ -186,6 +192,8 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) break; case CMPH_BMZ: /* included -- Fabiano */ break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_tmp_dir(mph, tmp_dir); break; @@ -206,9 +214,11 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_destroy(mph); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_destroy(mph); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); - break; default: assert(0); } @@ -230,6 +240,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_set_hashfuncs(mph, hashfuncs); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; @@ -262,6 +275,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Creating bmz8 hash\n"); + if (c == 0) c = 1.15; + mphf = bmz8_new(mph, c); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; @@ -279,13 +297,12 @@ int cmph_dump(cmph_t *mphf, FILE *f) { case CMPH_CHM: return chm_dump(mphf, f); - break; case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); - break; + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); - break; default: assert(0); } @@ -309,6 +326,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Loading bmz8 algorithm dependent parts\n"); + bmz8_load(f, mphf); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); @@ -331,6 +352,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("bmz8 algorithm search\n"); + return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); @@ -356,6 +380,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_destroy(mphf); + return; case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; diff --git a/src/cmph_types.h b/src/cmph_types.h index 9359e33..be976ee 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From 97e2fd04a05c3f7f8a2e7fe21a12e4ebc58023bf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 5 Sep 2005 17:32:21 +0000 Subject: [PATCH 172/739] BMZ8 - A 8 bit version of BMZ has been added --- src/Makefile.am | 1 + src/bmz.c | 6 +- src/bmz8.c | 547 +++++++++++++++++++++++++++++++++++++++++++++ src/bmz8.h | 18 ++ src/bmz8_structs.h | 25 +++ src/cmph.c | 39 +++- src/cmph_types.h | 2 +- 7 files changed, 628 insertions(+), 10 deletions(-) create mode 100644 src/bmz8.c create mode 100644 src/bmz8.h create mode 100644 src/bmz8_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index 73ee4ae..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,6 +16,7 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ + bmz8.h bmz8_structs.h bmz8.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 87c3aeb..7a3d069 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -31,13 +31,13 @@ bmz_config_data_t *bmz_config_new() { bmz_config_data_t *bmz; bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + assert(bmz); memset(bmz, 0, sizeof(bmz_config_data_t)); bmz->hashfuncs[0] = CMPH_HASH_JENKINS; bmz->hashfuncs[1] = CMPH_HASH_JENKINS; bmz->g = NULL; bmz->graph = NULL; bmz->hashes = NULL; - assert(bmz); return bmz; } @@ -378,7 +378,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; - if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; + //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); @@ -535,7 +535,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return ((bmz->g[h1] + bmz->g[h2]) % bmz->m); + return (bmz->g[h1] + bmz->g[h2]); } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c new file mode 100644 index 0000000..65de52f --- /dev/null +++ b/src/bmz8.c @@ -0,0 +1,547 @@ +#include "graph.h" +#include "bmz8.h" +#include "cmph_structs.h" +#include "bmz8_structs.h" +#include "hash.h" +#include "vqueue.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int bmz8_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited); + +bmz8_config_data_t *bmz8_config_new() +{ + bmz8_config_data_t *bmz8; + bmz8 = (bmz8_config_data_t *)malloc(sizeof(bmz8_config_data_t)); + assert(bmz8); + memset(bmz8, 0, sizeof(bmz8_config_data_t)); + bmz8->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz8->hashfuncs[1] = CMPH_HASH_JENKINS; + bmz8->g = NULL; + bmz8->graph = NULL; + bmz8->hashes = NULL; + return bmz8; +} + +void bmz8_config_destroy(cmph_config_t *mph) +{ + bmz8_config_data_t *data = (bmz8_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint8 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //bmz8 only uses two hash functions + bmz8->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bmz8_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + bmz8_data_t *bmz8f = NULL; + cmph_uint8 i; + cmph_uint8 iterations; + cmph_uint8 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + + + if (mph->key_source->nkeys >= 256) + { + if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); + return NULL; + } + + DEBUGP("c: %f\n", c); + bmz8->m = mph->key_source->nkeys; + bmz8->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz8->m, bmz8->n, c); + bmz8->graph = graph_new(bmz8->n, bmz8->m); + DEBUGP("Created graph\n"); + + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz8->hashes[i] = NULL; + + do + { + // Mapping step + cmph_uint8 biggest_g_value = 0; + cmph_uint8 biggest_edge_value = 1; + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz8->m, bmz8->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); + DEBUGP("hash function 2\n"); + bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); + DEBUGP("Generating edges\n"); + ok = bmz8_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz8->hashes[0]); + bmz8->hashes[0] = NULL; + hash_state_destroy(bmz8->hashes[1]); + bmz8->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz8->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz8->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step.\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + visited = (char *)malloc(bmz8->n/8 + 1); + memset(visited, 0, bmz8->n/8 + 1); + used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); + memset(used_edges, 0, bmz8->m/8 + 1); + free(bmz8->g); + bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + assert(bmz8->g); + for (i = 0; i < bmz8->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz8->graph, i) && (!GETBIT(visited,i))) + { + if(c > 1.14) restart_mapping = bmz8_traverse_critical_nodes(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz8_traverse_critical_nodes_heuristic(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; + } + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz8_traverse_non_critical_nodes(bmz8, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); + graph_destroy(bmz8->graph); + bmz8->graph = NULL; + if (iterations_map == 0) + { + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bmz8f = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + bmz8f->g = bmz8->g; + bmz8->g = NULL; //transfer memory ownership + bmz8f->hashes = bmz8->hashes; + bmz8->hashes = NULL; //transfer memory ownership + bmz8f->n = bmz8->n; + bmz8f->m = bmz8->m; + mphf->data = bmz8f; + mphf->size = bmz8->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + return 0; +} + +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint8 * unused_g_values = NULL; + cmph_uint8 unused_g_values_capacity = 0; + cmph_uint8 nunused_g_values = 0; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + cmph_uint8 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = 255;//UINT_MAX; + } + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, next_g + bmz8->g[lav])) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,next_g + bmz8->g[lav]); + if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; +} + +static cmph_uint8 next_unused_edge(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz8->m); + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 v, cmph_uint8 * unused_edge_index, cmph_uint8 * visited) +{ + graph_iterator_t it = graph_neighbors_it(bmz8->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); + bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + SETBIT(visited, neighbor); + (*unused_edge_index)++; + bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); + + } +} + +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + + cmph_uint8 i, v1, v2, unused_edge_index = 0; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz8->m; i++) + { + v1 = graph_vertex_id(bmz8->graph, i, 0); + v2 = graph_vertex_id(bmz8->graph, i, 1); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz8_traverse(bmz8, used_edges, v1, &unused_edge_index, visited); + else bmz8_traverse(bmz8, used_edges, v2, &unused_edge_index, visited); + + } + + for(i = 0; i < bmz8->n; i++) + { + if(!GETBIT(visited,i)) + { + bmz8->g[i] = 0; + SETBIT(visited, i); + bmz8_traverse(bmz8, used_edges, i, &unused_edge_index, visited); + } + } + +} + +static int bmz8_gen_edges(cmph_config_t *mph) +{ + cmph_uint8 e; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; + DEBUGP("Generating edges for %u vertices\n", bmz8->n); + graph_clear_edges(bmz8->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint8 h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); + h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + if (h1 == h2) if (++h2 >= bmz8->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); + multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz8->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz8_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + cmph_uint8 two = 2; //number of hash functions + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + cmph_uint8 nn, nm; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint8), 1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint8), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint8), 1, fd); + + fwrite(data->g, sizeof(cmph_uint8)*(data->n), 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz8_load(FILE *f, cmph_t *mphf) +{ + cmph_uint8 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + bmz8_data_t *bmz8 = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + + DEBUGP("Loading bmz8 mphf\n"); + mphf->data = bmz8; + fread(&nhashes, sizeof(cmph_uint8), 1, f); + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz8->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + bmz8->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(bmz8->n), sizeof(cmph_uint8), 1, f); + fread(&(bmz8->m), sizeof(cmph_uint8), 1, f); + + bmz8->g = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmz8->n); + fread(bmz8->g, bmz8->n*sizeof(cmph_uint8), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz8->n; ++i) fprintf(stderr, "%u ", bmz8->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bmz8_data_t *bmz8 = mphf->data; + cmph_uint8 h1 = hash(bmz8->hashes[0], key, keylen) % bmz8->n; + cmph_uint8 h2 = hash(bmz8->hashes[1], key, keylen) % bmz8->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz8->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz8->g[h1], bmz8->g[h2], bmz8->m); + return (bmz8->g[h1] + bmz8->g[h2]); +} +void bmz8_destroy(cmph_t *mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/bmz8.h b/src/bmz8.h new file mode 100644 index 0000000..cb35cd4 --- /dev/null +++ b/src/bmz8.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_BMZ8_H__ +#define __CMPH_BMZ8_H__ + +#include "cmph.h" + +typedef struct __bmz8_data_t bmz8_data_t; +typedef struct __bmz8_config_data_t bmz8_config_data_t; + +bmz8_config_data_t *bmz8_config_new(); +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz8_config_destroy(cmph_config_t *mph); +cmph_t *bmz8_new(cmph_config_t *mph, float c); + +void bmz8_load(FILE *f, cmph_t *mphf); +int bmz8_dump(cmph_t *mphf, FILE *f); +void bmz8_destroy(cmph_t *mphf); +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/bmz8_structs.h b/src/bmz8_structs.h new file mode 100644 index 0000000..408b529 --- /dev/null +++ b/src/bmz8_structs.h @@ -0,0 +1,25 @@ +#ifndef __CMPH_BMZ8_STRUCTS_H__ +#define __CMPH_BMZ8_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz8_data_t +{ + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + cmph_uint8 *g; + hash_state_t **hashes; +}; + + +struct __bmz8_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + graph_t *graph; + cmph_uint8 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/src/cmph.c b/src/cmph.c index 203d60d..8f86f4e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -2,6 +2,7 @@ #include "cmph_structs.h" #include "chm.h" #include "bmz.h" +#include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ #include @@ -10,7 +11,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ static cmph_uint32 position; // access position when data is a vector @@ -154,6 +155,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: bmz_config_destroy(mph); break; + case CMPH_BMZ8: + bmz8_config_destroy(mph); + break; case CMPH_BRZ: brz_config_destroy(mph); break; @@ -168,9 +172,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BMZ: mph->data = bmz_config_new(); break; + case CMPH_BMZ8: + mph->data = (void*)bmz8_config_new(); + break; case CMPH_BRZ: mph->data = brz_config_new(); - break; default: assert(0); } @@ -186,6 +192,8 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) break; case CMPH_BMZ: /* included -- Fabiano */ break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_tmp_dir(mph, tmp_dir); break; @@ -206,9 +214,11 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_destroy(mph); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_destroy(mph); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); - break; default: assert(0); } @@ -230,6 +240,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BMZ: /* included -- Fabiano */ bmz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_set_hashfuncs(mph, hashfuncs); + break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; @@ -262,6 +275,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Creating bmz8 hash\n"); + if (c == 0) c = 1.15; + mphf = bmz8_new(mph, c); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; @@ -279,13 +297,12 @@ int cmph_dump(cmph_t *mphf, FILE *f) { case CMPH_CHM: return chm_dump(mphf, f); - break; case CMPH_BMZ: /* included -- Fabiano */ return bmz_dump(mphf, f); - break; + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); - break; default: assert(0); } @@ -309,6 +326,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading bmz algorithm dependent parts\n"); bmz_load(f, mphf); break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Loading bmz8 algorithm dependent parts\n"); + bmz8_load(f, mphf); + break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); @@ -331,6 +352,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("bmz algorithm search\n"); return bmz_search(mphf, key, keylen); + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("bmz8 algorithm search\n"); + return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); @@ -356,6 +380,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BMZ: /* included -- Fabiano */ bmz_destroy(mphf); return; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_destroy(mphf); + return; case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; diff --git a/src/cmph_types.h b/src/cmph_types.h index 9359e33..be976ee 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif From d9ca12f60c80316ddd90fd41280ef160b3cd0887 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:11:37 +0000 Subject: [PATCH 173/739] Stable version of BRZ algorithm --- examples/Makefile | 48 ++++++++-------- examples/Makefile.in | 2 +- src/bmz.c | 9 +-- src/bmz8.c | 11 ++-- src/brz.c | 131 ++++++++----------------------------------- src/brz_structs.h | 1 + src/cmph.c | 4 +- 7 files changed, 60 insertions(+), 146 deletions(-) diff --git a/examples/Makefile b/examples/Makefile index 04bee77..2f4b1f5 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -36,8 +36,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i686-suse-linux -host_triplet = i686-suse-linux +build_triplet = i686-pc-linux-gnu +host_triplet = i686-pc-linux-gnu noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ file_adapter_ex2$(EXEEXT) subdir = examples @@ -74,14 +74,14 @@ DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal-1.9 +ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run aclocal-1.9 AMDEP_FALSE = # AMDEP_TRUE = -AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar +AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run tar AR = ar -AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf -AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader -AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake-1.9 +AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoconf +AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoheader +AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run automake-1.9 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 @@ -89,9 +89,9 @@ CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 CPP = gcc -E CPPFLAGS = CXX = g++ -CXXCPP = /lib/cpp -CXXDEPMODE = depmode=none -CXXFLAGS = +CXXCPP = g++ -E +CXXDEPMODE = depmode=gcc3 +CXXFLAGS = -g -O2 CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps @@ -101,8 +101,8 @@ ECHO_N = -n ECHO_T = EGREP = grep -E EXEEXT = -F77 = -FFLAGS = +F77 = g77 +FFLAGS = -g -O2 GETCONF = getconf INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} @@ -114,7 +114,7 @@ LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run makeinfo +MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run makeinfo OBJEXT = o PACKAGE = cmph PACKAGE_BUGREPORT = @@ -131,35 +131,35 @@ VERSION = 0.3 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ -ac_ct_F77 = +ac_ct_F77 = g77 ac_ct_GETCONF = getconf ac_ct_RANLIB = ranlib ac_ct_STRIP = strip am__fastdepCC_FALSE = # am__fastdepCC_TRUE = -am__fastdepCXX_FALSE = -am__fastdepCXX_TRUE = # +am__fastdepCXX_FALSE = # +am__fastdepCXX_TRUE = am__include = include am__leading_dot = . am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i686-suse-linux +build = i686-pc-linux-gnu build_alias = build_cpu = i686 -build_os = linux -build_vendor = suse +build_os = linux-gnu +build_vendor = pc datadir = ${prefix}/share exec_prefix = ${prefix} -host = i686-suse-linux +host = i686-pc-linux-gnu host_alias = host_cpu = i686 -host_os = linux -host_vendor = suse +host_os = linux-gnu +host_vendor = pc includedir = ${prefix}/include infodir = ${prefix}/info -install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh +install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localstatedir = ${prefix}/var diff --git a/examples/Makefile.in b/examples/Makefile.in index 2cf84b1..639e5c6 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, diff --git a/src/bmz.c b/src/bmz.c index 7a3d069..f3efc96 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -15,13 +15,6 @@ //#define DEBUG #include "debug.h" -//static cmph_uint32 UNDEFINED = UINT_MAX; - -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - static int bmz_gen_edges(cmph_config_t *mph); static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); @@ -535,7 +528,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return (bmz->g[h1] + bmz->g[h2]); + return bmz->g[h1] + bmz->g[h2]; } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c index 65de52f..5b5c275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -87,7 +87,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) { // Mapping step cmph_uint8 biggest_g_value = 0; - cmph_uint8 biggest_edge_value = 1; + cmph_uint8 biggest_edge_value = 1; iterations = 100; if (mph->verbosity) { @@ -100,7 +100,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); DEBUGP("hash function 2\n"); bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz8_gen_edges(mph); if (!ok) { @@ -120,7 +120,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(bmz8->graph); + graph_destroy(bmz8->graph); return NULL; } @@ -375,9 +375,10 @@ static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmp while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + //if (bmz8->g[neighbor] >= bmz8->m) bmz8->g[neighbor] += bmz8->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); @@ -437,7 +438,7 @@ static int bmz8_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); diff --git a/src/brz.c b/src/brz.c index 3e15711..195195d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "bmz.h" -#include "bmz_structs.h" +#include "bmz8.h" +#include "bmz8_structs.h" #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" @@ -22,7 +22,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -37,6 +37,7 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); @@ -64,6 +65,12 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->memory_availability = memory_availability*1024*1024; +} + void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -84,73 +91,6 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } } -// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); -// source->rewind(source->data); -// memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// h = cmph_search(mphf, buf, buflen); -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// } -// fprintf(stderr, "\n===============================================================================\n"); -// free(hashtable); -// return 1; -// } -// -// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); -// source->rewind(source->data); -// //memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h1_v; -// cmph_uint32 h2_v; -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// -// h1_v = hash(h1, buf, buflen) % n; -// -// h2_v = hash(h2, buf, buflen) % n; -// -// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; -// -// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; -// -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// -// } -// free(hashtable); -// return 1; -// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -244,13 +184,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_graphs(cmph_config_t *mph) { -#pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; - cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; @@ -276,7 +215,7 @@ static int brz_gen_graphs(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > memory_availability) // flush buffers + if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -305,7 +244,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -323,11 +261,10 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == MAX_BUCKET_SIZE) + if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) { free(buffer); free(buckets_size); @@ -367,8 +304,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -401,8 +336,6 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); @@ -420,7 +353,6 @@ static int brz_gen_graphs(cmph_config_t *mph) e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; - //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); @@ -436,56 +368,43 @@ static int brz_gen_graphs(cmph_config_t *mph) if (h3 != buffer_h3[i]) break; keys_vd[nkeys_vd++] = key; - - //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); - //fwrite(key, 1, keylen + 1, graphs_fd); e++; - //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } } -/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - //free(buffer_merge[i]); buffer_merge[i] = NULL; } - if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. { cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz_data_t * bmzf = NULL; + bmz8_data_t * bmzf = NULL; // Source of keys - //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); + bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); @@ -495,14 +414,12 @@ static int brz_gen_graphs(cmph_config_t *mph) } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); free(keys_vd); free(buffer_merge); free(buffer_h3); fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; -#pragma pack() } static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) @@ -541,7 +458,7 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); @@ -549,13 +466,11 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { - brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); - //brz->size[index] = bmzf->n; - //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -675,11 +590,13 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) cmph_uint32 n = ceil(brz->c * m); cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; + mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); - return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); + return (mphf_bucket + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index f6af310..adee286 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory }; diff --git a/src/cmph.c b/src/cmph.c index 8f86f4e..30bee18 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -173,10 +173,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz_config_new(); break; case CMPH_BMZ8: - mph->data = (void*)bmz8_config_new(); + mph->data = bmz8_config_new(); break; case CMPH_BRZ: mph->data = brz_config_new(); + break; default: assert(0); } @@ -219,6 +220,7 @@ void cmph_config_destroy(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); + break; default: assert(0); } From d686e0a53e0b3d278840f74ea7551c11c54f3776 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:11:37 +0000 Subject: [PATCH 174/739] Stable version of BRZ algorithm --- src/bmz.c | 9 +--- src/bmz8.c | 11 ++-- src/brz.c | 131 +++++++++------------------------------------- src/brz_structs.h | 1 + src/cmph.c | 4 +- 5 files changed, 35 insertions(+), 121 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 7a3d069..f3efc96 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -15,13 +15,6 @@ //#define DEBUG #include "debug.h" -//static cmph_uint32 UNDEFINED = UINT_MAX; - -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - static int bmz_gen_edges(cmph_config_t *mph); static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); @@ -535,7 +528,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return (bmz->g[h1] + bmz->g[h2]); + return bmz->g[h1] + bmz->g[h2]; } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c index 65de52f..5b5c275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -87,7 +87,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) { // Mapping step cmph_uint8 biggest_g_value = 0; - cmph_uint8 biggest_edge_value = 1; + cmph_uint8 biggest_edge_value = 1; iterations = 100; if (mph->verbosity) { @@ -100,7 +100,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); DEBUGP("hash function 2\n"); bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz8_gen_edges(mph); if (!ok) { @@ -120,7 +120,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(bmz8->graph); + graph_destroy(bmz8->graph); return NULL; } @@ -375,9 +375,10 @@ static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmp while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + //if (bmz8->g[neighbor] >= bmz8->m) bmz8->g[neighbor] += bmz8->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); @@ -437,7 +438,7 @@ static int bmz8_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); diff --git a/src/brz.c b/src/brz.c index 3e15711..195195d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "bmz.h" -#include "bmz_structs.h" +#include "bmz8.h" +#include "bmz8_structs.h" #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" @@ -22,7 +22,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -37,6 +37,7 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); @@ -64,6 +65,12 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->memory_availability = memory_availability*1024*1024; +} + void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -84,73 +91,6 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } } -// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); -// source->rewind(source->data); -// memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// h = cmph_search(mphf, buf, buflen); -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// } -// fprintf(stderr, "\n===============================================================================\n"); -// free(hashtable); -// return 1; -// } -// -// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); -// source->rewind(source->data); -// //memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h1_v; -// cmph_uint32 h2_v; -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// -// h1_v = hash(h1, buf, buflen) % n; -// -// h2_v = hash(h2, buf, buflen) % n; -// -// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; -// -// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; -// -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// -// } -// free(hashtable); -// return 1; -// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -244,13 +184,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_graphs(cmph_config_t *mph) { -#pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; - cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; @@ -276,7 +215,7 @@ static int brz_gen_graphs(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > memory_availability) // flush buffers + if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -305,7 +244,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -323,11 +261,10 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == MAX_BUCKET_SIZE) + if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) { free(buffer); free(buckets_size); @@ -367,8 +304,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -401,8 +336,6 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); @@ -420,7 +353,6 @@ static int brz_gen_graphs(cmph_config_t *mph) e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; - //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); @@ -436,56 +368,43 @@ static int brz_gen_graphs(cmph_config_t *mph) if (h3 != buffer_h3[i]) break; keys_vd[nkeys_vd++] = key; - - //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); - //fwrite(key, 1, keylen + 1, graphs_fd); e++; - //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } } -/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - //free(buffer_merge[i]); buffer_merge[i] = NULL; } - if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. { cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz_data_t * bmzf = NULL; + bmz8_data_t * bmzf = NULL; // Source of keys - //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); + bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); @@ -495,14 +414,12 @@ static int brz_gen_graphs(cmph_config_t *mph) } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); free(keys_vd); free(buffer_merge); free(buffer_h3); fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; -#pragma pack() } static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) @@ -541,7 +458,7 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); @@ -549,13 +466,11 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { - brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); - //brz->size[index] = bmzf->n; - //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -675,11 +590,13 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) cmph_uint32 n = ceil(brz->c * m); cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; + mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); - return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); + return (mphf_bucket + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index f6af310..adee286 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory }; diff --git a/src/cmph.c b/src/cmph.c index 8f86f4e..30bee18 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -173,10 +173,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz_config_new(); break; case CMPH_BMZ8: - mph->data = (void*)bmz8_config_new(); + mph->data = bmz8_config_new(); break; case CMPH_BRZ: mph->data = brz_config_new(); + break; default: assert(0); } @@ -219,6 +220,7 @@ void cmph_config_destroy(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); + break; default: assert(0); } From d2aeaae27cef9c50a34c9e6ac86b3ab706b384db Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:11:37 +0000 Subject: [PATCH 175/739] Stable version of BRZ algorithm --- INSTALL | 52 ++++++----- examples/.deps/file_adapter_ex2.Po | 8 +- examples/.deps/vector_adapter_ex1.Po | 8 +- examples/Makefile | 48 +++++----- examples/Makefile.in | 2 +- src/bmz.c | 9 +- src/bmz8.c | 11 ++- src/brz.c | 131 +++++---------------------- src/brz_structs.h | 1 + src/cmph.c | 4 +- 10 files changed, 95 insertions(+), 179 deletions(-) diff --git a/INSTALL b/INSTALL index 54caf7c..095b1eb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,13 +1,16 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. +Installation Instructions +************************* - This file is free documentation; the Free Software Foundation gives +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -67,9 +70,9 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -82,7 +85,7 @@ is an example: Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -99,19 +102,19 @@ for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== - Variables not defined in a site shell script can be set in the +Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -192,8 +195,7 @@ overridden in the site shell script). `configure' Invocation ====================== - `configure' recognizes the following options to control how it -operates. +`configure' recognizes the following options to control how it operates. `--help' `-h' diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po index 5aa5200..00af2d2 100644 --- a/examples/.deps/file_adapter_ex2.Po +++ b/examples/.deps/file_adapter_ex2.Po @@ -1,7 +1,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po index 73271e2..2c757d1 100644 --- a/examples/.deps/vector_adapter_ex1.Po +++ b/examples/.deps/vector_adapter_ex1.Po @@ -1,7 +1,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/Makefile b/examples/Makefile index 04bee77..2f4b1f5 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -36,8 +36,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i686-suse-linux -host_triplet = i686-suse-linux +build_triplet = i686-pc-linux-gnu +host_triplet = i686-pc-linux-gnu noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ file_adapter_ex2$(EXEEXT) subdir = examples @@ -74,14 +74,14 @@ DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run aclocal-1.9 +ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run aclocal-1.9 AMDEP_FALSE = # AMDEP_TRUE = -AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run tar +AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run tar AR = ar -AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoconf -AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run autoheader -AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run automake-1.9 +AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoconf +AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoheader +AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run automake-1.9 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 @@ -89,9 +89,9 @@ CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 CPP = gcc -E CPPFLAGS = CXX = g++ -CXXCPP = /lib/cpp -CXXDEPMODE = depmode=none -CXXFLAGS = +CXXCPP = g++ -E +CXXDEPMODE = depmode=gcc3 +CXXFLAGS = -g -O2 CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps @@ -101,8 +101,8 @@ ECHO_N = -n ECHO_T = EGREP = grep -E EXEEXT = -F77 = -FFLAGS = +F77 = g77 +FFLAGS = -g -O2 GETCONF = getconf INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} @@ -114,7 +114,7 @@ LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/cmph/missing --run makeinfo +MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run makeinfo OBJEXT = o PACKAGE = cmph PACKAGE_BUGREPORT = @@ -131,35 +131,35 @@ VERSION = 0.3 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ -ac_ct_F77 = +ac_ct_F77 = g77 ac_ct_GETCONF = getconf ac_ct_RANLIB = ranlib ac_ct_STRIP = strip am__fastdepCC_FALSE = # am__fastdepCC_TRUE = -am__fastdepCXX_FALSE = -am__fastdepCXX_TRUE = # +am__fastdepCXX_FALSE = # +am__fastdepCXX_TRUE = am__include = include am__leading_dot = . am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i686-suse-linux +build = i686-pc-linux-gnu build_alias = build_cpu = i686 -build_os = linux -build_vendor = suse +build_os = linux-gnu +build_vendor = pc datadir = ${prefix}/share exec_prefix = ${prefix} -host = i686-suse-linux +host = i686-pc-linux-gnu host_alias = host_cpu = i686 -host_os = linux -host_vendor = suse +host_os = linux-gnu +host_vendor = pc includedir = ${prefix}/include infodir = ${prefix}/info -install_sh = /home/fbotelho/doutorado/algoritmos/cmph/cmph/install-sh +install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localstatedir = ${prefix}/var diff --git a/examples/Makefile.in b/examples/Makefile.in index 2cf84b1..639e5c6 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, diff --git a/src/bmz.c b/src/bmz.c index 7a3d069..f3efc96 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -15,13 +15,6 @@ //#define DEBUG #include "debug.h" -//static cmph_uint32 UNDEFINED = UINT_MAX; - -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - static int bmz_gen_edges(cmph_config_t *mph); static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); @@ -535,7 +528,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return (bmz->g[h1] + bmz->g[h2]); + return bmz->g[h1] + bmz->g[h2]; } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c index 65de52f..5b5c275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -87,7 +87,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) { // Mapping step cmph_uint8 biggest_g_value = 0; - cmph_uint8 biggest_edge_value = 1; + cmph_uint8 biggest_edge_value = 1; iterations = 100; if (mph->verbosity) { @@ -100,7 +100,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); DEBUGP("hash function 2\n"); bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz8_gen_edges(mph); if (!ok) { @@ -120,7 +120,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(bmz8->graph); + graph_destroy(bmz8->graph); return NULL; } @@ -375,9 +375,10 @@ static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmp while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + //if (bmz8->g[neighbor] >= bmz8->m) bmz8->g[neighbor] += bmz8->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); @@ -437,7 +438,7 @@ static int bmz8_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); diff --git a/src/brz.c b/src/brz.c index 3e15711..195195d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "bmz.h" -#include "bmz_structs.h" +#include "bmz8.h" +#include "bmz8_structs.h" #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" @@ -22,7 +22,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -37,6 +37,7 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); @@ -64,6 +65,12 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->memory_availability = memory_availability*1024*1024; +} + void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -84,73 +91,6 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } } -// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); -// source->rewind(source->data); -// memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// h = cmph_search(mphf, buf, buflen); -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// } -// fprintf(stderr, "\n===============================================================================\n"); -// free(hashtable); -// return 1; -// } -// -// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); -// source->rewind(source->data); -// //memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h1_v; -// cmph_uint32 h2_v; -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// -// h1_v = hash(h1, buf, buflen) % n; -// -// h2_v = hash(h2, buf, buflen) % n; -// -// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; -// -// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; -// -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// -// } -// free(hashtable); -// return 1; -// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -244,13 +184,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_graphs(cmph_config_t *mph) { -#pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; - cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; @@ -276,7 +215,7 @@ static int brz_gen_graphs(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > memory_availability) // flush buffers + if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -305,7 +244,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -323,11 +261,10 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == MAX_BUCKET_SIZE) + if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) { free(buffer); free(buckets_size); @@ -367,8 +304,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -401,8 +336,6 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); @@ -420,7 +353,6 @@ static int brz_gen_graphs(cmph_config_t *mph) e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; - //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); @@ -436,56 +368,43 @@ static int brz_gen_graphs(cmph_config_t *mph) if (h3 != buffer_h3[i]) break; keys_vd[nkeys_vd++] = key; - - //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); - //fwrite(key, 1, keylen + 1, graphs_fd); e++; - //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } } -/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - //free(buffer_merge[i]); buffer_merge[i] = NULL; } - if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. { cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz_data_t * bmzf = NULL; + bmz8_data_t * bmzf = NULL; // Source of keys - //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); + bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); @@ -495,14 +414,12 @@ static int brz_gen_graphs(cmph_config_t *mph) } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); free(keys_vd); free(buffer_merge); free(buffer_h3); fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; -#pragma pack() } static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) @@ -541,7 +458,7 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); @@ -549,13 +466,11 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { - brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); - //brz->size[index] = bmzf->n; - //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -675,11 +590,13 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) cmph_uint32 n = ceil(brz->c * m); cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; + mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); - return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); + return (mphf_bucket + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index f6af310..adee286 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory }; diff --git a/src/cmph.c b/src/cmph.c index 8f86f4e..30bee18 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -173,10 +173,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz_config_new(); break; case CMPH_BMZ8: - mph->data = (void*)bmz8_config_new(); + mph->data = bmz8_config_new(); break; case CMPH_BRZ: mph->data = brz_config_new(); + break; default: assert(0); } @@ -219,6 +220,7 @@ void cmph_config_destroy(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); + break; default: assert(0); } From 209986c6a54c3355b7712114b309767bcf18ecca Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:11:37 +0000 Subject: [PATCH 176/739] Stable version of BRZ algorithm --- INSTALL | 52 ++++++----- examples/.deps/file_adapter_ex2.Po | 8 +- examples/.deps/vector_adapter_ex1.Po | 8 +- src/bmz.c | 9 +- src/bmz8.c | 11 ++- src/brz.c | 131 +++++---------------------- src/brz_structs.h | 1 + src/cmph.c | 4 +- 8 files changed, 70 insertions(+), 154 deletions(-) diff --git a/INSTALL b/INSTALL index 54caf7c..095b1eb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,13 +1,16 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. +Installation Instructions +************************* - This file is free documentation; the Free Software Foundation gives +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -67,9 +70,9 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -82,7 +85,7 @@ is an example: Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -99,19 +102,19 @@ for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== - Variables not defined in a site shell script can be set in the +Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -192,8 +195,7 @@ overridden in the site shell script). `configure' Invocation ====================== - `configure' recognizes the following options to control how it -operates. +`configure' recognizes the following options to control how it operates. `--help' `-h' diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po index 5aa5200..00af2d2 100644 --- a/examples/.deps/file_adapter_ex2.Po +++ b/examples/.deps/file_adapter_ex2.Po @@ -1,7 +1,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po index 73271e2..2c757d1 100644 --- a/examples/.deps/vector_adapter_ex1.Po +++ b/examples/.deps/vector_adapter_ex1.Po @@ -1,7 +1,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ + /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gnu/stubs.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gconv.h: -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: +/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/src/bmz.c b/src/bmz.c index 7a3d069..f3efc96 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -15,13 +15,6 @@ //#define DEBUG #include "debug.h" -//static cmph_uint32 UNDEFINED = UINT_MAX; - -/* static const char bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ -/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ -/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ -/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ - static int bmz_gen_edges(cmph_config_t *mph); static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); @@ -535,7 +528,7 @@ cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); if (h1 == h2 && ++h2 > bmz->n) h2 = 0; DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); - return (bmz->g[h1] + bmz->g[h2]); + return bmz->g[h1] + bmz->g[h2]; } void bmz_destroy(cmph_t *mphf) { diff --git a/src/bmz8.c b/src/bmz8.c index 65de52f..5b5c275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -87,7 +87,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) { // Mapping step cmph_uint8 biggest_g_value = 0; - cmph_uint8 biggest_edge_value = 1; + cmph_uint8 biggest_edge_value = 1; iterations = 100; if (mph->verbosity) { @@ -100,7 +100,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); DEBUGP("hash function 2\n"); bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz8_gen_edges(mph); if (!ok) { @@ -120,7 +120,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(bmz8->graph); + graph_destroy(bmz8->graph); return NULL; } @@ -375,9 +375,10 @@ static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmp while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); bmz8->g[neighbor] = *unused_edge_index - bmz8->g[v]; + //if (bmz8->g[neighbor] >= bmz8->m) bmz8->g[neighbor] += bmz8->m; SETBIT(visited, neighbor); (*unused_edge_index)++; bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); @@ -437,7 +438,7 @@ static int bmz8_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); diff --git a/src/brz.c b/src/brz.c index 3e15711..195195d 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "bmz.h" -#include "bmz_structs.h" +#include "bmz8.h" +#include "bmz8_structs.h" #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" @@ -22,7 +22,7 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); brz_config_data_t *brz_config_new() { @@ -37,6 +37,7 @@ brz_config_data_t *brz_config_new() brz->h1 = NULL; brz->h2 = NULL; brz->h3 = NULL; + brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); strcpy(brz->tmp_dir, "/var/tmp/\0"); assert(brz); @@ -64,6 +65,12 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->memory_availability = memory_availability*1024*1024; +} + void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -84,73 +91,6 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } } -// static cmph_uint8 brz_verify_mphf(cmph_t * mphf, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); -// source->rewind(source->data); -// memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// h = cmph_search(mphf, buf, buflen); -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// } -// fprintf(stderr, "\n===============================================================================\n"); -// free(hashtable); -// return 1; -// } -// -// static cmph_uint8 brz_verify_mphf1(hash_state_t *h1, hash_state_t *h2, cmph_uint8 * g, cmph_uint32 n, cmph_io_adapter_t *source) -// { -// cmph_uint8 * hashtable = NULL; -// cmph_uint32 i; -// hashtable = (cmph_uint8*)calloc(source->nkeys, sizeof(cmph_uint8)); -// source->rewind(source->data); -// //memset(hashtable, 0, source->nkeys); -// //check all keys -// for (i = 0; i < source->nkeys; ++i) -// { -// cmph_uint32 h1_v; -// cmph_uint32 h2_v; -// cmph_uint32 h; -// char *buf; -// cmph_uint32 buflen = 0; -// source->read(source->data, &buf, &buflen); -// -// h1_v = hash(h1, buf, buflen) % n; -// -// h2_v = hash(h2, buf, buflen) % n; -// -// if (h1_v == h2_v && ++h2_v >= n) h2_v = 0; -// -// h = ((cmph_uint32)g[h1_v] + (cmph_uint32)g[h2_v]) % source->nkeys; -// -// if(hashtable[h]) -// { -// fprintf(stderr, "collision: %u\n",h); -// return 0; -// } -// //assert(hashtable[h]==0); -// hashtable[h] = 1; -// source->dispose(source->data, buf, buflen); -// -// } -// free(hashtable); -// return 1; -// } cmph_t *brz_new(cmph_config_t *mph, float c) { @@ -244,13 +184,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_graphs(cmph_config_t *mph) { -#pragma pack(1) cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - cmph_uint32 memory_availability = 209715200;//200MB //104857600;//100MB //524288000; // 500MB //209715200; // 200 MB + //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; - cmph_uint8 *buffer = (cmph_uint8 *)malloc(memory_availability); + cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; @@ -276,7 +215,7 @@ static int brz_gen_graphs(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > memory_availability) // flush buffers + if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -305,7 +244,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -323,11 +261,10 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - //fprintf(stderr, "Storing read Key\n"); memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; h3 = hash(brz->h3, key, keylen) % brz->k; - if (brz->size[h3] == MAX_BUCKET_SIZE) + if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) { free(buffer); free(buckets_size); @@ -367,8 +304,6 @@ static int brz_gen_graphs(cmph_config_t *mph) buckets_size[h3]++; memory_usage = memory_usage + keylen1 + 1; } -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",nflushes); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",nflushes); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); @@ -401,8 +336,6 @@ static int brz_gen_graphs(cmph_config_t *mph) for(i = 0; i < nflushes; i++) { -// sprintf(filename, "/mnt/hd4/fbotelho/%u.cmph",i); -// sprintf(filename, "/mnt/sd2/fbotelho/dados/%u.cmph",i); filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); tmp_fds[i] = fopen(filename, "rb"); @@ -420,7 +353,6 @@ static int brz_gen_graphs(cmph_config_t *mph) e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; - //buffer = (cmph_uint8 *)malloc(memory_availability); while(e < brz->m) { i = brz_min_index(buffer_h3, nflushes); @@ -436,56 +368,43 @@ static int brz_gen_graphs(cmph_config_t *mph) if (h3 != buffer_h3[i]) break; keys_vd[nkeys_vd++] = key; - - //save_in_disk(buffer, key, keylen, &memory_usage, memory_availability, graphs_fd); - //fwrite(key, 1, keylen + 1, graphs_fd); e++; - //free(key); key = brz_read_key(tmp_fds[i]); } if (key) { - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = h3; - //free(buffer_merge[i]); buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } } -/* fprintf(stderr, "BOSTA %u %u e: %u\n", i, buffer_h3[i], e);*/ if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); keys_vd[nkeys_vd++] = buffer_merge[i]; - //save_in_disk(buffer, buffer_merge[i], strlen(buffer_merge[i]), &memory_usage, memory_availability, graphs_fd); - //fwrite(buffer_merge[i], 1, strlen(buffer_merge[i]) + 1, graphs_fd); e++; buffer_h3[i] = UINT_MAX; - //free(buffer_merge[i]); buffer_merge[i] = NULL; } - if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf. + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. { cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz_data_t * bmzf = NULL; + bmz8_data_t * bmzf = NULL; // Source of keys - //fprintf(stderr, "Generating mphf %u in %u \n",cur_bucket + 1, brz->k); if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); + cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz_data_t *)mphf_tmp->data; - //assert(brz_verify_mphf(mphf_tmp, source)); + bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); @@ -495,14 +414,12 @@ static int brz_gen_graphs(cmph_config_t *mph) } } for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - //flush_buffer(buffer, &memory_usage, graphs_fd); free(tmp_fds); free(keys_vd); free(buffer_merge); free(buffer_h3); fprintf(stderr, "Maximal Size: %u\n", max_size); return 1; -#pragma pack() } static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) @@ -541,7 +458,7 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); @@ -549,13 +466,11 @@ static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz_data_t * bmzf, cmp brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { - brz->g[index][i] = (cmph_uint8) bmzf->g[i]; + brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); } brz->h1[index] = hash_state_copy(bmzf->hashes[0]); brz->h2[index] = hash_state_copy(bmzf->hashes[1]); - //brz->size[index] = bmzf->n; - //assert(brz_verify_mphf1(brz->h1[index], brz->h2[index], brz->g[index], n, source)); } int brz_dump(cmph_t *mphf, FILE *fd) @@ -675,11 +590,13 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) cmph_uint32 n = ceil(brz->c * m); cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; + mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3])); - return (((cmph_uint32)brz->g[h3][h1] + (cmph_uint32)brz->g[h3][h2])% m + brz->offset[h3]); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); + return (mphf_bucket + brz->offset[h3]); } void brz_destroy(cmph_t *mphf) { diff --git a/src/brz_structs.h b/src/brz_structs.h index f6af310..adee286 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -28,6 +28,7 @@ struct __brz_config_data_t hash_state_t **h1; hash_state_t **h2; hash_state_t * h3; + cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory }; diff --git a/src/cmph.c b/src/cmph.c index 8f86f4e..30bee18 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -173,10 +173,11 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz_config_new(); break; case CMPH_BMZ8: - mph->data = (void*)bmz8_config_new(); + mph->data = bmz8_config_new(); break; case CMPH_BRZ: mph->data = brz_config_new(); + break; default: assert(0); } @@ -219,6 +220,7 @@ void cmph_config_destroy(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); + break; default: assert(0); } From a5b68f040aaeba182a50ea11a52da0d7cb8694ce Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:37:35 +0000 Subject: [PATCH 177/739] Stable version of BRZ algorithm with option -M (memory_availability) --- src/brz.c | 2 +- src/brz.h | 1 + src/cmph.c | 19 +++++++++++++++++++ src/cmph.h | 1 + src/main.c | 20 ++++++++++++++++---- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/brz.c b/src/brz.c index 195195d..91df769 100755 --- a/src/brz.c +++ b/src/brz.c @@ -68,7 +68,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->memory_availability = memory_availability*1024*1024; + if(memory_availability > 0) brz->memory_availability = memory_availability*1024*1024; } void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) diff --git a/src/brz.h b/src/brz.h index 886eab2..e1c932e 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 30bee18..9f0b464 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -204,6 +204,25 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_memory_availability(mph, memory_availability); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index c301a91..88ed317 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -36,6 +36,7 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index 6416359..5694108 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -65,10 +66,10 @@ int main(int argc, char **argv) cmph_t *mphf = NULL; cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; - + cmph_uint32 memory_availability = 0; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -111,6 +112,16 @@ int main(int argc, char **argv) case 'd': tmp_dir = strdup(optarg); break; + case 'M': + { + char *cptr; + memory_availability = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid memory availability %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -202,6 +213,7 @@ int main(int argc, char **argv) if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_memory_availability(config, memory_availability); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); From 0c25b2d6f536faf7680c59cb29bcd081b0f5837a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:37:35 +0000 Subject: [PATCH 178/739] Stable version of BRZ algorithm with option -M (memory_availability) --- src/brz.c | 2 +- src/brz.h | 1 + src/cmph.c | 19 +++++++++++++++++++ src/cmph.h | 1 + src/main.c | 20 ++++++++++++++++---- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/brz.c b/src/brz.c index 195195d..91df769 100755 --- a/src/brz.c +++ b/src/brz.c @@ -68,7 +68,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->memory_availability = memory_availability*1024*1024; + if(memory_availability > 0) brz->memory_availability = memory_availability*1024*1024; } void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) diff --git a/src/brz.h b/src/brz.h index 886eab2..e1c932e 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 30bee18..9f0b464 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -204,6 +204,25 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_memory_availability(mph, memory_availability); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index c301a91..88ed317 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -36,6 +36,7 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index 6416359..5694108 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -65,10 +66,10 @@ int main(int argc, char **argv) cmph_t *mphf = NULL; cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; - + cmph_uint32 memory_availability = 0; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -111,6 +112,16 @@ int main(int argc, char **argv) case 'd': tmp_dir = strdup(optarg); break; + case 'M': + { + char *cptr; + memory_availability = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid memory availability %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -202,6 +213,7 @@ int main(int argc, char **argv) if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_memory_availability(config, memory_availability); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); From c9b937fcbb27d59d43e81870e8d1e3f6c3797950 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:37:35 +0000 Subject: [PATCH 179/739] Stable version of BRZ algorithm with option -M (memory_availability) --- src/brz.c | 2 +- src/brz.h | 1 + src/cmph.c | 19 +++++++++++++++++++ src/cmph.h | 1 + src/main.c | 20 ++++++++++++++++---- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/brz.c b/src/brz.c index 195195d..91df769 100755 --- a/src/brz.c +++ b/src/brz.c @@ -68,7 +68,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->memory_availability = memory_availability*1024*1024; + if(memory_availability > 0) brz->memory_availability = memory_availability*1024*1024; } void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) diff --git a/src/brz.h b/src/brz.h index 886eab2..e1c932e 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 30bee18..9f0b464 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -204,6 +204,25 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_memory_availability(mph, memory_availability); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index c301a91..88ed317 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -36,6 +36,7 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index 6416359..5694108 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -65,10 +66,10 @@ int main(int argc, char **argv) cmph_t *mphf = NULL; cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; - + cmph_uint32 memory_availability = 0; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -111,6 +112,16 @@ int main(int argc, char **argv) case 'd': tmp_dir = strdup(optarg); break; + case 'M': + { + char *cptr; + memory_availability = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid memory availability %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -202,6 +213,7 @@ int main(int argc, char **argv) if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_memory_availability(config, memory_availability); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); From 9c5dd49f61962e1364c3b5b0119b3394ce729ec7 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 6 Sep 2005 14:37:35 +0000 Subject: [PATCH 180/739] Stable version of BRZ algorithm with option -M (memory_availability) --- src/brz.c | 2 +- src/brz.h | 1 + src/cmph.c | 19 +++++++++++++++++++ src/cmph.h | 1 + src/main.c | 20 ++++++++++++++++---- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/brz.c b/src/brz.c index 195195d..91df769 100755 --- a/src/brz.c +++ b/src/brz.c @@ -68,7 +68,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { brz_config_data_t *brz = (brz_config_data_t *)mph->data; - brz->memory_availability = memory_availability*1024*1024; + if(memory_availability > 0) brz->memory_availability = memory_availability*1024*1024; } void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) diff --git a/src/brz.h b/src/brz.h index 886eab2..e1c932e 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,7 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 30bee18..9f0b464 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -204,6 +204,25 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) } +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_memory_availability(mph, memory_availability); + break; + default: + assert(0); + } + +} + void cmph_config_destroy(cmph_config_t *mph) { DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); diff --git a/src/cmph.h b/src/cmph.h index c301a91..88ed317 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -36,6 +36,7 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); /** Hash API **/ diff --git a/src/main.c b/src/main.c index 6416359..5694108 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -41,6 +41,7 @@ void usage_long(const char *prg) fprintf(stderr, " -g\t generation mode\n"); fprintf(stderr, " -s\t random seed\n"); fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } @@ -65,10 +66,10 @@ int main(int argc, char **argv) cmph_t *mphf = NULL; cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; - + cmph_uint32 memory_availability = 0; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -111,6 +112,16 @@ int main(int argc, char **argv) case 'd': tmp_dir = strdup(optarg); break; + case 'M': + { + char *cptr; + memory_availability = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid memory availability %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -202,6 +213,7 @@ int main(int argc, char **argv) if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_memory_availability(config, memory_availability); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); From 109853d82cc9f3e791c4d639920e8a5fd338da09 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 12 Sep 2005 21:58:41 +0000 Subject: [PATCH 181/739] LGPL license included in the file COPYING --- COPYING | 646 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 405 insertions(+), 241 deletions(-) diff --git a/COPYING b/COPYING index 60549be..8add30a 100644 --- a/COPYING +++ b/COPYING @@ -1,221 +1,397 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. - 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 -this service 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. + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. The precise terms and conditions for copying, distribution and -modification follow. +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. - GNU GENERAL PUBLIC LICENSE + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". -Activities other than copying, distribution and modification are not + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) You must cause the modified files to carry prominent notices + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, +identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of +on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. +entire whole, and thus to each and every part regardless of who wrote +it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Program. +collective works based on the Library. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. - 5. You are not required to accept this License, since you have not + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are +distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. +the Library or works based on it. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to +You are not responsible for enforcing compliance by third parties with this License. - - 7. If, as a consequence of a court judgment or allegation of patent + + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is +integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -225,116 +401,104 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in + + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. NO WARRANTY - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Libraries - 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. + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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) 19yy + + 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 2 of the License, or - (at your option) any later version. + This library 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 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if +school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. - , 1 April 1989 + , 1 April 1990 Ty Coon, President of Vice -This 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 Library General -Public License instead of this License. +That's all there is to it! + + From 7a64ad46b24544cf28a1362d30ebc024d6d5ab33 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 12 Sep 2005 21:58:41 +0000 Subject: [PATCH 182/739] LGPL license included in the file COPYING --- COPYING | 646 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 405 insertions(+), 241 deletions(-) diff --git a/COPYING b/COPYING index 60549be..8add30a 100644 --- a/COPYING +++ b/COPYING @@ -1,221 +1,397 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. - 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 -this service 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. + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. The precise terms and conditions for copying, distribution and -modification follow. +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. - GNU GENERAL PUBLIC LICENSE + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". -Activities other than copying, distribution and modification are not + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) You must cause the modified files to carry prominent notices + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, +identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of +on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. +entire whole, and thus to each and every part regardless of who wrote +it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Program. +collective works based on the Library. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. - 5. You are not required to accept this License, since you have not + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are +distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. +the Library or works based on it. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to +You are not responsible for enforcing compliance by third parties with this License. - - 7. If, as a consequence of a court judgment or allegation of patent + + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is +integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -225,116 +401,104 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in + + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. NO WARRANTY - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Libraries - 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. + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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) 19yy + + 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 2 of the License, or - (at your option) any later version. + This library 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 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if +school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. - , 1 April 1989 + , 1 April 1990 Ty Coon, President of Vice -This 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 Library General -Public License instead of this License. +That's all there is to it! + + From b78fa918796da0104012ed21f694a65ab22e1ad5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 12 Sep 2005 21:58:41 +0000 Subject: [PATCH 183/739] LGPL license included in the file COPYING --- COPYING | 646 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 405 insertions(+), 241 deletions(-) diff --git a/COPYING b/COPYING index 60549be..8add30a 100644 --- a/COPYING +++ b/COPYING @@ -1,221 +1,397 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. - 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 -this service 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. + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. The precise terms and conditions for copying, distribution and -modification follow. +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. - GNU GENERAL PUBLIC LICENSE + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". -Activities other than copying, distribution and modification are not + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) You must cause the modified files to carry prominent notices + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, +identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of +on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. +entire whole, and thus to each and every part regardless of who wrote +it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Program. +collective works based on the Library. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. - 5. You are not required to accept this License, since you have not + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are +distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. +the Library or works based on it. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to +You are not responsible for enforcing compliance by third parties with this License. - - 7. If, as a consequence of a court judgment or allegation of patent + + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is +integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -225,116 +401,104 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in + + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. NO WARRANTY - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Libraries - 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. + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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) 19yy + + 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 2 of the License, or - (at your option) any later version. + This library 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 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if +school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. - , 1 April 1989 + , 1 April 1990 Ty Coon, President of Vice -This 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 Library General -Public License instead of this License. +That's all there is to it! + + From cff94651c4a5f97eb1fec12d5020992388e7fe12 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 12 Sep 2005 21:58:41 +0000 Subject: [PATCH 184/739] LGPL license included in the file COPYING --- COPYING | 646 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 405 insertions(+), 241 deletions(-) diff --git a/COPYING b/COPYING index 60549be..8add30a 100644 --- a/COPYING +++ b/COPYING @@ -1,221 +1,397 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. - 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 -this service 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. + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. The precise terms and conditions for copying, distribution and -modification follow. +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. - GNU GENERAL PUBLIC LICENSE + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". -Activities other than copying, distribution and modification are not + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) You must cause the modified files to carry prominent notices + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, +identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of +on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. +entire whole, and thus to each and every part regardless of who wrote +it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Program. +collective works based on the Library. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. - 5. You are not required to accept this License, since you have not + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are +distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. +the Library or works based on it. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to +You are not responsible for enforcing compliance by third parties with this License. - - 7. If, as a consequence of a court judgment or allegation of patent + + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is +integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -225,116 +401,104 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in + + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. NO WARRANTY - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Libraries - 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. + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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) 19yy + + 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 2 of the License, or - (at your option) any later version. + This library 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 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if +school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. - , 1 April 1989 + , 1 April 1990 Ty Coon, President of Vice -This 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 Library General -Public License instead of this License. +That's all there is to it! + + From c9cddd13189cdce2582b68738e529637e36289dd Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 02:53:07 +0000 Subject: [PATCH 185/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- configure.ac | 2 +- examples/Makefile | 26 +++++++++++++------------- examples/Makefile.in | 2 +- src/Makefile.am | 4 ++-- src/cmph.c | 32 +++++++++++++++++--------------- src/main.c | 4 ++-- 6 files changed, 36 insertions(+), 34 deletions(-) diff --git a/configure.ac b/configure.ac index f3b0bb1..31aa872 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.3) +AM_INIT_AUTOMAKE(cmph, 0.4) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/examples/Makefile b/examples/Makefile index 2f4b1f5..b4449b0 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. # examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -36,8 +36,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i686-pc-linux-gnu -host_triplet = i686-pc-linux-gnu +build_triplet = i686-suse-linux +host_triplet = i686-suse-linux noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ file_adapter_ex2$(EXEEXT) subdir = examples @@ -101,8 +101,8 @@ ECHO_N = -n ECHO_T = EGREP = grep -E EXEEXT = -F77 = g77 -FFLAGS = -g -O2 +F77 = +FFLAGS = GETCONF = getconf INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} @@ -127,11 +127,11 @@ RANLIB = ranlib SET_MAKE = SHELL = /bin/sh STRIP = strip -VERSION = 0.3 +VERSION = 0.4 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ -ac_ct_F77 = g77 +ac_ct_F77 = ac_ct_GETCONF = getconf ac_ct_RANLIB = ranlib ac_ct_STRIP = strip @@ -145,18 +145,18 @@ am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i686-pc-linux-gnu +build = i686-suse-linux build_alias = build_cpu = i686 -build_os = linux-gnu -build_vendor = pc +build_os = linux +build_vendor = suse datadir = ${prefix}/share exec_prefix = ${prefix} -host = i686-pc-linux-gnu +host = i686-suse-linux host_alias = host_cpu = i686 -host_os = linux-gnu -host_vendor = pc +host_os = linux +host_vendor = suse includedir = ${prefix}/include infodir = ${prefix}/info install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh diff --git a/examples/Makefile.in b/examples/Makefile.in index 639e5c6..2cf84b1 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..4c01bc2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c\ - brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c +# brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/cmph.c b/src/cmph.c index 9f0b464..7b73341 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,7 +3,7 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -#include "brz.h" /* included -- Fabiano */ +//#include "brz.h" /* included -- Fabiano */ #include #include @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: - mph->data = brz_config_new(); +// mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); +// brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); +// brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_hashfuncs(mph, hashfuncs); +// brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Creating brz hash\n"); +/* DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c); + mphf = brz_new(mph, c);*/ break; default: assert(0); @@ -323,7 +323,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - return brz_dump(mphf, f); + break; +/* return brz_dump(mphf, f);*/ default: assert(0); } @@ -352,8 +353,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf); +/* DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf);*/ break; default: assert(0); @@ -377,8 +378,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen); + break; +/* DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen);*/ default: assert(0); } @@ -405,7 +407,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ - brz_destroy(mphf); +/* brz_destroy(mphf);*/ return; default: assert(0); diff --git a/src/main.c b/src/main.c index 5694108..701b997 100644 --- a/src/main.c +++ b/src/main.c @@ -143,9 +143,9 @@ int main(int argc, char **argv) break; } } - if (!valid) + if (!valid || mph_algo == CMPH_BRZ) { - fprintf(stderr, "Invalid mph algorithm: %s\n", optarg); + fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; } } From cfbe58352025747d35d286ee44479ac65bc24586 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 02:53:07 +0000 Subject: [PATCH 186/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- configure.ac | 2 +- src/Makefile.am | 4 ++-- src/cmph.c | 32 +++++++++++++++++--------------- src/main.c | 4 ++-- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/configure.ac b/configure.ac index f3b0bb1..31aa872 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.3) +AM_INIT_AUTOMAKE(cmph, 0.4) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..4c01bc2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c\ - brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c +# brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/cmph.c b/src/cmph.c index 9f0b464..7b73341 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,7 +3,7 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -#include "brz.h" /* included -- Fabiano */ +//#include "brz.h" /* included -- Fabiano */ #include #include @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: - mph->data = brz_config_new(); +// mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); +// brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); +// brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_hashfuncs(mph, hashfuncs); +// brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Creating brz hash\n"); +/* DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c); + mphf = brz_new(mph, c);*/ break; default: assert(0); @@ -323,7 +323,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - return brz_dump(mphf, f); + break; +/* return brz_dump(mphf, f);*/ default: assert(0); } @@ -352,8 +353,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf); +/* DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf);*/ break; default: assert(0); @@ -377,8 +378,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen); + break; +/* DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen);*/ default: assert(0); } @@ -405,7 +407,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ - brz_destroy(mphf); +/* brz_destroy(mphf);*/ return; default: assert(0); diff --git a/src/main.c b/src/main.c index 5694108..701b997 100644 --- a/src/main.c +++ b/src/main.c @@ -143,9 +143,9 @@ int main(int argc, char **argv) break; } } - if (!valid) + if (!valid || mph_algo == CMPH_BRZ) { - fprintf(stderr, "Invalid mph algorithm: %s\n", optarg); + fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; } } From 23035177037b6f58d3936a735bd6bc08ddaa99ab Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 02:53:07 +0000 Subject: [PATCH 187/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- INSTALL | 52 +++++++++++++--------------- configure.ac | 2 +- examples/.deps/file_adapter_ex2.Po | 8 ++--- examples/.deps/vector_adapter_ex1.Po | 8 ++--- examples/Makefile | 26 +++++++------- examples/Makefile.in | 2 +- src/Makefile.am | 4 +-- src/cmph.c | 32 +++++++++-------- src/main.c | 4 +-- 9 files changed, 69 insertions(+), 69 deletions(-) diff --git a/INSTALL b/INSTALL index 095b1eb..54caf7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,16 +1,13 @@ -Installation Instructions -************************* +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives + This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -70,9 +67,9 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -85,7 +82,7 @@ is an example: Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -102,19 +99,19 @@ for another architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +122,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,11 +137,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -170,9 +167,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -181,7 +178,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== -Variables not defined in a site shell script can be set in the + Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -195,7 +192,8 @@ overridden in the site shell script). `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' diff --git a/configure.ac b/configure.ac index f3b0bb1..31aa872 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.3) +AM_INIT_AUTOMAKE(cmph, 0.4) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po index 00af2d2..5aa5200 100644 --- a/examples/.deps/file_adapter_ex2.Po +++ b/examples/.deps/file_adapter_ex2.Po @@ -1,7 +1,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po index 2c757d1..73271e2 100644 --- a/examples/.deps/vector_adapter_ex1.Po +++ b/examples/.deps/vector_adapter_ex1.Po @@ -1,7 +1,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gnu/stubs.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gconv.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/Makefile b/examples/Makefile index 2f4b1f5..b4449b0 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. # examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -36,8 +36,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i686-pc-linux-gnu -host_triplet = i686-pc-linux-gnu +build_triplet = i686-suse-linux +host_triplet = i686-suse-linux noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ file_adapter_ex2$(EXEEXT) subdir = examples @@ -101,8 +101,8 @@ ECHO_N = -n ECHO_T = EGREP = grep -E EXEEXT = -F77 = g77 -FFLAGS = -g -O2 +F77 = +FFLAGS = GETCONF = getconf INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} @@ -127,11 +127,11 @@ RANLIB = ranlib SET_MAKE = SHELL = /bin/sh STRIP = strip -VERSION = 0.3 +VERSION = 0.4 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ -ac_ct_F77 = g77 +ac_ct_F77 = ac_ct_GETCONF = getconf ac_ct_RANLIB = ranlib ac_ct_STRIP = strip @@ -145,18 +145,18 @@ am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i686-pc-linux-gnu +build = i686-suse-linux build_alias = build_cpu = i686 -build_os = linux-gnu -build_vendor = pc +build_os = linux +build_vendor = suse datadir = ${prefix}/share exec_prefix = ${prefix} -host = i686-pc-linux-gnu +host = i686-suse-linux host_alias = host_cpu = i686 -host_os = linux-gnu -host_vendor = pc +host_os = linux +host_vendor = suse includedir = ${prefix}/include infodir = ${prefix}/info install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh diff --git a/examples/Makefile.in b/examples/Makefile.in index 639e5c6..2cf84b1 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. +# Makefile.in generated by automake 1.9.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..4c01bc2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c\ - brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c +# brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/cmph.c b/src/cmph.c index 9f0b464..7b73341 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,7 +3,7 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -#include "brz.h" /* included -- Fabiano */ +//#include "brz.h" /* included -- Fabiano */ #include #include @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: - mph->data = brz_config_new(); +// mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); +// brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); +// brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_hashfuncs(mph, hashfuncs); +// brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Creating brz hash\n"); +/* DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c); + mphf = brz_new(mph, c);*/ break; default: assert(0); @@ -323,7 +323,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - return brz_dump(mphf, f); + break; +/* return brz_dump(mphf, f);*/ default: assert(0); } @@ -352,8 +353,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf); +/* DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf);*/ break; default: assert(0); @@ -377,8 +378,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen); + break; +/* DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen);*/ default: assert(0); } @@ -405,7 +407,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ - brz_destroy(mphf); +/* brz_destroy(mphf);*/ return; default: assert(0); diff --git a/src/main.c b/src/main.c index 5694108..701b997 100644 --- a/src/main.c +++ b/src/main.c @@ -143,9 +143,9 @@ int main(int argc, char **argv) break; } } - if (!valid) + if (!valid || mph_algo == CMPH_BRZ) { - fprintf(stderr, "Invalid mph algorithm: %s\n", optarg); + fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; } } From 92cf0ea484d87a271ed5e35e1b1ec030df2fa765 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 02:53:07 +0000 Subject: [PATCH 188/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- INSTALL | 52 +++++++++++++--------------- configure.ac | 2 +- examples/.deps/file_adapter_ex2.Po | 8 ++--- examples/.deps/vector_adapter_ex1.Po | 8 ++--- src/Makefile.am | 4 +-- src/cmph.c | 32 +++++++++-------- src/main.c | 4 +-- 7 files changed, 55 insertions(+), 55 deletions(-) diff --git a/INSTALL b/INSTALL index 095b1eb..54caf7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,16 +1,13 @@ -Installation Instructions -************************* +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives + This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -70,9 +67,9 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -85,7 +82,7 @@ is an example: Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -102,19 +99,19 @@ for another architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +122,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,11 +137,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -170,9 +167,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -181,7 +178,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== -Variables not defined in a site shell script can be set in the + Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -195,7 +192,8 @@ overridden in the site shell script). `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' diff --git a/configure.ac b/configure.ac index f3b0bb1..31aa872 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.3) +AM_INIT_AUTOMAKE(cmph, 0.4) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po index 00af2d2..5aa5200 100644 --- a/examples/.deps/file_adapter_ex2.Po +++ b/examples/.deps/file_adapter_ex2.Po @@ -1,7 +1,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gnu/stubs.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ /usr/include/gconv.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po index 2c757d1..73271e2 100644 --- a/examples/.deps/vector_adapter_ex1.Po +++ b/examples/.deps/vector_adapter_ex1.Po @@ -1,7 +1,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ /usr/include/sys/types.h /usr/include/bits/types.h \ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ @@ -11,7 +11,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \ + /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h ../src/cmph_types.h @@ -25,7 +25,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gnu/stubs.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: /usr/include/sys/types.h: @@ -69,7 +69,7 @@ vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ /usr/include/gconv.h: -/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h: +/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: /usr/include/bits/stdio_lim.h: diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..4c01bc2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c\ - brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c +# brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/cmph.c b/src/cmph.c index 9f0b464..7b73341 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,7 +3,7 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -#include "brz.h" /* included -- Fabiano */ +//#include "brz.h" /* included -- Fabiano */ #include #include @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: - mph->data = brz_config_new(); +// mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); +// brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); +// brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_destroy(mph); +// brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_hashfuncs(mph, hashfuncs); +// brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Creating brz hash\n"); +/* DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c); + mphf = brz_new(mph, c);*/ break; default: assert(0); @@ -323,7 +323,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - return brz_dump(mphf, f); + break; +/* return brz_dump(mphf, f);*/ default: assert(0); } @@ -352,8 +353,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf); +/* DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf);*/ break; default: assert(0); @@ -377,8 +378,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen); + break; +/* DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen);*/ default: assert(0); } @@ -405,7 +407,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ - brz_destroy(mphf); +/* brz_destroy(mphf);*/ return; default: assert(0); diff --git a/src/main.c b/src/main.c index 5694108..701b997 100644 --- a/src/main.c +++ b/src/main.c @@ -143,9 +143,9 @@ int main(int argc, char **argv) break; } } - if (!valid) + if (!valid || mph_algo == CMPH_BRZ) { - fprintf(stderr, "Invalid mph algorithm: %s\n", optarg); + fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; } } From 6722f0e80b76ed0eb39d8193fd4a38a2df1c6b1e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 04:10:16 +0000 Subject: [PATCH 189/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- README.t2t | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.t2t b/README.t2t index 231718d..d51e705 100644 --- a/README.t2t +++ b/README.t2t @@ -56,6 +56,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.4== + +- Vector Adapter has been added. +- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.3== From f462c1061101d399f86f63fecf5427ec40543870 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 04:10:16 +0000 Subject: [PATCH 190/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- README.t2t | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.t2t b/README.t2t index 231718d..d51e705 100644 --- a/README.t2t +++ b/README.t2t @@ -56,6 +56,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.4== + +- Vector Adapter has been added. +- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.3== From ee35a5237dce81d13341eed29cb62b8babb5c023 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 04:10:16 +0000 Subject: [PATCH 191/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- README | 12 +++++++++++- README.t2t | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/README b/README index 9e84f05..de2ffbe 100644 --- a/README +++ b/README @@ -52,6 +52,16 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas perfect hash functions in linear time. The resulting functions are order preserving and are stored in 4cn bytes, where c is greater than 2. +---------------------------------------- + + + News for version 0.4 + ==================== + +- Vector Adapter has been added. +- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. +- All reported bugs and suggestions have been corrected and included as well. + ---------------------------------------- @@ -210,7 +220,7 @@ Davi de Castro Reis (davi@users.sourceforge.net) Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) -Last Updated: Mon Jul 25 19:14:42 2005 +Last Updated: Fri Sep 16 00:47:45 2005 diff --git a/README.t2t b/README.t2t index 231718d..d51e705 100644 --- a/README.t2t +++ b/README.t2t @@ -56,6 +56,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.4== + +- Vector Adapter has been added. +- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.3== From 3871a24405b7d65c577ca5d604a4df22be70c227 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 16 Sep 2005 04:10:16 +0000 Subject: [PATCH 192/739] vesion 0.4. It was included the bmz8 algorithm to generate mphfs for small set of keys (at most 256 keys), the vector adpter and some bugs have been corrected. --- README | 12 +++++++++++- README.t2t | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/README b/README index 9e84f05..de2ffbe 100644 --- a/README +++ b/README @@ -52,6 +52,16 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas perfect hash functions in linear time. The resulting functions are order preserving and are stored in 4cn bytes, where c is greater than 2. +---------------------------------------- + + + News for version 0.4 + ==================== + +- Vector Adapter has been added. +- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. +- All reported bugs and suggestions have been corrected and included as well. + ---------------------------------------- @@ -210,7 +220,7 @@ Davi de Castro Reis (davi@users.sourceforge.net) Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) -Last Updated: Mon Jul 25 19:14:42 2005 +Last Updated: Fri Sep 16 00:47:45 2005 diff --git a/README.t2t b/README.t2t index 231718d..d51e705 100644 --- a/README.t2t +++ b/README.t2t @@ -56,6 +56,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.4== + +- Vector Adapter has been added. +- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.3== From bab5f9465ba901a513ade9d5619333125b8a443e Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 19:58:44 +0000 Subject: [PATCH 193/739] Removed useless files. From 009bd68bcd2cfe790b1158e84b2b55f21e242573 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 19:58:44 +0000 Subject: [PATCH 194/739] Removed useless files. From e1b7b7477644639ff7833402124f4356a1cbdb33 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 19:58:44 +0000 Subject: [PATCH 195/739] Removed useless files. --- examples/.deps/file_adapter_ex2.Po | 80 ---------------------------- examples/.deps/vector_adapter_ex1.Po | 80 ---------------------------- 2 files changed, 160 deletions(-) delete mode 100644 examples/.deps/file_adapter_ex2.Po delete mode 100644 examples/.deps/vector_adapter_ex1.Po diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po deleted file mode 100644 index 5aa5200..0000000 --- a/examples/.deps/file_adapter_ex2.Po +++ /dev/null @@ -1,80 +0,0 @@ -file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ - /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ - /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ - /usr/include/sys/types.h /usr/include/bits/types.h \ - /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ - /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ - /usr/include/sys/select.h /usr/include/bits/select.h \ - /usr/include/bits/sigset.h /usr/include/bits/time.h \ - /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ - /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ - /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ - /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ - /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ - /usr/include/bits/stdio.h ../src/cmph_types.h - -../src/cmph.h: - -/usr/include/stdlib.h: - -/usr/include/features.h: - -/usr/include/sys/cdefs.h: - -/usr/include/gnu/stubs.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: - -/usr/include/sys/types.h: - -/usr/include/bits/types.h: - -/usr/include/bits/wordsize.h: - -/usr/include/bits/typesizes.h: - -/usr/include/time.h: - -/usr/include/endian.h: - -/usr/include/bits/endian.h: - -/usr/include/sys/select.h: - -/usr/include/bits/select.h: - -/usr/include/bits/sigset.h: - -/usr/include/bits/time.h: - -/usr/include/sys/sysmacros.h: - -/usr/include/bits/pthreadtypes.h: - -/usr/include/bits/sched.h: - -/usr/include/alloca.h: - -/usr/include/stdio.h: - -/usr/include/libio.h: - -/usr/include/_G_config.h: - -/usr/include/wchar.h: - -/usr/include/bits/wchar.h: - -/usr/include/gconv.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: - -/usr/include/bits/stdio_lim.h: - -/usr/include/bits/sys_errlist.h: - -/usr/include/bits/stdio.h: - -../src/cmph_types.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po deleted file mode 100644 index 73271e2..0000000 --- a/examples/.deps/vector_adapter_ex1.Po +++ /dev/null @@ -1,80 +0,0 @@ -vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ - ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ - /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ - /usr/include/sys/types.h /usr/include/bits/types.h \ - /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ - /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ - /usr/include/sys/select.h /usr/include/bits/select.h \ - /usr/include/bits/sigset.h /usr/include/bits/time.h \ - /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ - /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ - /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ - /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ - /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ - /usr/include/bits/stdio.h ../src/cmph_types.h - -../src/cmph.h: - -/usr/include/stdlib.h: - -/usr/include/features.h: - -/usr/include/sys/cdefs.h: - -/usr/include/gnu/stubs.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: - -/usr/include/sys/types.h: - -/usr/include/bits/types.h: - -/usr/include/bits/wordsize.h: - -/usr/include/bits/typesizes.h: - -/usr/include/time.h: - -/usr/include/endian.h: - -/usr/include/bits/endian.h: - -/usr/include/sys/select.h: - -/usr/include/bits/select.h: - -/usr/include/bits/sigset.h: - -/usr/include/bits/time.h: - -/usr/include/sys/sysmacros.h: - -/usr/include/bits/pthreadtypes.h: - -/usr/include/bits/sched.h: - -/usr/include/alloca.h: - -/usr/include/stdio.h: - -/usr/include/libio.h: - -/usr/include/_G_config.h: - -/usr/include/wchar.h: - -/usr/include/bits/wchar.h: - -/usr/include/gconv.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: - -/usr/include/bits/stdio_lim.h: - -/usr/include/bits/sys_errlist.h: - -/usr/include/bits/stdio.h: - -../src/cmph_types.h: From 24dbad9bd3a30d59c0c79e0f512d12d17ec8d0e5 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 19:58:44 +0000 Subject: [PATCH 196/739] Removed useless files. --- examples/.deps/file_adapter_ex2.Po | 80 ---------------------------- examples/.deps/vector_adapter_ex1.Po | 80 ---------------------------- 2 files changed, 160 deletions(-) delete mode 100644 examples/.deps/file_adapter_ex2.Po delete mode 100644 examples/.deps/vector_adapter_ex1.Po diff --git a/examples/.deps/file_adapter_ex2.Po b/examples/.deps/file_adapter_ex2.Po deleted file mode 100644 index 5aa5200..0000000 --- a/examples/.deps/file_adapter_ex2.Po +++ /dev/null @@ -1,80 +0,0 @@ -file_adapter_ex2.o file_adapter_ex2.o: file_adapter_ex2.c ../src/cmph.h \ - /usr/include/stdlib.h /usr/include/features.h /usr/include/sys/cdefs.h \ - /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ - /usr/include/sys/types.h /usr/include/bits/types.h \ - /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ - /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ - /usr/include/sys/select.h /usr/include/bits/select.h \ - /usr/include/bits/sigset.h /usr/include/bits/time.h \ - /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ - /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ - /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ - /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ - /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ - /usr/include/bits/stdio.h ../src/cmph_types.h - -../src/cmph.h: - -/usr/include/stdlib.h: - -/usr/include/features.h: - -/usr/include/sys/cdefs.h: - -/usr/include/gnu/stubs.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: - -/usr/include/sys/types.h: - -/usr/include/bits/types.h: - -/usr/include/bits/wordsize.h: - -/usr/include/bits/typesizes.h: - -/usr/include/time.h: - -/usr/include/endian.h: - -/usr/include/bits/endian.h: - -/usr/include/sys/select.h: - -/usr/include/bits/select.h: - -/usr/include/bits/sigset.h: - -/usr/include/bits/time.h: - -/usr/include/sys/sysmacros.h: - -/usr/include/bits/pthreadtypes.h: - -/usr/include/bits/sched.h: - -/usr/include/alloca.h: - -/usr/include/stdio.h: - -/usr/include/libio.h: - -/usr/include/_G_config.h: - -/usr/include/wchar.h: - -/usr/include/bits/wchar.h: - -/usr/include/gconv.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: - -/usr/include/bits/stdio_lim.h: - -/usr/include/bits/sys_errlist.h: - -/usr/include/bits/stdio.h: - -../src/cmph_types.h: diff --git a/examples/.deps/vector_adapter_ex1.Po b/examples/.deps/vector_adapter_ex1.Po deleted file mode 100644 index 73271e2..0000000 --- a/examples/.deps/vector_adapter_ex1.Po +++ /dev/null @@ -1,80 +0,0 @@ -vector_adapter_ex1.o vector_adapter_ex1.o: vector_adapter_ex1.c \ - ../src/cmph.h /usr/include/stdlib.h /usr/include/features.h \ - /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h \ - /usr/include/sys/types.h /usr/include/bits/types.h \ - /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \ - /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \ - /usr/include/sys/select.h /usr/include/bits/select.h \ - /usr/include/bits/sigset.h /usr/include/bits/time.h \ - /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \ - /usr/include/bits/sched.h /usr/include/alloca.h /usr/include/stdio.h \ - /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ - /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h \ - /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ - /usr/include/bits/stdio.h ../src/cmph_types.h - -../src/cmph.h: - -/usr/include/stdlib.h: - -/usr/include/features.h: - -/usr/include/sys/cdefs.h: - -/usr/include/gnu/stubs.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stddef.h: - -/usr/include/sys/types.h: - -/usr/include/bits/types.h: - -/usr/include/bits/wordsize.h: - -/usr/include/bits/typesizes.h: - -/usr/include/time.h: - -/usr/include/endian.h: - -/usr/include/bits/endian.h: - -/usr/include/sys/select.h: - -/usr/include/bits/select.h: - -/usr/include/bits/sigset.h: - -/usr/include/bits/time.h: - -/usr/include/sys/sysmacros.h: - -/usr/include/bits/pthreadtypes.h: - -/usr/include/bits/sched.h: - -/usr/include/alloca.h: - -/usr/include/stdio.h: - -/usr/include/libio.h: - -/usr/include/_G_config.h: - -/usr/include/wchar.h: - -/usr/include/bits/wchar.h: - -/usr/include/gconv.h: - -/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include/stdarg.h: - -/usr/include/bits/stdio_lim.h: - -/usr/include/bits/sys_errlist.h: - -/usr/include/bits/stdio.h: - -../src/cmph_types.h: From 7c654b88a85db0c03ffd7267565437bcd758ac64 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 20:54:31 +0000 Subject: [PATCH 197/739] stable version of BRZ using extenal memory to flush vector g --- src/Makefile.am | 4 ++-- src/bmz.c | 3 --- src/bmz8.c | 2 -- src/brz.c | 50 ++++++++++++++++++++++++++++++++++++++--------- src/brz_structs.h | 3 ++- src/chm.c | 5 +---- src/cmph.c | 34 +++++++++++++++----------------- src/main.c | 2 +- 8 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 4c01bc2..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c -# brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index f3efc96..2fba0c2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -446,11 +446,8 @@ int bmz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions bmz_data_t *data = (bmz_data_t *)mphf->data; - cmph_uint32 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); diff --git a/src/bmz8.c b/src/bmz8.c index 5b5c275..c4837c2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -453,10 +453,8 @@ int bmz8_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint8 i; cmph_uint8 two = 2; //number of hash functions bmz8_data_t *data = (bmz8_data_t *)mphf->data; - cmph_uint8 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint8), 1, fd); diff --git a/src/brz.c b/src/brz.c index 91df769..44dcaa7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,3 @@ - #include "graph.h" #include "bmz8.h" #include "bmz8_structs.h" @@ -23,7 +22,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); - +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -48,7 +47,6 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); - free(data->tmp_dir); free(data); } @@ -81,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + sprintf(brz->tmp_dir, "%s/", tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s\0", tmp_dir); + sprintf(brz->tmp_dir, "%s", tmp_dir); } } @@ -169,6 +167,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership + brzf->tmp_dir = brz->tmp_dir; + brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -204,6 +204,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; + cmph_uint32 start_index = 0; char ** keys_vd = NULL; @@ -333,7 +334,11 @@ static int brz_gen_graphs(cmph_config_t *mph) tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",brz->tmp_dir); + tmp_fd = fopen(filename, "w"); + free(filename); + memory_usage = 0; for(i = 0; i < nflushes; i++) { filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); @@ -406,6 +411,12 @@ static int brz_gen_graphs(cmph_config_t *mph) mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + memory_usage += brz->size[cur_bucket]; + if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) + { + brz_flush_g(brz, &start_index, tmp_fd); + memory_usage = 0; + } cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); @@ -413,6 +424,7 @@ static int brz_gen_graphs(cmph_config_t *mph) nkeys_vd = 0; } } + fclose(tmp_fd); for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); free(tmp_fds); free(keys_vd); @@ -458,6 +470,17 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) +{ + while(*start_index < brz->k && brz->g[*start_index] != NULL) + { + fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); + free(brz->g[*start_index]); + brz->g[*start_index] = NULL; + *start_index = *start_index + 1; + } +} + static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; @@ -477,9 +500,14 @@ int brz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + FILE * tmpg_fd = NULL; + char * filename = NULL; + filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",data->tmp_dir); + tmpg_fd = fopen(filename, "rb"); + free(filename); DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); @@ -517,14 +545,17 @@ int brz_dump(cmph_t *mphf, FILE *fd) for(i = 0; i < data->k; i++) { cmph_uint32 n = ceil(data->c * data->size[i]); - fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + buf = (char *)calloc(n, sizeof(cmph_uint8)); + fread(buf, sizeof(cmph_uint8), n, tmpg_fd); + fwrite(buf, sizeof(cmph_uint8), n, fd); + free(buf); } + fclose(tmpg_fd); return 1; } void brz_load(FILE *f, cmph_t *mphf) { - cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -614,6 +645,7 @@ void brz_destroy(cmph_t *mphf) free(data->h2); free(data->size); free(data->offset); + free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz_structs.h b/src/brz_structs.h index adee286..e76e717 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,7 +13,8 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; struct __brz_config_data_t diff --git a/src/chm.c b/src/chm.c index 3458577..7feec29 100644 --- a/src/chm.c +++ b/src/chm.c @@ -182,7 +182,7 @@ static int chm_gen_edges(cmph_config_t *mph) if (h1 == h2) if (++h2 >= chm->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -201,7 +201,6 @@ int chm_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions chm_data_t *data = (chm_data_t *)mphf->data; __cmph_dump(mphf, fd); @@ -234,11 +233,9 @@ int chm_dump(cmph_t *mphf, FILE *fd) void chm_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - hash_state_t *state; chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); DEBUGP("Loading chm mphf\n"); diff --git a/src/cmph.c b/src/cmph.c index 7b73341..d03bc74 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,11 +3,11 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -//#include "brz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include - +#include //#define DEBUG #include "debug.h" @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: -// mph->data = brz_config_new(); + mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_tmp_dir(mph, tmp_dir); + brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_memory_availability(mph, memory_availability); + brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_hashfuncs(mph, hashfuncs); + brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Creating brz hash\n"); + DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c);*/ + mphf = brz_new(mph, c); break; default: assert(0); @@ -323,8 +323,7 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* return brz_dump(mphf, f);*/ + return brz_dump(mphf, f); default: assert(0); } @@ -353,8 +352,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf);*/ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); break; default: assert(0); @@ -378,9 +377,8 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen);*/ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -407,7 +405,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ -/* brz_destroy(mphf);*/ + brz_destroy(mphf); return; default: assert(0); diff --git a/src/main.c b/src/main.c index 701b997..112fdc7 100644 --- a/src/main.c +++ b/src/main.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) break; } } - if (!valid || mph_algo == CMPH_BRZ) + if (!valid) { fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; From c4bc326c4b817ae045ad111bb56f24d3888777cf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 20:54:31 +0000 Subject: [PATCH 198/739] stable version of BRZ using extenal memory to flush vector g --- src/Makefile.am | 4 ++-- src/bmz.c | 3 --- src/bmz8.c | 2 -- src/brz.c | 50 ++++++++++++++++++++++++++++++++++++++--------- src/brz_structs.h | 3 ++- src/chm.c | 5 +---- src/cmph.c | 34 +++++++++++++++----------------- src/main.c | 2 +- 8 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 4c01bc2..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c -# brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index f3efc96..2fba0c2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -446,11 +446,8 @@ int bmz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions bmz_data_t *data = (bmz_data_t *)mphf->data; - cmph_uint32 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); diff --git a/src/bmz8.c b/src/bmz8.c index 5b5c275..c4837c2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -453,10 +453,8 @@ int bmz8_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint8 i; cmph_uint8 two = 2; //number of hash functions bmz8_data_t *data = (bmz8_data_t *)mphf->data; - cmph_uint8 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint8), 1, fd); diff --git a/src/brz.c b/src/brz.c index 91df769..44dcaa7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,3 @@ - #include "graph.h" #include "bmz8.h" #include "bmz8_structs.h" @@ -23,7 +22,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); - +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -48,7 +47,6 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); - free(data->tmp_dir); free(data); } @@ -81,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + sprintf(brz->tmp_dir, "%s/", tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s\0", tmp_dir); + sprintf(brz->tmp_dir, "%s", tmp_dir); } } @@ -169,6 +167,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership + brzf->tmp_dir = brz->tmp_dir; + brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -204,6 +204,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; + cmph_uint32 start_index = 0; char ** keys_vd = NULL; @@ -333,7 +334,11 @@ static int brz_gen_graphs(cmph_config_t *mph) tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",brz->tmp_dir); + tmp_fd = fopen(filename, "w"); + free(filename); + memory_usage = 0; for(i = 0; i < nflushes; i++) { filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); @@ -406,6 +411,12 @@ static int brz_gen_graphs(cmph_config_t *mph) mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + memory_usage += brz->size[cur_bucket]; + if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) + { + brz_flush_g(brz, &start_index, tmp_fd); + memory_usage = 0; + } cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); @@ -413,6 +424,7 @@ static int brz_gen_graphs(cmph_config_t *mph) nkeys_vd = 0; } } + fclose(tmp_fd); for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); free(tmp_fds); free(keys_vd); @@ -458,6 +470,17 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) +{ + while(*start_index < brz->k && brz->g[*start_index] != NULL) + { + fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); + free(brz->g[*start_index]); + brz->g[*start_index] = NULL; + *start_index = *start_index + 1; + } +} + static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; @@ -477,9 +500,14 @@ int brz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + FILE * tmpg_fd = NULL; + char * filename = NULL; + filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",data->tmp_dir); + tmpg_fd = fopen(filename, "rb"); + free(filename); DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); @@ -517,14 +545,17 @@ int brz_dump(cmph_t *mphf, FILE *fd) for(i = 0; i < data->k; i++) { cmph_uint32 n = ceil(data->c * data->size[i]); - fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + buf = (char *)calloc(n, sizeof(cmph_uint8)); + fread(buf, sizeof(cmph_uint8), n, tmpg_fd); + fwrite(buf, sizeof(cmph_uint8), n, fd); + free(buf); } + fclose(tmpg_fd); return 1; } void brz_load(FILE *f, cmph_t *mphf) { - cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -614,6 +645,7 @@ void brz_destroy(cmph_t *mphf) free(data->h2); free(data->size); free(data->offset); + free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz_structs.h b/src/brz_structs.h index adee286..e76e717 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,7 +13,8 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; struct __brz_config_data_t diff --git a/src/chm.c b/src/chm.c index 3458577..7feec29 100644 --- a/src/chm.c +++ b/src/chm.c @@ -182,7 +182,7 @@ static int chm_gen_edges(cmph_config_t *mph) if (h1 == h2) if (++h2 >= chm->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -201,7 +201,6 @@ int chm_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions chm_data_t *data = (chm_data_t *)mphf->data; __cmph_dump(mphf, fd); @@ -234,11 +233,9 @@ int chm_dump(cmph_t *mphf, FILE *fd) void chm_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - hash_state_t *state; chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); DEBUGP("Loading chm mphf\n"); diff --git a/src/cmph.c b/src/cmph.c index 7b73341..d03bc74 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,11 +3,11 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -//#include "brz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include - +#include //#define DEBUG #include "debug.h" @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: -// mph->data = brz_config_new(); + mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_tmp_dir(mph, tmp_dir); + brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_memory_availability(mph, memory_availability); + brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_hashfuncs(mph, hashfuncs); + brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Creating brz hash\n"); + DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c);*/ + mphf = brz_new(mph, c); break; default: assert(0); @@ -323,8 +323,7 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* return brz_dump(mphf, f);*/ + return brz_dump(mphf, f); default: assert(0); } @@ -353,8 +352,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf);*/ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); break; default: assert(0); @@ -378,9 +377,8 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen);*/ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -407,7 +405,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ -/* brz_destroy(mphf);*/ + brz_destroy(mphf); return; default: assert(0); diff --git a/src/main.c b/src/main.c index 701b997..112fdc7 100644 --- a/src/main.c +++ b/src/main.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) break; } } - if (!valid || mph_algo == CMPH_BRZ) + if (!valid) { fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; From ded7440fd46ec7193760af12d9382c5d77240ba1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 20:54:31 +0000 Subject: [PATCH 199/739] stable version of BRZ using extenal memory to flush vector g --- src/Makefile.am | 4 ++-- src/bmz.c | 3 --- src/bmz8.c | 2 -- src/brz.c | 50 ++++++++++++++++++++++++++++++++++++++--------- src/brz_structs.h | 3 ++- src/chm.c | 5 +---- src/cmph.c | 34 +++++++++++++++----------------- src/main.c | 2 +- 8 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 4c01bc2..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c -# brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index f3efc96..2fba0c2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -446,11 +446,8 @@ int bmz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions bmz_data_t *data = (bmz_data_t *)mphf->data; - cmph_uint32 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); diff --git a/src/bmz8.c b/src/bmz8.c index 5b5c275..c4837c2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -453,10 +453,8 @@ int bmz8_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint8 i; cmph_uint8 two = 2; //number of hash functions bmz8_data_t *data = (bmz8_data_t *)mphf->data; - cmph_uint8 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint8), 1, fd); diff --git a/src/brz.c b/src/brz.c index 91df769..44dcaa7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,3 @@ - #include "graph.h" #include "bmz8.h" #include "bmz8_structs.h" @@ -23,7 +22,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); - +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -48,7 +47,6 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); - free(data->tmp_dir); free(data); } @@ -81,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + sprintf(brz->tmp_dir, "%s/", tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s\0", tmp_dir); + sprintf(brz->tmp_dir, "%s", tmp_dir); } } @@ -169,6 +167,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership + brzf->tmp_dir = brz->tmp_dir; + brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -204,6 +204,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; + cmph_uint32 start_index = 0; char ** keys_vd = NULL; @@ -333,7 +334,11 @@ static int brz_gen_graphs(cmph_config_t *mph) tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",brz->tmp_dir); + tmp_fd = fopen(filename, "w"); + free(filename); + memory_usage = 0; for(i = 0; i < nflushes; i++) { filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); @@ -406,6 +411,12 @@ static int brz_gen_graphs(cmph_config_t *mph) mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + memory_usage += brz->size[cur_bucket]; + if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) + { + brz_flush_g(brz, &start_index, tmp_fd); + memory_usage = 0; + } cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); @@ -413,6 +424,7 @@ static int brz_gen_graphs(cmph_config_t *mph) nkeys_vd = 0; } } + fclose(tmp_fd); for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); free(tmp_fds); free(keys_vd); @@ -458,6 +470,17 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) +{ + while(*start_index < brz->k && brz->g[*start_index] != NULL) + { + fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); + free(brz->g[*start_index]); + brz->g[*start_index] = NULL; + *start_index = *start_index + 1; + } +} + static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; @@ -477,9 +500,14 @@ int brz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + FILE * tmpg_fd = NULL; + char * filename = NULL; + filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",data->tmp_dir); + tmpg_fd = fopen(filename, "rb"); + free(filename); DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); @@ -517,14 +545,17 @@ int brz_dump(cmph_t *mphf, FILE *fd) for(i = 0; i < data->k; i++) { cmph_uint32 n = ceil(data->c * data->size[i]); - fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + buf = (char *)calloc(n, sizeof(cmph_uint8)); + fread(buf, sizeof(cmph_uint8), n, tmpg_fd); + fwrite(buf, sizeof(cmph_uint8), n, fd); + free(buf); } + fclose(tmpg_fd); return 1; } void brz_load(FILE *f, cmph_t *mphf) { - cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -614,6 +645,7 @@ void brz_destroy(cmph_t *mphf) free(data->h2); free(data->size); free(data->offset); + free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz_structs.h b/src/brz_structs.h index adee286..e76e717 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,7 +13,8 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; struct __brz_config_data_t diff --git a/src/chm.c b/src/chm.c index 3458577..7feec29 100644 --- a/src/chm.c +++ b/src/chm.c @@ -182,7 +182,7 @@ static int chm_gen_edges(cmph_config_t *mph) if (h1 == h2) if (++h2 >= chm->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -201,7 +201,6 @@ int chm_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions chm_data_t *data = (chm_data_t *)mphf->data; __cmph_dump(mphf, fd); @@ -234,11 +233,9 @@ int chm_dump(cmph_t *mphf, FILE *fd) void chm_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - hash_state_t *state; chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); DEBUGP("Loading chm mphf\n"); diff --git a/src/cmph.c b/src/cmph.c index 7b73341..d03bc74 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,11 +3,11 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -//#include "brz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include - +#include //#define DEBUG #include "debug.h" @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: -// mph->data = brz_config_new(); + mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_tmp_dir(mph, tmp_dir); + brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_memory_availability(mph, memory_availability); + brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_hashfuncs(mph, hashfuncs); + brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Creating brz hash\n"); + DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c);*/ + mphf = brz_new(mph, c); break; default: assert(0); @@ -323,8 +323,7 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* return brz_dump(mphf, f);*/ + return brz_dump(mphf, f); default: assert(0); } @@ -353,8 +352,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf);*/ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); break; default: assert(0); @@ -378,9 +377,8 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen);*/ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -407,7 +405,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ -/* brz_destroy(mphf);*/ + brz_destroy(mphf); return; default: assert(0); diff --git a/src/main.c b/src/main.c index 701b997..112fdc7 100644 --- a/src/main.c +++ b/src/main.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) break; } } - if (!valid || mph_algo == CMPH_BRZ) + if (!valid) { fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; From 7352e084884b3ba3249ce22b13bff85b81f21f73 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 20:54:31 +0000 Subject: [PATCH 200/739] stable version of BRZ using extenal memory to flush vector g --- src/Makefile.am | 4 ++-- src/bmz.c | 3 --- src/bmz8.c | 2 -- src/brz.c | 50 ++++++++++++++++++++++++++++++++++++++--------- src/brz_structs.h | 3 ++- src/chm.c | 5 +---- src/cmph.c | 34 +++++++++++++++----------------- src/main.c | 2 +- 8 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 4c01bc2..1d05357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,8 +16,8 @@ libcmph_la_SOURCES = debug.h\ cmph_structs.h cmph_structs.c\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ - bmz8.h bmz8_structs.h bmz8.c -# brz.h brz_structs.h brz.c + bmz8.h bmz8_structs.h bmz8.c\ + brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index f3efc96..2fba0c2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -446,11 +446,8 @@ int bmz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions bmz_data_t *data = (bmz_data_t *)mphf->data; - cmph_uint32 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); diff --git a/src/bmz8.c b/src/bmz8.c index 5b5c275..c4837c2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -453,10 +453,8 @@ int bmz8_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint8 i; cmph_uint8 two = 2; //number of hash functions bmz8_data_t *data = (bmz8_data_t *)mphf->data; - cmph_uint8 nn, nm; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint8), 1, fd); diff --git a/src/brz.c b/src/brz.c index 91df769..44dcaa7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,3 @@ - #include "graph.h" #include "bmz8.h" #include "bmz8_structs.h" @@ -23,7 +22,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); - +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -48,7 +47,6 @@ void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); - free(data->tmp_dir); free(data); } @@ -81,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/\0", tmp_dir); + sprintf(brz->tmp_dir, "%s/", tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s\0", tmp_dir); + sprintf(brz->tmp_dir, "%s", tmp_dir); } } @@ -169,6 +167,8 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership + brzf->tmp_dir = brz->tmp_dir; + brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -204,6 +204,7 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; + cmph_uint32 start_index = 0; char ** keys_vd = NULL; @@ -333,7 +334,11 @@ static int brz_gen_graphs(cmph_config_t *mph) tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - + filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",brz->tmp_dir); + tmp_fd = fopen(filename, "w"); + free(filename); + memory_usage = 0; for(i = 0; i < nflushes; i++) { filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); @@ -406,6 +411,12 @@ static int brz_gen_graphs(cmph_config_t *mph) mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); + memory_usage += brz->size[cur_bucket]; + if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) + { + brz_flush_g(brz, &start_index, tmp_fd); + memory_usage = 0; + } cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); @@ -413,6 +424,7 @@ static int brz_gen_graphs(cmph_config_t *mph) nkeys_vd = 0; } } + fclose(tmp_fd); for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); free(tmp_fds); free(keys_vd); @@ -458,6 +470,17 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) free(keys_vd[i]); } +static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) +{ + while(*start_index < brz->k && brz->g[*start_index] != NULL) + { + fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); + free(brz->g[*start_index]); + brz->g[*start_index] = NULL; + *start_index = *start_index + 1; + } +} + static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) { cmph_uint32 i; @@ -477,9 +500,14 @@ int brz_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 nbuflen; cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; + FILE * tmpg_fd = NULL; + char * filename = NULL; + filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); + sprintf(filename, "%stmpg.cmph",data->tmp_dir); + tmpg_fd = fopen(filename, "rb"); + free(filename); DEBUGP("Dumping brzf\n"); __cmph_dump(mphf, fd); @@ -517,14 +545,17 @@ int brz_dump(cmph_t *mphf, FILE *fd) for(i = 0; i < data->k; i++) { cmph_uint32 n = ceil(data->c * data->size[i]); - fwrite(data->g[i], sizeof(cmph_uint8)*n, 1, fd); + buf = (char *)calloc(n, sizeof(cmph_uint8)); + fread(buf, sizeof(cmph_uint8), n, tmpg_fd); + fwrite(buf, sizeof(cmph_uint8), n, fd); + free(buf); } + fclose(tmpg_fd); return 1; } void brz_load(FILE *f, cmph_t *mphf) { - cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; @@ -614,6 +645,7 @@ void brz_destroy(cmph_t *mphf) free(data->h2); free(data->size); free(data->offset); + free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz_structs.h b/src/brz_structs.h index adee286..e76e717 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,7 +13,8 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h3; + cmph_uint8 * tmp_dir; // temporary directory }; struct __brz_config_data_t diff --git a/src/chm.c b/src/chm.c index 3458577..7feec29 100644 --- a/src/chm.c +++ b/src/chm.c @@ -182,7 +182,7 @@ static int chm_gen_edges(cmph_config_t *mph) if (h1 == h2) if (++h2 >= chm->n) h2 = 0; if (h1 == h2) { - if (mph->verbosity) fprintf(stderr, "Self loop for key %e\n", e); + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } @@ -201,7 +201,6 @@ int chm_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; cmph_uint32 two = 2; //number of hash functions chm_data_t *data = (chm_data_t *)mphf->data; __cmph_dump(mphf, fd); @@ -234,11 +233,9 @@ int chm_dump(cmph_t *mphf, FILE *fd) void chm_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; - char fbuf[BUFSIZ]; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - hash_state_t *state; chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); DEBUGP("Loading chm mphf\n"); diff --git a/src/cmph.c b/src/cmph.c index 7b73341..d03bc74 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -3,11 +3,11 @@ #include "chm.h" #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ -//#include "brz.h" /* included -- Fabiano */ +#include "brz.h" /* included -- Fabiano */ #include #include - +#include //#define DEBUG #include "debug.h" @@ -159,7 +159,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) bmz8_config_destroy(mph); break; case CMPH_BRZ: -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -176,7 +176,7 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) mph->data = bmz8_config_new(); break; case CMPH_BRZ: -// mph->data = brz_config_new(); + mph->data = brz_config_new(); break; default: assert(0); @@ -196,7 +196,7 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_tmp_dir(mph, tmp_dir); + brz_config_set_tmp_dir(mph, tmp_dir); break; default: assert(0); @@ -215,7 +215,7 @@ void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_ case CMPH_BMZ8: /* included -- Fabiano */ break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_memory_availability(mph, memory_availability); + brz_config_set_memory_availability(mph, memory_availability); break; default: assert(0); @@ -238,7 +238,7 @@ void cmph_config_destroy(cmph_config_t *mph) bmz8_config_destroy(mph); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_destroy(mph); + brz_config_destroy(mph); break; default: assert(0); @@ -265,7 +265,7 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) bmz8_config_set_hashfuncs(mph, hashfuncs); break; case CMPH_BRZ: /* included -- Fabiano */ -// brz_config_set_hashfuncs(mph, hashfuncs); + brz_config_set_hashfuncs(mph, hashfuncs); break; default: break; @@ -302,9 +302,9 @@ cmph_t *cmph_new(cmph_config_t *mph) mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Creating brz hash\n"); + DEBUGP("Creating brz hash\n"); if (c == 0) c = 1.15; - mphf = brz_new(mph, c);*/ + mphf = brz_new(mph, c); break; default: assert(0); @@ -323,8 +323,7 @@ int cmph_dump(cmph_t *mphf, FILE *f) case CMPH_BMZ8: /* included -- Fabiano */ return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* return brz_dump(mphf, f);*/ + return brz_dump(mphf, f); default: assert(0); } @@ -353,8 +352,8 @@ cmph_t *cmph_load(FILE *f) bmz8_load(f, mphf); break; case CMPH_BRZ: /* included -- Fabiano */ -/* DEBUGP("Loading brz algorithm dependent parts\n"); - brz_load(f, mphf);*/ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); break; default: assert(0); @@ -378,9 +377,8 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("bmz8 algorithm search\n"); return bmz8_search(mphf, key, keylen); case CMPH_BRZ: /* included -- Fabiano */ - break; -/* DEBUGP("brz algorithm search\n"); - return brz_search(mphf, key, keylen);*/ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); default: assert(0); } @@ -407,7 +405,7 @@ void cmph_destroy(cmph_t *mphf) bmz8_destroy(mphf); return; case CMPH_BRZ: /* included -- Fabiano */ -/* brz_destroy(mphf);*/ + brz_destroy(mphf); return; default: assert(0); diff --git a/src/main.c b/src/main.c index 701b997..112fdc7 100644 --- a/src/main.c +++ b/src/main.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) break; } } - if (!valid || mph_algo == CMPH_BRZ) + if (!valid) { fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); return -1; From 06f9e8b7680d8195dd5657879367f8587ff75123 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 20:57:42 +0000 Subject: [PATCH 201/739] Fixed small main.cc bug when -m parameter was in use. --- src/main.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 112fdc7..8a7f977 100644 --- a/src/main.c +++ b/src/main.c @@ -187,6 +187,7 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); + int ret = 0; if (mphf_file == NULL) { mphf_file = (char *)malloc(strlen(keys_file) + 5); @@ -255,6 +256,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } + cmph_uint32 siz = cmph_size(mphf); hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); memset(hashtable, 0, source->nkeys); //check all keys @@ -265,10 +267,16 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); - assert(h < source->nkeys); - if(hashtable[h])fprintf(stderr, "collision: %u\n",h); - assert(hashtable[h]==0); - hashtable[h] = 1; + if (!(h < siz)) + { + fprintf(stderr, "Unknown key %*s in the input.\n", buflen, buf); + ret = 1; + } else if(hashtable[h]) + { + fprintf(stderr, "Duplicated or unknown key %*s in the input\n", buflen, buf); + ret = 1; + } else hashtable[h] = 1; + if (verbosity) { printf("%s -> %u\n", buf, h); @@ -282,5 +290,5 @@ int main(int argc, char **argv) free(mphf_file); free(tmp_dir); free(source); - return 0; + return ret; } From dffa191e74898aae678dcabd266d961d88fc30fa Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 20:57:42 +0000 Subject: [PATCH 202/739] Fixed small main.cc bug when -m parameter was in use. --- src/main.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 112fdc7..8a7f977 100644 --- a/src/main.c +++ b/src/main.c @@ -187,6 +187,7 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); + int ret = 0; if (mphf_file == NULL) { mphf_file = (char *)malloc(strlen(keys_file) + 5); @@ -255,6 +256,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } + cmph_uint32 siz = cmph_size(mphf); hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); memset(hashtable, 0, source->nkeys); //check all keys @@ -265,10 +267,16 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); - assert(h < source->nkeys); - if(hashtable[h])fprintf(stderr, "collision: %u\n",h); - assert(hashtable[h]==0); - hashtable[h] = 1; + if (!(h < siz)) + { + fprintf(stderr, "Unknown key %*s in the input.\n", buflen, buf); + ret = 1; + } else if(hashtable[h]) + { + fprintf(stderr, "Duplicated or unknown key %*s in the input\n", buflen, buf); + ret = 1; + } else hashtable[h] = 1; + if (verbosity) { printf("%s -> %u\n", buf, h); @@ -282,5 +290,5 @@ int main(int argc, char **argv) free(mphf_file); free(tmp_dir); free(source); - return 0; + return ret; } From 17ed72b8d2bf083ad5a0d32007e76879b507b6fe Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 20:57:42 +0000 Subject: [PATCH 203/739] Fixed small main.cc bug when -m parameter was in use. --- src/main.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 112fdc7..8a7f977 100644 --- a/src/main.c +++ b/src/main.c @@ -187,6 +187,7 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); + int ret = 0; if (mphf_file == NULL) { mphf_file = (char *)malloc(strlen(keys_file) + 5); @@ -255,6 +256,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } + cmph_uint32 siz = cmph_size(mphf); hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); memset(hashtable, 0, source->nkeys); //check all keys @@ -265,10 +267,16 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); - assert(h < source->nkeys); - if(hashtable[h])fprintf(stderr, "collision: %u\n",h); - assert(hashtable[h]==0); - hashtable[h] = 1; + if (!(h < siz)) + { + fprintf(stderr, "Unknown key %*s in the input.\n", buflen, buf); + ret = 1; + } else if(hashtable[h]) + { + fprintf(stderr, "Duplicated or unknown key %*s in the input\n", buflen, buf); + ret = 1; + } else hashtable[h] = 1; + if (verbosity) { printf("%s -> %u\n", buf, h); @@ -282,5 +290,5 @@ int main(int argc, char **argv) free(mphf_file); free(tmp_dir); free(source); - return 0; + return ret; } From 8fed2245756ed16653c093e981c484ee222114b1 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 20:57:42 +0000 Subject: [PATCH 204/739] Fixed small main.cc bug when -m parameter was in use. --- src/main.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 112fdc7..8a7f977 100644 --- a/src/main.c +++ b/src/main.c @@ -187,6 +187,7 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); + int ret = 0; if (mphf_file == NULL) { mphf_file = (char *)malloc(strlen(keys_file) + 5); @@ -255,6 +256,7 @@ int main(int argc, char **argv) free(mphf_file); return -1; } + cmph_uint32 siz = cmph_size(mphf); hashtable = (cmph_uint8*)malloc(source->nkeys*sizeof(cmph_uint8)); memset(hashtable, 0, source->nkeys); //check all keys @@ -265,10 +267,16 @@ int main(int argc, char **argv) cmph_uint32 buflen = 0; source->read(source->data, &buf, &buflen); h = cmph_search(mphf, buf, buflen); - assert(h < source->nkeys); - if(hashtable[h])fprintf(stderr, "collision: %u\n",h); - assert(hashtable[h]==0); - hashtable[h] = 1; + if (!(h < siz)) + { + fprintf(stderr, "Unknown key %*s in the input.\n", buflen, buf); + ret = 1; + } else if(hashtable[h]) + { + fprintf(stderr, "Duplicated or unknown key %*s in the input\n", buflen, buf); + ret = 1; + } else hashtable[h] = 1; + if (verbosity) { printf("%s -> %u\n", buf, h); @@ -282,5 +290,5 @@ int main(int argc, char **argv) free(mphf_file); free(tmp_dir); free(source); - return 0; + return ret; } From f7c6e8a60a449cb54f5c2d328b8d35a2d89e5f6b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 21:05:48 +0000 Subject: [PATCH 205/739] *** empty log message *** --- cmph.spec | 4 ++-- examples/Makefile | 24 ++++++++++++------------ examples/Makefile.in | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cmph.spec b/cmph.spec index 19e796b..d6c239e 100644 --- a/cmph.spec +++ b/cmph.spec @@ -1,6 +1,6 @@ %define name cmph -%define version 0.2 -%define release 1 +%define version 0.4 +%define release 3 Name: %{name} Version: %{version} diff --git a/examples/Makefile b/examples/Makefile index b4449b0..dd5c062 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -36,8 +36,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i686-suse-linux -host_triplet = i686-suse-linux +build_triplet = i686-pc-linux-gnu +host_triplet = i686-pc-linux-gnu noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ file_adapter_ex2$(EXEEXT) subdir = examples @@ -101,8 +101,8 @@ ECHO_N = -n ECHO_T = EGREP = grep -E EXEEXT = -F77 = -FFLAGS = +F77 = g77 +FFLAGS = -g -O2 GETCONF = getconf INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} @@ -131,7 +131,7 @@ VERSION = 0.4 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ -ac_ct_F77 = +ac_ct_F77 = g77 ac_ct_GETCONF = getconf ac_ct_RANLIB = ranlib ac_ct_STRIP = strip @@ -145,18 +145,18 @@ am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i686-suse-linux +build = i686-pc-linux-gnu build_alias = build_cpu = i686 -build_os = linux -build_vendor = suse +build_os = linux-gnu +build_vendor = pc datadir = ${prefix}/share exec_prefix = ${prefix} -host = i686-suse-linux +host = i686-pc-linux-gnu host_alias = host_cpu = i686 -host_os = linux -host_vendor = suse +host_os = linux-gnu +host_vendor = pc includedir = ${prefix}/include infodir = ${prefix}/info install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh diff --git a/examples/Makefile.in b/examples/Makefile.in index 2cf84b1..639e5c6 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, From 70e14dcc674c9aab4f5b74707f466b4f886b2dad Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 21:05:48 +0000 Subject: [PATCH 206/739] *** empty log message *** --- cmph.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmph.spec b/cmph.spec index 19e796b..d6c239e 100644 --- a/cmph.spec +++ b/cmph.spec @@ -1,6 +1,6 @@ %define name cmph -%define version 0.2 -%define release 1 +%define version 0.4 +%define release 3 Name: %{name} Version: %{version} From feb24d8a69356f0e728253e5975db07ca135b5c5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 21:05:48 +0000 Subject: [PATCH 207/739] *** empty log message *** --- INSTALL | 52 +++++++++++++++++++++++--------------------- cmph.spec | 4 ++-- examples/Makefile | 24 ++++++++++---------- examples/Makefile.in | 2 +- 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/INSTALL b/INSTALL index 54caf7c..095b1eb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,13 +1,16 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. +Installation Instructions +************************* - This file is free documentation; the Free Software Foundation gives +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -67,9 +70,9 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -82,7 +85,7 @@ is an example: Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -99,19 +102,19 @@ for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== - Variables not defined in a site shell script can be set in the +Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -192,8 +195,7 @@ overridden in the site shell script). `configure' Invocation ====================== - `configure' recognizes the following options to control how it -operates. +`configure' recognizes the following options to control how it operates. `--help' `-h' diff --git a/cmph.spec b/cmph.spec index 19e796b..d6c239e 100644 --- a/cmph.spec +++ b/cmph.spec @@ -1,6 +1,6 @@ %define name cmph -%define version 0.2 -%define release 1 +%define version 0.4 +%define release 3 Name: %{name} Version: %{version} diff --git a/examples/Makefile b/examples/Makefile index b4449b0..dd5c062 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -36,8 +36,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i686-suse-linux -host_triplet = i686-suse-linux +build_triplet = i686-pc-linux-gnu +host_triplet = i686-pc-linux-gnu noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ file_adapter_ex2$(EXEEXT) subdir = examples @@ -101,8 +101,8 @@ ECHO_N = -n ECHO_T = EGREP = grep -E EXEEXT = -F77 = -FFLAGS = +F77 = g77 +FFLAGS = -g -O2 GETCONF = getconf INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} @@ -131,7 +131,7 @@ VERSION = 0.4 ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ -ac_ct_F77 = +ac_ct_F77 = g77 ac_ct_GETCONF = getconf ac_ct_RANLIB = ranlib ac_ct_STRIP = strip @@ -145,18 +145,18 @@ am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i686-suse-linux +build = i686-pc-linux-gnu build_alias = build_cpu = i686 -build_os = linux -build_vendor = suse +build_os = linux-gnu +build_vendor = pc datadir = ${prefix}/share exec_prefix = ${prefix} -host = i686-suse-linux +host = i686-pc-linux-gnu host_alias = host_cpu = i686 -host_os = linux -host_vendor = suse +host_os = linux-gnu +host_vendor = pc includedir = ${prefix}/include infodir = ${prefix}/info install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh diff --git a/examples/Makefile.in b/examples/Makefile.in index 2cf84b1..639e5c6 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.1 from Makefile.am. +# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, From f30b8f6172f71d24a10752faf31a3271987bb6e7 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 23 Sep 2005 21:05:48 +0000 Subject: [PATCH 208/739] *** empty log message *** --- INSTALL | 52 +++++++++++++++++++++++++++------------------------- cmph.spec | 4 ++-- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/INSTALL b/INSTALL index 54caf7c..095b1eb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,13 +1,16 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. +Installation Instructions +************************* - This file is free documentation; the Free Software Foundation gives +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -67,9 +70,9 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -82,7 +85,7 @@ is an example: Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -99,19 +102,19 @@ for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== - Variables not defined in a site shell script can be set in the +Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -192,8 +195,7 @@ overridden in the site shell script). `configure' Invocation ====================== - `configure' recognizes the following options to control how it -operates. +`configure' recognizes the following options to control how it operates. `--help' `-h' diff --git a/cmph.spec b/cmph.spec index 19e796b..d6c239e 100644 --- a/cmph.spec +++ b/cmph.spec @@ -1,6 +1,6 @@ %define name cmph -%define version 0.2 -%define release 1 +%define version 0.4 +%define release 3 Name: %{name} Version: %{version} From 5adcefa25566e91f1bc5f3d03bcf4fa459eb9812 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 21:43:33 +0000 Subject: [PATCH 209/739] Started to implement new algorithm hashtree. --- src/hashtree.c | 293 +++++++++++++++++++++++++++++++++++++++++ src/hashtree.h | 18 +++ src/hashtree_structs.h | 31 +++++ 3 files changed, 342 insertions(+) create mode 100644 src/hashtree.c create mode 100644 src/hashtree.h create mode 100644 src/hashtree_structs.h diff --git a/src/hashtree.c b/src/hashtree.c new file mode 100644 index 0000000..7feec29 --- /dev/null +++ b/src/hashtree.c @@ -0,0 +1,293 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new() +{ + chm_config_data_t *chm; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + chm->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(chm->n/8 + 1); + memset(visited, 0, chm->n/8 + 1); + free(chm->g); + chm->g = malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(chm->n), sizeof(cmph_uint32), 1, f); + fread(&(chm->m), sizeof(cmph_uint32), 1, f); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/hashtree.h b/src/hashtree.h new file mode 100644 index 0000000..7c736e7 --- /dev/null +++ b/src/hashtree.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_HASHTREE_H__ +#define __CMPH_HASHTREE_H__ + +#include "cmph.h" + +typedef struct __hashtree_data_t hashtree_data_t; +typedef struct __hashtree_config_data_t hashtree_config_data_t; + +hashtree_config_data_t *hashtree_config_new(); +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_destroy(cmph_config_t *mph); +cmph_t *hashtree_new(cmph_config_t *mph, float c); + +void hashtree_load(FILE *f, cmph_t *mphf); +int hashtree_dump(cmph_t *mphf, FILE *f); +void hashtree_destroy(cmph_t *mphf); +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h new file mode 100644 index 0000000..f45a343 --- /dev/null +++ b/src/hashtree_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_HASHTREE_STRUCTS_H__ +#define __CMPH_HASHTREE_STRUCTS_H__ + +#include "hash_state.h" + +struct __hashtree_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_float32 c; //constant c + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 **g; + cmph_uint32 k; //number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +struct __hashtree_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; //edges (words) count + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 *offset; //offset[i] stores the sum size[0] + ... size[i - 1] + cmph_uint32 k; //number of components + cmph_uint32 memory; + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +#endif From 5c679aeb779dca606bd405febea45e6517ba5e30 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 21:43:33 +0000 Subject: [PATCH 210/739] Started to implement new algorithm hashtree. --- src/hashtree.c | 293 +++++++++++++++++++++++++++++++++++++++++ src/hashtree.h | 18 +++ src/hashtree_structs.h | 31 +++++ 3 files changed, 342 insertions(+) create mode 100644 src/hashtree.c create mode 100644 src/hashtree.h create mode 100644 src/hashtree_structs.h diff --git a/src/hashtree.c b/src/hashtree.c new file mode 100644 index 0000000..7feec29 --- /dev/null +++ b/src/hashtree.c @@ -0,0 +1,293 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new() +{ + chm_config_data_t *chm; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + chm->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(chm->n/8 + 1); + memset(visited, 0, chm->n/8 + 1); + free(chm->g); + chm->g = malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(chm->n), sizeof(cmph_uint32), 1, f); + fread(&(chm->m), sizeof(cmph_uint32), 1, f); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/hashtree.h b/src/hashtree.h new file mode 100644 index 0000000..7c736e7 --- /dev/null +++ b/src/hashtree.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_HASHTREE_H__ +#define __CMPH_HASHTREE_H__ + +#include "cmph.h" + +typedef struct __hashtree_data_t hashtree_data_t; +typedef struct __hashtree_config_data_t hashtree_config_data_t; + +hashtree_config_data_t *hashtree_config_new(); +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_destroy(cmph_config_t *mph); +cmph_t *hashtree_new(cmph_config_t *mph, float c); + +void hashtree_load(FILE *f, cmph_t *mphf); +int hashtree_dump(cmph_t *mphf, FILE *f); +void hashtree_destroy(cmph_t *mphf); +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h new file mode 100644 index 0000000..f45a343 --- /dev/null +++ b/src/hashtree_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_HASHTREE_STRUCTS_H__ +#define __CMPH_HASHTREE_STRUCTS_H__ + +#include "hash_state.h" + +struct __hashtree_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_float32 c; //constant c + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 **g; + cmph_uint32 k; //number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +struct __hashtree_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; //edges (words) count + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 *offset; //offset[i] stores the sum size[0] + ... size[i - 1] + cmph_uint32 k; //number of components + cmph_uint32 memory; + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +#endif From 5d4d6024e5b476e62779f3d55754330ea3093da5 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 21:43:33 +0000 Subject: [PATCH 211/739] Started to implement new algorithm hashtree. --- src/hashtree.c | 293 +++++++++++++++++++++++++++++++++++++++++ src/hashtree.h | 18 +++ src/hashtree_structs.h | 31 +++++ 3 files changed, 342 insertions(+) create mode 100644 src/hashtree.c create mode 100644 src/hashtree.h create mode 100644 src/hashtree_structs.h diff --git a/src/hashtree.c b/src/hashtree.c new file mode 100644 index 0000000..7feec29 --- /dev/null +++ b/src/hashtree.c @@ -0,0 +1,293 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new() +{ + chm_config_data_t *chm; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + chm->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(chm->n/8 + 1); + memset(visited, 0, chm->n/8 + 1); + free(chm->g); + chm->g = malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(chm->n), sizeof(cmph_uint32), 1, f); + fread(&(chm->m), sizeof(cmph_uint32), 1, f); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/hashtree.h b/src/hashtree.h new file mode 100644 index 0000000..7c736e7 --- /dev/null +++ b/src/hashtree.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_HASHTREE_H__ +#define __CMPH_HASHTREE_H__ + +#include "cmph.h" + +typedef struct __hashtree_data_t hashtree_data_t; +typedef struct __hashtree_config_data_t hashtree_config_data_t; + +hashtree_config_data_t *hashtree_config_new(); +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_destroy(cmph_config_t *mph); +cmph_t *hashtree_new(cmph_config_t *mph, float c); + +void hashtree_load(FILE *f, cmph_t *mphf); +int hashtree_dump(cmph_t *mphf, FILE *f); +void hashtree_destroy(cmph_t *mphf); +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h new file mode 100644 index 0000000..f45a343 --- /dev/null +++ b/src/hashtree_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_HASHTREE_STRUCTS_H__ +#define __CMPH_HASHTREE_STRUCTS_H__ + +#include "hash_state.h" + +struct __hashtree_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_float32 c; //constant c + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 **g; + cmph_uint32 k; //number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +struct __hashtree_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; //edges (words) count + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 *offset; //offset[i] stores the sum size[0] + ... size[i - 1] + cmph_uint32 k; //number of components + cmph_uint32 memory; + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +#endif From a8c4aa7a458897a24231e515cec247206faf6433 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 21:43:33 +0000 Subject: [PATCH 212/739] Started to implement new algorithm hashtree. --- src/hashtree.c | 293 +++++++++++++++++++++++++++++++++++++++++ src/hashtree.h | 18 +++ src/hashtree_structs.h | 31 +++++ 3 files changed, 342 insertions(+) create mode 100644 src/hashtree.c create mode 100644 src/hashtree.h create mode 100644 src/hashtree_structs.h diff --git a/src/hashtree.c b/src/hashtree.c new file mode 100644 index 0000000..7feec29 --- /dev/null +++ b/src/hashtree.c @@ -0,0 +1,293 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new() +{ + chm_config_data_t *chm; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm,0,sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + chm->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(chm->n/8 + 1); + memset(visited, 0, chm->n/8 + 1); + free(chm->g); + chm->g = malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(chm->n), sizeof(cmph_uint32), 1, f); + fread(&(chm->m), sizeof(cmph_uint32), 1, f); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/src/hashtree.h b/src/hashtree.h new file mode 100644 index 0000000..7c736e7 --- /dev/null +++ b/src/hashtree.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_HASHTREE_H__ +#define __CMPH_HASHTREE_H__ + +#include "cmph.h" + +typedef struct __hashtree_data_t hashtree_data_t; +typedef struct __hashtree_config_data_t hashtree_config_data_t; + +hashtree_config_data_t *hashtree_config_new(); +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_destroy(cmph_config_t *mph); +cmph_t *hashtree_new(cmph_config_t *mph, float c); + +void hashtree_load(FILE *f, cmph_t *mphf); +int hashtree_dump(cmph_t *mphf, FILE *f); +void hashtree_destroy(cmph_t *mphf); +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h new file mode 100644 index 0000000..f45a343 --- /dev/null +++ b/src/hashtree_structs.h @@ -0,0 +1,31 @@ +#ifndef __CMPH_HASHTREE_STRUCTS_H__ +#define __CMPH_HASHTREE_STRUCTS_H__ + +#include "hash_state.h" + +struct __hashtree_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_float32 c; //constant c + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 **g; + cmph_uint32 k; //number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +struct __hashtree_config_data_t +{ + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; //edges (words) count + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 *offset; //offset[i] stores the sum size[0] + ... size[i - 1] + cmph_uint32 k; //number of components + cmph_uint32 memory; + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +#endif From 3cd94080ee2e166cfc66b03c272b5c2310b93f08 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 22:31:02 +0000 Subject: [PATCH 213/739] Starting to implement hashtree algorithm. --- src/hashtree.c | 192 ++++++++++++++++++++--------------------- src/hashtree.h | 1 + src/hashtree_structs.h | 1 + 3 files changed, 96 insertions(+), 98 deletions(-) diff --git a/src/hashtree.c b/src/hashtree.c index 7feec29..31e64f0 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "chm.h" +#include "hashtree.h" #include "cmph_structs.h" -#include "chm_structs.h" +#include "hastree_structs.h" #include "hash.h" #include "bitbool.h" @@ -14,77 +14,73 @@ //#define DEBUG #include "debug.h" -static int chm_gen_edges(cmph_config_t *mph); -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); - -chm_config_data_t *chm_config_new() +hashtree_config_data_t *hashtree_config_new() { - chm_config_data_t *chm; - chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); - assert(chm); - memset(chm,0,sizeof(chm_config_data_t)); - chm->hashfuncs[0] = CMPH_HASH_JENKINS; - chm->hashfuncs[1] = CMPH_HASH_JENKINS; - chm->g = NULL; - chm->graph = NULL; - chm->hashes = NULL; - return chm; + hashtree_config_data_t *hashtree; + hashtree = (hashtree_config_data_t *)malloc(sizeof(hashtree_config_data_t)); + if (!hashtree) return NULL; + memset(hashtree, 0, sizeof(hashtree_config_data_t)); + hashtree->hashfuncs[0] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[1] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[2] = CMPH_HASH_JENKINS; + hashtree->memory = 32 * 1024 * 1024; + return hashtree; } -void chm_config_destroy(cmph_config_t *mph) +void hashtree_config_destroy(cmph_config_t *mph) { - chm_config_data_t *data = (chm_config_data_t *)mph->data; + hashtree_config_data_t *data = (hashtree_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); } -void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) { - if (i >= 2) break; //chm only uses two hash functions - chm->hashfuncs[i] = *hashptr; + if (i >= 3) break; //hashtree only uses three hash functions + hashtree->hashfuncs[i] = *hashptr; ++i, ++hashptr; } } -cmph_t *chm_new(cmph_config_t *mph, float c) +cmph_t *hashtree_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; - chm_data_t *chmf = NULL; + hashtree_data_t *hashtreef = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; - chm->n = ceil(c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); - chm->graph = graph_new(chm->n, chm->m); + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + hashtree->m = mph->key_source->nkeys; + hashtree->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", hashtree->m, hashtree->n, c); + hashtree->graph = graph_new(hashtree->n, hashtree->m); DEBUGP("Created graph\n"); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); - for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) hashtree->hashes[i] = NULL; //Mapping step if (mph->verbosity) { - fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", hashtree->m, hashtree->n); } while(1) { int ok; - chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); - chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); - ok = chm_gen_edges(mph); + hashtree->hashes[0] = hash_state_new(hashtree->hashfuncs[0], hashtree->n); + hashtree->hashes[1] = hash_state_new(hashtree->hashfuncs[1], hashtree->n); + ok = hashtree_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(chm->hashes[0]); - chm->hashes[0] = NULL; - hash_state_destroy(chm->hashes[1]); - chm->hashes[1] = NULL; + hash_state_destroy(hashtree->hashes[0]); + hashtree->hashes[0] = NULL; + hash_state_destroy(hashtree->hashes[1]); + hashtree->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) { @@ -96,7 +92,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); return NULL; } @@ -106,34 +102,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); - memset(visited, 0, chm->n/8 + 1); - free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); - assert(chm->g); - for (i = 0; i < chm->n; ++i) + visited = (char *)malloc(hashtree->n/8 + 1); + memset(visited, 0, hashtree->n/8 + 1); + free(hashtree->g); + hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + assert(hashtree->g); + for (i = 0; i < hashtree->n; ++i) { if (!GETBIT(visited,i)) { - chm->g[i] = 0; - chm_traverse(chm, visited, i); + hashtree->g[i] = 0; + hashtree_traverse(hashtree, visited, i); } } - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); free(visited); - chm->graph = NULL; + hashtree->graph = NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); - chmf->g = chm->g; - chm->g = NULL; //transfer memory ownership - chmf->hashes = chm->hashes; - chm->hashes = NULL; //transfer memory ownership - chmf->n = chm->n; - chmf->m = chm->m; - mphf->data = chmf; - mphf->size = chm->m; + hashtreef = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); + hashtreef->g = hashtree->g; + hashtree->g = NULL; //transfer memory ownership + hashtreef->hashes = hashtree->hashes; + hashtree->hashes = NULL; //transfer memory ownership + hashtreef->n = hashtree->n; + hashtreef->m = hashtree->m; + mphf->data = hashtreef; + mphf->size = hashtree->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -142,34 +138,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) return mphf; } -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +static void hashtree_traverse(hashtree_config_data_t *hashtree, cmph_uint8 *visited, cmph_uint32 v) { - graph_iterator_t it = graph_neighbors_it(chm->graph, v); + graph_iterator_t it = graph_neighbors_it(hashtree->graph, v); cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(hashtree->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); - chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); - chm_traverse(chm, visited, neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(hashtree->graph, v, neighbor)); + hashtree->g[neighbor] = graph_edge_id(hashtree->graph, v, neighbor) - hashtree->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", hashtree->g[neighbor], graph_edge_id(hashtree->graph, v, neighbor), hashtree->g[v], hashtree->m); + hashtree_traverse(hashtree, visited, neighbor); } } -static int chm_gen_edges(cmph_config_t *mph) +static int hashtree_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; int cycles = 0; - DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); - graph_clear_edges(chm->graph); + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", hashtree->n, cmph_hash_names[hashtree->hashfuncs[0]], cmph_hash_names[hashtree->hashfuncs[1]]); + graph_clear_edges(hashtree->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -177,9 +173,9 @@ static int chm_gen_edges(cmph_config_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(chm->hashes[0], key, keylen) % chm->n; - h2 = hash(chm->hashes[1], key, keylen) % chm->n; - if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; + if (h1 == h2) if (++h2 >= hashtree->n) h2 = 0; if (h1 == h2) { if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); @@ -188,21 +184,21 @@ static int chm_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(chm->graph, h1, h2); + graph_add_edge(hashtree->graph, h1, h2); } - cycles = graph_is_cyclic(chm->graph); + cycles = graph_is_cyclic(hashtree->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int chm_dump(cmph_t *mphf, FILE *fd) +int hashtree_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 two = 2; //number of hash functions - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); @@ -230,19 +226,19 @@ int chm_dump(cmph_t *mphf, FILE *fd) return 1; } -void chm_load(FILE *f, cmph_t *mphf) +void hashtree_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + hashtree_data_t *hashtree = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); - DEBUGP("Loading chm mphf\n"); - mphf->data = chm; + DEBUGP("Loading hashtree mphf\n"); + mphf->data = hashtree; fread(&nhashes, sizeof(cmph_uint32), 1, f); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - chm->hashes[nhashes] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + hashtree->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { @@ -252,38 +248,38 @@ void chm_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); state = hash_state_load(buf, buflen); - chm->hashes[i] = state; + hashtree->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(chm->n), sizeof(cmph_uint32), 1, f); - fread(&(chm->m), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->n), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->m), sizeof(cmph_uint32), 1, f); - chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); - fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + hashtree->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*hashtree->n); + fread(hashtree->g, hashtree->n*sizeof(cmph_uint32), 1, f); #ifdef DEBUG fprintf(stderr, "G: "); - for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + for (i = 0; i < hashtree->n; ++i) fprintf(stderr, "%u ", hashtree->g[i]); fprintf(stderr, "\n"); #endif return; } -cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - chm_data_t *chm = mphf->data; - cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; - cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + hashtree_data_t *hashtree = mphf->data; + cmph_uint32 h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + cmph_uint32 h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 >= chm->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); - return (chm->g[h1] + chm->g[h2]) % chm->m; + if (h1 == h2 && ++h2 >= hashtree->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, hashtree->g[h1], hashtree->g[h2], hashtree->m); + return (hashtree->g[h1] + hashtree->g[h2]) % hashtree->m; } -void chm_destroy(cmph_t *mphf) +void hashtree_destroy(cmph_t *mphf) { - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); diff --git a/src/hashtree.h b/src/hashtree.h index 7c736e7..0ed1e12 100644 --- a/src/hashtree.h +++ b/src/hashtree.h @@ -8,6 +8,7 @@ typedef struct __hashtree_config_data_t hashtree_config_data_t; hashtree_config_data_t *hashtree_config_new(); void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_set_leaf_algo(cmph_config_t *mph, CMPH_ALGO leaf_algo); void hashtree_config_destroy(cmph_config_t *mph); cmph_t *hashtree_new(cmph_config_t *mph, float c); diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h index f45a343..dd3052c 100644 --- a/src/hashtree_structs.h +++ b/src/hashtree_structs.h @@ -17,6 +17,7 @@ struct __hashtree_data_t struct __hashtree_config_data_t { + CMPH_ALGO leaf_algo; CMPH_HASH hashfuncs[3]; cmph_uint32 m; //edges (words) count cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] From 12445eb28765e3bed8b13aa6da7a8544037c3040 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 22:31:02 +0000 Subject: [PATCH 214/739] Starting to implement hashtree algorithm. --- src/hashtree.c | 192 ++++++++++++++++++++--------------------- src/hashtree.h | 1 + src/hashtree_structs.h | 1 + 3 files changed, 96 insertions(+), 98 deletions(-) diff --git a/src/hashtree.c b/src/hashtree.c index 7feec29..31e64f0 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "chm.h" +#include "hashtree.h" #include "cmph_structs.h" -#include "chm_structs.h" +#include "hastree_structs.h" #include "hash.h" #include "bitbool.h" @@ -14,77 +14,73 @@ //#define DEBUG #include "debug.h" -static int chm_gen_edges(cmph_config_t *mph); -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); - -chm_config_data_t *chm_config_new() +hashtree_config_data_t *hashtree_config_new() { - chm_config_data_t *chm; - chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); - assert(chm); - memset(chm,0,sizeof(chm_config_data_t)); - chm->hashfuncs[0] = CMPH_HASH_JENKINS; - chm->hashfuncs[1] = CMPH_HASH_JENKINS; - chm->g = NULL; - chm->graph = NULL; - chm->hashes = NULL; - return chm; + hashtree_config_data_t *hashtree; + hashtree = (hashtree_config_data_t *)malloc(sizeof(hashtree_config_data_t)); + if (!hashtree) return NULL; + memset(hashtree, 0, sizeof(hashtree_config_data_t)); + hashtree->hashfuncs[0] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[1] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[2] = CMPH_HASH_JENKINS; + hashtree->memory = 32 * 1024 * 1024; + return hashtree; } -void chm_config_destroy(cmph_config_t *mph) +void hashtree_config_destroy(cmph_config_t *mph) { - chm_config_data_t *data = (chm_config_data_t *)mph->data; + hashtree_config_data_t *data = (hashtree_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); } -void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) { - if (i >= 2) break; //chm only uses two hash functions - chm->hashfuncs[i] = *hashptr; + if (i >= 3) break; //hashtree only uses three hash functions + hashtree->hashfuncs[i] = *hashptr; ++i, ++hashptr; } } -cmph_t *chm_new(cmph_config_t *mph, float c) +cmph_t *hashtree_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; - chm_data_t *chmf = NULL; + hashtree_data_t *hashtreef = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; - chm->n = ceil(c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); - chm->graph = graph_new(chm->n, chm->m); + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + hashtree->m = mph->key_source->nkeys; + hashtree->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", hashtree->m, hashtree->n, c); + hashtree->graph = graph_new(hashtree->n, hashtree->m); DEBUGP("Created graph\n"); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); - for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) hashtree->hashes[i] = NULL; //Mapping step if (mph->verbosity) { - fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", hashtree->m, hashtree->n); } while(1) { int ok; - chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); - chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); - ok = chm_gen_edges(mph); + hashtree->hashes[0] = hash_state_new(hashtree->hashfuncs[0], hashtree->n); + hashtree->hashes[1] = hash_state_new(hashtree->hashfuncs[1], hashtree->n); + ok = hashtree_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(chm->hashes[0]); - chm->hashes[0] = NULL; - hash_state_destroy(chm->hashes[1]); - chm->hashes[1] = NULL; + hash_state_destroy(hashtree->hashes[0]); + hashtree->hashes[0] = NULL; + hash_state_destroy(hashtree->hashes[1]); + hashtree->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) { @@ -96,7 +92,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); return NULL; } @@ -106,34 +102,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); - memset(visited, 0, chm->n/8 + 1); - free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); - assert(chm->g); - for (i = 0; i < chm->n; ++i) + visited = (char *)malloc(hashtree->n/8 + 1); + memset(visited, 0, hashtree->n/8 + 1); + free(hashtree->g); + hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + assert(hashtree->g); + for (i = 0; i < hashtree->n; ++i) { if (!GETBIT(visited,i)) { - chm->g[i] = 0; - chm_traverse(chm, visited, i); + hashtree->g[i] = 0; + hashtree_traverse(hashtree, visited, i); } } - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); free(visited); - chm->graph = NULL; + hashtree->graph = NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); - chmf->g = chm->g; - chm->g = NULL; //transfer memory ownership - chmf->hashes = chm->hashes; - chm->hashes = NULL; //transfer memory ownership - chmf->n = chm->n; - chmf->m = chm->m; - mphf->data = chmf; - mphf->size = chm->m; + hashtreef = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); + hashtreef->g = hashtree->g; + hashtree->g = NULL; //transfer memory ownership + hashtreef->hashes = hashtree->hashes; + hashtree->hashes = NULL; //transfer memory ownership + hashtreef->n = hashtree->n; + hashtreef->m = hashtree->m; + mphf->data = hashtreef; + mphf->size = hashtree->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -142,34 +138,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) return mphf; } -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +static void hashtree_traverse(hashtree_config_data_t *hashtree, cmph_uint8 *visited, cmph_uint32 v) { - graph_iterator_t it = graph_neighbors_it(chm->graph, v); + graph_iterator_t it = graph_neighbors_it(hashtree->graph, v); cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(hashtree->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); - chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); - chm_traverse(chm, visited, neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(hashtree->graph, v, neighbor)); + hashtree->g[neighbor] = graph_edge_id(hashtree->graph, v, neighbor) - hashtree->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", hashtree->g[neighbor], graph_edge_id(hashtree->graph, v, neighbor), hashtree->g[v], hashtree->m); + hashtree_traverse(hashtree, visited, neighbor); } } -static int chm_gen_edges(cmph_config_t *mph) +static int hashtree_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; int cycles = 0; - DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); - graph_clear_edges(chm->graph); + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", hashtree->n, cmph_hash_names[hashtree->hashfuncs[0]], cmph_hash_names[hashtree->hashfuncs[1]]); + graph_clear_edges(hashtree->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -177,9 +173,9 @@ static int chm_gen_edges(cmph_config_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(chm->hashes[0], key, keylen) % chm->n; - h2 = hash(chm->hashes[1], key, keylen) % chm->n; - if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; + if (h1 == h2) if (++h2 >= hashtree->n) h2 = 0; if (h1 == h2) { if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); @@ -188,21 +184,21 @@ static int chm_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(chm->graph, h1, h2); + graph_add_edge(hashtree->graph, h1, h2); } - cycles = graph_is_cyclic(chm->graph); + cycles = graph_is_cyclic(hashtree->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int chm_dump(cmph_t *mphf, FILE *fd) +int hashtree_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 two = 2; //number of hash functions - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); @@ -230,19 +226,19 @@ int chm_dump(cmph_t *mphf, FILE *fd) return 1; } -void chm_load(FILE *f, cmph_t *mphf) +void hashtree_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + hashtree_data_t *hashtree = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); - DEBUGP("Loading chm mphf\n"); - mphf->data = chm; + DEBUGP("Loading hashtree mphf\n"); + mphf->data = hashtree; fread(&nhashes, sizeof(cmph_uint32), 1, f); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - chm->hashes[nhashes] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + hashtree->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { @@ -252,38 +248,38 @@ void chm_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); state = hash_state_load(buf, buflen); - chm->hashes[i] = state; + hashtree->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(chm->n), sizeof(cmph_uint32), 1, f); - fread(&(chm->m), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->n), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->m), sizeof(cmph_uint32), 1, f); - chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); - fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + hashtree->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*hashtree->n); + fread(hashtree->g, hashtree->n*sizeof(cmph_uint32), 1, f); #ifdef DEBUG fprintf(stderr, "G: "); - for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + for (i = 0; i < hashtree->n; ++i) fprintf(stderr, "%u ", hashtree->g[i]); fprintf(stderr, "\n"); #endif return; } -cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - chm_data_t *chm = mphf->data; - cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; - cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + hashtree_data_t *hashtree = mphf->data; + cmph_uint32 h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + cmph_uint32 h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 >= chm->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); - return (chm->g[h1] + chm->g[h2]) % chm->m; + if (h1 == h2 && ++h2 >= hashtree->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, hashtree->g[h1], hashtree->g[h2], hashtree->m); + return (hashtree->g[h1] + hashtree->g[h2]) % hashtree->m; } -void chm_destroy(cmph_t *mphf) +void hashtree_destroy(cmph_t *mphf) { - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); diff --git a/src/hashtree.h b/src/hashtree.h index 7c736e7..0ed1e12 100644 --- a/src/hashtree.h +++ b/src/hashtree.h @@ -8,6 +8,7 @@ typedef struct __hashtree_config_data_t hashtree_config_data_t; hashtree_config_data_t *hashtree_config_new(); void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_set_leaf_algo(cmph_config_t *mph, CMPH_ALGO leaf_algo); void hashtree_config_destroy(cmph_config_t *mph); cmph_t *hashtree_new(cmph_config_t *mph, float c); diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h index f45a343..dd3052c 100644 --- a/src/hashtree_structs.h +++ b/src/hashtree_structs.h @@ -17,6 +17,7 @@ struct __hashtree_data_t struct __hashtree_config_data_t { + CMPH_ALGO leaf_algo; CMPH_HASH hashfuncs[3]; cmph_uint32 m; //edges (words) count cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] From ba8d86fc2ead48d6032769ce0c4bfe5719463cd4 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 22:31:02 +0000 Subject: [PATCH 215/739] Starting to implement hashtree algorithm. --- src/hashtree.c | 192 ++++++++++++++++++++--------------------- src/hashtree.h | 1 + src/hashtree_structs.h | 1 + 3 files changed, 96 insertions(+), 98 deletions(-) diff --git a/src/hashtree.c b/src/hashtree.c index 7feec29..31e64f0 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "chm.h" +#include "hashtree.h" #include "cmph_structs.h" -#include "chm_structs.h" +#include "hastree_structs.h" #include "hash.h" #include "bitbool.h" @@ -14,77 +14,73 @@ //#define DEBUG #include "debug.h" -static int chm_gen_edges(cmph_config_t *mph); -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); - -chm_config_data_t *chm_config_new() +hashtree_config_data_t *hashtree_config_new() { - chm_config_data_t *chm; - chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); - assert(chm); - memset(chm,0,sizeof(chm_config_data_t)); - chm->hashfuncs[0] = CMPH_HASH_JENKINS; - chm->hashfuncs[1] = CMPH_HASH_JENKINS; - chm->g = NULL; - chm->graph = NULL; - chm->hashes = NULL; - return chm; + hashtree_config_data_t *hashtree; + hashtree = (hashtree_config_data_t *)malloc(sizeof(hashtree_config_data_t)); + if (!hashtree) return NULL; + memset(hashtree, 0, sizeof(hashtree_config_data_t)); + hashtree->hashfuncs[0] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[1] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[2] = CMPH_HASH_JENKINS; + hashtree->memory = 32 * 1024 * 1024; + return hashtree; } -void chm_config_destroy(cmph_config_t *mph) +void hashtree_config_destroy(cmph_config_t *mph) { - chm_config_data_t *data = (chm_config_data_t *)mph->data; + hashtree_config_data_t *data = (hashtree_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); } -void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) { - if (i >= 2) break; //chm only uses two hash functions - chm->hashfuncs[i] = *hashptr; + if (i >= 3) break; //hashtree only uses three hash functions + hashtree->hashfuncs[i] = *hashptr; ++i, ++hashptr; } } -cmph_t *chm_new(cmph_config_t *mph, float c) +cmph_t *hashtree_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; - chm_data_t *chmf = NULL; + hashtree_data_t *hashtreef = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; - chm->n = ceil(c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); - chm->graph = graph_new(chm->n, chm->m); + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + hashtree->m = mph->key_source->nkeys; + hashtree->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", hashtree->m, hashtree->n, c); + hashtree->graph = graph_new(hashtree->n, hashtree->m); DEBUGP("Created graph\n"); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); - for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) hashtree->hashes[i] = NULL; //Mapping step if (mph->verbosity) { - fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", hashtree->m, hashtree->n); } while(1) { int ok; - chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); - chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); - ok = chm_gen_edges(mph); + hashtree->hashes[0] = hash_state_new(hashtree->hashfuncs[0], hashtree->n); + hashtree->hashes[1] = hash_state_new(hashtree->hashfuncs[1], hashtree->n); + ok = hashtree_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(chm->hashes[0]); - chm->hashes[0] = NULL; - hash_state_destroy(chm->hashes[1]); - chm->hashes[1] = NULL; + hash_state_destroy(hashtree->hashes[0]); + hashtree->hashes[0] = NULL; + hash_state_destroy(hashtree->hashes[1]); + hashtree->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) { @@ -96,7 +92,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); return NULL; } @@ -106,34 +102,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); - memset(visited, 0, chm->n/8 + 1); - free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); - assert(chm->g); - for (i = 0; i < chm->n; ++i) + visited = (char *)malloc(hashtree->n/8 + 1); + memset(visited, 0, hashtree->n/8 + 1); + free(hashtree->g); + hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + assert(hashtree->g); + for (i = 0; i < hashtree->n; ++i) { if (!GETBIT(visited,i)) { - chm->g[i] = 0; - chm_traverse(chm, visited, i); + hashtree->g[i] = 0; + hashtree_traverse(hashtree, visited, i); } } - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); free(visited); - chm->graph = NULL; + hashtree->graph = NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); - chmf->g = chm->g; - chm->g = NULL; //transfer memory ownership - chmf->hashes = chm->hashes; - chm->hashes = NULL; //transfer memory ownership - chmf->n = chm->n; - chmf->m = chm->m; - mphf->data = chmf; - mphf->size = chm->m; + hashtreef = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); + hashtreef->g = hashtree->g; + hashtree->g = NULL; //transfer memory ownership + hashtreef->hashes = hashtree->hashes; + hashtree->hashes = NULL; //transfer memory ownership + hashtreef->n = hashtree->n; + hashtreef->m = hashtree->m; + mphf->data = hashtreef; + mphf->size = hashtree->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -142,34 +138,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) return mphf; } -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +static void hashtree_traverse(hashtree_config_data_t *hashtree, cmph_uint8 *visited, cmph_uint32 v) { - graph_iterator_t it = graph_neighbors_it(chm->graph, v); + graph_iterator_t it = graph_neighbors_it(hashtree->graph, v); cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(hashtree->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); - chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); - chm_traverse(chm, visited, neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(hashtree->graph, v, neighbor)); + hashtree->g[neighbor] = graph_edge_id(hashtree->graph, v, neighbor) - hashtree->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", hashtree->g[neighbor], graph_edge_id(hashtree->graph, v, neighbor), hashtree->g[v], hashtree->m); + hashtree_traverse(hashtree, visited, neighbor); } } -static int chm_gen_edges(cmph_config_t *mph) +static int hashtree_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; int cycles = 0; - DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); - graph_clear_edges(chm->graph); + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", hashtree->n, cmph_hash_names[hashtree->hashfuncs[0]], cmph_hash_names[hashtree->hashfuncs[1]]); + graph_clear_edges(hashtree->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -177,9 +173,9 @@ static int chm_gen_edges(cmph_config_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(chm->hashes[0], key, keylen) % chm->n; - h2 = hash(chm->hashes[1], key, keylen) % chm->n; - if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; + if (h1 == h2) if (++h2 >= hashtree->n) h2 = 0; if (h1 == h2) { if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); @@ -188,21 +184,21 @@ static int chm_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(chm->graph, h1, h2); + graph_add_edge(hashtree->graph, h1, h2); } - cycles = graph_is_cyclic(chm->graph); + cycles = graph_is_cyclic(hashtree->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int chm_dump(cmph_t *mphf, FILE *fd) +int hashtree_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 two = 2; //number of hash functions - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); @@ -230,19 +226,19 @@ int chm_dump(cmph_t *mphf, FILE *fd) return 1; } -void chm_load(FILE *f, cmph_t *mphf) +void hashtree_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + hashtree_data_t *hashtree = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); - DEBUGP("Loading chm mphf\n"); - mphf->data = chm; + DEBUGP("Loading hashtree mphf\n"); + mphf->data = hashtree; fread(&nhashes, sizeof(cmph_uint32), 1, f); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - chm->hashes[nhashes] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + hashtree->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { @@ -252,38 +248,38 @@ void chm_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); state = hash_state_load(buf, buflen); - chm->hashes[i] = state; + hashtree->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(chm->n), sizeof(cmph_uint32), 1, f); - fread(&(chm->m), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->n), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->m), sizeof(cmph_uint32), 1, f); - chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); - fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + hashtree->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*hashtree->n); + fread(hashtree->g, hashtree->n*sizeof(cmph_uint32), 1, f); #ifdef DEBUG fprintf(stderr, "G: "); - for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + for (i = 0; i < hashtree->n; ++i) fprintf(stderr, "%u ", hashtree->g[i]); fprintf(stderr, "\n"); #endif return; } -cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - chm_data_t *chm = mphf->data; - cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; - cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + hashtree_data_t *hashtree = mphf->data; + cmph_uint32 h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + cmph_uint32 h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 >= chm->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); - return (chm->g[h1] + chm->g[h2]) % chm->m; + if (h1 == h2 && ++h2 >= hashtree->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, hashtree->g[h1], hashtree->g[h2], hashtree->m); + return (hashtree->g[h1] + hashtree->g[h2]) % hashtree->m; } -void chm_destroy(cmph_t *mphf) +void hashtree_destroy(cmph_t *mphf) { - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); diff --git a/src/hashtree.h b/src/hashtree.h index 7c736e7..0ed1e12 100644 --- a/src/hashtree.h +++ b/src/hashtree.h @@ -8,6 +8,7 @@ typedef struct __hashtree_config_data_t hashtree_config_data_t; hashtree_config_data_t *hashtree_config_new(); void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_set_leaf_algo(cmph_config_t *mph, CMPH_ALGO leaf_algo); void hashtree_config_destroy(cmph_config_t *mph); cmph_t *hashtree_new(cmph_config_t *mph, float c); diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h index f45a343..dd3052c 100644 --- a/src/hashtree_structs.h +++ b/src/hashtree_structs.h @@ -17,6 +17,7 @@ struct __hashtree_data_t struct __hashtree_config_data_t { + CMPH_ALGO leaf_algo; CMPH_HASH hashfuncs[3]; cmph_uint32 m; //edges (words) count cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] From f2b6da9a13da19e2d2fc6a8d503d8d125839ec61 Mon Sep 17 00:00:00 2001 From: davi Date: Fri, 23 Sep 2005 22:31:02 +0000 Subject: [PATCH 216/739] Starting to implement hashtree algorithm. --- src/hashtree.c | 192 ++++++++++++++++++++--------------------- src/hashtree.h | 1 + src/hashtree_structs.h | 1 + 3 files changed, 96 insertions(+), 98 deletions(-) diff --git a/src/hashtree.c b/src/hashtree.c index 7feec29..31e64f0 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -1,7 +1,7 @@ #include "graph.h" -#include "chm.h" +#include "hashtree.h" #include "cmph_structs.h" -#include "chm_structs.h" +#include "hastree_structs.h" #include "hash.h" #include "bitbool.h" @@ -14,77 +14,73 @@ //#define DEBUG #include "debug.h" -static int chm_gen_edges(cmph_config_t *mph); -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); - -chm_config_data_t *chm_config_new() +hashtree_config_data_t *hashtree_config_new() { - chm_config_data_t *chm; - chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); - assert(chm); - memset(chm,0,sizeof(chm_config_data_t)); - chm->hashfuncs[0] = CMPH_HASH_JENKINS; - chm->hashfuncs[1] = CMPH_HASH_JENKINS; - chm->g = NULL; - chm->graph = NULL; - chm->hashes = NULL; - return chm; + hashtree_config_data_t *hashtree; + hashtree = (hashtree_config_data_t *)malloc(sizeof(hashtree_config_data_t)); + if (!hashtree) return NULL; + memset(hashtree, 0, sizeof(hashtree_config_data_t)); + hashtree->hashfuncs[0] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[1] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[2] = CMPH_HASH_JENKINS; + hashtree->memory = 32 * 1024 * 1024; + return hashtree; } -void chm_config_destroy(cmph_config_t *mph) +void hashtree_config_destroy(cmph_config_t *mph) { - chm_config_data_t *data = (chm_config_data_t *)mph->data; + hashtree_config_data_t *data = (hashtree_config_data_t *)mph->data; DEBUGP("Destroying algorithm dependent data\n"); free(data); } -void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) { - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; CMPH_HASH *hashptr = hashfuncs; cmph_uint32 i = 0; while(*hashptr != CMPH_HASH_COUNT) { - if (i >= 2) break; //chm only uses two hash functions - chm->hashfuncs[i] = *hashptr; + if (i >= 3) break; //hashtree only uses three hash functions + hashtree->hashfuncs[i] = *hashptr; ++i, ++hashptr; } } -cmph_t *chm_new(cmph_config_t *mph, float c) +cmph_t *hashtree_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; - chm_data_t *chmf = NULL; + hashtree_data_t *hashtreef = NULL; cmph_uint32 i; cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; - chm->n = ceil(c * mph->key_source->nkeys); - DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); - chm->graph = graph_new(chm->n, chm->m); + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + hashtree->m = mph->key_source->nkeys; + hashtree->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", hashtree->m, hashtree->n, c); + hashtree->graph = graph_new(hashtree->n, hashtree->m); DEBUGP("Created graph\n"); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); - for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) hashtree->hashes[i] = NULL; //Mapping step if (mph->verbosity) { - fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", hashtree->m, hashtree->n); } while(1) { int ok; - chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); - chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); - ok = chm_gen_edges(mph); + hashtree->hashes[0] = hash_state_new(hashtree->hashfuncs[0], hashtree->n); + hashtree->hashes[1] = hash_state_new(hashtree->hashfuncs[1], hashtree->n); + ok = hashtree_gen_edges(mph); if (!ok) { --iterations; - hash_state_destroy(chm->hashes[0]); - chm->hashes[0] = NULL; - hash_state_destroy(chm->hashes[1]); - chm->hashes[1] = NULL; + hash_state_destroy(hashtree->hashes[0]); + hashtree->hashes[0] = NULL; + hash_state_destroy(hashtree->hashes[1]); + hashtree->hashes[1] = NULL; DEBUGP("%u iterations remaining\n", iterations); if (mph->verbosity) { @@ -96,7 +92,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) } if (iterations == 0) { - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); return NULL; } @@ -106,34 +102,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); - memset(visited, 0, chm->n/8 + 1); - free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); - assert(chm->g); - for (i = 0; i < chm->n; ++i) + visited = (char *)malloc(hashtree->n/8 + 1); + memset(visited, 0, hashtree->n/8 + 1); + free(hashtree->g); + hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + assert(hashtree->g); + for (i = 0; i < hashtree->n; ++i) { if (!GETBIT(visited,i)) { - chm->g[i] = 0; - chm_traverse(chm, visited, i); + hashtree->g[i] = 0; + hashtree_traverse(hashtree, visited, i); } } - graph_destroy(chm->graph); + graph_destroy(hashtree->graph); free(visited); - chm->graph = NULL; + hashtree->graph = NULL; mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; - chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); - chmf->g = chm->g; - chm->g = NULL; //transfer memory ownership - chmf->hashes = chm->hashes; - chm->hashes = NULL; //transfer memory ownership - chmf->n = chm->n; - chmf->m = chm->m; - mphf->data = chmf; - mphf->size = chm->m; + hashtreef = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); + hashtreef->g = hashtree->g; + hashtree->g = NULL; //transfer memory ownership + hashtreef->hashes = hashtree->hashes; + hashtree->hashes = NULL; //transfer memory ownership + hashtreef->n = hashtree->n; + hashtreef->m = hashtree->m; + mphf->data = hashtreef; + mphf->size = hashtree->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -142,34 +138,34 @@ cmph_t *chm_new(cmph_config_t *mph, float c) return mphf; } -static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +static void hashtree_traverse(hashtree_config_data_t *hashtree, cmph_uint8 *visited, cmph_uint32 v) { - graph_iterator_t it = graph_neighbors_it(chm->graph, v); + graph_iterator_t it = graph_neighbors_it(hashtree->graph, v); cmph_uint32 neighbor = 0; SETBIT(visited,v); DEBUGP("Visiting vertex %u\n", v); - while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + while((neighbor = graph_next_neighbor(hashtree->graph, &it)) != GRAPH_NO_NEIGHBOR) { DEBUGP("Visiting neighbor %u\n", neighbor); if(GETBIT(visited,neighbor)) continue; DEBUGP("Visiting neighbor %u\n", neighbor); - DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); - chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; - DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); - chm_traverse(chm, visited, neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(hashtree->graph, v, neighbor)); + hashtree->g[neighbor] = graph_edge_id(hashtree->graph, v, neighbor) - hashtree->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", hashtree->g[neighbor], graph_edge_id(hashtree->graph, v, neighbor), hashtree->g[v], hashtree->m); + hashtree_traverse(hashtree, visited, neighbor); } } -static int chm_gen_edges(cmph_config_t *mph) +static int hashtree_gen_edges(cmph_config_t *mph) { cmph_uint32 e; - chm_config_data_t *chm = (chm_config_data_t *)mph->data; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; int cycles = 0; - DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); - graph_clear_edges(chm->graph); + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", hashtree->n, cmph_hash_names[hashtree->hashfuncs[0]], cmph_hash_names[hashtree->hashfuncs[1]]); + graph_clear_edges(hashtree->graph); mph->key_source->rewind(mph->key_source->data); for (e = 0; e < mph->key_source->nkeys; ++e) { @@ -177,9 +173,9 @@ static int chm_gen_edges(cmph_config_t *mph) cmph_uint32 keylen; char *key; mph->key_source->read(mph->key_source->data, &key, &keylen); - h1 = hash(chm->hashes[0], key, keylen) % chm->n; - h2 = hash(chm->hashes[1], key, keylen) % chm->n; - if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; + if (h1 == h2) if (++h2 >= hashtree->n) h2 = 0; if (h1 == h2) { if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); @@ -188,21 +184,21 @@ static int chm_gen_edges(cmph_config_t *mph) } DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); - graph_add_edge(chm->graph, h1, h2); + graph_add_edge(hashtree->graph, h1, h2); } - cycles = graph_is_cyclic(chm->graph); + cycles = graph_is_cyclic(hashtree->graph); if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); DEBUGP("Looking for cycles: %u\n", cycles); return ! cycles; } -int chm_dump(cmph_t *mphf, FILE *fd) +int hashtree_dump(cmph_t *mphf, FILE *fd) { char *buf = NULL; cmph_uint32 buflen; cmph_uint32 two = 2; //number of hash functions - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; __cmph_dump(mphf, fd); fwrite(&two, sizeof(cmph_uint32), 1, fd); @@ -230,19 +226,19 @@ int chm_dump(cmph_t *mphf, FILE *fd) return 1; } -void chm_load(FILE *f, cmph_t *mphf) +void hashtree_load(FILE *f, cmph_t *mphf) { cmph_uint32 nhashes; char *buf = NULL; cmph_uint32 buflen; cmph_uint32 i; - chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + hashtree_data_t *hashtree = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); - DEBUGP("Loading chm mphf\n"); - mphf->data = chm; + DEBUGP("Loading hashtree mphf\n"); + mphf->data = hashtree; fread(&nhashes, sizeof(cmph_uint32), 1, f); - chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); - chm->hashes[nhashes] = NULL; + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + hashtree->hashes[nhashes] = NULL; DEBUGP("Reading %u hashes\n", nhashes); for (i = 0; i < nhashes; ++i) { @@ -252,38 +248,38 @@ void chm_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); state = hash_state_load(buf, buflen); - chm->hashes[i] = state; + hashtree->hashes[i] = state; free(buf); } DEBUGP("Reading m and n\n"); - fread(&(chm->n), sizeof(cmph_uint32), 1, f); - fread(&(chm->m), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->n), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->m), sizeof(cmph_uint32), 1, f); - chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); - fread(chm->g, chm->n*sizeof(cmph_uint32), 1, f); + hashtree->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*hashtree->n); + fread(hashtree->g, hashtree->n*sizeof(cmph_uint32), 1, f); #ifdef DEBUG fprintf(stderr, "G: "); - for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + for (i = 0; i < hashtree->n; ++i) fprintf(stderr, "%u ", hashtree->g[i]); fprintf(stderr, "\n"); #endif return; } -cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { - chm_data_t *chm = mphf->data; - cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; - cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + hashtree_data_t *hashtree = mphf->data; + cmph_uint32 h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + cmph_uint32 h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); - if (h1 == h2 && ++h2 >= chm->n) h2 = 0; - DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); - return (chm->g[h1] + chm->g[h2]) % chm->m; + if (h1 == h2 && ++h2 >= hashtree->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, hashtree->g[h1], hashtree->g[h2], hashtree->m); + return (hashtree->g[h1] + hashtree->g[h2]) % hashtree->m; } -void chm_destroy(cmph_t *mphf) +void hashtree_destroy(cmph_t *mphf) { - chm_data_t *data = (chm_data_t *)mphf->data; + hashtree_data_t *data = (hashtree_data_t *)mphf->data; free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); diff --git a/src/hashtree.h b/src/hashtree.h index 7c736e7..0ed1e12 100644 --- a/src/hashtree.h +++ b/src/hashtree.h @@ -8,6 +8,7 @@ typedef struct __hashtree_config_data_t hashtree_config_data_t; hashtree_config_data_t *hashtree_config_new(); void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_set_leaf_algo(cmph_config_t *mph, CMPH_ALGO leaf_algo); void hashtree_config_destroy(cmph_config_t *mph); cmph_t *hashtree_new(cmph_config_t *mph, float c); diff --git a/src/hashtree_structs.h b/src/hashtree_structs.h index f45a343..dd3052c 100644 --- a/src/hashtree_structs.h +++ b/src/hashtree_structs.h @@ -17,6 +17,7 @@ struct __hashtree_data_t struct __hashtree_config_data_t { + CMPH_ALGO leaf_algo; CMPH_HASH hashfuncs[3]; cmph_uint32 m; //edges (words) count cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] From aa501651c126c5dad99138109c44a57ad1296fc5 Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 04:30:54 +0000 Subject: [PATCH 217/739] Added gentoo ebuild. --- COPYING | 642 ++++++++++---------------- ChangeLog | 321 +++++++++++++ examples/Makefile | 435 ----------------- examples/Makefile.in | 416 +++++++---------- portage/dev-libs/cmph/ChangeLog | 8 + portage/dev-libs/cmph/cmph-0.4.ebuild | 25 + portage/dev-libs/cmph/metadata.xml | 5 + tests/graph_tests.c | 6 +- 8 files changed, 757 insertions(+), 1101 deletions(-) delete mode 100644 examples/Makefile create mode 100644 portage/dev-libs/cmph/ChangeLog create mode 100644 portage/dev-libs/cmph/cmph-0.4.ebuild create mode 100644 portage/dev-libs/cmph/metadata.xml diff --git a/COPYING b/COPYING index 8add30a..60549be 100644 --- a/COPYING +++ b/COPYING @@ -1,397 +1,221 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + 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 +this service 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 make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. +modification follow. - GNU LESSER GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, +identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of +on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Library. +collective works based on the Program. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. 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 not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not + 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are +distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Library or works based on it. +the Program or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with +You are not responsible for enforcing compliance by third parties to this License. - - 11. If, as a consequence of a court judgment or allegation of patent + + 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. +refrain entirely from distribution of the Program. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is +integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -401,104 +225,116 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the 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 -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Libraries + How to Apply These Terms to Your New Programs - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). + 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 apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. + 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 +convey 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) + + Copyright (C) 19yy - This library 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 2.1 of the License, or (at your option) any later version. + 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 2 of the License, or + (at your option) any later version. - This library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if +school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. - , 1 April 1990 + , 1 April 1989 Ty Coon, President of Vice -That's all there is to it! - - +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index 65fe7fd..d846708 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,324 @@ +2005-08-08 18:34 fc_botelho + + * INSTALL, examples/Makefile, examples/Makefile.in, + examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/brz.c: [no log message] + +2005-08-07 22:00 fc_botelho + + * src/: brz.c, brz.h, brz_structs.h, cmph.c, cmph.h, main.c: + temporary directory passed by command line + +2005-08-07 20:22 fc_botelho + + * src/brz.c: stable version of BRZ + +2005-08-06 22:09 fc_botelho + + * src/bmz.c: no message + +2005-08-06 22:02 fc_botelho + + * src/bmz.c: no message + +2005-08-06 21:45 fc_botelho + + * src/brz.c: fastest version of BRZ + +2005-08-06 17:20 fc_botelho + + * src/: bmz.c, brz.c, main.c: [no log message] + +2005-07-29 16:43 fc_botelho + + * src/brz.c: BRZ algorithm is almost stable + +2005-07-29 15:29 fc_botelho + + * src/: bmz.c, brz.c, brz_structs.h, cmph_types.h: BRZ algorithm is + almost stable + +2005-07-29 00:09 fc_botelho + + * src/: brz.c, djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, + hash.c, hash.h, jenkins_hash.c, jenkins_hash.h, sdbm_hash.c, + sdbm_hash.h: it was fixed more mistakes in BRZ algorithm + +2005-07-28 21:00 fc_botelho + + * src/: bmz.c, brz.c, cmph.c: fixed some mistakes in BRZ algorithm + +2005-07-27 19:13 fc_botelho + + * src/brz.c: algorithm BRZ included + +2005-07-27 18:16 fc_botelho + + * src/: bmz_structs.h, brz.c, brz.h, brz_structs.h: Algorithm BRZ + included + +2005-07-27 18:13 fc_botelho + + * src/: Makefile.am, bmz.c, chm.c, cmph.c, cmph.h, cmph_types.h: + Algorithm BRZ included + +2005-07-25 19:18 fc_botelho + + * README, README.t2t, scpscript: it was included an examples + directory + +2005-07-25 18:26 fc_botelho + + * INSTALL, Makefile.am, configure.ac, examples/Makefile, + examples/Makefile.am, examples/Makefile.in, + examples/file_adapter_ex2.c, examples/keys.txt, + examples/vector_adapter_ex1.c, examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/cmph.c, src/cmph.h: it + was included a examples directory + +2005-03-03 02:07 davi + + * src/: bmz.c, chm.c, chm.h, chm_structs.h, cmph.c, cmph.h, + graph.c, graph.h, jenkins_hash.c, jenkins_hash.h, main.c (xgraph): + New f*cking cool algorithm works. Roughly implemented in chm.c + +2005-03-02 20:55 davi + + * src/xgraph.c (xgraph): xchmr working nice, but a bit slow + +2005-03-02 02:01 davi + + * src/xchmr.h: file xchmr.h was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr_structs.h: file xchmr_structs.h was initially added on + branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr.c: file xchmr.c was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/: Makefile.am, cmph.c, cmph_types.h, xchmr.c, xchmr.h, + xchmr_structs.h, xgraph.c, xgraph.h (xgraph): xchmr working fine + except for false positives on cyclic detection. + +2005-03-02 00:05 davi + + * src/: Makefile.am, xgraph.c, xgraph.h (xgraph): Added external + graph functionality in branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.c: file xgraph.c was initially added on branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.h: file xgraph.h was initially added on branch xgraph. + +2005-02-28 19:53 davi + + * src/chm.c: Fixed off by one bug in chm. + +2005-02-17 16:20 fc_botelho + + * LOGO.html, README, README.t2t, gendocs: The way of calling the + function cmph_search was fixed in the file README.t2t + +2005-01-31 17:13 fc_botelho + + * README.t2t: Heuristic BMZ memory consumption was updated + +2005-01-31 17:09 fc_botelho + + * BMZ.t2t: DJB2, SDBM, FNV and Jenkins hash link were added + +2005-01-31 16:50 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONCEPTS.t2t, CONFIG.t2t, + FAQ.t2t, GPERF.t2t, LOGO.t2t, README.t2t, TABLE1.t2t, TABLE4.t2t, + TABLE5.t2t, DOC.css: BMZ documentation was finished + +2005-01-28 18:12 fc_botelho + + * figs/img1.png, figs/img10.png, figs/img100.png, figs/img101.png, + figs/img102.png, figs/img103.png, figs/img104.png, figs/img105.png, + figs/img106.png, figs/img107.png, figs/img108.png, figs/img109.png, + papers/bmz_tr004_04.ps, papers/bmz_wea2005.ps, papers/chm92.pdf, + figs/img11.png, figs/img110.png, figs/img111.png, figs/img112.png, + figs/img113.png, figs/img114.png, figs/img115.png, figs/img116.png, + figs/img117.png, figs/img118.png, figs/img119.png, figs/img12.png, + figs/img120.png, figs/img121.png, figs/img122.png, figs/img123.png, + figs/img124.png, figs/img125.png, figs/img126.png, figs/img127.png, + figs/img128.png, figs/img129.png, figs/img13.png, figs/img130.png, + figs/img131.png, figs/img132.png, figs/img133.png, figs/img134.png, + figs/img135.png, figs/img136.png, figs/img137.png, figs/img138.png, + figs/img139.png, figs/img14.png, figs/img140.png, figs/img141.png, + figs/img142.png, figs/img143.png, figs/img144.png, figs/img145.png, + figs/img146.png, figs/img147.png, figs/img148.png, figs/img149.png, + figs/img15.png, figs/img150.png, figs/img151.png, figs/img152.png, + figs/img153.png, figs/img154.png, figs/img155.png, figs/img156.png, + figs/img157.png, figs/img158.png, figs/img159.png, figs/img16.png, + figs/img160.png, figs/img161.png, figs/img162.png, figs/img163.png, + figs/img164.png, figs/img165.png, figs/img166.png, figs/img167.png, + figs/img168.png, figs/img169.png, figs/img17.png, figs/img170.png, + figs/img171.png, figs/img172.png, figs/img173.png, figs/img174.png, + figs/img175.png, figs/img176.png, figs/img177.png, figs/img178.png, + figs/img179.png, figs/img18.png, figs/img180.png, figs/img181.png, + figs/img182.png, figs/img183.png, figs/img184.png, figs/img185.png, + figs/img186.png, figs/img187.png, figs/img188.png, figs/img189.png, + figs/img19.png, figs/img190.png, figs/img191.png, figs/img192.png, + figs/img193.png, figs/img194.png, figs/img195.png, figs/img196.png, + figs/img197.png, figs/img198.png, figs/img199.png, figs/img2.png, + figs/img20.png, figs/img200.png, figs/img201.png, figs/img202.png, + figs/img203.png, figs/img204.png, figs/img205.png, figs/img206.png, + figs/img207.png, figs/img208.png, figs/img209.png, figs/img21.png, + figs/img210.png, figs/img211.png, figs/img212.png, figs/img213.png, + figs/img214.png, figs/img215.png, figs/img216.png, figs/img217.png, + figs/img218.png, figs/img219.png, figs/img22.png, figs/img220.png, + figs/img221.png, figs/img222.png, figs/img223.png, figs/img224.png, + figs/img225.png, figs/img226.png, figs/img227.png, figs/img228.png, + figs/img229.png, figs/img23.png, figs/img230.png, figs/img231.png, + figs/img232.png, figs/img233.png, figs/img234.png, figs/img235.png, + figs/img236.png, figs/img237.png, figs/img238.png, figs/img239.png, + figs/img24.png, figs/img240.png, figs/img241.png, figs/img242.png, + figs/img243.png, figs/img244.png, figs/img245.png, figs/img246.png, + figs/img247.png, figs/img248.png, figs/img249.png, figs/img25.png, + figs/img250.png, figs/img251.png, figs/img252.png, figs/img253.png, + figs/img26.png, figs/img27.png, figs/img28.png, figs/img29.png, + figs/img3.png, figs/img30.png, figs/img31.png, figs/img32.png, + figs/img33.png, figs/img34.png, figs/img35.png, figs/img36.png, + figs/img37.png, figs/img38.png, figs/img39.png, figs/img4.png, + figs/img40.png, figs/img41.png, figs/img42.png, figs/img43.png, + figs/img44.png, figs/img45.png, figs/img46.png, figs/img47.png, + figs/img48.png, figs/img49.png, figs/img5.png, figs/img50.png, + figs/img51.png, figs/img52.png, figs/img53.png, figs/img54.png, + figs/img55.png, figs/img56.png, figs/img57.png, figs/img58.png, + figs/img59.png, figs/img6.png, figs/img60.png, figs/img61.png, + figs/img62.png, figs/img63.png, figs/img64.png, figs/img65.png, + figs/img66.png, figs/img67.png, figs/img68.png, figs/img69.png, + figs/img7.png, figs/img70.png, figs/img71.png, figs/img72.png, + figs/img73.png, figs/img74.png, figs/img75.png, figs/img76.png, + figs/img77.png, figs/img78.png, figs/img79.png, figs/img8.png, + figs/img80.png, figs/img81.png, figs/img82.png, figs/img83.png, + figs/img84.png, figs/img85.png, figs/img86.png, figs/img87.png, + figs/img88.png, figs/img89.png, figs/img9.png, figs/img90.png, + figs/img91.png, figs/img92.png, figs/img93.png, figs/img94.png, + figs/img95.png, figs/img96.png, figs/img97.png, figs/img98.png, + figs/img99.png: Initial version + +2005-01-28 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONFIG.t2t, README.t2t: It was + improved the documentation of BMZ and CHM algorithms + +2005-01-27 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, FAQ.t2t: history of BMZ algorithm is available + +2005-01-27 14:23 fc_botelho + + * AUTHORS: It was added the authors' email + +2005-01-27 14:21 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, FAQ.t2t, FOOTER.t2t, GPERF.t2t, + README.t2t: It was added FOOTER.t2t file + +2005-01-27 12:16 fc_botelho + + * src/cmph_types.h: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 12:12 fc_botelho + + * src/hash.c: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 11:01 davi + + * FAQ.t2t, README, README.t2t, gendocs, src/bmz.c, src/bmz.h, + src/chm.c, src/chm.h, src/cmph.c, src/cmph_structs.c, src/debug.h, + src/main.c: Fix to alternate hash functions code. Removed htonl + stuff from chm algorithm. Added faq. + +2005-01-27 09:14 fc_botelho + + * README.t2t: It was corrected some formatting mistakes + +2005-01-26 22:04 davi + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, GPERF.t2t, README, README.t2t, + gendocs: Added gperf notes. + +2005-01-25 19:10 fc_botelho + + * INSTALL: generated in version 0.3 + +2005-01-25 19:09 fc_botelho + + * src/: czech.c, czech.h, czech_structs.h: The czech.h, + czech_structs.h and czech.c files were removed + +2005-01-25 19:06 fc_botelho + + * src/: chm.c, chm.h, chm_structs.h, cmph.c, cmph_types.h, main.c, + Makefile.am: It was changed the prefix czech by chm + +2005-01-25 18:50 fc_botelho + + * gendocs: script to generate the documentation and the README file + +2005-01-25 18:47 fc_botelho + + * README: README was updated + +2005-01-25 18:44 fc_botelho + + * configure.ac: Version was updated + +2005-01-25 18:42 fc_botelho + + * src/cmph.h: Vector adapter commented + +2005-01-25 18:40 fc_botelho + + * CHM.t2t, CONFIG.t2t, LOGO.html: It was included the PreProc macro + through the CONFIG.t2t file and the LOGO through the LOGO.html file + +2005-01-25 18:33 fc_botelho + + * README.t2t, BMZ.t2t, COMPARISON.t2t, CZECH.t2t: It was included + the PreProc macro through the CONFIG.t2t file and the LOGO through + the LOGO.html file + +2005-01-24 18:25 fc_botelho + + * src/: bmz.c, bmz.h, cmph_structs.c, cmph_structs.h, czech.c, + cmph.c, czech.h, main.c, cmph.h: The file adpater was implemented. + +2005-01-24 17:20 fc_botelho + + * README.t2t: the memory consumption to create a mphf using bmz + with a heuristic was fixed. + +2005-01-24 17:11 fc_botelho + + * src/: cmph_types.h, main.c: The algorithms and hash functions + were put in alphabetical order + +2005-01-24 16:15 fc_botelho + + * BMZ.t2t, COMPARISON.t2t, CZECH.t2t, README.t2t: It was fixed some + English mistakes and It was included the files BMZ.t2t, CZECH.t2t + and COMPARISON.t2t + +2005-01-21 19:19 davi + + * ChangeLog, Doxyfile: Added Doxyfile. + 2005-01-21 19:14 davi * README.t2t, wingetopt.c, src/cmph.h, tests/graph_tests.c: Fixed diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index dd5c062..0000000 --- a/examples/Makefile +++ /dev/null @@ -1,435 +0,0 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. -# examples/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - -srcdir = . -top_srcdir = .. - -pkgdatadir = $(datadir)/cmph -pkglibdir = $(libdir)/cmph -pkgincludedir = $(includedir)/cmph -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = /usr/bin/install -c -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = i686-pc-linux-gnu -host_triplet = i686-pc-linux-gnu -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ - file_adapter_ex2$(EXEEXT) -subdir = examples -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) -file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) -file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) -vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) -vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ - $(vector_adapter_ex1_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run aclocal-1.9 -AMDEP_FALSE = # -AMDEP_TRUE = -AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run tar -AR = ar -AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoconf -AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoheader -AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run automake-1.9 -AWK = gawk -CC = gcc -CCDEPMODE = depmode=gcc3 -CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -CPP = gcc -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=gcc3 -CXXFLAGS = -g -O2 -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -ECHO = echo -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = grep -E -EXEEXT = -F77 = g77 -FFLAGS = -g -O2 -GETCONF = getconf -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s -LDFLAGS = -lm -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LN_S = ln -s -LTLIBOBJS = -MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run makeinfo -OBJEXT = o -PACKAGE = cmph -PACKAGE_BUGREPORT = -PACKAGE_NAME = -PACKAGE_STRING = -PACKAGE_TARNAME = -PACKAGE_VERSION = -PATH_SEPARATOR = : -RANLIB = ranlib -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -VERSION = 0.4 -ac_ct_AR = ar -ac_ct_CC = gcc -ac_ct_CXX = g++ -ac_ct_F77 = g77 -ac_ct_GETCONF = getconf -ac_ct_RANLIB = ranlib -ac_ct_STRIP = strip -am__fastdepCC_FALSE = # -am__fastdepCC_TRUE = -am__fastdepCXX_FALSE = # -am__fastdepCXX_TRUE = -am__include = include -am__leading_dot = . -am__quote = -am__tar = ${AMTAR} chof - "$$tardir" -am__untar = ${AMTAR} xf - -bindir = ${exec_prefix}/bin -build = i686-pc-linux-gnu -build_alias = -build_cpu = i686 -build_os = linux-gnu -build_vendor = pc -datadir = ${prefix}/share -exec_prefix = ${prefix} -host = i686-pc-linux-gnu -host_alias = -host_cpu = i686 -host_os = linux-gnu -host_vendor = pc -includedir = ${prefix}/include -infodir = ${prefix}/info -install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localstatedir = ${prefix}/var -mandir = ${prefix}/man -mkdir_p = mkdir -p -- -oldincludedir = /usr/include -prefix = /usr/local -program_transform_name = s,x,x, -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -sysconfdir = ${prefix}/etc -target_alias = -INCLUDES = -I../src/ -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -include ./$(DEPDIR)/file_adapter_ex2.Po -include ./$(DEPDIR)/vector_adapter_ex1.Po - -.c.o: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c $< - -.c.obj: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: - if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=yes \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/examples/Makefile.in b/examples/Makefile.in index 639e5c6..513ea93 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,8 +1,7 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. -# @configure_input@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,245 +13,129 @@ @SET_MAKE@ -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) +transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ +host_alias = @host_alias@ host_triplet = @host@ -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ - file_adapter_ex2$(EXEEXT) -subdir = examples -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) -file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) -file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) -vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) -vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ - $(vector_adapter_ex1_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ +AS = @AS@ AWK = @AWK@ CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ -FFLAGS = @FFLAGS@ +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ GETCONF = @GETCONF@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ +OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ +RC = @RC@ STRIP = @STRIP@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_GETCONF = @ac_ct_GETCONF@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ -am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ + +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + INCLUDES = -I../src/ + vector_adapter_ex1_LDADD = ../src/libcmph.la vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + file_adapter_ex2_LDADD = ../src/libcmph.la file_adapter_ex2_SOURCES = file_adapter_ex2.c +subdir = examples +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) +file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) +file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la +file_adapter_ex2_LDFLAGS = +am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) +vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) +vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la +vector_adapter_ex1_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ +@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) + all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_adapter_ex2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -262,77 +145,102 @@ clean-libtool: distclean-libtool: -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ uninstall-info-am: +tags: TAGS + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS + mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ + here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -342,7 +250,9 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) + installdirs: + install: install-am install-exec: install-exec-am install-data: install-data-am @@ -354,7 +264,6 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -362,7 +271,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -373,17 +282,14 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags dvi: dvi-am dvi-am: -html: html-am - info: info-am info-am: @@ -399,8 +305,7 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -408,27 +313,18 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - uninstall-am: uninstall-info-am -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am + tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/portage/dev-libs/cmph/ChangeLog b/portage/dev-libs/cmph/ChangeLog new file mode 100644 index 0000000..f621ba0 --- /dev/null +++ b/portage/dev-libs/cmph/ChangeLog @@ -0,0 +1,8 @@ +# ChangeLog for / +# Copyright 1999-2005 Gentoo Foundation; Distributed under the GPL v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/ChangeLog,v 1.1 2005/09/26 04:30:54 davi Exp $ + +*cmph-0.4 (25 Sep 2005) + + 25 Sep 2005; Davi de Castro Reis cmph-04.ebuild, metadata.xml, ChangeLog: + Initial import. diff --git a/portage/dev-libs/cmph/cmph-0.4.ebuild b/portage/dev-libs/cmph/cmph-0.4.ebuild new file mode 100644 index 0000000..7ae1c62 --- /dev/null +++ b/portage/dev-libs/cmph/cmph-0.4.ebuild @@ -0,0 +1,25 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/cmph-0.4.ebuild,v 1.1 2005/09/26 04:30:54 davi Exp $ + +inherit eutils +DESCRIPTION="Library for building large minimal perfect hashes" +HOMEPAGE="http://cmph.sf.net/" +SRC_URI="http://unc.dl.sourceforge.net/sourceforge/cmph/${P}.tar.gz" +LICENSE="LGPL-2" +SLOT="0" +KEYWORDS="~x86" +IUSE="" +DEPEND="gcc libtool libc" +RDEPEND="libc" + +S=${WORKDIR}/${P} + +src_compile() { + econf || die "econf failed" + emake || die "emake failed" +} + +src_install() { + make DESTDIR=${D} install || die +} diff --git a/portage/dev-libs/cmph/metadata.xml b/portage/dev-libs/cmph/metadata.xml new file mode 100644 index 0000000..20ce219 --- /dev/null +++ b/portage/dev-libs/cmph/metadata.xml @@ -0,0 +1,5 @@ + + + +no-herd + diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 74dd32e..39e9b3e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10); + graph_t *g = graph_new(5, 10, 0); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5); + g = graph_new(4, 5, 0); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4); + g = graph_new(5, 4, 0); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From a4b8e4d31ec17e5d47b5957760fda17f87fd3af3 Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 04:30:54 +0000 Subject: [PATCH 218/739] Added gentoo ebuild. --- COPYING | 642 ++++++++++---------------- ChangeLog | 321 +++++++++++++ portage/dev-libs/cmph/ChangeLog | 8 + portage/dev-libs/cmph/cmph-0.4.ebuild | 25 + portage/dev-libs/cmph/metadata.xml | 5 + tests/graph_tests.c | 6 +- 6 files changed, 601 insertions(+), 406 deletions(-) create mode 100644 portage/dev-libs/cmph/ChangeLog create mode 100644 portage/dev-libs/cmph/cmph-0.4.ebuild create mode 100644 portage/dev-libs/cmph/metadata.xml diff --git a/COPYING b/COPYING index 8add30a..60549be 100644 --- a/COPYING +++ b/COPYING @@ -1,397 +1,221 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + 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 +this service 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 make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. +modification follow. - GNU LESSER GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, +identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of +on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Library. +collective works based on the Program. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. 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 not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not + 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are +distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Library or works based on it. +the Program or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with +You are not responsible for enforcing compliance by third parties to this License. - - 11. If, as a consequence of a court judgment or allegation of patent + + 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. +refrain entirely from distribution of the Program. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is +integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -401,104 +225,116 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the 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 -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Libraries + How to Apply These Terms to Your New Programs - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). + 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 apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. + 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 +convey 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) + + Copyright (C) 19yy - This library 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 2.1 of the License, or (at your option) any later version. + 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 2 of the License, or + (at your option) any later version. - This library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if +school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. - , 1 April 1990 + , 1 April 1989 Ty Coon, President of Vice -That's all there is to it! - - +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index 65fe7fd..d846708 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,324 @@ +2005-08-08 18:34 fc_botelho + + * INSTALL, examples/Makefile, examples/Makefile.in, + examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/brz.c: [no log message] + +2005-08-07 22:00 fc_botelho + + * src/: brz.c, brz.h, brz_structs.h, cmph.c, cmph.h, main.c: + temporary directory passed by command line + +2005-08-07 20:22 fc_botelho + + * src/brz.c: stable version of BRZ + +2005-08-06 22:09 fc_botelho + + * src/bmz.c: no message + +2005-08-06 22:02 fc_botelho + + * src/bmz.c: no message + +2005-08-06 21:45 fc_botelho + + * src/brz.c: fastest version of BRZ + +2005-08-06 17:20 fc_botelho + + * src/: bmz.c, brz.c, main.c: [no log message] + +2005-07-29 16:43 fc_botelho + + * src/brz.c: BRZ algorithm is almost stable + +2005-07-29 15:29 fc_botelho + + * src/: bmz.c, brz.c, brz_structs.h, cmph_types.h: BRZ algorithm is + almost stable + +2005-07-29 00:09 fc_botelho + + * src/: brz.c, djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, + hash.c, hash.h, jenkins_hash.c, jenkins_hash.h, sdbm_hash.c, + sdbm_hash.h: it was fixed more mistakes in BRZ algorithm + +2005-07-28 21:00 fc_botelho + + * src/: bmz.c, brz.c, cmph.c: fixed some mistakes in BRZ algorithm + +2005-07-27 19:13 fc_botelho + + * src/brz.c: algorithm BRZ included + +2005-07-27 18:16 fc_botelho + + * src/: bmz_structs.h, brz.c, brz.h, brz_structs.h: Algorithm BRZ + included + +2005-07-27 18:13 fc_botelho + + * src/: Makefile.am, bmz.c, chm.c, cmph.c, cmph.h, cmph_types.h: + Algorithm BRZ included + +2005-07-25 19:18 fc_botelho + + * README, README.t2t, scpscript: it was included an examples + directory + +2005-07-25 18:26 fc_botelho + + * INSTALL, Makefile.am, configure.ac, examples/Makefile, + examples/Makefile.am, examples/Makefile.in, + examples/file_adapter_ex2.c, examples/keys.txt, + examples/vector_adapter_ex1.c, examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/cmph.c, src/cmph.h: it + was included a examples directory + +2005-03-03 02:07 davi + + * src/: bmz.c, chm.c, chm.h, chm_structs.h, cmph.c, cmph.h, + graph.c, graph.h, jenkins_hash.c, jenkins_hash.h, main.c (xgraph): + New f*cking cool algorithm works. Roughly implemented in chm.c + +2005-03-02 20:55 davi + + * src/xgraph.c (xgraph): xchmr working nice, but a bit slow + +2005-03-02 02:01 davi + + * src/xchmr.h: file xchmr.h was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr_structs.h: file xchmr_structs.h was initially added on + branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr.c: file xchmr.c was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/: Makefile.am, cmph.c, cmph_types.h, xchmr.c, xchmr.h, + xchmr_structs.h, xgraph.c, xgraph.h (xgraph): xchmr working fine + except for false positives on cyclic detection. + +2005-03-02 00:05 davi + + * src/: Makefile.am, xgraph.c, xgraph.h (xgraph): Added external + graph functionality in branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.c: file xgraph.c was initially added on branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.h: file xgraph.h was initially added on branch xgraph. + +2005-02-28 19:53 davi + + * src/chm.c: Fixed off by one bug in chm. + +2005-02-17 16:20 fc_botelho + + * LOGO.html, README, README.t2t, gendocs: The way of calling the + function cmph_search was fixed in the file README.t2t + +2005-01-31 17:13 fc_botelho + + * README.t2t: Heuristic BMZ memory consumption was updated + +2005-01-31 17:09 fc_botelho + + * BMZ.t2t: DJB2, SDBM, FNV and Jenkins hash link were added + +2005-01-31 16:50 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONCEPTS.t2t, CONFIG.t2t, + FAQ.t2t, GPERF.t2t, LOGO.t2t, README.t2t, TABLE1.t2t, TABLE4.t2t, + TABLE5.t2t, DOC.css: BMZ documentation was finished + +2005-01-28 18:12 fc_botelho + + * figs/img1.png, figs/img10.png, figs/img100.png, figs/img101.png, + figs/img102.png, figs/img103.png, figs/img104.png, figs/img105.png, + figs/img106.png, figs/img107.png, figs/img108.png, figs/img109.png, + papers/bmz_tr004_04.ps, papers/bmz_wea2005.ps, papers/chm92.pdf, + figs/img11.png, figs/img110.png, figs/img111.png, figs/img112.png, + figs/img113.png, figs/img114.png, figs/img115.png, figs/img116.png, + figs/img117.png, figs/img118.png, figs/img119.png, figs/img12.png, + figs/img120.png, figs/img121.png, figs/img122.png, figs/img123.png, + figs/img124.png, figs/img125.png, figs/img126.png, figs/img127.png, + figs/img128.png, figs/img129.png, figs/img13.png, figs/img130.png, + figs/img131.png, figs/img132.png, figs/img133.png, figs/img134.png, + figs/img135.png, figs/img136.png, figs/img137.png, figs/img138.png, + figs/img139.png, figs/img14.png, figs/img140.png, figs/img141.png, + figs/img142.png, figs/img143.png, figs/img144.png, figs/img145.png, + figs/img146.png, figs/img147.png, figs/img148.png, figs/img149.png, + figs/img15.png, figs/img150.png, figs/img151.png, figs/img152.png, + figs/img153.png, figs/img154.png, figs/img155.png, figs/img156.png, + figs/img157.png, figs/img158.png, figs/img159.png, figs/img16.png, + figs/img160.png, figs/img161.png, figs/img162.png, figs/img163.png, + figs/img164.png, figs/img165.png, figs/img166.png, figs/img167.png, + figs/img168.png, figs/img169.png, figs/img17.png, figs/img170.png, + figs/img171.png, figs/img172.png, figs/img173.png, figs/img174.png, + figs/img175.png, figs/img176.png, figs/img177.png, figs/img178.png, + figs/img179.png, figs/img18.png, figs/img180.png, figs/img181.png, + figs/img182.png, figs/img183.png, figs/img184.png, figs/img185.png, + figs/img186.png, figs/img187.png, figs/img188.png, figs/img189.png, + figs/img19.png, figs/img190.png, figs/img191.png, figs/img192.png, + figs/img193.png, figs/img194.png, figs/img195.png, figs/img196.png, + figs/img197.png, figs/img198.png, figs/img199.png, figs/img2.png, + figs/img20.png, figs/img200.png, figs/img201.png, figs/img202.png, + figs/img203.png, figs/img204.png, figs/img205.png, figs/img206.png, + figs/img207.png, figs/img208.png, figs/img209.png, figs/img21.png, + figs/img210.png, figs/img211.png, figs/img212.png, figs/img213.png, + figs/img214.png, figs/img215.png, figs/img216.png, figs/img217.png, + figs/img218.png, figs/img219.png, figs/img22.png, figs/img220.png, + figs/img221.png, figs/img222.png, figs/img223.png, figs/img224.png, + figs/img225.png, figs/img226.png, figs/img227.png, figs/img228.png, + figs/img229.png, figs/img23.png, figs/img230.png, figs/img231.png, + figs/img232.png, figs/img233.png, figs/img234.png, figs/img235.png, + figs/img236.png, figs/img237.png, figs/img238.png, figs/img239.png, + figs/img24.png, figs/img240.png, figs/img241.png, figs/img242.png, + figs/img243.png, figs/img244.png, figs/img245.png, figs/img246.png, + figs/img247.png, figs/img248.png, figs/img249.png, figs/img25.png, + figs/img250.png, figs/img251.png, figs/img252.png, figs/img253.png, + figs/img26.png, figs/img27.png, figs/img28.png, figs/img29.png, + figs/img3.png, figs/img30.png, figs/img31.png, figs/img32.png, + figs/img33.png, figs/img34.png, figs/img35.png, figs/img36.png, + figs/img37.png, figs/img38.png, figs/img39.png, figs/img4.png, + figs/img40.png, figs/img41.png, figs/img42.png, figs/img43.png, + figs/img44.png, figs/img45.png, figs/img46.png, figs/img47.png, + figs/img48.png, figs/img49.png, figs/img5.png, figs/img50.png, + figs/img51.png, figs/img52.png, figs/img53.png, figs/img54.png, + figs/img55.png, figs/img56.png, figs/img57.png, figs/img58.png, + figs/img59.png, figs/img6.png, figs/img60.png, figs/img61.png, + figs/img62.png, figs/img63.png, figs/img64.png, figs/img65.png, + figs/img66.png, figs/img67.png, figs/img68.png, figs/img69.png, + figs/img7.png, figs/img70.png, figs/img71.png, figs/img72.png, + figs/img73.png, figs/img74.png, figs/img75.png, figs/img76.png, + figs/img77.png, figs/img78.png, figs/img79.png, figs/img8.png, + figs/img80.png, figs/img81.png, figs/img82.png, figs/img83.png, + figs/img84.png, figs/img85.png, figs/img86.png, figs/img87.png, + figs/img88.png, figs/img89.png, figs/img9.png, figs/img90.png, + figs/img91.png, figs/img92.png, figs/img93.png, figs/img94.png, + figs/img95.png, figs/img96.png, figs/img97.png, figs/img98.png, + figs/img99.png: Initial version + +2005-01-28 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONFIG.t2t, README.t2t: It was + improved the documentation of BMZ and CHM algorithms + +2005-01-27 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, FAQ.t2t: history of BMZ algorithm is available + +2005-01-27 14:23 fc_botelho + + * AUTHORS: It was added the authors' email + +2005-01-27 14:21 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, FAQ.t2t, FOOTER.t2t, GPERF.t2t, + README.t2t: It was added FOOTER.t2t file + +2005-01-27 12:16 fc_botelho + + * src/cmph_types.h: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 12:12 fc_botelho + + * src/hash.c: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 11:01 davi + + * FAQ.t2t, README, README.t2t, gendocs, src/bmz.c, src/bmz.h, + src/chm.c, src/chm.h, src/cmph.c, src/cmph_structs.c, src/debug.h, + src/main.c: Fix to alternate hash functions code. Removed htonl + stuff from chm algorithm. Added faq. + +2005-01-27 09:14 fc_botelho + + * README.t2t: It was corrected some formatting mistakes + +2005-01-26 22:04 davi + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, GPERF.t2t, README, README.t2t, + gendocs: Added gperf notes. + +2005-01-25 19:10 fc_botelho + + * INSTALL: generated in version 0.3 + +2005-01-25 19:09 fc_botelho + + * src/: czech.c, czech.h, czech_structs.h: The czech.h, + czech_structs.h and czech.c files were removed + +2005-01-25 19:06 fc_botelho + + * src/: chm.c, chm.h, chm_structs.h, cmph.c, cmph_types.h, main.c, + Makefile.am: It was changed the prefix czech by chm + +2005-01-25 18:50 fc_botelho + + * gendocs: script to generate the documentation and the README file + +2005-01-25 18:47 fc_botelho + + * README: README was updated + +2005-01-25 18:44 fc_botelho + + * configure.ac: Version was updated + +2005-01-25 18:42 fc_botelho + + * src/cmph.h: Vector adapter commented + +2005-01-25 18:40 fc_botelho + + * CHM.t2t, CONFIG.t2t, LOGO.html: It was included the PreProc macro + through the CONFIG.t2t file and the LOGO through the LOGO.html file + +2005-01-25 18:33 fc_botelho + + * README.t2t, BMZ.t2t, COMPARISON.t2t, CZECH.t2t: It was included + the PreProc macro through the CONFIG.t2t file and the LOGO through + the LOGO.html file + +2005-01-24 18:25 fc_botelho + + * src/: bmz.c, bmz.h, cmph_structs.c, cmph_structs.h, czech.c, + cmph.c, czech.h, main.c, cmph.h: The file adpater was implemented. + +2005-01-24 17:20 fc_botelho + + * README.t2t: the memory consumption to create a mphf using bmz + with a heuristic was fixed. + +2005-01-24 17:11 fc_botelho + + * src/: cmph_types.h, main.c: The algorithms and hash functions + were put in alphabetical order + +2005-01-24 16:15 fc_botelho + + * BMZ.t2t, COMPARISON.t2t, CZECH.t2t, README.t2t: It was fixed some + English mistakes and It was included the files BMZ.t2t, CZECH.t2t + and COMPARISON.t2t + +2005-01-21 19:19 davi + + * ChangeLog, Doxyfile: Added Doxyfile. + 2005-01-21 19:14 davi * README.t2t, wingetopt.c, src/cmph.h, tests/graph_tests.c: Fixed diff --git a/portage/dev-libs/cmph/ChangeLog b/portage/dev-libs/cmph/ChangeLog new file mode 100644 index 0000000..f621ba0 --- /dev/null +++ b/portage/dev-libs/cmph/ChangeLog @@ -0,0 +1,8 @@ +# ChangeLog for / +# Copyright 1999-2005 Gentoo Foundation; Distributed under the GPL v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/ChangeLog,v 1.1 2005/09/26 04:30:54 davi Exp $ + +*cmph-0.4 (25 Sep 2005) + + 25 Sep 2005; Davi de Castro Reis cmph-04.ebuild, metadata.xml, ChangeLog: + Initial import. diff --git a/portage/dev-libs/cmph/cmph-0.4.ebuild b/portage/dev-libs/cmph/cmph-0.4.ebuild new file mode 100644 index 0000000..7ae1c62 --- /dev/null +++ b/portage/dev-libs/cmph/cmph-0.4.ebuild @@ -0,0 +1,25 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/cmph-0.4.ebuild,v 1.1 2005/09/26 04:30:54 davi Exp $ + +inherit eutils +DESCRIPTION="Library for building large minimal perfect hashes" +HOMEPAGE="http://cmph.sf.net/" +SRC_URI="http://unc.dl.sourceforge.net/sourceforge/cmph/${P}.tar.gz" +LICENSE="LGPL-2" +SLOT="0" +KEYWORDS="~x86" +IUSE="" +DEPEND="gcc libtool libc" +RDEPEND="libc" + +S=${WORKDIR}/${P} + +src_compile() { + econf || die "econf failed" + emake || die "emake failed" +} + +src_install() { + make DESTDIR=${D} install || die +} diff --git a/portage/dev-libs/cmph/metadata.xml b/portage/dev-libs/cmph/metadata.xml new file mode 100644 index 0000000..20ce219 --- /dev/null +++ b/portage/dev-libs/cmph/metadata.xml @@ -0,0 +1,5 @@ + + + +no-herd + diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 74dd32e..39e9b3e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10); + graph_t *g = graph_new(5, 10, 0); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5); + g = graph_new(4, 5, 0); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4); + g = graph_new(5, 4, 0); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From e350c110d2da73ba360ff9bfa29e79b0a45c4a61 Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 04:30:54 +0000 Subject: [PATCH 219/739] Added gentoo ebuild. --- COPYING | 642 ++++++++++---------------- ChangeLog | 321 +++++++++++++ INSTALL | 161 +++---- README | 228 --------- examples/Makefile | 435 ----------------- examples/Makefile.in | 416 +++++++---------- portage/dev-libs/cmph/ChangeLog | 8 + portage/dev-libs/cmph/cmph-0.4.ebuild | 25 + portage/dev-libs/cmph/metadata.xml | 5 + tests/graph_tests.c | 6 +- 10 files changed, 813 insertions(+), 1434 deletions(-) delete mode 100644 README delete mode 100644 examples/Makefile create mode 100644 portage/dev-libs/cmph/ChangeLog create mode 100644 portage/dev-libs/cmph/cmph-0.4.ebuild create mode 100644 portage/dev-libs/cmph/metadata.xml diff --git a/COPYING b/COPYING index 8add30a..60549be 100644 --- a/COPYING +++ b/COPYING @@ -1,397 +1,221 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + 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 +this service 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 make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. +modification follow. - GNU LESSER GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, +identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of +on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Library. +collective works based on the Program. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. 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 not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not + 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are +distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Library or works based on it. +the Program or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with +You are not responsible for enforcing compliance by third parties to this License. - - 11. If, as a consequence of a court judgment or allegation of patent + + 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. +refrain entirely from distribution of the Program. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is +integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -401,104 +225,116 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the 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 -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Libraries + How to Apply These Terms to Your New Programs - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). + 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 apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. + 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 +convey 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) + + Copyright (C) 19yy - This library 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 2.1 of the License, or (at your option) any later version. + 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 2 of the License, or + (at your option) any later version. - This library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if +school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. - , 1 April 1990 + , 1 April 1989 Ty Coon, President of Vice -That's all there is to it! - - +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index 65fe7fd..d846708 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,324 @@ +2005-08-08 18:34 fc_botelho + + * INSTALL, examples/Makefile, examples/Makefile.in, + examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/brz.c: [no log message] + +2005-08-07 22:00 fc_botelho + + * src/: brz.c, brz.h, brz_structs.h, cmph.c, cmph.h, main.c: + temporary directory passed by command line + +2005-08-07 20:22 fc_botelho + + * src/brz.c: stable version of BRZ + +2005-08-06 22:09 fc_botelho + + * src/bmz.c: no message + +2005-08-06 22:02 fc_botelho + + * src/bmz.c: no message + +2005-08-06 21:45 fc_botelho + + * src/brz.c: fastest version of BRZ + +2005-08-06 17:20 fc_botelho + + * src/: bmz.c, brz.c, main.c: [no log message] + +2005-07-29 16:43 fc_botelho + + * src/brz.c: BRZ algorithm is almost stable + +2005-07-29 15:29 fc_botelho + + * src/: bmz.c, brz.c, brz_structs.h, cmph_types.h: BRZ algorithm is + almost stable + +2005-07-29 00:09 fc_botelho + + * src/: brz.c, djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, + hash.c, hash.h, jenkins_hash.c, jenkins_hash.h, sdbm_hash.c, + sdbm_hash.h: it was fixed more mistakes in BRZ algorithm + +2005-07-28 21:00 fc_botelho + + * src/: bmz.c, brz.c, cmph.c: fixed some mistakes in BRZ algorithm + +2005-07-27 19:13 fc_botelho + + * src/brz.c: algorithm BRZ included + +2005-07-27 18:16 fc_botelho + + * src/: bmz_structs.h, brz.c, brz.h, brz_structs.h: Algorithm BRZ + included + +2005-07-27 18:13 fc_botelho + + * src/: Makefile.am, bmz.c, chm.c, cmph.c, cmph.h, cmph_types.h: + Algorithm BRZ included + +2005-07-25 19:18 fc_botelho + + * README, README.t2t, scpscript: it was included an examples + directory + +2005-07-25 18:26 fc_botelho + + * INSTALL, Makefile.am, configure.ac, examples/Makefile, + examples/Makefile.am, examples/Makefile.in, + examples/file_adapter_ex2.c, examples/keys.txt, + examples/vector_adapter_ex1.c, examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/cmph.c, src/cmph.h: it + was included a examples directory + +2005-03-03 02:07 davi + + * src/: bmz.c, chm.c, chm.h, chm_structs.h, cmph.c, cmph.h, + graph.c, graph.h, jenkins_hash.c, jenkins_hash.h, main.c (xgraph): + New f*cking cool algorithm works. Roughly implemented in chm.c + +2005-03-02 20:55 davi + + * src/xgraph.c (xgraph): xchmr working nice, but a bit slow + +2005-03-02 02:01 davi + + * src/xchmr.h: file xchmr.h was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr_structs.h: file xchmr_structs.h was initially added on + branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr.c: file xchmr.c was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/: Makefile.am, cmph.c, cmph_types.h, xchmr.c, xchmr.h, + xchmr_structs.h, xgraph.c, xgraph.h (xgraph): xchmr working fine + except for false positives on cyclic detection. + +2005-03-02 00:05 davi + + * src/: Makefile.am, xgraph.c, xgraph.h (xgraph): Added external + graph functionality in branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.c: file xgraph.c was initially added on branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.h: file xgraph.h was initially added on branch xgraph. + +2005-02-28 19:53 davi + + * src/chm.c: Fixed off by one bug in chm. + +2005-02-17 16:20 fc_botelho + + * LOGO.html, README, README.t2t, gendocs: The way of calling the + function cmph_search was fixed in the file README.t2t + +2005-01-31 17:13 fc_botelho + + * README.t2t: Heuristic BMZ memory consumption was updated + +2005-01-31 17:09 fc_botelho + + * BMZ.t2t: DJB2, SDBM, FNV and Jenkins hash link were added + +2005-01-31 16:50 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONCEPTS.t2t, CONFIG.t2t, + FAQ.t2t, GPERF.t2t, LOGO.t2t, README.t2t, TABLE1.t2t, TABLE4.t2t, + TABLE5.t2t, DOC.css: BMZ documentation was finished + +2005-01-28 18:12 fc_botelho + + * figs/img1.png, figs/img10.png, figs/img100.png, figs/img101.png, + figs/img102.png, figs/img103.png, figs/img104.png, figs/img105.png, + figs/img106.png, figs/img107.png, figs/img108.png, figs/img109.png, + papers/bmz_tr004_04.ps, papers/bmz_wea2005.ps, papers/chm92.pdf, + figs/img11.png, figs/img110.png, figs/img111.png, figs/img112.png, + figs/img113.png, figs/img114.png, figs/img115.png, figs/img116.png, + figs/img117.png, figs/img118.png, figs/img119.png, figs/img12.png, + figs/img120.png, figs/img121.png, figs/img122.png, figs/img123.png, + figs/img124.png, figs/img125.png, figs/img126.png, figs/img127.png, + figs/img128.png, figs/img129.png, figs/img13.png, figs/img130.png, + figs/img131.png, figs/img132.png, figs/img133.png, figs/img134.png, + figs/img135.png, figs/img136.png, figs/img137.png, figs/img138.png, + figs/img139.png, figs/img14.png, figs/img140.png, figs/img141.png, + figs/img142.png, figs/img143.png, figs/img144.png, figs/img145.png, + figs/img146.png, figs/img147.png, figs/img148.png, figs/img149.png, + figs/img15.png, figs/img150.png, figs/img151.png, figs/img152.png, + figs/img153.png, figs/img154.png, figs/img155.png, figs/img156.png, + figs/img157.png, figs/img158.png, figs/img159.png, figs/img16.png, + figs/img160.png, figs/img161.png, figs/img162.png, figs/img163.png, + figs/img164.png, figs/img165.png, figs/img166.png, figs/img167.png, + figs/img168.png, figs/img169.png, figs/img17.png, figs/img170.png, + figs/img171.png, figs/img172.png, figs/img173.png, figs/img174.png, + figs/img175.png, figs/img176.png, figs/img177.png, figs/img178.png, + figs/img179.png, figs/img18.png, figs/img180.png, figs/img181.png, + figs/img182.png, figs/img183.png, figs/img184.png, figs/img185.png, + figs/img186.png, figs/img187.png, figs/img188.png, figs/img189.png, + figs/img19.png, figs/img190.png, figs/img191.png, figs/img192.png, + figs/img193.png, figs/img194.png, figs/img195.png, figs/img196.png, + figs/img197.png, figs/img198.png, figs/img199.png, figs/img2.png, + figs/img20.png, figs/img200.png, figs/img201.png, figs/img202.png, + figs/img203.png, figs/img204.png, figs/img205.png, figs/img206.png, + figs/img207.png, figs/img208.png, figs/img209.png, figs/img21.png, + figs/img210.png, figs/img211.png, figs/img212.png, figs/img213.png, + figs/img214.png, figs/img215.png, figs/img216.png, figs/img217.png, + figs/img218.png, figs/img219.png, figs/img22.png, figs/img220.png, + figs/img221.png, figs/img222.png, figs/img223.png, figs/img224.png, + figs/img225.png, figs/img226.png, figs/img227.png, figs/img228.png, + figs/img229.png, figs/img23.png, figs/img230.png, figs/img231.png, + figs/img232.png, figs/img233.png, figs/img234.png, figs/img235.png, + figs/img236.png, figs/img237.png, figs/img238.png, figs/img239.png, + figs/img24.png, figs/img240.png, figs/img241.png, figs/img242.png, + figs/img243.png, figs/img244.png, figs/img245.png, figs/img246.png, + figs/img247.png, figs/img248.png, figs/img249.png, figs/img25.png, + figs/img250.png, figs/img251.png, figs/img252.png, figs/img253.png, + figs/img26.png, figs/img27.png, figs/img28.png, figs/img29.png, + figs/img3.png, figs/img30.png, figs/img31.png, figs/img32.png, + figs/img33.png, figs/img34.png, figs/img35.png, figs/img36.png, + figs/img37.png, figs/img38.png, figs/img39.png, figs/img4.png, + figs/img40.png, figs/img41.png, figs/img42.png, figs/img43.png, + figs/img44.png, figs/img45.png, figs/img46.png, figs/img47.png, + figs/img48.png, figs/img49.png, figs/img5.png, figs/img50.png, + figs/img51.png, figs/img52.png, figs/img53.png, figs/img54.png, + figs/img55.png, figs/img56.png, figs/img57.png, figs/img58.png, + figs/img59.png, figs/img6.png, figs/img60.png, figs/img61.png, + figs/img62.png, figs/img63.png, figs/img64.png, figs/img65.png, + figs/img66.png, figs/img67.png, figs/img68.png, figs/img69.png, + figs/img7.png, figs/img70.png, figs/img71.png, figs/img72.png, + figs/img73.png, figs/img74.png, figs/img75.png, figs/img76.png, + figs/img77.png, figs/img78.png, figs/img79.png, figs/img8.png, + figs/img80.png, figs/img81.png, figs/img82.png, figs/img83.png, + figs/img84.png, figs/img85.png, figs/img86.png, figs/img87.png, + figs/img88.png, figs/img89.png, figs/img9.png, figs/img90.png, + figs/img91.png, figs/img92.png, figs/img93.png, figs/img94.png, + figs/img95.png, figs/img96.png, figs/img97.png, figs/img98.png, + figs/img99.png: Initial version + +2005-01-28 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONFIG.t2t, README.t2t: It was + improved the documentation of BMZ and CHM algorithms + +2005-01-27 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, FAQ.t2t: history of BMZ algorithm is available + +2005-01-27 14:23 fc_botelho + + * AUTHORS: It was added the authors' email + +2005-01-27 14:21 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, FAQ.t2t, FOOTER.t2t, GPERF.t2t, + README.t2t: It was added FOOTER.t2t file + +2005-01-27 12:16 fc_botelho + + * src/cmph_types.h: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 12:12 fc_botelho + + * src/hash.c: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 11:01 davi + + * FAQ.t2t, README, README.t2t, gendocs, src/bmz.c, src/bmz.h, + src/chm.c, src/chm.h, src/cmph.c, src/cmph_structs.c, src/debug.h, + src/main.c: Fix to alternate hash functions code. Removed htonl + stuff from chm algorithm. Added faq. + +2005-01-27 09:14 fc_botelho + + * README.t2t: It was corrected some formatting mistakes + +2005-01-26 22:04 davi + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, GPERF.t2t, README, README.t2t, + gendocs: Added gperf notes. + +2005-01-25 19:10 fc_botelho + + * INSTALL: generated in version 0.3 + +2005-01-25 19:09 fc_botelho + + * src/: czech.c, czech.h, czech_structs.h: The czech.h, + czech_structs.h and czech.c files were removed + +2005-01-25 19:06 fc_botelho + + * src/: chm.c, chm.h, chm_structs.h, cmph.c, cmph_types.h, main.c, + Makefile.am: It was changed the prefix czech by chm + +2005-01-25 18:50 fc_botelho + + * gendocs: script to generate the documentation and the README file + +2005-01-25 18:47 fc_botelho + + * README: README was updated + +2005-01-25 18:44 fc_botelho + + * configure.ac: Version was updated + +2005-01-25 18:42 fc_botelho + + * src/cmph.h: Vector adapter commented + +2005-01-25 18:40 fc_botelho + + * CHM.t2t, CONFIG.t2t, LOGO.html: It was included the PreProc macro + through the CONFIG.t2t file and the LOGO through the LOGO.html file + +2005-01-25 18:33 fc_botelho + + * README.t2t, BMZ.t2t, COMPARISON.t2t, CZECH.t2t: It was included + the PreProc macro through the CONFIG.t2t file and the LOGO through + the LOGO.html file + +2005-01-24 18:25 fc_botelho + + * src/: bmz.c, bmz.h, cmph_structs.c, cmph_structs.h, czech.c, + cmph.c, czech.h, main.c, cmph.h: The file adpater was implemented. + +2005-01-24 17:20 fc_botelho + + * README.t2t: the memory consumption to create a mphf using bmz + with a heuristic was fixed. + +2005-01-24 17:11 fc_botelho + + * src/: cmph_types.h, main.c: The algorithms and hash functions + were put in alphabetical order + +2005-01-24 16:15 fc_botelho + + * BMZ.t2t, COMPARISON.t2t, CZECH.t2t, README.t2t: It was fixed some + English mistakes and It was included the files BMZ.t2t, CZECH.t2t + and COMPARISON.t2t + +2005-01-21 19:19 davi + + * ChangeLog, Doxyfile: Added Doxyfile. + 2005-01-21 19:14 davi * README.t2t, wingetopt.c, src/cmph.h, tests/graph_tests.c: Fixed diff --git a/INSTALL b/INSTALL index 095b1eb..b42a17a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,43 +1,27 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: @@ -70,22 +54,20 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -93,28 +75,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +107,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,80 +122,47 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If +See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't -need to know the machine type. +need to know the host type. - If you are _building_ compiler tools for cross-compiling, you should + If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Defining Variables +Operation Controls ================== -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. + `configure' recognizes the following options to control how it +operates. `--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +`--help' + Print a summary of the options to `configure', and exit. `--quiet' `--silent' @@ -226,6 +175,8 @@ overridden in the site shell script). Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. +`configure' also accepts some other, not widely useful, options. diff --git a/README b/README deleted file mode 100644 index de2ffbe..0000000 --- a/README +++ /dev/null @@ -1,228 +0,0 @@ -CMPH - C Minimal Perfect Hashing Library - -------------------------------------------------------------------- - - - Motivation - ========== - -A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. - -Minimal perfect hash functions (concepts.html) are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. - -The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. - -Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers database applications (http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299). - -For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. - -As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library (gperf is a bit different (gperf.html), since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. - -------------------------------------------------------------------- - - - Description - =========== - -The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - -- Fast. -- Space-efficient with main memory usage carefully documented. -- The best modern algorithms are available (or at least scheduled for implementation :-)). -- Works with in-disk key sets through of using the adapter pattern. -- Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). -- Object oriented implementation. -- Easily extensible. -- Well encapsulated API aiming binary compatibility through releases. -- Free Software. - ----------------------------------------- - - - Supported Algorithms - ==================== - -- BMZ Algorithm. - A very fast algorithm based on cyclic random graphs to construct minimal - perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only 4cn bytes, where c is between 0.93 and 1.15. -- CHM Algorithm. - An algorithm based on acyclic random graphs to construct minimal - perfect hash functions in linear time. The resulting functions are order preserving and - are stored in 4cn bytes, where c is greater than 2. - ----------------------------------------- - - - News for version 0.4 - ==================== - -- Vector Adapter has been added. -- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. -- All reported bugs and suggestions have been corrected and included as well. - ----------------------------------------- - - - News for version 0.3 - ==================== - -- New heuristic added to the bmz algorithm permits to generate a mphf with only - 24.80n + O(1) bytes. The resulting function can be stored in 3.72n bytes. - ----------------------------------------- - - - Examples - ======== - -Using cmph is quite simple. Take a look. - - - #include - - // Create minimal perfect hash function from in-memory vector - int main(int argc, char **argv) - { - // Creating a filled vector - const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", - "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; - unsigned int nkeys = 10; - // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); - - //Create minimal perfect hash function using the default (chm) algorithm. - cmph_config_t *config = cmph_config_new(source); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); - //Destroy hash - cmph_destroy(hash); - free(source); - return 0; - } - -Download vector_adapter_ex1.c (examples/vector_adapter_ex1.c). This example does not work in version 0.3. You need to update the sources from CVS to make it works. - -------------------------------- - - - #include - #include - - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - int main(int argc, char **argv) - { - //Open file with newline separated list of keys - FILE * keys_fd = fopen("keys.txt", "r"); - cmph_t *hash = NULL; - if (keys_fd == NULL) - { - fprintf(stderr, "File \"keys.txt\" not found\n"); - exit(1); - } - // Source of keys - cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); - - cmph_config_t *config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); - hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); - //Destroy hash - cmph_destroy(hash); - free(source); - fclose(keys_fd); - return 0; - } - -Download file_adapter_ex2.c (examples/file_adapter_ex2.c) and keys.txt (examples/keys.txt) - --------------------------------------- - - - The cmph application - ==================== - -cmph is the name of both the library and the utility -application that comes with this package. You can use the cmph -application for constructing minimal perfect hash functions from the command line. -The cmph utility -comes with a number of flags, but it is very simple to create and to query -minimal perfect hash functions: - - - $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file - $ ./cmph -g keys_file - $ # Query id of keys in the file keys_query - $ ./cmph -m keys_file.mph keys_query - - -The additional options let you set most of the parameters you have -available through the C API. Below you can see the full help message for the -utility. - - - usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile - Minimum perfect hashing tool - - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * bmz - * chm - -f hash function (may be used multiple times) - valid values are - * djb2 - * fnv - * jenkins - * sdbm - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys - - - - Additional Documentation - ======================== - -FAQ (faq.html) - - - Downloads - ========= - -Use the project page at sourceforge: http://sf.net/projects/cmph - - - License Stuff - ============= - -Code is under the LGPL. - ----------------------------------------- - -Enjoy! - -Davi de Castro Reis (davi@users.sourceforge.net) - -Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) - -Last Updated: Fri Sep 16 00:47:45 2005 - - - - - diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index dd5c062..0000000 --- a/examples/Makefile +++ /dev/null @@ -1,435 +0,0 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. -# examples/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - -srcdir = . -top_srcdir = .. - -pkgdatadir = $(datadir)/cmph -pkglibdir = $(libdir)/cmph -pkgincludedir = $(includedir)/cmph -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = /usr/bin/install -c -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = i686-pc-linux-gnu -host_triplet = i686-pc-linux-gnu -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ - file_adapter_ex2$(EXEEXT) -subdir = examples -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) -file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) -file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) -vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) -vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ - $(vector_adapter_ex1_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run aclocal-1.9 -AMDEP_FALSE = # -AMDEP_TRUE = -AMTAR = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run tar -AR = ar -AUTOCONF = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoconf -AUTOHEADER = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run autoheader -AUTOMAKE = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run automake-1.9 -AWK = gawk -CC = gcc -CCDEPMODE = depmode=gcc3 -CFLAGS = -g -O2 -D_FILE_OFFSET_BITS=64 -CPP = gcc -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=gcc3 -CXXFLAGS = -g -O2 -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -ECHO = echo -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = grep -E -EXEEXT = -F77 = g77 -FFLAGS = -g -O2 -GETCONF = getconf -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s -LDFLAGS = -lm -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LN_S = ln -s -LTLIBOBJS = -MAKEINFO = ${SHELL} /home/fbotelho/doutorado/algoritmos/cmph/missing --run makeinfo -OBJEXT = o -PACKAGE = cmph -PACKAGE_BUGREPORT = -PACKAGE_NAME = -PACKAGE_STRING = -PACKAGE_TARNAME = -PACKAGE_VERSION = -PATH_SEPARATOR = : -RANLIB = ranlib -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -VERSION = 0.4 -ac_ct_AR = ar -ac_ct_CC = gcc -ac_ct_CXX = g++ -ac_ct_F77 = g77 -ac_ct_GETCONF = getconf -ac_ct_RANLIB = ranlib -ac_ct_STRIP = strip -am__fastdepCC_FALSE = # -am__fastdepCC_TRUE = -am__fastdepCXX_FALSE = # -am__fastdepCXX_TRUE = -am__include = include -am__leading_dot = . -am__quote = -am__tar = ${AMTAR} chof - "$$tardir" -am__untar = ${AMTAR} xf - -bindir = ${exec_prefix}/bin -build = i686-pc-linux-gnu -build_alias = -build_cpu = i686 -build_os = linux-gnu -build_vendor = pc -datadir = ${prefix}/share -exec_prefix = ${prefix} -host = i686-pc-linux-gnu -host_alias = -host_cpu = i686 -host_os = linux-gnu -host_vendor = pc -includedir = ${prefix}/include -infodir = ${prefix}/info -install_sh = /home/fbotelho/doutorado/algoritmos/cmph/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localstatedir = ${prefix}/var -mandir = ${prefix}/man -mkdir_p = mkdir -p -- -oldincludedir = /usr/include -prefix = /usr/local -program_transform_name = s,x,x, -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -sysconfdir = ${prefix}/etc -target_alias = -INCLUDES = -I../src/ -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -include ./$(DEPDIR)/file_adapter_ex2.Po -include ./$(DEPDIR)/vector_adapter_ex1.Po - -.c.o: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c $< - -.c.obj: - if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=no \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: - if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ - then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -# source='$<' object='$@' libtool=yes \ -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ -# $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/examples/Makefile.in b/examples/Makefile.in index 639e5c6..513ea93 100755 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,8 +1,7 @@ -# Makefile.in generated by automake 1.9.2 from Makefile.am. -# @configure_input@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004 Free Software Foundation, Inc. +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,245 +13,129 @@ @SET_MAKE@ -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) +transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = @build@ +host_alias = @host_alias@ host_triplet = @host@ -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) \ - file_adapter_ex2$(EXEEXT) -subdir = examples -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) -file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) -file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) -vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) -vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_SOURCES = $(file_adapter_ex2_SOURCES) \ - $(vector_adapter_ex1_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ +AS = @AS@ AWK = @AWK@ CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ -FFLAGS = @FFLAGS@ +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ GETCONF = @GETCONF@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ +OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ +RC = @RC@ STRIP = @STRIP@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_GETCONF = @ac_ct_GETCONF@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ -am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ + +noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 + INCLUDES = -I../src/ + vector_adapter_ex1_LDADD = ../src/libcmph.la vector_adapter_ex1_SOURCES = vector_adapter_ex1.c + file_adapter_ex2_LDADD = ../src/libcmph.la file_adapter_ex2_SOURCES = file_adapter_ex2.c +subdir = examples +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) + +am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) +file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) +file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la +file_adapter_ex2_LDFLAGS = +am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) +vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) +vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la +vector_adapter_ex1_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ +@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) + all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_adapter_ex2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -262,77 +145,102 @@ clean-libtool: distclean-libtool: -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) +file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) + @rm -f file_adapter_ex2$(EXEEXT) + $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) +vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) + @rm -f vector_adapter_ex1$(EXEEXT) + $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ uninstall-info-am: +tags: TAGS + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS + mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ + here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ @@ -342,7 +250,9 @@ distdir: $(DISTFILES) check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) + installdirs: + install: install-am install-exec: install-exec-am install-data: install-data-am @@ -354,7 +264,6 @@ install-am: all-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: @@ -362,7 +271,7 @@ mostlyclean-generic: clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -373,17 +282,14 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags dvi: dvi-am dvi-am: -html: html-am - info: info-am info-am: @@ -399,8 +305,7 @@ install-man: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am @@ -408,27 +313,18 @@ mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - uninstall-am: uninstall-info-am -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ +.PHONY: GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am + tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/portage/dev-libs/cmph/ChangeLog b/portage/dev-libs/cmph/ChangeLog new file mode 100644 index 0000000..f621ba0 --- /dev/null +++ b/portage/dev-libs/cmph/ChangeLog @@ -0,0 +1,8 @@ +# ChangeLog for / +# Copyright 1999-2005 Gentoo Foundation; Distributed under the GPL v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/ChangeLog,v 1.1 2005/09/26 04:30:54 davi Exp $ + +*cmph-0.4 (25 Sep 2005) + + 25 Sep 2005; Davi de Castro Reis cmph-04.ebuild, metadata.xml, ChangeLog: + Initial import. diff --git a/portage/dev-libs/cmph/cmph-0.4.ebuild b/portage/dev-libs/cmph/cmph-0.4.ebuild new file mode 100644 index 0000000..7ae1c62 --- /dev/null +++ b/portage/dev-libs/cmph/cmph-0.4.ebuild @@ -0,0 +1,25 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/cmph-0.4.ebuild,v 1.1 2005/09/26 04:30:54 davi Exp $ + +inherit eutils +DESCRIPTION="Library for building large minimal perfect hashes" +HOMEPAGE="http://cmph.sf.net/" +SRC_URI="http://unc.dl.sourceforge.net/sourceforge/cmph/${P}.tar.gz" +LICENSE="LGPL-2" +SLOT="0" +KEYWORDS="~x86" +IUSE="" +DEPEND="gcc libtool libc" +RDEPEND="libc" + +S=${WORKDIR}/${P} + +src_compile() { + econf || die "econf failed" + emake || die "emake failed" +} + +src_install() { + make DESTDIR=${D} install || die +} diff --git a/portage/dev-libs/cmph/metadata.xml b/portage/dev-libs/cmph/metadata.xml new file mode 100644 index 0000000..20ce219 --- /dev/null +++ b/portage/dev-libs/cmph/metadata.xml @@ -0,0 +1,5 @@ + + + +no-herd + diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 74dd32e..39e9b3e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10); + graph_t *g = graph_new(5, 10, 0); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5); + g = graph_new(4, 5, 0); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4); + g = graph_new(5, 4, 0); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From ed9214779449602cffa3f85939d4c9837a759cee Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 04:30:54 +0000 Subject: [PATCH 220/739] Added gentoo ebuild. --- COPYING | 642 ++++++++++---------------- ChangeLog | 321 +++++++++++++ INSTALL | 161 +++---- README | 228 --------- portage/dev-libs/cmph/ChangeLog | 8 + portage/dev-libs/cmph/cmph-0.4.ebuild | 25 + portage/dev-libs/cmph/metadata.xml | 5 + tests/graph_tests.c | 6 +- 8 files changed, 657 insertions(+), 739 deletions(-) delete mode 100644 README create mode 100644 portage/dev-libs/cmph/ChangeLog create mode 100644 portage/dev-libs/cmph/cmph-0.4.ebuild create mode 100644 portage/dev-libs/cmph/metadata.xml diff --git a/COPYING b/COPYING index 8add30a..60549be 100644 --- a/COPYING +++ b/COPYING @@ -1,397 +1,221 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + 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 +this service 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 make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. +modification follow. - GNU LESSER GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, +identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of +on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or -collective works based on the Library. +collective works based on the Program. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. 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 not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not + 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are +distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying -the Library or works based on it. +the Program or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with +You are not responsible for enforcing compliance by third parties to this License. - - 11. If, as a consequence of a court judgment or allegation of patent + + 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. +refrain entirely from distribution of the Program. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is +integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that @@ -401,104 +225,116 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the 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 -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Libraries + How to Apply These Terms to Your New Programs - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). + 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 apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. + 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 +convey 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) + + Copyright (C) 19yy - This library 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 2.1 of the License, or (at your option) any later version. + 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 2 of the License, or + (at your option) any later version. - This library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if +school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. - , 1 April 1990 + , 1 April 1989 Ty Coon, President of Vice -That's all there is to it! - - +This 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index 65fe7fd..d846708 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,324 @@ +2005-08-08 18:34 fc_botelho + + * INSTALL, examples/Makefile, examples/Makefile.in, + examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/brz.c: [no log message] + +2005-08-07 22:00 fc_botelho + + * src/: brz.c, brz.h, brz_structs.h, cmph.c, cmph.h, main.c: + temporary directory passed by command line + +2005-08-07 20:22 fc_botelho + + * src/brz.c: stable version of BRZ + +2005-08-06 22:09 fc_botelho + + * src/bmz.c: no message + +2005-08-06 22:02 fc_botelho + + * src/bmz.c: no message + +2005-08-06 21:45 fc_botelho + + * src/brz.c: fastest version of BRZ + +2005-08-06 17:20 fc_botelho + + * src/: bmz.c, brz.c, main.c: [no log message] + +2005-07-29 16:43 fc_botelho + + * src/brz.c: BRZ algorithm is almost stable + +2005-07-29 15:29 fc_botelho + + * src/: bmz.c, brz.c, brz_structs.h, cmph_types.h: BRZ algorithm is + almost stable + +2005-07-29 00:09 fc_botelho + + * src/: brz.c, djb2_hash.c, djb2_hash.h, fnv_hash.c, fnv_hash.h, + hash.c, hash.h, jenkins_hash.c, jenkins_hash.h, sdbm_hash.c, + sdbm_hash.h: it was fixed more mistakes in BRZ algorithm + +2005-07-28 21:00 fc_botelho + + * src/: bmz.c, brz.c, cmph.c: fixed some mistakes in BRZ algorithm + +2005-07-27 19:13 fc_botelho + + * src/brz.c: algorithm BRZ included + +2005-07-27 18:16 fc_botelho + + * src/: bmz_structs.h, brz.c, brz.h, brz_structs.h: Algorithm BRZ + included + +2005-07-27 18:13 fc_botelho + + * src/: Makefile.am, bmz.c, chm.c, cmph.c, cmph.h, cmph_types.h: + Algorithm BRZ included + +2005-07-25 19:18 fc_botelho + + * README, README.t2t, scpscript: it was included an examples + directory + +2005-07-25 18:26 fc_botelho + + * INSTALL, Makefile.am, configure.ac, examples/Makefile, + examples/Makefile.am, examples/Makefile.in, + examples/file_adapter_ex2.c, examples/keys.txt, + examples/vector_adapter_ex1.c, examples/.deps/file_adapter_ex2.Po, + examples/.deps/vector_adapter_ex1.Po, src/cmph.c, src/cmph.h: it + was included a examples directory + +2005-03-03 02:07 davi + + * src/: bmz.c, chm.c, chm.h, chm_structs.h, cmph.c, cmph.h, + graph.c, graph.h, jenkins_hash.c, jenkins_hash.h, main.c (xgraph): + New f*cking cool algorithm works. Roughly implemented in chm.c + +2005-03-02 20:55 davi + + * src/xgraph.c (xgraph): xchmr working nice, but a bit slow + +2005-03-02 02:01 davi + + * src/xchmr.h: file xchmr.h was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr_structs.h: file xchmr_structs.h was initially added on + branch xgraph. + +2005-03-02 02:01 davi + + * src/xchmr.c: file xchmr.c was initially added on branch xgraph. + +2005-03-02 02:01 davi + + * src/: Makefile.am, cmph.c, cmph_types.h, xchmr.c, xchmr.h, + xchmr_structs.h, xgraph.c, xgraph.h (xgraph): xchmr working fine + except for false positives on cyclic detection. + +2005-03-02 00:05 davi + + * src/: Makefile.am, xgraph.c, xgraph.h (xgraph): Added external + graph functionality in branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.c: file xgraph.c was initially added on branch xgraph. + +2005-03-02 00:05 davi + + * src/xgraph.h: file xgraph.h was initially added on branch xgraph. + +2005-02-28 19:53 davi + + * src/chm.c: Fixed off by one bug in chm. + +2005-02-17 16:20 fc_botelho + + * LOGO.html, README, README.t2t, gendocs: The way of calling the + function cmph_search was fixed in the file README.t2t + +2005-01-31 17:13 fc_botelho + + * README.t2t: Heuristic BMZ memory consumption was updated + +2005-01-31 17:09 fc_botelho + + * BMZ.t2t: DJB2, SDBM, FNV and Jenkins hash link were added + +2005-01-31 16:50 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONCEPTS.t2t, CONFIG.t2t, + FAQ.t2t, GPERF.t2t, LOGO.t2t, README.t2t, TABLE1.t2t, TABLE4.t2t, + TABLE5.t2t, DOC.css: BMZ documentation was finished + +2005-01-28 18:12 fc_botelho + + * figs/img1.png, figs/img10.png, figs/img100.png, figs/img101.png, + figs/img102.png, figs/img103.png, figs/img104.png, figs/img105.png, + figs/img106.png, figs/img107.png, figs/img108.png, figs/img109.png, + papers/bmz_tr004_04.ps, papers/bmz_wea2005.ps, papers/chm92.pdf, + figs/img11.png, figs/img110.png, figs/img111.png, figs/img112.png, + figs/img113.png, figs/img114.png, figs/img115.png, figs/img116.png, + figs/img117.png, figs/img118.png, figs/img119.png, figs/img12.png, + figs/img120.png, figs/img121.png, figs/img122.png, figs/img123.png, + figs/img124.png, figs/img125.png, figs/img126.png, figs/img127.png, + figs/img128.png, figs/img129.png, figs/img13.png, figs/img130.png, + figs/img131.png, figs/img132.png, figs/img133.png, figs/img134.png, + figs/img135.png, figs/img136.png, figs/img137.png, figs/img138.png, + figs/img139.png, figs/img14.png, figs/img140.png, figs/img141.png, + figs/img142.png, figs/img143.png, figs/img144.png, figs/img145.png, + figs/img146.png, figs/img147.png, figs/img148.png, figs/img149.png, + figs/img15.png, figs/img150.png, figs/img151.png, figs/img152.png, + figs/img153.png, figs/img154.png, figs/img155.png, figs/img156.png, + figs/img157.png, figs/img158.png, figs/img159.png, figs/img16.png, + figs/img160.png, figs/img161.png, figs/img162.png, figs/img163.png, + figs/img164.png, figs/img165.png, figs/img166.png, figs/img167.png, + figs/img168.png, figs/img169.png, figs/img17.png, figs/img170.png, + figs/img171.png, figs/img172.png, figs/img173.png, figs/img174.png, + figs/img175.png, figs/img176.png, figs/img177.png, figs/img178.png, + figs/img179.png, figs/img18.png, figs/img180.png, figs/img181.png, + figs/img182.png, figs/img183.png, figs/img184.png, figs/img185.png, + figs/img186.png, figs/img187.png, figs/img188.png, figs/img189.png, + figs/img19.png, figs/img190.png, figs/img191.png, figs/img192.png, + figs/img193.png, figs/img194.png, figs/img195.png, figs/img196.png, + figs/img197.png, figs/img198.png, figs/img199.png, figs/img2.png, + figs/img20.png, figs/img200.png, figs/img201.png, figs/img202.png, + figs/img203.png, figs/img204.png, figs/img205.png, figs/img206.png, + figs/img207.png, figs/img208.png, figs/img209.png, figs/img21.png, + figs/img210.png, figs/img211.png, figs/img212.png, figs/img213.png, + figs/img214.png, figs/img215.png, figs/img216.png, figs/img217.png, + figs/img218.png, figs/img219.png, figs/img22.png, figs/img220.png, + figs/img221.png, figs/img222.png, figs/img223.png, figs/img224.png, + figs/img225.png, figs/img226.png, figs/img227.png, figs/img228.png, + figs/img229.png, figs/img23.png, figs/img230.png, figs/img231.png, + figs/img232.png, figs/img233.png, figs/img234.png, figs/img235.png, + figs/img236.png, figs/img237.png, figs/img238.png, figs/img239.png, + figs/img24.png, figs/img240.png, figs/img241.png, figs/img242.png, + figs/img243.png, figs/img244.png, figs/img245.png, figs/img246.png, + figs/img247.png, figs/img248.png, figs/img249.png, figs/img25.png, + figs/img250.png, figs/img251.png, figs/img252.png, figs/img253.png, + figs/img26.png, figs/img27.png, figs/img28.png, figs/img29.png, + figs/img3.png, figs/img30.png, figs/img31.png, figs/img32.png, + figs/img33.png, figs/img34.png, figs/img35.png, figs/img36.png, + figs/img37.png, figs/img38.png, figs/img39.png, figs/img4.png, + figs/img40.png, figs/img41.png, figs/img42.png, figs/img43.png, + figs/img44.png, figs/img45.png, figs/img46.png, figs/img47.png, + figs/img48.png, figs/img49.png, figs/img5.png, figs/img50.png, + figs/img51.png, figs/img52.png, figs/img53.png, figs/img54.png, + figs/img55.png, figs/img56.png, figs/img57.png, figs/img58.png, + figs/img59.png, figs/img6.png, figs/img60.png, figs/img61.png, + figs/img62.png, figs/img63.png, figs/img64.png, figs/img65.png, + figs/img66.png, figs/img67.png, figs/img68.png, figs/img69.png, + figs/img7.png, figs/img70.png, figs/img71.png, figs/img72.png, + figs/img73.png, figs/img74.png, figs/img75.png, figs/img76.png, + figs/img77.png, figs/img78.png, figs/img79.png, figs/img8.png, + figs/img80.png, figs/img81.png, figs/img82.png, figs/img83.png, + figs/img84.png, figs/img85.png, figs/img86.png, figs/img87.png, + figs/img88.png, figs/img89.png, figs/img9.png, figs/img90.png, + figs/img91.png, figs/img92.png, figs/img93.png, figs/img94.png, + figs/img95.png, figs/img96.png, figs/img97.png, figs/img98.png, + figs/img99.png: Initial version + +2005-01-28 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, CONFIG.t2t, README.t2t: It was + improved the documentation of BMZ and CHM algorithms + +2005-01-27 18:07 fc_botelho + + * BMZ.t2t, CHM.t2t, FAQ.t2t: history of BMZ algorithm is available + +2005-01-27 14:23 fc_botelho + + * AUTHORS: It was added the authors' email + +2005-01-27 14:21 fc_botelho + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, FAQ.t2t, FOOTER.t2t, GPERF.t2t, + README.t2t: It was added FOOTER.t2t file + +2005-01-27 12:16 fc_botelho + + * src/cmph_types.h: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 12:12 fc_botelho + + * src/hash.c: It was removed pjw and glib functions from + cmph_hash_names vector + +2005-01-27 11:01 davi + + * FAQ.t2t, README, README.t2t, gendocs, src/bmz.c, src/bmz.h, + src/chm.c, src/chm.h, src/cmph.c, src/cmph_structs.c, src/debug.h, + src/main.c: Fix to alternate hash functions code. Removed htonl + stuff from chm algorithm. Added faq. + +2005-01-27 09:14 fc_botelho + + * README.t2t: It was corrected some formatting mistakes + +2005-01-26 22:04 davi + + * BMZ.t2t, CHM.t2t, COMPARISON.t2t, GPERF.t2t, README, README.t2t, + gendocs: Added gperf notes. + +2005-01-25 19:10 fc_botelho + + * INSTALL: generated in version 0.3 + +2005-01-25 19:09 fc_botelho + + * src/: czech.c, czech.h, czech_structs.h: The czech.h, + czech_structs.h and czech.c files were removed + +2005-01-25 19:06 fc_botelho + + * src/: chm.c, chm.h, chm_structs.h, cmph.c, cmph_types.h, main.c, + Makefile.am: It was changed the prefix czech by chm + +2005-01-25 18:50 fc_botelho + + * gendocs: script to generate the documentation and the README file + +2005-01-25 18:47 fc_botelho + + * README: README was updated + +2005-01-25 18:44 fc_botelho + + * configure.ac: Version was updated + +2005-01-25 18:42 fc_botelho + + * src/cmph.h: Vector adapter commented + +2005-01-25 18:40 fc_botelho + + * CHM.t2t, CONFIG.t2t, LOGO.html: It was included the PreProc macro + through the CONFIG.t2t file and the LOGO through the LOGO.html file + +2005-01-25 18:33 fc_botelho + + * README.t2t, BMZ.t2t, COMPARISON.t2t, CZECH.t2t: It was included + the PreProc macro through the CONFIG.t2t file and the LOGO through + the LOGO.html file + +2005-01-24 18:25 fc_botelho + + * src/: bmz.c, bmz.h, cmph_structs.c, cmph_structs.h, czech.c, + cmph.c, czech.h, main.c, cmph.h: The file adpater was implemented. + +2005-01-24 17:20 fc_botelho + + * README.t2t: the memory consumption to create a mphf using bmz + with a heuristic was fixed. + +2005-01-24 17:11 fc_botelho + + * src/: cmph_types.h, main.c: The algorithms and hash functions + were put in alphabetical order + +2005-01-24 16:15 fc_botelho + + * BMZ.t2t, COMPARISON.t2t, CZECH.t2t, README.t2t: It was fixed some + English mistakes and It was included the files BMZ.t2t, CZECH.t2t + and COMPARISON.t2t + +2005-01-21 19:19 davi + + * ChangeLog, Doxyfile: Added Doxyfile. + 2005-01-21 19:14 davi * README.t2t, wingetopt.c, src/cmph.h, tests/graph_tests.c: Fixed diff --git a/INSTALL b/INSTALL index 095b1eb..b42a17a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,43 +1,27 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: @@ -70,22 +54,20 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -93,28 +75,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +107,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,80 +122,47 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If +See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't -need to know the machine type. +need to know the host type. - If you are _building_ compiler tools for cross-compiling, you should + If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Defining Variables +Operation Controls ================== -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. + `configure' recognizes the following options to control how it +operates. `--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +`--help' + Print a summary of the options to `configure', and exit. `--quiet' `--silent' @@ -226,6 +175,8 @@ overridden in the site shell script). Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. +`configure' also accepts some other, not widely useful, options. diff --git a/README b/README deleted file mode 100644 index de2ffbe..0000000 --- a/README +++ /dev/null @@ -1,228 +0,0 @@ -CMPH - C Minimal Perfect Hashing Library - -------------------------------------------------------------------- - - - Motivation - ========== - -A perfect hash function maps a static set of n keys into a set of m integer numbers without collisions, where m is greater than or equal to n. If m is equal to n, the function is called minimal. - -Minimal perfect hash functions (concepts.html) are widely used for memory efficient storage and fast retrieval of items from static sets, such as words in natural languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. Therefore, there are applications for minimal perfect hash functions in information retrieval systems, database systems, language translation systems, electronic commerce systems, compilers, operating systems, among others. - -The use of minimal perfect hash functions is, until now, restricted to scenarios where the set of keys being hashed is small, because of the limitations of current algorithms. But in many cases, to deal with huge set of keys is crucial. So, this project gives to the free software community an API that will work with sets in the order of billion of keys. - -Probably, the most interesting application for minimal perfect hash functions is its use as an indexing structure for databases. The most popular data structure used as an indexing structure in databases is the B+ tree. In fact, the B+ tree is very used for dynamic applications with frequent insertions and deletions of records. However, for applications with sporadic modifications and a huge number of queries the B+ tree is not the best option, because practical deployments of this structure are extremely complex, and perform poorly with very large sets of keys such as those required for the new frontiers database applications (http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299). - -For example, in the information retrieval field, the work with huge collections is a daily task. The simple assignment of ids to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working set of web page urls does not fit in main memory anymore, minimal perfect hash functions can easily scale to hundred of millions of entries, using stock hardware. - -As there are lots of applications for minimal perfect hash functions, it is important to implement memory and time efficient algorithms for constructing such functions. The lack of similar libraries in the free software world has been the main motivation to create the C Minimal Perfect Hashing Library (gperf is a bit different (gperf.html), since it was conceived to create very fast perfect hash functions for small sets of keys and CMPH Library was conceived to create minimal perfect hash functions for very large sets of keys). C Minimal Perfect Hashing Library is a portable LGPLed library to generate and to work with very efficient minimal perfect hash functions. - -------------------------------------------------------------------- - - - Description - =========== - -The CMPH Library encapsulates the newest and more efficient algorithms in an easy-to-use, production-quality, fast API. The library was designed to work with big entries that cannot fit in the main memory. It has been used successfully for constructing minimal perfect hash functions for sets with more than 100 million of keys, and we intend to expand this number to the order of billion of keys. Although there is a lack of similar libraries, we can point out some of the distinguishable features of the CMPH Library: - -- Fast. -- Space-efficient with main memory usage carefully documented. -- The best modern algorithms are available (or at least scheduled for implementation :-)). -- Works with in-disk key sets through of using the adapter pattern. -- Serialization of hash functions. -- Portable C code (currently works on GNU/Linux and WIN32 and is reported to work in OpenBSD and Solaris). -- Object oriented implementation. -- Easily extensible. -- Well encapsulated API aiming binary compatibility through releases. -- Free Software. - ----------------------------------------- - - - Supported Algorithms - ==================== - -- BMZ Algorithm. - A very fast algorithm based on cyclic random graphs to construct minimal - perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only 4cn bytes, where c is between 0.93 and 1.15. -- CHM Algorithm. - An algorithm based on acyclic random graphs to construct minimal - perfect hash functions in linear time. The resulting functions are order preserving and - are stored in 4cn bytes, where c is greater than 2. - ----------------------------------------- - - - News for version 0.4 - ==================== - -- Vector Adapter has been added. -- An optimized version of bmz (bmz8) for small set of keys (at most 256 keys) has been added. -- All reported bugs and suggestions have been corrected and included as well. - ----------------------------------------- - - - News for version 0.3 - ==================== - -- New heuristic added to the bmz algorithm permits to generate a mphf with only - 24.80n + O(1) bytes. The resulting function can be stored in 3.72n bytes. - ----------------------------------------- - - - Examples - ======== - -Using cmph is quite simple. Take a look. - - - #include - - // Create minimal perfect hash function from in-memory vector - int main(int argc, char **argv) - { - // Creating a filled vector - const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", - "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; - unsigned int nkeys = 10; - // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); - - //Create minimal perfect hash function using the default (chm) algorithm. - cmph_config_t *config = cmph_config_new(source); - cmph_t *hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); - //Destroy hash - cmph_destroy(hash); - free(source); - return 0; - } - -Download vector_adapter_ex1.c (examples/vector_adapter_ex1.c). This example does not work in version 0.3. You need to update the sources from CVS to make it works. - -------------------------------- - - - #include - #include - - // Create minimal perfect hash function from in-disk keys using BMZ algorithm - int main(int argc, char **argv) - { - //Open file with newline separated list of keys - FILE * keys_fd = fopen("keys.txt", "r"); - cmph_t *hash = NULL; - if (keys_fd == NULL) - { - fprintf(stderr, "File \"keys.txt\" not found\n"); - exit(1); - } - // Source of keys - cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); - - cmph_config_t *config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ); - hash = cmph_new(config); - cmph_config_destroy(config); - - //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); - //Destroy hash - cmph_destroy(hash); - free(source); - fclose(keys_fd); - return 0; - } - -Download file_adapter_ex2.c (examples/file_adapter_ex2.c) and keys.txt (examples/keys.txt) - --------------------------------------- - - - The cmph application - ==================== - -cmph is the name of both the library and the utility -application that comes with this package. You can use the cmph -application for constructing minimal perfect hash functions from the command line. -The cmph utility -comes with a number of flags, but it is very simple to create and to query -minimal perfect hash functions: - - - $ # Using the chm algorithm (default one) for constructing a mphf for keys in file keys_file - $ ./cmph -g keys_file - $ # Query id of keys in the file keys_query - $ ./cmph -m keys_file.mph keys_query - - -The additional options let you set most of the parameters you have -available through the C API. Below you can see the full help message for the -utility. - - - usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile - Minimum perfect hashing tool - - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * bmz - * chm - -f hash function (may be used multiple times) - valid values are - * djb2 - * fnv - * jenkins - * sdbm - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys - - - - Additional Documentation - ======================== - -FAQ (faq.html) - - - Downloads - ========= - -Use the project page at sourceforge: http://sf.net/projects/cmph - - - License Stuff - ============= - -Code is under the LGPL. - ----------------------------------------- - -Enjoy! - -Davi de Castro Reis (davi@users.sourceforge.net) - -Fabiano Cupertino Botelho (fc_botelho@users.sourceforge.net) - -Last Updated: Fri Sep 16 00:47:45 2005 - - - - - diff --git a/portage/dev-libs/cmph/ChangeLog b/portage/dev-libs/cmph/ChangeLog new file mode 100644 index 0000000..f621ba0 --- /dev/null +++ b/portage/dev-libs/cmph/ChangeLog @@ -0,0 +1,8 @@ +# ChangeLog for / +# Copyright 1999-2005 Gentoo Foundation; Distributed under the GPL v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/ChangeLog,v 1.1 2005/09/26 04:30:54 davi Exp $ + +*cmph-0.4 (25 Sep 2005) + + 25 Sep 2005; Davi de Castro Reis cmph-04.ebuild, metadata.xml, ChangeLog: + Initial import. diff --git a/portage/dev-libs/cmph/cmph-0.4.ebuild b/portage/dev-libs/cmph/cmph-0.4.ebuild new file mode 100644 index 0000000..7ae1c62 --- /dev/null +++ b/portage/dev-libs/cmph/cmph-0.4.ebuild @@ -0,0 +1,25 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /cvsroot/cmph/cmph/portage/dev-libs/cmph/cmph-0.4.ebuild,v 1.1 2005/09/26 04:30:54 davi Exp $ + +inherit eutils +DESCRIPTION="Library for building large minimal perfect hashes" +HOMEPAGE="http://cmph.sf.net/" +SRC_URI="http://unc.dl.sourceforge.net/sourceforge/cmph/${P}.tar.gz" +LICENSE="LGPL-2" +SLOT="0" +KEYWORDS="~x86" +IUSE="" +DEPEND="gcc libtool libc" +RDEPEND="libc" + +S=${WORKDIR}/${P} + +src_compile() { + econf || die "econf failed" + emake || die "emake failed" +} + +src_install() { + make DESTDIR=${D} install || die +} diff --git a/portage/dev-libs/cmph/metadata.xml b/portage/dev-libs/cmph/metadata.xml new file mode 100644 index 0000000..20ce219 --- /dev/null +++ b/portage/dev-libs/cmph/metadata.xml @@ -0,0 +1,5 @@ + + + +no-herd + diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 74dd32e..39e9b3e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10); + graph_t *g = graph_new(5, 10, 0); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5); + g = graph_new(4, 5, 0); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4); + g = graph_new(5, 4, 0); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From 7c10672e35c251d4c97a185165b3d4e85f8547f1 Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 18:45:56 +0000 Subject: [PATCH 221/739] Removed useless files. --- examples/Makefile.in | 331 ------------------------------------------- 1 file changed, 331 deletions(-) delete mode 100755 examples/Makefile.in diff --git a/examples/Makefile.in b/examples/Makefile.in deleted file mode 100755 index 513ea93..0000000 --- a/examples/Makefile.in +++ /dev/null @@ -1,331 +0,0 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. - -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -host_alias = @host_alias@ -host_triplet = @host@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AWK = @AWK@ -CC = @CC@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -ECHO = @ECHO@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -GCJ = @GCJ@ -GCJFLAGS = @GCJFLAGS@ -GETCONF = @GETCONF@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -RC = @RC@ -STRIP = @STRIP@ -VERSION = @VERSION@ -am__include = @am__include@ -am__quote = @am__quote@ -install_sh = @install_sh@ - -noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 - -INCLUDES = -I../src/ - -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c - -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c -subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) - -am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) -file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) -file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -file_adapter_ex2_LDFLAGS = -am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) -vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) -vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -vector_adapter_ex1_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ -@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_COMMON = Makefile.am Makefile.in -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) - -.c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< - -.c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` - -.c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) - -GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ - fi; \ - if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) - -installdirs: - -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -uninstall-am: uninstall-info-am - -.PHONY: GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - tags uninstall uninstall-am uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: From 8a95b0c18053f9ff0db17a679c0126cfac8b76e3 Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 18:45:56 +0000 Subject: [PATCH 222/739] Removed useless files. From 5d271817dd49eec8f925939d0134ab9bbbc4b23f Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 18:45:56 +0000 Subject: [PATCH 223/739] Removed useless files. --- examples/Makefile.in | 331 ------------------------------------------- 1 file changed, 331 deletions(-) delete mode 100755 examples/Makefile.in diff --git a/examples/Makefile.in b/examples/Makefile.in deleted file mode 100755 index 513ea93..0000000 --- a/examples/Makefile.in +++ /dev/null @@ -1,331 +0,0 @@ -# Makefile.in generated automatically by automake 1.5 from Makefile.am. - -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_HEADER = $(INSTALL_DATA) -transform = @program_transform_name@ -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -host_alias = @host_alias@ -host_triplet = @host@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AWK = @AWK@ -CC = @CC@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -ECHO = @ECHO@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -GCJ = @GCJ@ -GCJFLAGS = @GCJFLAGS@ -GETCONF = @GETCONF@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -RC = @RC@ -STRIP = @STRIP@ -VERSION = @VERSION@ -am__include = @am__include@ -am__quote = @am__quote@ -install_sh = @install_sh@ - -noinst_PROGRAMS = vector_adapter_ex1 file_adapter_ex2 - -INCLUDES = -I../src/ - -vector_adapter_ex1_LDADD = ../src/libcmph.la -vector_adapter_ex1_SOURCES = vector_adapter_ex1.c - -file_adapter_ex2_LDADD = ../src/libcmph.la -file_adapter_ex2_SOURCES = file_adapter_ex2.c -subdir = examples -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -noinst_PROGRAMS = vector_adapter_ex1$(EXEEXT) file_adapter_ex2$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) - -am_file_adapter_ex2_OBJECTS = file_adapter_ex2.$(OBJEXT) -file_adapter_ex2_OBJECTS = $(am_file_adapter_ex2_OBJECTS) -file_adapter_ex2_DEPENDENCIES = ../src/libcmph.la -file_adapter_ex2_LDFLAGS = -am_vector_adapter_ex1_OBJECTS = vector_adapter_ex1.$(OBJEXT) -vector_adapter_ex1_OBJECTS = $(am_vector_adapter_ex1_OBJECTS) -vector_adapter_ex1_DEPENDENCIES = ../src/libcmph.la -vector_adapter_ex1_LDFLAGS = - -DEFS = @DEFS@ -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/file_adapter_ex2.Po \ -@AMDEP_TRUE@ $(DEPDIR)/vector_adapter_ex1.Po -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CFLAGS = @CFLAGS@ -DIST_SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) -DIST_COMMON = Makefile.am Makefile.in -SOURCES = $(file_adapter_ex2_SOURCES) $(vector_adapter_ex1_SOURCES) - -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu examples/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) && \ - CONFIG_HEADERS= CONFIG_LINKS= \ - CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -file_adapter_ex2$(EXEEXT): $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_DEPENDENCIES) - @rm -f file_adapter_ex2$(EXEEXT) - $(LINK) $(file_adapter_ex2_LDFLAGS) $(file_adapter_ex2_OBJECTS) $(file_adapter_ex2_LDADD) $(LIBS) -vector_adapter_ex1$(EXEEXT): $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_DEPENDENCIES) - @rm -f vector_adapter_ex1$(EXEEXT) - $(LINK) $(vector_adapter_ex1_LDFLAGS) $(vector_adapter_ex1_OBJECTS) $(vector_adapter_ex1_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) core *.core - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_adapter_ex2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector_adapter_ex1.Po@am__quote@ - -distclean-depend: - -rm -rf $(DEPDIR) - -.c.o: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< - -.c.obj: -@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(COMPILE) -c `cygpath -w $<` - -.c.lo: -@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - $(LTCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< -CCDEPMODE = @CCDEPMODE@ -uninstall-info-am: - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) - -GTAGS: - here=`CDPATH=: && cd $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH - -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) - -top_distdir = .. -distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - $(mkinstalldirs) "$(distdir)/$$dir"; \ - fi; \ - if test -d $$d/$$file; then \ - cp -pR $$d/$$file $(distdir) \ - || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) - -installdirs: - -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -distclean-am: clean-am distclean-compile distclean-depend \ - distclean-generic distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -uninstall-am: uninstall-info-am - -.PHONY: GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ - distclean-depend distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am info info-am install \ - install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - tags uninstall uninstall-am uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: From b9842cfcbd0a5e70ce2f9d420cee6d0d360e4435 Mon Sep 17 00:00:00 2001 From: davi Date: Mon, 26 Sep 2005 18:45:56 +0000 Subject: [PATCH 224/739] Removed useless files. From ab356bf19ba1ae272da2a756c1ed3d96d45fb56b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 27 Sep 2005 15:11:25 +0000 Subject: [PATCH 225/739] added vldb jounal --- vldb/ingles/algorithms.tex | 596 +++++++ vldb/ingles/applications.tex | 2 + vldb/ingles/conclusions.tex | 5 + vldb/ingles/experimentalresults.tex | 178 +++ vldb/ingles/figs/brz.fig | 135 ++ vldb/ingles/figs/brz.ps | 324 ++++ vldb/ingles/figs/grafordering.fig | 206 +++ vldb/ingles/figs/grafordering2.fig | 219 +++ vldb/ingles/figs/grafordering3.fig | 130 ++ vldb/ingles/figs/grafsearching.fig | 168 ++ vldb/ingles/figs/grafsearching2.fig | 180 +++ vldb/ingles/figs/grafsearchingncv.fig | 124 ++ .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/ingles/introduction.tex | 86 + vldb/ingles/makefile | 17 + vldb/ingles/references.bib | 669 ++++++++ vldb/ingles/relatedwork.tex | 67 + vldb/ingles/svglov2.clo | 77 + vldb/ingles/svjour2.cls | 1419 +++++++++++++++++ vldb/ingles/vldb.tex | 150 ++ vldb/pt/algorithms.tex | 19 + vldb/pt/applications.tex | 2 + vldb/pt/conclusions.tex | 3 + vldb/pt/experimentalresults.tex | 1 + vldb/pt/figs/brz.fig | 135 ++ vldb/pt/figs/brz.ps | 324 ++++ vldb/pt/figs/grafordering.fig | 206 +++ vldb/pt/figs/grafordering2.fig | 219 +++ vldb/pt/figs/grafordering3.fig | 130 ++ vldb/pt/figs/grafsearching.fig | 168 ++ vldb/pt/figs/grafsearching2.fig | 180 +++ vldb/pt/figs/grafsearchingncv.fig | 124 ++ vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/pt/introduction.tex | 13 + vldb/pt/makefile | 17 + vldb/pt/references.bib | 669 ++++++++ vldb/pt/relatedwork.tex | 2 + vldb/pt/svglov2.clo | 77 + vldb/pt/svjour2.cls | 1419 +++++++++++++++++ vldb/pt/vldb.tex | 150 ++ 42 files changed, 9938 insertions(+) create mode 100755 vldb/ingles/algorithms.tex create mode 100644 vldb/ingles/applications.tex create mode 100755 vldb/ingles/conclusions.tex create mode 100755 vldb/ingles/experimentalresults.tex create mode 100644 vldb/ingles/figs/brz.fig create mode 100644 vldb/ingles/figs/brz.ps create mode 100755 vldb/ingles/figs/grafordering.fig create mode 100755 vldb/ingles/figs/grafordering2.fig create mode 100755 vldb/ingles/figs/grafordering3.fig create mode 100755 vldb/ingles/figs/grafsearching.fig create mode 100755 vldb/ingles/figs/grafsearching2.fig create mode 100755 vldb/ingles/figs/grafsearchingncv.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/ingles/introduction.tex create mode 100755 vldb/ingles/makefile create mode 100755 vldb/ingles/references.bib create mode 100755 vldb/ingles/relatedwork.tex create mode 100644 vldb/ingles/svglov2.clo create mode 100644 vldb/ingles/svjour2.cls create mode 100644 vldb/ingles/vldb.tex create mode 100755 vldb/pt/algorithms.tex create mode 100644 vldb/pt/applications.tex create mode 100755 vldb/pt/conclusions.tex create mode 100755 vldb/pt/experimentalresults.tex create mode 100644 vldb/pt/figs/brz.fig create mode 100644 vldb/pt/figs/brz.ps create mode 100755 vldb/pt/figs/grafordering.fig create mode 100755 vldb/pt/figs/grafordering2.fig create mode 100755 vldb/pt/figs/grafordering3.fig create mode 100755 vldb/pt/figs/grafsearching.fig create mode 100755 vldb/pt/figs/grafsearching2.fig create mode 100755 vldb/pt/figs/grafsearchingncv.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/pt/introduction.tex create mode 100755 vldb/pt/makefile create mode 100755 vldb/pt/references.bib create mode 100755 vldb/pt/relatedwork.tex create mode 100644 vldb/pt/svglov2.clo create mode 100644 vldb/pt/svjour2.cls create mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex new file mode 100755 index 0000000..226fbe5 --- /dev/null +++ b/vldb/ingles/algorithms.tex @@ -0,0 +1,596 @@ +\section{The Algorithms} +\label{sec:thealgorithm} +We are going to present a novel algorithm that extends our previous work +presented in~\cite{bkz05}. +First we describe our previous work and in the following the new algorithm. +To the best of our knowledge this work is the first one that becomes possible +the construction of minimal perfect hash functions for sets in the order of +billion of keys efficiently. +And better, the generated functions are very compact and can be represented +using approximately nine bits per key. + +\subsection{A Main Memory Based Algorithm} + +\subsection{An External Memory Based Algorithm} +The idea of behind the new algorithm is the traditional divide-to-conquer approach. +The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: +\begin{enumerate} +\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to +a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will +contain more than 256 keys. +This choice is crucial to make the new algorithm works and we give details about it hereinafter. +\item The keys in each bucket are separetaly spread into a hash table. +\end{enumerate} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +The main novelties are in the way the keys are segmented using external memory and spread using +minimal perfect hash functions for each bucket. The next two sections describe each step in details. +\subsubsection{Segmentation} +\subsubsection{Spreading} +% Let us show how the minimal perfect hash function~$h$ +% will be constructed. +% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, +% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where +% $n=|S|$. +% We build a random graph~$G=G(h_1,h_2)$ on~$V$, +% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. +% There is an edge in~$G$ for each key in the set of keys~$S$. +% +% In what follows, we shall be interested in the \textit{2-core} of +% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal +% degree at least~$2$ +% (see, e.g., \cite{b01,jlr00}). +% Because of its importance in our context, we call the 2-core the +% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. +% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. +% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. +% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} +% vertices in~$G$. +% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical +% vertices that have at least one non-critical vertex as a neighbour. +% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. +% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the +% {\em non-critical} subgraph of~$G$. +% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' +% of~$G$. +% We have $G=G_\crit\cup G_\ncrit$. +% +% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices +% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such +% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a +% minimal perfect hash function for~$S$. +% We will see later on that this labelling~$g$ can be found in linear time +% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. +% The procedure GenerateMPHF ($S$, $g$) receives as input the set of +% keys~$S$ and produces the labelling~$g$. +% The method uses a mapping, ordering and searching approach. +% We now describe each step. +% +% \enlargethispage{\baselineskip} +% \enlargethispage{\baselineskip} +% \vspace{-11pt} +% \begin{figure}[htb] +% \begin{center} +% \begin{lstlisting}[ +% ] +% procedure @GenerateMPHF@ (@$S$@, @$g$@) +% Mapping (@$S$@, @$G$@); +% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); +% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); +% \end{lstlisting} +% \end{center} +% \vspace{-12pt} +% \caption{Main steps of the algorithm for constructing a minimal +% perfect hash function} +% \vspace{-26pt} +% \label{prog:mainsteps} +% \end{figure} +% +% \subsection{Mapping Step} +% \label{sec:mapping} +% +% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and +% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary +% functions~$h_1$, $h_2:U\to[0,t-1]$. +% +% \def\tabela{\hbox{table}} +% % +% The functions~$h_1$ and~$h_2$ are constructed as follows. +% We impose some upper bound~$L$ on the lengths of the keys in~$S$. +% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table +% of random integers~$\tabela_j$. +% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let +% \begin{displaymath} \nonumber +% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. +% \end{displaymath} +% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set +% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be +% simple, i.e., +% $G$~should have neither loops nor multiple edges. +% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. +% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod +% t$ in this case. +% If we still find a loop after this, +% we generate another pair $(h_1,h_2)$. +% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. +% +% \vspace{-10pt} +% \subsubsection{Analysis of the Mapping Step. } +% +% We start by discussing some facts on random graphs. +% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform +% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs +% on~$V$ with~$n$ edges are equiprobable. +% The study of~$\cG(t,n)$ goes back to the classical +% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, +% see~\cite{b01,jlr00}). +% Let $d=2n/t$ be the average degree of $G$. +% It is well known that, if~$d>1$, or, equivalently, +% if~$c<2$ (recall that we have $t=cn$), +% then, almost every~$G$ +% contains\footnote{As is usual in the theory of random graphs, we use +% the terms `almost every' and `almost surely' to mean `with probability +% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of +% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ +% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall +% $c=1.15$). +% As the expected number of iterations is $O(1)$, the mapping step takes +% $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Ordering Step} +% \label{sec:ordering} +% +% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as +% input the graph~$G$ and partitions~$G$ into the two subgraphs +% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. +% For that, the procedure iteratively remove all vertices of degree 1 until done. +% +% \enlargethispage{\baselineskip} +% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices +% and 8 edges, where the degree of a vertex is shown besides each vertex. +% Applying the ordering step in this graph, the $5$-vertex graph showed in +% Figure~\ref{fig:grafordering}(b) is obtained. +% All vertices with degree 0 are non-critical vertices and the others are +% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices +% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and +% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). +% +% \vspace{-5pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} +% \end{center} +% \vspace{-10pt} +% \caption{Ordering step for a graph with 9 vertices and 8 edges} +% \vspace{-30pt} +% \label{fig:grafordering} +% \end{figure*} +% +% +% \subsubsection{Analysis of the Ordering Step. } +% +% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). +% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Searching Step} +% \label{sec:searching} +% +% In the searching step, the key part is +% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that +% the function $h:E(G)\to\ZZ$ defined by +% \begin{eqnarray} +% \label{eq:phf} +% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) +% \end{eqnarray} +% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). +% We are interested in a labelling $g:V\to\ZZ$ of +% the vertices of the graph~$G=G(h_1,h_2)$ with +% the property that if~$x$ and~$y$ are keys in~$S$, then +% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate +% to each edge the sum of the labels on its endpoints, then these values +% should be all distinct. +% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) +% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection +% between~$S$ and~$[0,n-1]$. +% +% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives +% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable +% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the +% array~$g$. +% This step is first performed for the vertices in the +% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is +% performed for the vertices in $G_\ncrit$ (the non-critical subgraph +% of~$G$ that contains the ``acyclic part'' of $G$). +% The reason the assignment of the $g$~values is first +% performed on the vertices in~$G_\crit$ is to resolve reassignments +% as early as possible (such reassignments are consequences of the cycles +% in~$G_\crit$ and are depicted hereinafter). +% +% \vspace{-8pt} +% \subsubsection{Assignment of Values to Critical Vertices. } +% \label{sec:assignmentcv} +% +% The labels~$g(v)$ ($v\in V(G_\crit)$) +% are assigned in increasing order following a greedy +% strategy where the critical vertices~$v$ are considered one at a time, +% according to a breadth-first search on~$G_\crit$. +% If a candidate value~$x$ for~$g(v)$ is forbidden +% because setting~$g(v)=x$ would create two edges with the same sum, +% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. +% +% \enlargethispage{\baselineskip} +% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. +% Initially $A_E = \emptyset$. +% Let $x$ be a candidate value for $g(v)$. +% Initially $x = 0$. +% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in $G_\crit$ +% is presented in Figure~\ref{fig:searching}. +% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made +% and $x$ is set to $x + 1$. +% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is +% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. +% +% \vspace{-12pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} +% \end{center} +% \vspace{-13pt} +% \caption{Example of the assignment of values to critical vertices} +% \vspace{-15pt} +% \label{fig:searching} +% \end{figure*} +% +% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, +% the unassigned vertex $0$ is reached. +% At this point, we collect in +% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned +% an $x$ value, and $Y = \{8\}$. +% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. +% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented +% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. +% Next, vertex $3$ is reached, $g(3)$ is set to $2$, +% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. +% Next, vertex $4$ is reached and $Y=\{3, 8\}$. +% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then +% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. +% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. +% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in +% Figure~\ref{fig:searching}(c). +% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, +% as depicted in Figure~\ref{fig:searching}(d). +% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. +% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then +% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. +% This finishes the algorithm. +% +% \vspace{-15pt} +% \subsubsection{Assignment of Values to Non-Critical Vertices. } +% \label{sec:assignmentncv} +% +% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are +% associated with edges in $G_\ncrit$, making this step simple to solve +% by a standard depth first search algorithm. +% Therefore, in the assignment of values to vertices in $G_\ncrit$ we +% benefit from the unused addresses in the gaps left by the assignment of values +% to vertices in $G_\crit$. +% For that, we start the depth-first search from the vertices in $V_\scrit$ +% because the $g$ values for these critical vertices have already been assigned +% and cannot be changed. +% +% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in +% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. +% Figure~\ref{fig:searchingncv}(a) presents the initial state of the +% algorithm. +% The critical vertex~$8$ is the only one that has non-critical +% neighbours. +% In the example presented in Figure~\ref{fig:searching}, the addresses +% $\{0, 4\}$ were not used. +% So, taking the first unused address $0$ and the vertex $1$, which is +% reached from the vertex $8$, $g(1)$ is set to +% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). +% The only vertex that is reached from vertex $1$ is vertex $2$, so +% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, +% as shown in Figure~\ref{fig:searchingncv}(c). +% This process is repeated until the UnAssignedAddresses list becomes empty. +% +% \vspace{-8pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} +% \end{center} +% \vspace{-12pt} +% \caption{Example of the assignment of values to non-critical vertices} +% \vspace{-30pt} +% \label{fig:searchingncv} +% \end{figure*} +% +% \subsubsection{Analysis of the Searching Step. } +% +% We shall demonstrate that +% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we +% generate a minimal perfect hash function), and +% (ii) the perfect assignment problem (determination of~$g$) +% can be solved in expected time $O(n)$ if the number of edges +% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% \enlargethispage{\baselineskip} +% We focus on the analysis of the assignment of values to critical vertices +% because the assignment of values to non-critical vertices +% can be solved in linear time by a depth first search algorithm. +% +% We now define certain complexity measures. +% Let $I(v)$ be the number of times a candidate value $x$ for +% $g(v)$ is incremented. +% Let $N_t$ be the total number of times that candidate values +% $x$ are incremented. +% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in +% V(G_\crit)$. +% +% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is +% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant +% component is provably very small for~$c=1.15$; +% see~\cite{b01,jlr00,pw04}.} The fact that +% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) +% then implies the following. +% +% \begin{theorem} \label{th:nbedg} +% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ +% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed +% \end{theorem} +% +% \def\maxx{{\rm max}} +% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e +% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. +% +% \begin{theorem} \label{th:Agrt} +% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. +% \end{theorem} +% \vspace{-15pt} +% +% \enlargethispage{\baselineskip} +% \begin{proof}(Sketch) +% The assignment of $g$ values to critical vertices starts from 0, +% and each edge~$e$ receives the label $h(e)$ +% as given by Eq.~(\ref{eq:phf}). +% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. +% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the +% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two +% distinct vertices get distinct~$g$ values. Hence, +% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) +% \le2|V(G_\crit)|-3+2N_t$, as required.\qed +% \end{proof} +% +% \vspace{-15pt} +% \subsubsection{Maximal Value Assigned to an Edge. } +% +% In this section we present the following conjecture. +% \begin{conjecture} \label{conj:gretestaddr} +% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and +% $|V(G)| = 1.15n$, +% it is always possible to generate a minimal perfect hash function +% because the maximal value $A_\maxx$ assigned to an edge +% $e \in E(G_\crit)$ is at most $n - 1$. +% \end{conjecture} +% +% Let us assume for the moment that $N_{t} \le N_\bedges$. +% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, +% we have +% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges +% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. +% As by hypothesis $|E(G_\crit)|\leq n/2$, we have +% $A_\maxx \le n - 1$, as required. +% +% \textit{In the mathematical analysis of our algorithm, what is left +% open is a single problem: +% prove that $N_{t} \le N_\bedges$.}\footnote{% +% Bollob\'as and Pikhurko~\cite{bp04} have investigated +% a very close vertex labelling problem for random graphs. +% However, their interest was on denser random graphs, and it seems that +% different methods will have to be used to attack the sparser case that +% we are interested in here.} +% +% We now show experimental evidence that $N_{t} \le N_\bedges$. +% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), +% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are +% $0.401 n$ and $0.501n$, respectively. +% From Theorem~\ref{th:nbedg}, +% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. +% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained +% during 10,000 executions of the algorithm for different sizes of $S$. +% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and +% tends to $0.059n$ for $n\ge1{,}000{,}000$. +% +% \vspace{-5pt} +% \begin{table}[!htb] +% {\footnotesize%\small +% \begin{center} +% \begin{tabular}{|c|c|} +% \hline +% $n$ & Maximal value of $N_t$\\ +% \hline +% %$1{,}000$ & $0.091 n$ \\ +% $10{,}000$ & $0.067 n$ \\ +% $100{,}000$ & $0.061 n$ \\ +% $1{,}000{,}000$ & $0.059 n$ \\ +% $2{,}000{,}000$ & $0.059 n$ \\ +% %$\vdots$ & $\vdots$ \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{The maximal value of $N_t$ for different number of URLs} +% \vspace{-40pt} +% \label{tab:collisions1} +% \end{table} +% +% \subsubsection{Time Complexity. } +% We now show that the time complexity of determining~$g(v)$ +% for all critical vertices~$x\in V(G_\crit)$ is +% $O(|V(G_\crit)|)=O(n)$. +% For each unassigned vertex $v$, the adjacency list of $v$, which we +% call Adj($v$), must be traversed +% to collect the set $Y$ of adjacent vertices that have already been assigned a +% value. +% Then, for each vertex in $Y$, we check if the current candidate value $x$ is +% forbidden because setting $g(v)=x$ would create two edges with the same +% endpoint sum. +% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is +% associated with +% the address that corresponds to the sum of its endpoints. +% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, +% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity +% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. +% Then, putting all these together, we see that the time complexity of this +% procedure is +% \begin{eqnarray} +% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + +% (I(v) \times|Y|) + |Y|\big]\nonumber\\ +% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| +% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber +% \end{eqnarray} +% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have +% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. +% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, +% that +% $ +% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 +% =O(|E(G_\crit)|)$. +% We conclude that +% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. +% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, +% the time required to determine~$g$ on the critical vertices is $O(n)$. +% \enlargethispage{\baselineskip} +% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex new file mode 100644 index 0000000..cd6e72b --- /dev/null +++ b/vldb/ingles/applications.tex @@ -0,0 +1,2 @@ +\section{Applications} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex new file mode 100755 index 0000000..a71789c --- /dev/null +++ b/vldb/ingles/conclusions.tex @@ -0,0 +1,5 @@ +\section{Conclusion} + +% We have presented a practical method for constructing minimal perfect +% hash functions for static sets that is efficient and may be tuned +% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex new file mode 100755 index 0000000..3193625 --- /dev/null +++ b/vldb/ingles/experimentalresults.tex @@ -0,0 +1,178 @@ +\section{Experimental Results} + +% We now present some experimental results. +% The same experiments were run with our algorithm and +% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as +% the CHM algorithm. +% The two algorithms were implemented in the C language and +% are available at \texttt{http://cmph.sf.net}. +% Our data consists +% of a collection of 100 million +% universe resource locations (URLs) collected from the Web. +% The average length of a URL in the collection is 63 bytes. +% All experiments were carried out on +% a computer running the Linux operating system, version 2.6.7, +% with a 2.4 gigahertz processor and +% 4 gigabytes of main memory. +% +% Table~\ref{tab:characteristics} presents the main characteristics +% of the two algorithms. +% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, +% the number of keys in the input set~$S$. +% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ +% for our algorithm and the CHM algorithm, respectively. +% This measure is related to the amount of space to store the array $g$. +% This improves the space required to store a function in our algorithm to +% $55\%$ of the space required by the CHM algorithm. +% The number of critical edges +% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, +% respectively. +% Our algorithm generates random graphs that contain cycles with high +% probability and the +% CHM algorithm +% generates +% acyclic random graphs. +% Finally, the CHM algorithm generates order preserving functions +% while our algorithm does not preserve order. +% +% \vspace{-10pt} +% \begin{table}[htb] +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|c|c|c|c|c|c|} +% \hline +% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ +% \hline +% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ +% \hline +% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{Main characteristics of the algorithms} +% \vspace{-25pt} +% \label{tab:characteristics} +% \end{table} +% +% Table~\ref{tab:timeresults} presents time measurements. +% All times are in seconds. +% The table entries are averages over 50 trials. +% The column labelled $N_i$ gives +% the number of iterations to generate the random graph $G$ +% in the mapping step of the algorithms. +% The next columns give the running times +% for the mapping plus ordering steps together and the searching +% step for each algorithm. +% The last column gives the percentage gain of our algorithm +% over the CHM algorithm. +% +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|c|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ +% \hline +% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] +% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] +% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] +% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] +% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] +% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] +% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our algorithm and the CHM algorithm} +% \vspace{-25pt} +% \label{tab:timeresults} +% }\end{table*} +% +% \enlargethispage{\baselineskip} +% The mapping step of the new algorithm is faster because +% the expected number of iterations in the mapping step to generate +% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. +% The graph $G$ generated by our algorithm +% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. +% These two facts make our algorithm faster in the mapping step. +% The ordering step of our algorithm is approximately equal to +% the time to check if $G$ is acyclic for the CHM algorithm. +% The searching step of the CHM algorithm is faster, but the total +% time of our algorithm is, on average, approximately 58\% faster +% than the CHM algorithm. +% +% The experimental results fully backs the theoretical results. +% It is important to notice the times for the searching step: +% for both algorithms they are not the dominant times, +% and the experimental results clearly show +% a linear behavior for the searching step. +% +% We now present a heuristic that reduces the space requirement +% to any given value between $1.15n$ words and $0.93n$ words. +% The heuristic reuses, when possible, the set +% of $x$ values that caused reassignments, just before trying $x+1$ +% (see Section~\ref{sec:searching}). +% The lower limit $c=0.93$ was obtained experimentally. +% We generate $10{,}000$ random graphs for +% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). +% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never +% succeeded. +% Decreasing the value of $c$ leads to an increase in the number of +% iterations to generate $G$. +% For example, for $c=1$ and $c=0.93$, the analytical expected number +% of iterations are $2.72$ and $3.17$, respectively +% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 +% for $c=0.93$). +% Table~\ref{tab:timeresults2} presents the total times to construct a +% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds +% for $c=1.15$ (see Table~\ref{tab:timeresults}) to +% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. +% +% \vspace{-5pt} +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} \\%[0.3mm] +% \hline%\\[-2mm] +% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our tuned algorithm with $c=1.00$ and $c=0.93$} +% \vspace{-25pt} +% \label{tab:timeresults2} +% } +% \end{table*} +% +% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and +% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their +% source code. In their implementation the set of keys is a set of random integers. +% We modified our implementation to generate our~$h$ from a set of random +% integers in order to make a fair comparison. For a set of $10^6$ random integers, +% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for +% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. +% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than +% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different +% sizes. +% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store +% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and +% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. +% The time to generate the functions is inversely proportional to the value of $k$. +% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/ingles/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/ingles/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/ingles/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/ingles/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/ingles/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/ingles/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/ingles/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/ingles/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex new file mode 100755 index 0000000..2c08256 --- /dev/null +++ b/vldb/ingles/introduction.tex @@ -0,0 +1,86 @@ +\section{Introduction} +\label{sec:introduction} + +Suppose~$U$ is a universe of \textit{keys}. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +Hashing methods for {\em non-static sets} of keys can be used to construct +data structures storing $S$ and supporting membership queries +``$x \in S$?'' in expected time $O(1)$. +However, they involve a certain amount of wasted space owing to unused +locations in the table and waisted time to resolve collisions when +two keys are hashed to the same table location. + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + +Minimal perfect hash functions are widely used for memory efficient +storage +and fast retrieval of items from static sets, such as words in natural +languages, reserved words in programming languages or interactive systems, +universal resource locations (URLs) in Web search engines, or item sets in +data mining techniques. + +The aim of this paper is to describe a new way of constructing minimal perfect +hash functions. Our algorithm shares several features with the one due to +Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also +based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one +correspondence with the key set~$S$ for which we wish to generate the hash +function. +The two main differences between our algorithm and theirs +are as follows: +(\textit{i})~we generate random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ +contains cycles with high probability, +while they generate \textit{acyclic} random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, +with a greater number of vertices: $|V|\ge2.09n$; +(\textit{ii})~they generate order preserving minimal perfect hash functions +while our algorithm does not preserve order (a perfect hash function $h$ is +\textit{order preserving} if the keys in~$S$ are arranged in some given order +and~$h$ preserves this order in the hash table). Thus, our algorithm improves +the space requirement at the expense of generating functions that are not +order preserving. + +Our algorithm is efficient and may be tuned to yield a function~$h$ +with a very economical description. +As the algorithm in~\cite{chm92}, our algorithm produces~$h$ +in~$O(n)$ expected time for a set of~$n$ keys. +The description of~$h$ requires~$1.15n$ computer words, +and evaluating~$h(x)$ +requires two accesses to an array of~$1.15n$ integers. +We further derive a heuristic that improves the space requirement +from~$1.15n$ words down to~$0.93n$ words. +Our scheme is very practical: to generate a minimal perfect hash function for +a collection of 100~million universe resource locations (URLs), each 63 bytes +long on average, our algorithm running on a commodity PC takes 811 seconds on +average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/ingles/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/ingles/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex new file mode 100755 index 0000000..e32c52e --- /dev/null +++ b/vldb/ingles/relatedwork.tex @@ -0,0 +1,67 @@ +\section{Related Work} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical results +on perfect hashing. +In the following, we review some of those results. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Many methods for generating minimal perfect hash functions use a +{\em mapping}, {\em ordering} and {\em searching} +(MOS) approach, +a description coined by Fox, Chen and Heath~\cite{fch92}. +In the MOS approach, the construction of a minimal perfect hash function +is accomplished in three steps. +First, the mapping step transforms the key set from the original universe +to a new universe. +Second, the ordering step places the keys in a sequential order that +determines the order in which hash values are assigned to keys. +Third, the searching step attempts to assign hash values to the keys. +Our algorithm and the algorithm presented in~\cite{chm92} use the +MOS approach. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing minimal perfect hash functions. +The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n$ computer words. +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer +words required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +Differently from the works in~\cite{p99,dh01}, our algorithm uses two +universal hash functions $h_1$ and $h_2$ randomly selected from a class +of universal hash functions that do not need to meet any additional +requirements. + +The work in~\cite{chm92} presents an efficient and practical algorithm +for generating order preserving minimal perfect hash functions. +Their method involves the generation of acyclic random graphs +$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. +They showed that an order preserving minimal perfect hash function +can be found in optimal time if~$G$ is acyclic. +To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are +computed for each key $x \in S$. +Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, +\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. +In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects +$h_1$ and $h_2$ from a family of universal hash functions +until the corresponding graph is acyclic. +Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, +then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. +For $c=2.09$, this probability is +$p \simeq 0.342$, and +the expected number of iterations to obtain an acyclic graph +is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/ingles/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/ingles/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/ingles/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex new file mode 100755 index 0000000..61d26cd --- /dev/null +++ b/vldb/pt/algorithms.tex @@ -0,0 +1,19 @@ +\section{Os Algoritmos} +\label{sec:thealgorithm} + +\subsection{Um Algoritmo Baseado em Mem\'oria Principal} + +\subsection{Um Algoritmo Baseado em Mem\'oria Externa} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +\subsubsection{Segmenta\c{c}\~ao} +\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex new file mode 100644 index 0000000..785ccc0 --- /dev/null +++ b/vldb/pt/applications.tex @@ -0,0 +1,2 @@ +\section{Aplica\c{c}\~oes} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex new file mode 100755 index 0000000..08f3cd4 --- /dev/null +++ b/vldb/pt/conclusions.tex @@ -0,0 +1,3 @@ +\section{Conclus\~oes} + + diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex new file mode 100755 index 0000000..5152c0e --- /dev/null +++ b/vldb/pt/experimentalresults.tex @@ -0,0 +1 @@ +\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/pt/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/pt/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/pt/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/pt/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/pt/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/pt/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/pt/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/pt/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex new file mode 100755 index 0000000..bf4ef85 --- /dev/null +++ b/vldb/pt/introduction.tex @@ -0,0 +1,13 @@ +\section{Introdu\c{c}\~ao} +\label{sec:introduction} +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + diff --git a/vldb/pt/makefile b/vldb/pt/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/pt/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/pt/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex new file mode 100755 index 0000000..554b9db --- /dev/null +++ b/vldb/pt/relatedwork.tex @@ -0,0 +1,2 @@ +\section{Trabalhos Relacionados} +\cite{bkz05} \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/pt/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/pt/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/pt/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} From c0ae67705be70c5847da00c888994d993b229c04 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 27 Sep 2005 15:11:25 +0000 Subject: [PATCH 226/739] added vldb jounal --- vldb/ingles/algorithms.tex | 596 +++++++ vldb/ingles/applications.tex | 2 + vldb/ingles/conclusions.tex | 5 + vldb/ingles/experimentalresults.tex | 178 +++ vldb/ingles/figs/brz.fig | 135 ++ vldb/ingles/figs/brz.ps | 324 ++++ vldb/ingles/figs/grafordering.fig | 206 +++ vldb/ingles/figs/grafordering2.fig | 219 +++ vldb/ingles/figs/grafordering3.fig | 130 ++ vldb/ingles/figs/grafsearching.fig | 168 ++ vldb/ingles/figs/grafsearching2.fig | 180 +++ vldb/ingles/figs/grafsearchingncv.fig | 124 ++ .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/ingles/introduction.tex | 86 + vldb/ingles/makefile | 17 + vldb/ingles/references.bib | 669 ++++++++ vldb/ingles/relatedwork.tex | 67 + vldb/ingles/svglov2.clo | 77 + vldb/ingles/svjour2.cls | 1419 +++++++++++++++++ vldb/ingles/vldb.tex | 150 ++ vldb/pt/algorithms.tex | 19 + vldb/pt/applications.tex | 2 + vldb/pt/conclusions.tex | 3 + vldb/pt/experimentalresults.tex | 1 + vldb/pt/figs/brz.fig | 135 ++ vldb/pt/figs/brz.ps | 324 ++++ vldb/pt/figs/grafordering.fig | 206 +++ vldb/pt/figs/grafordering2.fig | 219 +++ vldb/pt/figs/grafordering3.fig | 130 ++ vldb/pt/figs/grafsearching.fig | 168 ++ vldb/pt/figs/grafsearching2.fig | 180 +++ vldb/pt/figs/grafsearchingncv.fig | 124 ++ vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/pt/introduction.tex | 13 + vldb/pt/makefile | 17 + vldb/pt/references.bib | 669 ++++++++ vldb/pt/relatedwork.tex | 2 + vldb/pt/svglov2.clo | 77 + vldb/pt/svjour2.cls | 1419 +++++++++++++++++ vldb/pt/vldb.tex | 150 ++ 42 files changed, 9938 insertions(+) create mode 100755 vldb/ingles/algorithms.tex create mode 100644 vldb/ingles/applications.tex create mode 100755 vldb/ingles/conclusions.tex create mode 100755 vldb/ingles/experimentalresults.tex create mode 100644 vldb/ingles/figs/brz.fig create mode 100644 vldb/ingles/figs/brz.ps create mode 100755 vldb/ingles/figs/grafordering.fig create mode 100755 vldb/ingles/figs/grafordering2.fig create mode 100755 vldb/ingles/figs/grafordering3.fig create mode 100755 vldb/ingles/figs/grafsearching.fig create mode 100755 vldb/ingles/figs/grafsearching2.fig create mode 100755 vldb/ingles/figs/grafsearchingncv.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/ingles/introduction.tex create mode 100755 vldb/ingles/makefile create mode 100755 vldb/ingles/references.bib create mode 100755 vldb/ingles/relatedwork.tex create mode 100644 vldb/ingles/svglov2.clo create mode 100644 vldb/ingles/svjour2.cls create mode 100644 vldb/ingles/vldb.tex create mode 100755 vldb/pt/algorithms.tex create mode 100644 vldb/pt/applications.tex create mode 100755 vldb/pt/conclusions.tex create mode 100755 vldb/pt/experimentalresults.tex create mode 100644 vldb/pt/figs/brz.fig create mode 100644 vldb/pt/figs/brz.ps create mode 100755 vldb/pt/figs/grafordering.fig create mode 100755 vldb/pt/figs/grafordering2.fig create mode 100755 vldb/pt/figs/grafordering3.fig create mode 100755 vldb/pt/figs/grafsearching.fig create mode 100755 vldb/pt/figs/grafsearching2.fig create mode 100755 vldb/pt/figs/grafsearchingncv.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/pt/introduction.tex create mode 100755 vldb/pt/makefile create mode 100755 vldb/pt/references.bib create mode 100755 vldb/pt/relatedwork.tex create mode 100644 vldb/pt/svglov2.clo create mode 100644 vldb/pt/svjour2.cls create mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex new file mode 100755 index 0000000..226fbe5 --- /dev/null +++ b/vldb/ingles/algorithms.tex @@ -0,0 +1,596 @@ +\section{The Algorithms} +\label{sec:thealgorithm} +We are going to present a novel algorithm that extends our previous work +presented in~\cite{bkz05}. +First we describe our previous work and in the following the new algorithm. +To the best of our knowledge this work is the first one that becomes possible +the construction of minimal perfect hash functions for sets in the order of +billion of keys efficiently. +And better, the generated functions are very compact and can be represented +using approximately nine bits per key. + +\subsection{A Main Memory Based Algorithm} + +\subsection{An External Memory Based Algorithm} +The idea of behind the new algorithm is the traditional divide-to-conquer approach. +The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: +\begin{enumerate} +\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to +a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will +contain more than 256 keys. +This choice is crucial to make the new algorithm works and we give details about it hereinafter. +\item The keys in each bucket are separetaly spread into a hash table. +\end{enumerate} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +The main novelties are in the way the keys are segmented using external memory and spread using +minimal perfect hash functions for each bucket. The next two sections describe each step in details. +\subsubsection{Segmentation} +\subsubsection{Spreading} +% Let us show how the minimal perfect hash function~$h$ +% will be constructed. +% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, +% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where +% $n=|S|$. +% We build a random graph~$G=G(h_1,h_2)$ on~$V$, +% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. +% There is an edge in~$G$ for each key in the set of keys~$S$. +% +% In what follows, we shall be interested in the \textit{2-core} of +% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal +% degree at least~$2$ +% (see, e.g., \cite{b01,jlr00}). +% Because of its importance in our context, we call the 2-core the +% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. +% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. +% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. +% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} +% vertices in~$G$. +% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical +% vertices that have at least one non-critical vertex as a neighbour. +% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. +% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the +% {\em non-critical} subgraph of~$G$. +% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' +% of~$G$. +% We have $G=G_\crit\cup G_\ncrit$. +% +% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices +% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such +% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a +% minimal perfect hash function for~$S$. +% We will see later on that this labelling~$g$ can be found in linear time +% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. +% The procedure GenerateMPHF ($S$, $g$) receives as input the set of +% keys~$S$ and produces the labelling~$g$. +% The method uses a mapping, ordering and searching approach. +% We now describe each step. +% +% \enlargethispage{\baselineskip} +% \enlargethispage{\baselineskip} +% \vspace{-11pt} +% \begin{figure}[htb] +% \begin{center} +% \begin{lstlisting}[ +% ] +% procedure @GenerateMPHF@ (@$S$@, @$g$@) +% Mapping (@$S$@, @$G$@); +% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); +% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); +% \end{lstlisting} +% \end{center} +% \vspace{-12pt} +% \caption{Main steps of the algorithm for constructing a minimal +% perfect hash function} +% \vspace{-26pt} +% \label{prog:mainsteps} +% \end{figure} +% +% \subsection{Mapping Step} +% \label{sec:mapping} +% +% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and +% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary +% functions~$h_1$, $h_2:U\to[0,t-1]$. +% +% \def\tabela{\hbox{table}} +% % +% The functions~$h_1$ and~$h_2$ are constructed as follows. +% We impose some upper bound~$L$ on the lengths of the keys in~$S$. +% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table +% of random integers~$\tabela_j$. +% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let +% \begin{displaymath} \nonumber +% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. +% \end{displaymath} +% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set +% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be +% simple, i.e., +% $G$~should have neither loops nor multiple edges. +% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. +% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod +% t$ in this case. +% If we still find a loop after this, +% we generate another pair $(h_1,h_2)$. +% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. +% +% \vspace{-10pt} +% \subsubsection{Analysis of the Mapping Step. } +% +% We start by discussing some facts on random graphs. +% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform +% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs +% on~$V$ with~$n$ edges are equiprobable. +% The study of~$\cG(t,n)$ goes back to the classical +% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, +% see~\cite{b01,jlr00}). +% Let $d=2n/t$ be the average degree of $G$. +% It is well known that, if~$d>1$, or, equivalently, +% if~$c<2$ (recall that we have $t=cn$), +% then, almost every~$G$ +% contains\footnote{As is usual in the theory of random graphs, we use +% the terms `almost every' and `almost surely' to mean `with probability +% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of +% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ +% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall +% $c=1.15$). +% As the expected number of iterations is $O(1)$, the mapping step takes +% $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Ordering Step} +% \label{sec:ordering} +% +% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as +% input the graph~$G$ and partitions~$G$ into the two subgraphs +% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. +% For that, the procedure iteratively remove all vertices of degree 1 until done. +% +% \enlargethispage{\baselineskip} +% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices +% and 8 edges, where the degree of a vertex is shown besides each vertex. +% Applying the ordering step in this graph, the $5$-vertex graph showed in +% Figure~\ref{fig:grafordering}(b) is obtained. +% All vertices with degree 0 are non-critical vertices and the others are +% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices +% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and +% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). +% +% \vspace{-5pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} +% \end{center} +% \vspace{-10pt} +% \caption{Ordering step for a graph with 9 vertices and 8 edges} +% \vspace{-30pt} +% \label{fig:grafordering} +% \end{figure*} +% +% +% \subsubsection{Analysis of the Ordering Step. } +% +% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). +% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Searching Step} +% \label{sec:searching} +% +% In the searching step, the key part is +% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that +% the function $h:E(G)\to\ZZ$ defined by +% \begin{eqnarray} +% \label{eq:phf} +% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) +% \end{eqnarray} +% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). +% We are interested in a labelling $g:V\to\ZZ$ of +% the vertices of the graph~$G=G(h_1,h_2)$ with +% the property that if~$x$ and~$y$ are keys in~$S$, then +% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate +% to each edge the sum of the labels on its endpoints, then these values +% should be all distinct. +% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) +% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection +% between~$S$ and~$[0,n-1]$. +% +% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives +% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable +% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the +% array~$g$. +% This step is first performed for the vertices in the +% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is +% performed for the vertices in $G_\ncrit$ (the non-critical subgraph +% of~$G$ that contains the ``acyclic part'' of $G$). +% The reason the assignment of the $g$~values is first +% performed on the vertices in~$G_\crit$ is to resolve reassignments +% as early as possible (such reassignments are consequences of the cycles +% in~$G_\crit$ and are depicted hereinafter). +% +% \vspace{-8pt} +% \subsubsection{Assignment of Values to Critical Vertices. } +% \label{sec:assignmentcv} +% +% The labels~$g(v)$ ($v\in V(G_\crit)$) +% are assigned in increasing order following a greedy +% strategy where the critical vertices~$v$ are considered one at a time, +% according to a breadth-first search on~$G_\crit$. +% If a candidate value~$x$ for~$g(v)$ is forbidden +% because setting~$g(v)=x$ would create two edges with the same sum, +% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. +% +% \enlargethispage{\baselineskip} +% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. +% Initially $A_E = \emptyset$. +% Let $x$ be a candidate value for $g(v)$. +% Initially $x = 0$. +% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in $G_\crit$ +% is presented in Figure~\ref{fig:searching}. +% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made +% and $x$ is set to $x + 1$. +% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is +% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. +% +% \vspace{-12pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} +% \end{center} +% \vspace{-13pt} +% \caption{Example of the assignment of values to critical vertices} +% \vspace{-15pt} +% \label{fig:searching} +% \end{figure*} +% +% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, +% the unassigned vertex $0$ is reached. +% At this point, we collect in +% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned +% an $x$ value, and $Y = \{8\}$. +% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. +% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented +% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. +% Next, vertex $3$ is reached, $g(3)$ is set to $2$, +% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. +% Next, vertex $4$ is reached and $Y=\{3, 8\}$. +% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then +% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. +% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. +% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in +% Figure~\ref{fig:searching}(c). +% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, +% as depicted in Figure~\ref{fig:searching}(d). +% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. +% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then +% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. +% This finishes the algorithm. +% +% \vspace{-15pt} +% \subsubsection{Assignment of Values to Non-Critical Vertices. } +% \label{sec:assignmentncv} +% +% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are +% associated with edges in $G_\ncrit$, making this step simple to solve +% by a standard depth first search algorithm. +% Therefore, in the assignment of values to vertices in $G_\ncrit$ we +% benefit from the unused addresses in the gaps left by the assignment of values +% to vertices in $G_\crit$. +% For that, we start the depth-first search from the vertices in $V_\scrit$ +% because the $g$ values for these critical vertices have already been assigned +% and cannot be changed. +% +% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in +% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. +% Figure~\ref{fig:searchingncv}(a) presents the initial state of the +% algorithm. +% The critical vertex~$8$ is the only one that has non-critical +% neighbours. +% In the example presented in Figure~\ref{fig:searching}, the addresses +% $\{0, 4\}$ were not used. +% So, taking the first unused address $0$ and the vertex $1$, which is +% reached from the vertex $8$, $g(1)$ is set to +% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). +% The only vertex that is reached from vertex $1$ is vertex $2$, so +% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, +% as shown in Figure~\ref{fig:searchingncv}(c). +% This process is repeated until the UnAssignedAddresses list becomes empty. +% +% \vspace{-8pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} +% \end{center} +% \vspace{-12pt} +% \caption{Example of the assignment of values to non-critical vertices} +% \vspace{-30pt} +% \label{fig:searchingncv} +% \end{figure*} +% +% \subsubsection{Analysis of the Searching Step. } +% +% We shall demonstrate that +% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we +% generate a minimal perfect hash function), and +% (ii) the perfect assignment problem (determination of~$g$) +% can be solved in expected time $O(n)$ if the number of edges +% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% \enlargethispage{\baselineskip} +% We focus on the analysis of the assignment of values to critical vertices +% because the assignment of values to non-critical vertices +% can be solved in linear time by a depth first search algorithm. +% +% We now define certain complexity measures. +% Let $I(v)$ be the number of times a candidate value $x$ for +% $g(v)$ is incremented. +% Let $N_t$ be the total number of times that candidate values +% $x$ are incremented. +% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in +% V(G_\crit)$. +% +% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is +% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant +% component is provably very small for~$c=1.15$; +% see~\cite{b01,jlr00,pw04}.} The fact that +% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) +% then implies the following. +% +% \begin{theorem} \label{th:nbedg} +% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ +% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed +% \end{theorem} +% +% \def\maxx{{\rm max}} +% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e +% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. +% +% \begin{theorem} \label{th:Agrt} +% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. +% \end{theorem} +% \vspace{-15pt} +% +% \enlargethispage{\baselineskip} +% \begin{proof}(Sketch) +% The assignment of $g$ values to critical vertices starts from 0, +% and each edge~$e$ receives the label $h(e)$ +% as given by Eq.~(\ref{eq:phf}). +% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. +% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the +% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two +% distinct vertices get distinct~$g$ values. Hence, +% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) +% \le2|V(G_\crit)|-3+2N_t$, as required.\qed +% \end{proof} +% +% \vspace{-15pt} +% \subsubsection{Maximal Value Assigned to an Edge. } +% +% In this section we present the following conjecture. +% \begin{conjecture} \label{conj:gretestaddr} +% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and +% $|V(G)| = 1.15n$, +% it is always possible to generate a minimal perfect hash function +% because the maximal value $A_\maxx$ assigned to an edge +% $e \in E(G_\crit)$ is at most $n - 1$. +% \end{conjecture} +% +% Let us assume for the moment that $N_{t} \le N_\bedges$. +% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, +% we have +% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges +% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. +% As by hypothesis $|E(G_\crit)|\leq n/2$, we have +% $A_\maxx \le n - 1$, as required. +% +% \textit{In the mathematical analysis of our algorithm, what is left +% open is a single problem: +% prove that $N_{t} \le N_\bedges$.}\footnote{% +% Bollob\'as and Pikhurko~\cite{bp04} have investigated +% a very close vertex labelling problem for random graphs. +% However, their interest was on denser random graphs, and it seems that +% different methods will have to be used to attack the sparser case that +% we are interested in here.} +% +% We now show experimental evidence that $N_{t} \le N_\bedges$. +% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), +% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are +% $0.401 n$ and $0.501n$, respectively. +% From Theorem~\ref{th:nbedg}, +% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. +% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained +% during 10,000 executions of the algorithm for different sizes of $S$. +% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and +% tends to $0.059n$ for $n\ge1{,}000{,}000$. +% +% \vspace{-5pt} +% \begin{table}[!htb] +% {\footnotesize%\small +% \begin{center} +% \begin{tabular}{|c|c|} +% \hline +% $n$ & Maximal value of $N_t$\\ +% \hline +% %$1{,}000$ & $0.091 n$ \\ +% $10{,}000$ & $0.067 n$ \\ +% $100{,}000$ & $0.061 n$ \\ +% $1{,}000{,}000$ & $0.059 n$ \\ +% $2{,}000{,}000$ & $0.059 n$ \\ +% %$\vdots$ & $\vdots$ \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{The maximal value of $N_t$ for different number of URLs} +% \vspace{-40pt} +% \label{tab:collisions1} +% \end{table} +% +% \subsubsection{Time Complexity. } +% We now show that the time complexity of determining~$g(v)$ +% for all critical vertices~$x\in V(G_\crit)$ is +% $O(|V(G_\crit)|)=O(n)$. +% For each unassigned vertex $v$, the adjacency list of $v$, which we +% call Adj($v$), must be traversed +% to collect the set $Y$ of adjacent vertices that have already been assigned a +% value. +% Then, for each vertex in $Y$, we check if the current candidate value $x$ is +% forbidden because setting $g(v)=x$ would create two edges with the same +% endpoint sum. +% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is +% associated with +% the address that corresponds to the sum of its endpoints. +% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, +% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity +% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. +% Then, putting all these together, we see that the time complexity of this +% procedure is +% \begin{eqnarray} +% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + +% (I(v) \times|Y|) + |Y|\big]\nonumber\\ +% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| +% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber +% \end{eqnarray} +% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have +% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. +% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, +% that +% $ +% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 +% =O(|E(G_\crit)|)$. +% We conclude that +% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. +% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, +% the time required to determine~$g$ on the critical vertices is $O(n)$. +% \enlargethispage{\baselineskip} +% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex new file mode 100644 index 0000000..cd6e72b --- /dev/null +++ b/vldb/ingles/applications.tex @@ -0,0 +1,2 @@ +\section{Applications} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex new file mode 100755 index 0000000..a71789c --- /dev/null +++ b/vldb/ingles/conclusions.tex @@ -0,0 +1,5 @@ +\section{Conclusion} + +% We have presented a practical method for constructing minimal perfect +% hash functions for static sets that is efficient and may be tuned +% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex new file mode 100755 index 0000000..3193625 --- /dev/null +++ b/vldb/ingles/experimentalresults.tex @@ -0,0 +1,178 @@ +\section{Experimental Results} + +% We now present some experimental results. +% The same experiments were run with our algorithm and +% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as +% the CHM algorithm. +% The two algorithms were implemented in the C language and +% are available at \texttt{http://cmph.sf.net}. +% Our data consists +% of a collection of 100 million +% universe resource locations (URLs) collected from the Web. +% The average length of a URL in the collection is 63 bytes. +% All experiments were carried out on +% a computer running the Linux operating system, version 2.6.7, +% with a 2.4 gigahertz processor and +% 4 gigabytes of main memory. +% +% Table~\ref{tab:characteristics} presents the main characteristics +% of the two algorithms. +% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, +% the number of keys in the input set~$S$. +% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ +% for our algorithm and the CHM algorithm, respectively. +% This measure is related to the amount of space to store the array $g$. +% This improves the space required to store a function in our algorithm to +% $55\%$ of the space required by the CHM algorithm. +% The number of critical edges +% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, +% respectively. +% Our algorithm generates random graphs that contain cycles with high +% probability and the +% CHM algorithm +% generates +% acyclic random graphs. +% Finally, the CHM algorithm generates order preserving functions +% while our algorithm does not preserve order. +% +% \vspace{-10pt} +% \begin{table}[htb] +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|c|c|c|c|c|c|} +% \hline +% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ +% \hline +% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ +% \hline +% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{Main characteristics of the algorithms} +% \vspace{-25pt} +% \label{tab:characteristics} +% \end{table} +% +% Table~\ref{tab:timeresults} presents time measurements. +% All times are in seconds. +% The table entries are averages over 50 trials. +% The column labelled $N_i$ gives +% the number of iterations to generate the random graph $G$ +% in the mapping step of the algorithms. +% The next columns give the running times +% for the mapping plus ordering steps together and the searching +% step for each algorithm. +% The last column gives the percentage gain of our algorithm +% over the CHM algorithm. +% +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|c|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ +% \hline +% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] +% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] +% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] +% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] +% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] +% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] +% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our algorithm and the CHM algorithm} +% \vspace{-25pt} +% \label{tab:timeresults} +% }\end{table*} +% +% \enlargethispage{\baselineskip} +% The mapping step of the new algorithm is faster because +% the expected number of iterations in the mapping step to generate +% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. +% The graph $G$ generated by our algorithm +% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. +% These two facts make our algorithm faster in the mapping step. +% The ordering step of our algorithm is approximately equal to +% the time to check if $G$ is acyclic for the CHM algorithm. +% The searching step of the CHM algorithm is faster, but the total +% time of our algorithm is, on average, approximately 58\% faster +% than the CHM algorithm. +% +% The experimental results fully backs the theoretical results. +% It is important to notice the times for the searching step: +% for both algorithms they are not the dominant times, +% and the experimental results clearly show +% a linear behavior for the searching step. +% +% We now present a heuristic that reduces the space requirement +% to any given value between $1.15n$ words and $0.93n$ words. +% The heuristic reuses, when possible, the set +% of $x$ values that caused reassignments, just before trying $x+1$ +% (see Section~\ref{sec:searching}). +% The lower limit $c=0.93$ was obtained experimentally. +% We generate $10{,}000$ random graphs for +% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). +% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never +% succeeded. +% Decreasing the value of $c$ leads to an increase in the number of +% iterations to generate $G$. +% For example, for $c=1$ and $c=0.93$, the analytical expected number +% of iterations are $2.72$ and $3.17$, respectively +% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 +% for $c=0.93$). +% Table~\ref{tab:timeresults2} presents the total times to construct a +% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds +% for $c=1.15$ (see Table~\ref{tab:timeresults}) to +% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. +% +% \vspace{-5pt} +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} \\%[0.3mm] +% \hline%\\[-2mm] +% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our tuned algorithm with $c=1.00$ and $c=0.93$} +% \vspace{-25pt} +% \label{tab:timeresults2} +% } +% \end{table*} +% +% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and +% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their +% source code. In their implementation the set of keys is a set of random integers. +% We modified our implementation to generate our~$h$ from a set of random +% integers in order to make a fair comparison. For a set of $10^6$ random integers, +% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for +% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. +% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than +% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different +% sizes. +% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store +% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and +% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. +% The time to generate the functions is inversely proportional to the value of $k$. +% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/ingles/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/ingles/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/ingles/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/ingles/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/ingles/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/ingles/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/ingles/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/ingles/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex new file mode 100755 index 0000000..2c08256 --- /dev/null +++ b/vldb/ingles/introduction.tex @@ -0,0 +1,86 @@ +\section{Introduction} +\label{sec:introduction} + +Suppose~$U$ is a universe of \textit{keys}. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +Hashing methods for {\em non-static sets} of keys can be used to construct +data structures storing $S$ and supporting membership queries +``$x \in S$?'' in expected time $O(1)$. +However, they involve a certain amount of wasted space owing to unused +locations in the table and waisted time to resolve collisions when +two keys are hashed to the same table location. + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + +Minimal perfect hash functions are widely used for memory efficient +storage +and fast retrieval of items from static sets, such as words in natural +languages, reserved words in programming languages or interactive systems, +universal resource locations (URLs) in Web search engines, or item sets in +data mining techniques. + +The aim of this paper is to describe a new way of constructing minimal perfect +hash functions. Our algorithm shares several features with the one due to +Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also +based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one +correspondence with the key set~$S$ for which we wish to generate the hash +function. +The two main differences between our algorithm and theirs +are as follows: +(\textit{i})~we generate random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ +contains cycles with high probability, +while they generate \textit{acyclic} random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, +with a greater number of vertices: $|V|\ge2.09n$; +(\textit{ii})~they generate order preserving minimal perfect hash functions +while our algorithm does not preserve order (a perfect hash function $h$ is +\textit{order preserving} if the keys in~$S$ are arranged in some given order +and~$h$ preserves this order in the hash table). Thus, our algorithm improves +the space requirement at the expense of generating functions that are not +order preserving. + +Our algorithm is efficient and may be tuned to yield a function~$h$ +with a very economical description. +As the algorithm in~\cite{chm92}, our algorithm produces~$h$ +in~$O(n)$ expected time for a set of~$n$ keys. +The description of~$h$ requires~$1.15n$ computer words, +and evaluating~$h(x)$ +requires two accesses to an array of~$1.15n$ integers. +We further derive a heuristic that improves the space requirement +from~$1.15n$ words down to~$0.93n$ words. +Our scheme is very practical: to generate a minimal perfect hash function for +a collection of 100~million universe resource locations (URLs), each 63 bytes +long on average, our algorithm running on a commodity PC takes 811 seconds on +average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/ingles/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/ingles/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex new file mode 100755 index 0000000..e32c52e --- /dev/null +++ b/vldb/ingles/relatedwork.tex @@ -0,0 +1,67 @@ +\section{Related Work} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical results +on perfect hashing. +In the following, we review some of those results. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Many methods for generating minimal perfect hash functions use a +{\em mapping}, {\em ordering} and {\em searching} +(MOS) approach, +a description coined by Fox, Chen and Heath~\cite{fch92}. +In the MOS approach, the construction of a minimal perfect hash function +is accomplished in three steps. +First, the mapping step transforms the key set from the original universe +to a new universe. +Second, the ordering step places the keys in a sequential order that +determines the order in which hash values are assigned to keys. +Third, the searching step attempts to assign hash values to the keys. +Our algorithm and the algorithm presented in~\cite{chm92} use the +MOS approach. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing minimal perfect hash functions. +The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n$ computer words. +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer +words required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +Differently from the works in~\cite{p99,dh01}, our algorithm uses two +universal hash functions $h_1$ and $h_2$ randomly selected from a class +of universal hash functions that do not need to meet any additional +requirements. + +The work in~\cite{chm92} presents an efficient and practical algorithm +for generating order preserving minimal perfect hash functions. +Their method involves the generation of acyclic random graphs +$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. +They showed that an order preserving minimal perfect hash function +can be found in optimal time if~$G$ is acyclic. +To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are +computed for each key $x \in S$. +Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, +\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. +In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects +$h_1$ and $h_2$ from a family of universal hash functions +until the corresponding graph is acyclic. +Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, +then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. +For $c=2.09$, this probability is +$p \simeq 0.342$, and +the expected number of iterations to obtain an acyclic graph +is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/ingles/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/ingles/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/ingles/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex new file mode 100755 index 0000000..61d26cd --- /dev/null +++ b/vldb/pt/algorithms.tex @@ -0,0 +1,19 @@ +\section{Os Algoritmos} +\label{sec:thealgorithm} + +\subsection{Um Algoritmo Baseado em Mem\'oria Principal} + +\subsection{Um Algoritmo Baseado em Mem\'oria Externa} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +\subsubsection{Segmenta\c{c}\~ao} +\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex new file mode 100644 index 0000000..785ccc0 --- /dev/null +++ b/vldb/pt/applications.tex @@ -0,0 +1,2 @@ +\section{Aplica\c{c}\~oes} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex new file mode 100755 index 0000000..08f3cd4 --- /dev/null +++ b/vldb/pt/conclusions.tex @@ -0,0 +1,3 @@ +\section{Conclus\~oes} + + diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex new file mode 100755 index 0000000..5152c0e --- /dev/null +++ b/vldb/pt/experimentalresults.tex @@ -0,0 +1 @@ +\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/pt/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/pt/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/pt/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/pt/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/pt/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/pt/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/pt/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/pt/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex new file mode 100755 index 0000000..bf4ef85 --- /dev/null +++ b/vldb/pt/introduction.tex @@ -0,0 +1,13 @@ +\section{Introdu\c{c}\~ao} +\label{sec:introduction} +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + diff --git a/vldb/pt/makefile b/vldb/pt/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/pt/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/pt/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex new file mode 100755 index 0000000..554b9db --- /dev/null +++ b/vldb/pt/relatedwork.tex @@ -0,0 +1,2 @@ +\section{Trabalhos Relacionados} +\cite{bkz05} \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/pt/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/pt/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/pt/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} From 230a632915d638ced74f189984dceeb9444b76f5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 27 Sep 2005 15:11:25 +0000 Subject: [PATCH 227/739] added vldb jounal --- vldb/ingles/algorithms.tex | 596 +++++++ vldb/ingles/applications.tex | 2 + vldb/ingles/conclusions.tex | 5 + vldb/ingles/experimentalresults.tex | 178 +++ vldb/ingles/figs/brz.fig | 135 ++ vldb/ingles/figs/brz.ps | 324 ++++ vldb/ingles/figs/grafordering.fig | 206 +++ vldb/ingles/figs/grafordering2.fig | 219 +++ vldb/ingles/figs/grafordering3.fig | 130 ++ vldb/ingles/figs/grafsearching.fig | 168 ++ vldb/ingles/figs/grafsearching2.fig | 180 +++ vldb/ingles/figs/grafsearchingncv.fig | 124 ++ .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/ingles/introduction.tex | 86 + vldb/ingles/makefile | 17 + vldb/ingles/references.bib | 669 ++++++++ vldb/ingles/relatedwork.tex | 67 + vldb/ingles/svglov2.clo | 77 + vldb/ingles/svjour2.cls | 1419 +++++++++++++++++ vldb/ingles/vldb.tex | 150 ++ vldb/pt/algorithms.tex | 19 + vldb/pt/applications.tex | 2 + vldb/pt/conclusions.tex | 3 + vldb/pt/experimentalresults.tex | 1 + vldb/pt/figs/brz.fig | 135 ++ vldb/pt/figs/brz.ps | 324 ++++ vldb/pt/figs/grafordering.fig | 206 +++ vldb/pt/figs/grafordering2.fig | 219 +++ vldb/pt/figs/grafordering3.fig | 130 ++ vldb/pt/figs/grafsearching.fig | 168 ++ vldb/pt/figs/grafsearching2.fig | 180 +++ vldb/pt/figs/grafsearchingncv.fig | 124 ++ vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/pt/introduction.tex | 13 + vldb/pt/makefile | 17 + vldb/pt/references.bib | 669 ++++++++ vldb/pt/relatedwork.tex | 2 + vldb/pt/svglov2.clo | 77 + vldb/pt/svjour2.cls | 1419 +++++++++++++++++ vldb/pt/vldb.tex | 150 ++ 42 files changed, 9938 insertions(+) create mode 100755 vldb/ingles/algorithms.tex create mode 100644 vldb/ingles/applications.tex create mode 100755 vldb/ingles/conclusions.tex create mode 100755 vldb/ingles/experimentalresults.tex create mode 100644 vldb/ingles/figs/brz.fig create mode 100644 vldb/ingles/figs/brz.ps create mode 100755 vldb/ingles/figs/grafordering.fig create mode 100755 vldb/ingles/figs/grafordering2.fig create mode 100755 vldb/ingles/figs/grafordering3.fig create mode 100755 vldb/ingles/figs/grafsearching.fig create mode 100755 vldb/ingles/figs/grafsearching2.fig create mode 100755 vldb/ingles/figs/grafsearchingncv.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/ingles/introduction.tex create mode 100755 vldb/ingles/makefile create mode 100755 vldb/ingles/references.bib create mode 100755 vldb/ingles/relatedwork.tex create mode 100644 vldb/ingles/svglov2.clo create mode 100644 vldb/ingles/svjour2.cls create mode 100644 vldb/ingles/vldb.tex create mode 100755 vldb/pt/algorithms.tex create mode 100644 vldb/pt/applications.tex create mode 100755 vldb/pt/conclusions.tex create mode 100755 vldb/pt/experimentalresults.tex create mode 100644 vldb/pt/figs/brz.fig create mode 100644 vldb/pt/figs/brz.ps create mode 100755 vldb/pt/figs/grafordering.fig create mode 100755 vldb/pt/figs/grafordering2.fig create mode 100755 vldb/pt/figs/grafordering3.fig create mode 100755 vldb/pt/figs/grafsearching.fig create mode 100755 vldb/pt/figs/grafsearching2.fig create mode 100755 vldb/pt/figs/grafsearchingncv.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/pt/introduction.tex create mode 100755 vldb/pt/makefile create mode 100755 vldb/pt/references.bib create mode 100755 vldb/pt/relatedwork.tex create mode 100644 vldb/pt/svglov2.clo create mode 100644 vldb/pt/svjour2.cls create mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex new file mode 100755 index 0000000..226fbe5 --- /dev/null +++ b/vldb/ingles/algorithms.tex @@ -0,0 +1,596 @@ +\section{The Algorithms} +\label{sec:thealgorithm} +We are going to present a novel algorithm that extends our previous work +presented in~\cite{bkz05}. +First we describe our previous work and in the following the new algorithm. +To the best of our knowledge this work is the first one that becomes possible +the construction of minimal perfect hash functions for sets in the order of +billion of keys efficiently. +And better, the generated functions are very compact and can be represented +using approximately nine bits per key. + +\subsection{A Main Memory Based Algorithm} + +\subsection{An External Memory Based Algorithm} +The idea of behind the new algorithm is the traditional divide-to-conquer approach. +The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: +\begin{enumerate} +\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to +a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will +contain more than 256 keys. +This choice is crucial to make the new algorithm works and we give details about it hereinafter. +\item The keys in each bucket are separetaly spread into a hash table. +\end{enumerate} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +The main novelties are in the way the keys are segmented using external memory and spread using +minimal perfect hash functions for each bucket. The next two sections describe each step in details. +\subsubsection{Segmentation} +\subsubsection{Spreading} +% Let us show how the minimal perfect hash function~$h$ +% will be constructed. +% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, +% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where +% $n=|S|$. +% We build a random graph~$G=G(h_1,h_2)$ on~$V$, +% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. +% There is an edge in~$G$ for each key in the set of keys~$S$. +% +% In what follows, we shall be interested in the \textit{2-core} of +% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal +% degree at least~$2$ +% (see, e.g., \cite{b01,jlr00}). +% Because of its importance in our context, we call the 2-core the +% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. +% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. +% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. +% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} +% vertices in~$G$. +% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical +% vertices that have at least one non-critical vertex as a neighbour. +% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. +% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the +% {\em non-critical} subgraph of~$G$. +% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' +% of~$G$. +% We have $G=G_\crit\cup G_\ncrit$. +% +% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices +% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such +% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a +% minimal perfect hash function for~$S$. +% We will see later on that this labelling~$g$ can be found in linear time +% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. +% The procedure GenerateMPHF ($S$, $g$) receives as input the set of +% keys~$S$ and produces the labelling~$g$. +% The method uses a mapping, ordering and searching approach. +% We now describe each step. +% +% \enlargethispage{\baselineskip} +% \enlargethispage{\baselineskip} +% \vspace{-11pt} +% \begin{figure}[htb] +% \begin{center} +% \begin{lstlisting}[ +% ] +% procedure @GenerateMPHF@ (@$S$@, @$g$@) +% Mapping (@$S$@, @$G$@); +% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); +% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); +% \end{lstlisting} +% \end{center} +% \vspace{-12pt} +% \caption{Main steps of the algorithm for constructing a minimal +% perfect hash function} +% \vspace{-26pt} +% \label{prog:mainsteps} +% \end{figure} +% +% \subsection{Mapping Step} +% \label{sec:mapping} +% +% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and +% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary +% functions~$h_1$, $h_2:U\to[0,t-1]$. +% +% \def\tabela{\hbox{table}} +% % +% The functions~$h_1$ and~$h_2$ are constructed as follows. +% We impose some upper bound~$L$ on the lengths of the keys in~$S$. +% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table +% of random integers~$\tabela_j$. +% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let +% \begin{displaymath} \nonumber +% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. +% \end{displaymath} +% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set +% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be +% simple, i.e., +% $G$~should have neither loops nor multiple edges. +% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. +% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod +% t$ in this case. +% If we still find a loop after this, +% we generate another pair $(h_1,h_2)$. +% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. +% +% \vspace{-10pt} +% \subsubsection{Analysis of the Mapping Step. } +% +% We start by discussing some facts on random graphs. +% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform +% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs +% on~$V$ with~$n$ edges are equiprobable. +% The study of~$\cG(t,n)$ goes back to the classical +% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, +% see~\cite{b01,jlr00}). +% Let $d=2n/t$ be the average degree of $G$. +% It is well known that, if~$d>1$, or, equivalently, +% if~$c<2$ (recall that we have $t=cn$), +% then, almost every~$G$ +% contains\footnote{As is usual in the theory of random graphs, we use +% the terms `almost every' and `almost surely' to mean `with probability +% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of +% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ +% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall +% $c=1.15$). +% As the expected number of iterations is $O(1)$, the mapping step takes +% $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Ordering Step} +% \label{sec:ordering} +% +% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as +% input the graph~$G$ and partitions~$G$ into the two subgraphs +% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. +% For that, the procedure iteratively remove all vertices of degree 1 until done. +% +% \enlargethispage{\baselineskip} +% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices +% and 8 edges, where the degree of a vertex is shown besides each vertex. +% Applying the ordering step in this graph, the $5$-vertex graph showed in +% Figure~\ref{fig:grafordering}(b) is obtained. +% All vertices with degree 0 are non-critical vertices and the others are +% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices +% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and +% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). +% +% \vspace{-5pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} +% \end{center} +% \vspace{-10pt} +% \caption{Ordering step for a graph with 9 vertices and 8 edges} +% \vspace{-30pt} +% \label{fig:grafordering} +% \end{figure*} +% +% +% \subsubsection{Analysis of the Ordering Step. } +% +% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). +% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Searching Step} +% \label{sec:searching} +% +% In the searching step, the key part is +% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that +% the function $h:E(G)\to\ZZ$ defined by +% \begin{eqnarray} +% \label{eq:phf} +% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) +% \end{eqnarray} +% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). +% We are interested in a labelling $g:V\to\ZZ$ of +% the vertices of the graph~$G=G(h_1,h_2)$ with +% the property that if~$x$ and~$y$ are keys in~$S$, then +% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate +% to each edge the sum of the labels on its endpoints, then these values +% should be all distinct. +% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) +% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection +% between~$S$ and~$[0,n-1]$. +% +% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives +% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable +% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the +% array~$g$. +% This step is first performed for the vertices in the +% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is +% performed for the vertices in $G_\ncrit$ (the non-critical subgraph +% of~$G$ that contains the ``acyclic part'' of $G$). +% The reason the assignment of the $g$~values is first +% performed on the vertices in~$G_\crit$ is to resolve reassignments +% as early as possible (such reassignments are consequences of the cycles +% in~$G_\crit$ and are depicted hereinafter). +% +% \vspace{-8pt} +% \subsubsection{Assignment of Values to Critical Vertices. } +% \label{sec:assignmentcv} +% +% The labels~$g(v)$ ($v\in V(G_\crit)$) +% are assigned in increasing order following a greedy +% strategy where the critical vertices~$v$ are considered one at a time, +% according to a breadth-first search on~$G_\crit$. +% If a candidate value~$x$ for~$g(v)$ is forbidden +% because setting~$g(v)=x$ would create two edges with the same sum, +% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. +% +% \enlargethispage{\baselineskip} +% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. +% Initially $A_E = \emptyset$. +% Let $x$ be a candidate value for $g(v)$. +% Initially $x = 0$. +% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in $G_\crit$ +% is presented in Figure~\ref{fig:searching}. +% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made +% and $x$ is set to $x + 1$. +% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is +% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. +% +% \vspace{-12pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} +% \end{center} +% \vspace{-13pt} +% \caption{Example of the assignment of values to critical vertices} +% \vspace{-15pt} +% \label{fig:searching} +% \end{figure*} +% +% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, +% the unassigned vertex $0$ is reached. +% At this point, we collect in +% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned +% an $x$ value, and $Y = \{8\}$. +% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. +% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented +% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. +% Next, vertex $3$ is reached, $g(3)$ is set to $2$, +% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. +% Next, vertex $4$ is reached and $Y=\{3, 8\}$. +% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then +% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. +% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. +% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in +% Figure~\ref{fig:searching}(c). +% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, +% as depicted in Figure~\ref{fig:searching}(d). +% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. +% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then +% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. +% This finishes the algorithm. +% +% \vspace{-15pt} +% \subsubsection{Assignment of Values to Non-Critical Vertices. } +% \label{sec:assignmentncv} +% +% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are +% associated with edges in $G_\ncrit$, making this step simple to solve +% by a standard depth first search algorithm. +% Therefore, in the assignment of values to vertices in $G_\ncrit$ we +% benefit from the unused addresses in the gaps left by the assignment of values +% to vertices in $G_\crit$. +% For that, we start the depth-first search from the vertices in $V_\scrit$ +% because the $g$ values for these critical vertices have already been assigned +% and cannot be changed. +% +% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in +% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. +% Figure~\ref{fig:searchingncv}(a) presents the initial state of the +% algorithm. +% The critical vertex~$8$ is the only one that has non-critical +% neighbours. +% In the example presented in Figure~\ref{fig:searching}, the addresses +% $\{0, 4\}$ were not used. +% So, taking the first unused address $0$ and the vertex $1$, which is +% reached from the vertex $8$, $g(1)$ is set to +% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). +% The only vertex that is reached from vertex $1$ is vertex $2$, so +% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, +% as shown in Figure~\ref{fig:searchingncv}(c). +% This process is repeated until the UnAssignedAddresses list becomes empty. +% +% \vspace{-8pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} +% \end{center} +% \vspace{-12pt} +% \caption{Example of the assignment of values to non-critical vertices} +% \vspace{-30pt} +% \label{fig:searchingncv} +% \end{figure*} +% +% \subsubsection{Analysis of the Searching Step. } +% +% We shall demonstrate that +% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we +% generate a minimal perfect hash function), and +% (ii) the perfect assignment problem (determination of~$g$) +% can be solved in expected time $O(n)$ if the number of edges +% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% \enlargethispage{\baselineskip} +% We focus on the analysis of the assignment of values to critical vertices +% because the assignment of values to non-critical vertices +% can be solved in linear time by a depth first search algorithm. +% +% We now define certain complexity measures. +% Let $I(v)$ be the number of times a candidate value $x$ for +% $g(v)$ is incremented. +% Let $N_t$ be the total number of times that candidate values +% $x$ are incremented. +% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in +% V(G_\crit)$. +% +% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is +% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant +% component is provably very small for~$c=1.15$; +% see~\cite{b01,jlr00,pw04}.} The fact that +% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) +% then implies the following. +% +% \begin{theorem} \label{th:nbedg} +% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ +% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed +% \end{theorem} +% +% \def\maxx{{\rm max}} +% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e +% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. +% +% \begin{theorem} \label{th:Agrt} +% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. +% \end{theorem} +% \vspace{-15pt} +% +% \enlargethispage{\baselineskip} +% \begin{proof}(Sketch) +% The assignment of $g$ values to critical vertices starts from 0, +% and each edge~$e$ receives the label $h(e)$ +% as given by Eq.~(\ref{eq:phf}). +% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. +% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the +% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two +% distinct vertices get distinct~$g$ values. Hence, +% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) +% \le2|V(G_\crit)|-3+2N_t$, as required.\qed +% \end{proof} +% +% \vspace{-15pt} +% \subsubsection{Maximal Value Assigned to an Edge. } +% +% In this section we present the following conjecture. +% \begin{conjecture} \label{conj:gretestaddr} +% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and +% $|V(G)| = 1.15n$, +% it is always possible to generate a minimal perfect hash function +% because the maximal value $A_\maxx$ assigned to an edge +% $e \in E(G_\crit)$ is at most $n - 1$. +% \end{conjecture} +% +% Let us assume for the moment that $N_{t} \le N_\bedges$. +% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, +% we have +% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges +% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. +% As by hypothesis $|E(G_\crit)|\leq n/2$, we have +% $A_\maxx \le n - 1$, as required. +% +% \textit{In the mathematical analysis of our algorithm, what is left +% open is a single problem: +% prove that $N_{t} \le N_\bedges$.}\footnote{% +% Bollob\'as and Pikhurko~\cite{bp04} have investigated +% a very close vertex labelling problem for random graphs. +% However, their interest was on denser random graphs, and it seems that +% different methods will have to be used to attack the sparser case that +% we are interested in here.} +% +% We now show experimental evidence that $N_{t} \le N_\bedges$. +% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), +% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are +% $0.401 n$ and $0.501n$, respectively. +% From Theorem~\ref{th:nbedg}, +% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. +% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained +% during 10,000 executions of the algorithm for different sizes of $S$. +% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and +% tends to $0.059n$ for $n\ge1{,}000{,}000$. +% +% \vspace{-5pt} +% \begin{table}[!htb] +% {\footnotesize%\small +% \begin{center} +% \begin{tabular}{|c|c|} +% \hline +% $n$ & Maximal value of $N_t$\\ +% \hline +% %$1{,}000$ & $0.091 n$ \\ +% $10{,}000$ & $0.067 n$ \\ +% $100{,}000$ & $0.061 n$ \\ +% $1{,}000{,}000$ & $0.059 n$ \\ +% $2{,}000{,}000$ & $0.059 n$ \\ +% %$\vdots$ & $\vdots$ \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{The maximal value of $N_t$ for different number of URLs} +% \vspace{-40pt} +% \label{tab:collisions1} +% \end{table} +% +% \subsubsection{Time Complexity. } +% We now show that the time complexity of determining~$g(v)$ +% for all critical vertices~$x\in V(G_\crit)$ is +% $O(|V(G_\crit)|)=O(n)$. +% For each unassigned vertex $v$, the adjacency list of $v$, which we +% call Adj($v$), must be traversed +% to collect the set $Y$ of adjacent vertices that have already been assigned a +% value. +% Then, for each vertex in $Y$, we check if the current candidate value $x$ is +% forbidden because setting $g(v)=x$ would create two edges with the same +% endpoint sum. +% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is +% associated with +% the address that corresponds to the sum of its endpoints. +% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, +% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity +% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. +% Then, putting all these together, we see that the time complexity of this +% procedure is +% \begin{eqnarray} +% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + +% (I(v) \times|Y|) + |Y|\big]\nonumber\\ +% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| +% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber +% \end{eqnarray} +% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have +% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. +% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, +% that +% $ +% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 +% =O(|E(G_\crit)|)$. +% We conclude that +% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. +% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, +% the time required to determine~$g$ on the critical vertices is $O(n)$. +% \enlargethispage{\baselineskip} +% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex new file mode 100644 index 0000000..cd6e72b --- /dev/null +++ b/vldb/ingles/applications.tex @@ -0,0 +1,2 @@ +\section{Applications} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex new file mode 100755 index 0000000..a71789c --- /dev/null +++ b/vldb/ingles/conclusions.tex @@ -0,0 +1,5 @@ +\section{Conclusion} + +% We have presented a practical method for constructing minimal perfect +% hash functions for static sets that is efficient and may be tuned +% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex new file mode 100755 index 0000000..3193625 --- /dev/null +++ b/vldb/ingles/experimentalresults.tex @@ -0,0 +1,178 @@ +\section{Experimental Results} + +% We now present some experimental results. +% The same experiments were run with our algorithm and +% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as +% the CHM algorithm. +% The two algorithms were implemented in the C language and +% are available at \texttt{http://cmph.sf.net}. +% Our data consists +% of a collection of 100 million +% universe resource locations (URLs) collected from the Web. +% The average length of a URL in the collection is 63 bytes. +% All experiments were carried out on +% a computer running the Linux operating system, version 2.6.7, +% with a 2.4 gigahertz processor and +% 4 gigabytes of main memory. +% +% Table~\ref{tab:characteristics} presents the main characteristics +% of the two algorithms. +% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, +% the number of keys in the input set~$S$. +% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ +% for our algorithm and the CHM algorithm, respectively. +% This measure is related to the amount of space to store the array $g$. +% This improves the space required to store a function in our algorithm to +% $55\%$ of the space required by the CHM algorithm. +% The number of critical edges +% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, +% respectively. +% Our algorithm generates random graphs that contain cycles with high +% probability and the +% CHM algorithm +% generates +% acyclic random graphs. +% Finally, the CHM algorithm generates order preserving functions +% while our algorithm does not preserve order. +% +% \vspace{-10pt} +% \begin{table}[htb] +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|c|c|c|c|c|c|} +% \hline +% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ +% \hline +% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ +% \hline +% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{Main characteristics of the algorithms} +% \vspace{-25pt} +% \label{tab:characteristics} +% \end{table} +% +% Table~\ref{tab:timeresults} presents time measurements. +% All times are in seconds. +% The table entries are averages over 50 trials. +% The column labelled $N_i$ gives +% the number of iterations to generate the random graph $G$ +% in the mapping step of the algorithms. +% The next columns give the running times +% for the mapping plus ordering steps together and the searching +% step for each algorithm. +% The last column gives the percentage gain of our algorithm +% over the CHM algorithm. +% +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|c|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ +% \hline +% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] +% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] +% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] +% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] +% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] +% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] +% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our algorithm and the CHM algorithm} +% \vspace{-25pt} +% \label{tab:timeresults} +% }\end{table*} +% +% \enlargethispage{\baselineskip} +% The mapping step of the new algorithm is faster because +% the expected number of iterations in the mapping step to generate +% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. +% The graph $G$ generated by our algorithm +% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. +% These two facts make our algorithm faster in the mapping step. +% The ordering step of our algorithm is approximately equal to +% the time to check if $G$ is acyclic for the CHM algorithm. +% The searching step of the CHM algorithm is faster, but the total +% time of our algorithm is, on average, approximately 58\% faster +% than the CHM algorithm. +% +% The experimental results fully backs the theoretical results. +% It is important to notice the times for the searching step: +% for both algorithms they are not the dominant times, +% and the experimental results clearly show +% a linear behavior for the searching step. +% +% We now present a heuristic that reduces the space requirement +% to any given value between $1.15n$ words and $0.93n$ words. +% The heuristic reuses, when possible, the set +% of $x$ values that caused reassignments, just before trying $x+1$ +% (see Section~\ref{sec:searching}). +% The lower limit $c=0.93$ was obtained experimentally. +% We generate $10{,}000$ random graphs for +% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). +% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never +% succeeded. +% Decreasing the value of $c$ leads to an increase in the number of +% iterations to generate $G$. +% For example, for $c=1$ and $c=0.93$, the analytical expected number +% of iterations are $2.72$ and $3.17$, respectively +% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 +% for $c=0.93$). +% Table~\ref{tab:timeresults2} presents the total times to construct a +% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds +% for $c=1.15$ (see Table~\ref{tab:timeresults}) to +% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. +% +% \vspace{-5pt} +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} \\%[0.3mm] +% \hline%\\[-2mm] +% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our tuned algorithm with $c=1.00$ and $c=0.93$} +% \vspace{-25pt} +% \label{tab:timeresults2} +% } +% \end{table*} +% +% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and +% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their +% source code. In their implementation the set of keys is a set of random integers. +% We modified our implementation to generate our~$h$ from a set of random +% integers in order to make a fair comparison. For a set of $10^6$ random integers, +% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for +% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. +% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than +% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different +% sizes. +% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store +% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and +% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. +% The time to generate the functions is inversely proportional to the value of $k$. +% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/ingles/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/ingles/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/ingles/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/ingles/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/ingles/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/ingles/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/ingles/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/ingles/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex new file mode 100755 index 0000000..2c08256 --- /dev/null +++ b/vldb/ingles/introduction.tex @@ -0,0 +1,86 @@ +\section{Introduction} +\label{sec:introduction} + +Suppose~$U$ is a universe of \textit{keys}. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +Hashing methods for {\em non-static sets} of keys can be used to construct +data structures storing $S$ and supporting membership queries +``$x \in S$?'' in expected time $O(1)$. +However, they involve a certain amount of wasted space owing to unused +locations in the table and waisted time to resolve collisions when +two keys are hashed to the same table location. + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + +Minimal perfect hash functions are widely used for memory efficient +storage +and fast retrieval of items from static sets, such as words in natural +languages, reserved words in programming languages or interactive systems, +universal resource locations (URLs) in Web search engines, or item sets in +data mining techniques. + +The aim of this paper is to describe a new way of constructing minimal perfect +hash functions. Our algorithm shares several features with the one due to +Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also +based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one +correspondence with the key set~$S$ for which we wish to generate the hash +function. +The two main differences between our algorithm and theirs +are as follows: +(\textit{i})~we generate random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ +contains cycles with high probability, +while they generate \textit{acyclic} random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, +with a greater number of vertices: $|V|\ge2.09n$; +(\textit{ii})~they generate order preserving minimal perfect hash functions +while our algorithm does not preserve order (a perfect hash function $h$ is +\textit{order preserving} if the keys in~$S$ are arranged in some given order +and~$h$ preserves this order in the hash table). Thus, our algorithm improves +the space requirement at the expense of generating functions that are not +order preserving. + +Our algorithm is efficient and may be tuned to yield a function~$h$ +with a very economical description. +As the algorithm in~\cite{chm92}, our algorithm produces~$h$ +in~$O(n)$ expected time for a set of~$n$ keys. +The description of~$h$ requires~$1.15n$ computer words, +and evaluating~$h(x)$ +requires two accesses to an array of~$1.15n$ integers. +We further derive a heuristic that improves the space requirement +from~$1.15n$ words down to~$0.93n$ words. +Our scheme is very practical: to generate a minimal perfect hash function for +a collection of 100~million universe resource locations (URLs), each 63 bytes +long on average, our algorithm running on a commodity PC takes 811 seconds on +average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/ingles/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/ingles/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex new file mode 100755 index 0000000..e32c52e --- /dev/null +++ b/vldb/ingles/relatedwork.tex @@ -0,0 +1,67 @@ +\section{Related Work} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical results +on perfect hashing. +In the following, we review some of those results. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Many methods for generating minimal perfect hash functions use a +{\em mapping}, {\em ordering} and {\em searching} +(MOS) approach, +a description coined by Fox, Chen and Heath~\cite{fch92}. +In the MOS approach, the construction of a minimal perfect hash function +is accomplished in three steps. +First, the mapping step transforms the key set from the original universe +to a new universe. +Second, the ordering step places the keys in a sequential order that +determines the order in which hash values are assigned to keys. +Third, the searching step attempts to assign hash values to the keys. +Our algorithm and the algorithm presented in~\cite{chm92} use the +MOS approach. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing minimal perfect hash functions. +The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n$ computer words. +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer +words required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +Differently from the works in~\cite{p99,dh01}, our algorithm uses two +universal hash functions $h_1$ and $h_2$ randomly selected from a class +of universal hash functions that do not need to meet any additional +requirements. + +The work in~\cite{chm92} presents an efficient and practical algorithm +for generating order preserving minimal perfect hash functions. +Their method involves the generation of acyclic random graphs +$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. +They showed that an order preserving minimal perfect hash function +can be found in optimal time if~$G$ is acyclic. +To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are +computed for each key $x \in S$. +Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, +\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. +In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects +$h_1$ and $h_2$ from a family of universal hash functions +until the corresponding graph is acyclic. +Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, +then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. +For $c=2.09$, this probability is +$p \simeq 0.342$, and +the expected number of iterations to obtain an acyclic graph +is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/ingles/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/ingles/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/ingles/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex new file mode 100755 index 0000000..61d26cd --- /dev/null +++ b/vldb/pt/algorithms.tex @@ -0,0 +1,19 @@ +\section{Os Algoritmos} +\label{sec:thealgorithm} + +\subsection{Um Algoritmo Baseado em Mem\'oria Principal} + +\subsection{Um Algoritmo Baseado em Mem\'oria Externa} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +\subsubsection{Segmenta\c{c}\~ao} +\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex new file mode 100644 index 0000000..785ccc0 --- /dev/null +++ b/vldb/pt/applications.tex @@ -0,0 +1,2 @@ +\section{Aplica\c{c}\~oes} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex new file mode 100755 index 0000000..08f3cd4 --- /dev/null +++ b/vldb/pt/conclusions.tex @@ -0,0 +1,3 @@ +\section{Conclus\~oes} + + diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex new file mode 100755 index 0000000..5152c0e --- /dev/null +++ b/vldb/pt/experimentalresults.tex @@ -0,0 +1 @@ +\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/pt/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/pt/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/pt/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/pt/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/pt/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/pt/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/pt/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/pt/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex new file mode 100755 index 0000000..bf4ef85 --- /dev/null +++ b/vldb/pt/introduction.tex @@ -0,0 +1,13 @@ +\section{Introdu\c{c}\~ao} +\label{sec:introduction} +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + diff --git a/vldb/pt/makefile b/vldb/pt/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/pt/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/pt/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex new file mode 100755 index 0000000..554b9db --- /dev/null +++ b/vldb/pt/relatedwork.tex @@ -0,0 +1,2 @@ +\section{Trabalhos Relacionados} +\cite{bkz05} \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/pt/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/pt/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/pt/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} From 95096c2cbcf24dedc58ae99f9d98eadc6a7a5cd2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 27 Sep 2005 15:11:25 +0000 Subject: [PATCH 228/739] added vldb jounal --- vldb/ingles/algorithms.tex | 596 +++++++ vldb/ingles/applications.tex | 2 + vldb/ingles/conclusions.tex | 5 + vldb/ingles/experimentalresults.tex | 178 +++ vldb/ingles/figs/brz.fig | 135 ++ vldb/ingles/figs/brz.ps | 324 ++++ vldb/ingles/figs/grafordering.fig | 206 +++ vldb/ingles/figs/grafordering2.fig | 219 +++ vldb/ingles/figs/grafordering3.fig | 130 ++ vldb/ingles/figs/grafsearching.fig | 168 ++ vldb/ingles/figs/grafsearching2.fig | 180 +++ vldb/ingles/figs/grafsearchingncv.fig | 124 ++ .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/ingles/introduction.tex | 86 + vldb/ingles/makefile | 17 + vldb/ingles/references.bib | 669 ++++++++ vldb/ingles/relatedwork.tex | 67 + vldb/ingles/svglov2.clo | 77 + vldb/ingles/svjour2.cls | 1419 +++++++++++++++++ vldb/ingles/vldb.tex | 150 ++ vldb/pt/algorithms.tex | 19 + vldb/pt/applications.tex | 2 + vldb/pt/conclusions.tex | 3 + vldb/pt/experimentalresults.tex | 1 + vldb/pt/figs/brz.fig | 135 ++ vldb/pt/figs/brz.ps | 324 ++++ vldb/pt/figs/grafordering.fig | 206 +++ vldb/pt/figs/grafordering2.fig | 219 +++ vldb/pt/figs/grafordering3.fig | 130 ++ vldb/pt/figs/grafsearching.fig | 168 ++ vldb/pt/figs/grafsearching2.fig | 180 +++ vldb/pt/figs/grafsearchingncv.fig | 124 ++ vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 ++ vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ++++++ vldb/pt/introduction.tex | 13 + vldb/pt/makefile | 17 + vldb/pt/references.bib | 669 ++++++++ vldb/pt/relatedwork.tex | 2 + vldb/pt/svglov2.clo | 77 + vldb/pt/svjour2.cls | 1419 +++++++++++++++++ vldb/pt/vldb.tex | 150 ++ 42 files changed, 9938 insertions(+) create mode 100755 vldb/ingles/algorithms.tex create mode 100644 vldb/ingles/applications.tex create mode 100755 vldb/ingles/conclusions.tex create mode 100755 vldb/ingles/experimentalresults.tex create mode 100644 vldb/ingles/figs/brz.fig create mode 100644 vldb/ingles/figs/brz.ps create mode 100755 vldb/ingles/figs/grafordering.fig create mode 100755 vldb/ingles/figs/grafordering2.fig create mode 100755 vldb/ingles/figs/grafordering3.fig create mode 100755 vldb/ingles/figs/grafsearching.fig create mode 100755 vldb/ingles/figs/grafsearching2.fig create mode 100755 vldb/ingles/figs/grafsearchingncv.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/ingles/introduction.tex create mode 100755 vldb/ingles/makefile create mode 100755 vldb/ingles/references.bib create mode 100755 vldb/ingles/relatedwork.tex create mode 100644 vldb/ingles/svglov2.clo create mode 100644 vldb/ingles/svjour2.cls create mode 100644 vldb/ingles/vldb.tex create mode 100755 vldb/pt/algorithms.tex create mode 100644 vldb/pt/applications.tex create mode 100755 vldb/pt/conclusions.tex create mode 100755 vldb/pt/experimentalresults.tex create mode 100644 vldb/pt/figs/brz.fig create mode 100644 vldb/pt/figs/brz.ps create mode 100755 vldb/pt/figs/grafordering.fig create mode 100755 vldb/pt/figs/grafordering2.fig create mode 100755 vldb/pt/figs/grafordering3.fig create mode 100755 vldb/pt/figs/grafsearching.fig create mode 100755 vldb/pt/figs/grafsearching2.fig create mode 100755 vldb/pt/figs/grafsearchingncv.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig create mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps create mode 100755 vldb/pt/introduction.tex create mode 100755 vldb/pt/makefile create mode 100755 vldb/pt/references.bib create mode 100755 vldb/pt/relatedwork.tex create mode 100644 vldb/pt/svglov2.clo create mode 100644 vldb/pt/svjour2.cls create mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex new file mode 100755 index 0000000..226fbe5 --- /dev/null +++ b/vldb/ingles/algorithms.tex @@ -0,0 +1,596 @@ +\section{The Algorithms} +\label{sec:thealgorithm} +We are going to present a novel algorithm that extends our previous work +presented in~\cite{bkz05}. +First we describe our previous work and in the following the new algorithm. +To the best of our knowledge this work is the first one that becomes possible +the construction of minimal perfect hash functions for sets in the order of +billion of keys efficiently. +And better, the generated functions are very compact and can be represented +using approximately nine bits per key. + +\subsection{A Main Memory Based Algorithm} + +\subsection{An External Memory Based Algorithm} +The idea of behind the new algorithm is the traditional divide-to-conquer approach. +The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: +\begin{enumerate} +\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to +a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will +contain more than 256 keys. +This choice is crucial to make the new algorithm works and we give details about it hereinafter. +\item The keys in each bucket are separetaly spread into a hash table. +\end{enumerate} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +The main novelties are in the way the keys are segmented using external memory and spread using +minimal perfect hash functions for each bucket. The next two sections describe each step in details. +\subsubsection{Segmentation} +\subsubsection{Spreading} +% Let us show how the minimal perfect hash function~$h$ +% will be constructed. +% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, +% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where +% $n=|S|$. +% We build a random graph~$G=G(h_1,h_2)$ on~$V$, +% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. +% There is an edge in~$G$ for each key in the set of keys~$S$. +% +% In what follows, we shall be interested in the \textit{2-core} of +% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal +% degree at least~$2$ +% (see, e.g., \cite{b01,jlr00}). +% Because of its importance in our context, we call the 2-core the +% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. +% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. +% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. +% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} +% vertices in~$G$. +% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical +% vertices that have at least one non-critical vertex as a neighbour. +% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. +% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the +% {\em non-critical} subgraph of~$G$. +% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' +% of~$G$. +% We have $G=G_\crit\cup G_\ncrit$. +% +% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices +% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such +% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a +% minimal perfect hash function for~$S$. +% We will see later on that this labelling~$g$ can be found in linear time +% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. +% The procedure GenerateMPHF ($S$, $g$) receives as input the set of +% keys~$S$ and produces the labelling~$g$. +% The method uses a mapping, ordering and searching approach. +% We now describe each step. +% +% \enlargethispage{\baselineskip} +% \enlargethispage{\baselineskip} +% \vspace{-11pt} +% \begin{figure}[htb] +% \begin{center} +% \begin{lstlisting}[ +% ] +% procedure @GenerateMPHF@ (@$S$@, @$g$@) +% Mapping (@$S$@, @$G$@); +% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); +% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); +% \end{lstlisting} +% \end{center} +% \vspace{-12pt} +% \caption{Main steps of the algorithm for constructing a minimal +% perfect hash function} +% \vspace{-26pt} +% \label{prog:mainsteps} +% \end{figure} +% +% \subsection{Mapping Step} +% \label{sec:mapping} +% +% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and +% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary +% functions~$h_1$, $h_2:U\to[0,t-1]$. +% +% \def\tabela{\hbox{table}} +% % +% The functions~$h_1$ and~$h_2$ are constructed as follows. +% We impose some upper bound~$L$ on the lengths of the keys in~$S$. +% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table +% of random integers~$\tabela_j$. +% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let +% \begin{displaymath} \nonumber +% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. +% \end{displaymath} +% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set +% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be +% simple, i.e., +% $G$~should have neither loops nor multiple edges. +% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. +% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod +% t$ in this case. +% If we still find a loop after this, +% we generate another pair $(h_1,h_2)$. +% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. +% +% \vspace{-10pt} +% \subsubsection{Analysis of the Mapping Step. } +% +% We start by discussing some facts on random graphs. +% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform +% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs +% on~$V$ with~$n$ edges are equiprobable. +% The study of~$\cG(t,n)$ goes back to the classical +% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, +% see~\cite{b01,jlr00}). +% Let $d=2n/t$ be the average degree of $G$. +% It is well known that, if~$d>1$, or, equivalently, +% if~$c<2$ (recall that we have $t=cn$), +% then, almost every~$G$ +% contains\footnote{As is usual in the theory of random graphs, we use +% the terms `almost every' and `almost surely' to mean `with probability +% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of +% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ +% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall +% $c=1.15$). +% As the expected number of iterations is $O(1)$, the mapping step takes +% $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Ordering Step} +% \label{sec:ordering} +% +% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as +% input the graph~$G$ and partitions~$G$ into the two subgraphs +% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. +% For that, the procedure iteratively remove all vertices of degree 1 until done. +% +% \enlargethispage{\baselineskip} +% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices +% and 8 edges, where the degree of a vertex is shown besides each vertex. +% Applying the ordering step in this graph, the $5$-vertex graph showed in +% Figure~\ref{fig:grafordering}(b) is obtained. +% All vertices with degree 0 are non-critical vertices and the others are +% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices +% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and +% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). +% +% \vspace{-5pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} +% \end{center} +% \vspace{-10pt} +% \caption{Ordering step for a graph with 9 vertices and 8 edges} +% \vspace{-30pt} +% \label{fig:grafordering} +% \end{figure*} +% +% +% \subsubsection{Analysis of the Ordering Step. } +% +% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). +% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. +% +% \vspace{-5pt} +% \subsection{Searching Step} +% \label{sec:searching} +% +% In the searching step, the key part is +% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that +% the function $h:E(G)\to\ZZ$ defined by +% \begin{eqnarray} +% \label{eq:phf} +% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) +% \end{eqnarray} +% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). +% We are interested in a labelling $g:V\to\ZZ$ of +% the vertices of the graph~$G=G(h_1,h_2)$ with +% the property that if~$x$ and~$y$ are keys in~$S$, then +% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate +% to each edge the sum of the labels on its endpoints, then these values +% should be all distinct. +% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) +% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection +% between~$S$ and~$[0,n-1]$. +% +% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives +% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable +% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the +% array~$g$. +% This step is first performed for the vertices in the +% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is +% performed for the vertices in $G_\ncrit$ (the non-critical subgraph +% of~$G$ that contains the ``acyclic part'' of $G$). +% The reason the assignment of the $g$~values is first +% performed on the vertices in~$G_\crit$ is to resolve reassignments +% as early as possible (such reassignments are consequences of the cycles +% in~$G_\crit$ and are depicted hereinafter). +% +% \vspace{-8pt} +% \subsubsection{Assignment of Values to Critical Vertices. } +% \label{sec:assignmentcv} +% +% The labels~$g(v)$ ($v\in V(G_\crit)$) +% are assigned in increasing order following a greedy +% strategy where the critical vertices~$v$ are considered one at a time, +% according to a breadth-first search on~$G_\crit$. +% If a candidate value~$x$ for~$g(v)$ is forbidden +% because setting~$g(v)=x$ would create two edges with the same sum, +% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. +% +% \enlargethispage{\baselineskip} +% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. +% Initially $A_E = \emptyset$. +% Let $x$ be a candidate value for $g(v)$. +% Initially $x = 0$. +% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in $G_\crit$ +% is presented in Figure~\ref{fig:searching}. +% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made +% and $x$ is set to $x + 1$. +% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is +% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. +% +% \vspace{-12pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} +% \end{center} +% \vspace{-13pt} +% \caption{Example of the assignment of values to critical vertices} +% \vspace{-15pt} +% \label{fig:searching} +% \end{figure*} +% +% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, +% the unassigned vertex $0$ is reached. +% At this point, we collect in +% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned +% an $x$ value, and $Y = \{8\}$. +% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. +% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented +% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. +% Next, vertex $3$ is reached, $g(3)$ is set to $2$, +% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. +% Next, vertex $4$ is reached and $Y=\{3, 8\}$. +% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then +% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. +% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. +% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in +% Figure~\ref{fig:searching}(c). +% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, +% as depicted in Figure~\ref{fig:searching}(d). +% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. +% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then +% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. +% This finishes the algorithm. +% +% \vspace{-15pt} +% \subsubsection{Assignment of Values to Non-Critical Vertices. } +% \label{sec:assignmentncv} +% +% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are +% associated with edges in $G_\ncrit$, making this step simple to solve +% by a standard depth first search algorithm. +% Therefore, in the assignment of values to vertices in $G_\ncrit$ we +% benefit from the unused addresses in the gaps left by the assignment of values +% to vertices in $G_\crit$. +% For that, we start the depth-first search from the vertices in $V_\scrit$ +% because the $g$ values for these critical vertices have already been assigned +% and cannot be changed. +% +% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), +% a step by step example of the assignment of values to vertices in +% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. +% Figure~\ref{fig:searchingncv}(a) presents the initial state of the +% algorithm. +% The critical vertex~$8$ is the only one that has non-critical +% neighbours. +% In the example presented in Figure~\ref{fig:searching}, the addresses +% $\{0, 4\}$ were not used. +% So, taking the first unused address $0$ and the vertex $1$, which is +% reached from the vertex $8$, $g(1)$ is set to +% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). +% The only vertex that is reached from vertex $1$ is vertex $2$, so +% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, +% as shown in Figure~\ref{fig:searchingncv}(c). +% This process is repeated until the UnAssignedAddresses list becomes empty. +% +% \vspace{-8pt} +% \begin{figure*}[!htb] +% \begin{center} +% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} +% \end{center} +% \vspace{-12pt} +% \caption{Example of the assignment of values to non-critical vertices} +% \vspace{-30pt} +% \label{fig:searchingncv} +% \end{figure*} +% +% \subsubsection{Analysis of the Searching Step. } +% +% We shall demonstrate that +% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we +% generate a minimal perfect hash function), and +% (ii) the perfect assignment problem (determination of~$g$) +% can be solved in expected time $O(n)$ if the number of edges +% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. +% +% \enlargethispage{\baselineskip} +% We focus on the analysis of the assignment of values to critical vertices +% because the assignment of values to non-critical vertices +% can be solved in linear time by a depth first search algorithm. +% +% We now define certain complexity measures. +% Let $I(v)$ be the number of times a candidate value $x$ for +% $g(v)$ is incremented. +% Let $N_t$ be the total number of times that candidate values +% $x$ are incremented. +% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in +% V(G_\crit)$. +% +% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is +% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant +% component is provably very small for~$c=1.15$; +% see~\cite{b01,jlr00,pw04}.} The fact that +% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) +% then implies the following. +% +% \begin{theorem} \label{th:nbedg} +% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ +% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed +% \end{theorem} +% +% \def\maxx{{\rm max}} +% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e +% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. +% +% \begin{theorem} \label{th:Agrt} +% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. +% \end{theorem} +% \vspace{-15pt} +% +% \enlargethispage{\baselineskip} +% \begin{proof}(Sketch) +% The assignment of $g$ values to critical vertices starts from 0, +% and each edge~$e$ receives the label $h(e)$ +% as given by Eq.~(\ref{eq:phf}). +% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. +% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the +% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two +% distinct vertices get distinct~$g$ values. Hence, +% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) +% \le2|V(G_\crit)|-3+2N_t$, as required.\qed +% \end{proof} +% +% \vspace{-15pt} +% \subsubsection{Maximal Value Assigned to an Edge. } +% +% In this section we present the following conjecture. +% \begin{conjecture} \label{conj:gretestaddr} +% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and +% $|V(G)| = 1.15n$, +% it is always possible to generate a minimal perfect hash function +% because the maximal value $A_\maxx$ assigned to an edge +% $e \in E(G_\crit)$ is at most $n - 1$. +% \end{conjecture} +% +% Let us assume for the moment that $N_{t} \le N_\bedges$. +% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, +% we have +% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges +% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. +% As by hypothesis $|E(G_\crit)|\leq n/2$, we have +% $A_\maxx \le n - 1$, as required. +% +% \textit{In the mathematical analysis of our algorithm, what is left +% open is a single problem: +% prove that $N_{t} \le N_\bedges$.}\footnote{% +% Bollob\'as and Pikhurko~\cite{bp04} have investigated +% a very close vertex labelling problem for random graphs. +% However, their interest was on denser random graphs, and it seems that +% different methods will have to be used to attack the sparser case that +% we are interested in here.} +% +% We now show experimental evidence that $N_{t} \le N_\bedges$. +% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), +% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are +% $0.401 n$ and $0.501n$, respectively. +% From Theorem~\ref{th:nbedg}, +% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. +% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained +% during 10,000 executions of the algorithm for different sizes of $S$. +% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and +% tends to $0.059n$ for $n\ge1{,}000{,}000$. +% +% \vspace{-5pt} +% \begin{table}[!htb] +% {\footnotesize%\small +% \begin{center} +% \begin{tabular}{|c|c|} +% \hline +% $n$ & Maximal value of $N_t$\\ +% \hline +% %$1{,}000$ & $0.091 n$ \\ +% $10{,}000$ & $0.067 n$ \\ +% $100{,}000$ & $0.061 n$ \\ +% $1{,}000{,}000$ & $0.059 n$ \\ +% $2{,}000{,}000$ & $0.059 n$ \\ +% %$\vdots$ & $\vdots$ \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{The maximal value of $N_t$ for different number of URLs} +% \vspace{-40pt} +% \label{tab:collisions1} +% \end{table} +% +% \subsubsection{Time Complexity. } +% We now show that the time complexity of determining~$g(v)$ +% for all critical vertices~$x\in V(G_\crit)$ is +% $O(|V(G_\crit)|)=O(n)$. +% For each unassigned vertex $v$, the adjacency list of $v$, which we +% call Adj($v$), must be traversed +% to collect the set $Y$ of adjacent vertices that have already been assigned a +% value. +% Then, for each vertex in $Y$, we check if the current candidate value $x$ is +% forbidden because setting $g(v)=x$ would create two edges with the same +% endpoint sum. +% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is +% associated with +% the address that corresponds to the sum of its endpoints. +% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, +% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity +% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. +% Then, putting all these together, we see that the time complexity of this +% procedure is +% \begin{eqnarray} +% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + +% (I(v) \times|Y|) + |Y|\big]\nonumber\\ +% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| +% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber +% \end{eqnarray} +% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have +% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. +% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, +% that +% $ +% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 +% =O(|E(G_\crit)|)$. +% We conclude that +% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. +% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, +% the time required to determine~$g$ on the critical vertices is $O(n)$. +% \enlargethispage{\baselineskip} +% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex new file mode 100644 index 0000000..cd6e72b --- /dev/null +++ b/vldb/ingles/applications.tex @@ -0,0 +1,2 @@ +\section{Applications} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex new file mode 100755 index 0000000..a71789c --- /dev/null +++ b/vldb/ingles/conclusions.tex @@ -0,0 +1,5 @@ +\section{Conclusion} + +% We have presented a practical method for constructing minimal perfect +% hash functions for static sets that is efficient and may be tuned +% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex new file mode 100755 index 0000000..3193625 --- /dev/null +++ b/vldb/ingles/experimentalresults.tex @@ -0,0 +1,178 @@ +\section{Experimental Results} + +% We now present some experimental results. +% The same experiments were run with our algorithm and +% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as +% the CHM algorithm. +% The two algorithms were implemented in the C language and +% are available at \texttt{http://cmph.sf.net}. +% Our data consists +% of a collection of 100 million +% universe resource locations (URLs) collected from the Web. +% The average length of a URL in the collection is 63 bytes. +% All experiments were carried out on +% a computer running the Linux operating system, version 2.6.7, +% with a 2.4 gigahertz processor and +% 4 gigabytes of main memory. +% +% Table~\ref{tab:characteristics} presents the main characteristics +% of the two algorithms. +% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, +% the number of keys in the input set~$S$. +% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ +% for our algorithm and the CHM algorithm, respectively. +% This measure is related to the amount of space to store the array $g$. +% This improves the space required to store a function in our algorithm to +% $55\%$ of the space required by the CHM algorithm. +% The number of critical edges +% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, +% respectively. +% Our algorithm generates random graphs that contain cycles with high +% probability and the +% CHM algorithm +% generates +% acyclic random graphs. +% Finally, the CHM algorithm generates order preserving functions +% while our algorithm does not preserve order. +% +% \vspace{-10pt} +% \begin{table}[htb] +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|c|c|c|c|c|c|} +% \hline +% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ +% \hline +% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ +% \hline +% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ +% \hline +% \end{tabular} +% \end{center} +% } +% \caption{Main characteristics of the algorithms} +% \vspace{-25pt} +% \label{tab:characteristics} +% \end{table} +% +% Table~\ref{tab:timeresults} presents time measurements. +% All times are in seconds. +% The table entries are averages over 50 trials. +% The column labelled $N_i$ gives +% the number of iterations to generate the random graph $G$ +% in the mapping step of the algorithms. +% The next columns give the running times +% for the mapping plus ordering steps together and the searching +% step for each algorithm. +% The last column gives the percentage gain of our algorithm +% over the CHM algorithm. +% +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|c|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ +% \hline +% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] +% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] +% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] +% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] +% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] +% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] +% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our algorithm and the CHM algorithm} +% \vspace{-25pt} +% \label{tab:timeresults} +% }\end{table*} +% +% \enlargethispage{\baselineskip} +% The mapping step of the new algorithm is faster because +% the expected number of iterations in the mapping step to generate +% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. +% The graph $G$ generated by our algorithm +% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. +% These two facts make our algorithm faster in the mapping step. +% The ordering step of our algorithm is approximately equal to +% the time to check if $G$ is acyclic for the CHM algorithm. +% The searching step of the CHM algorithm is faster, but the total +% time of our algorithm is, on average, approximately 58\% faster +% than the CHM algorithm. +% +% The experimental results fully backs the theoretical results. +% It is important to notice the times for the searching step: +% for both algorithms they are not the dominant times, +% and the experimental results clearly show +% a linear behavior for the searching step. +% +% We now present a heuristic that reduces the space requirement +% to any given value between $1.15n$ words and $0.93n$ words. +% The heuristic reuses, when possible, the set +% of $x$ values that caused reassignments, just before trying $x+1$ +% (see Section~\ref{sec:searching}). +% The lower limit $c=0.93$ was obtained experimentally. +% We generate $10{,}000$ random graphs for +% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). +% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never +% succeeded. +% Decreasing the value of $c$ leads to an increase in the number of +% iterations to generate $G$. +% For example, for $c=1$ and $c=0.93$, the analytical expected number +% of iterations are $2.72$ and $3.17$, respectively +% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 +% for $c=0.93$). +% Table~\ref{tab:timeresults2} presents the total times to construct a +% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds +% for $c=1.15$ (see Table~\ref{tab:timeresults}) to +% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. +% +% \vspace{-5pt} +% \begin{table*} +% {\footnotesize +% \begin{center} +% \begin{tabular}{|c|cccc|cccc|} +% \hline +% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & +% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ +% \cline{2-5} \cline{6-9} +% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & +% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & +% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & +% \raisebox{-1mm}{Total} \\%[0.3mm] +% \hline%\\[-2mm] +% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] +% \hline +% \end{tabular} +% \end{center} +% \caption{Time measurements +% for our tuned algorithm with $c=1.00$ and $c=0.93$} +% \vspace{-25pt} +% \label{tab:timeresults2} +% } +% \end{table*} +% +% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and +% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their +% source code. In their implementation the set of keys is a set of random integers. +% We modified our implementation to generate our~$h$ from a set of random +% integers in order to make a fair comparison. For a set of $10^6$ random integers, +% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for +% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. +% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than +% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different +% sizes. +% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store +% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and +% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. +% The time to generate the functions is inversely proportional to the value of $k$. +% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/ingles/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/ingles/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/ingles/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/ingles/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/ingles/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/ingles/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/ingles/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/ingles/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex new file mode 100755 index 0000000..2c08256 --- /dev/null +++ b/vldb/ingles/introduction.tex @@ -0,0 +1,86 @@ +\section{Introduction} +\label{sec:introduction} + +Suppose~$U$ is a universe of \textit{keys}. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +Hashing methods for {\em non-static sets} of keys can be used to construct +data structures storing $S$ and supporting membership queries +``$x \in S$?'' in expected time $O(1)$. +However, they involve a certain amount of wasted space owing to unused +locations in the table and waisted time to resolve collisions when +two keys are hashed to the same table location. + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + +Minimal perfect hash functions are widely used for memory efficient +storage +and fast retrieval of items from static sets, such as words in natural +languages, reserved words in programming languages or interactive systems, +universal resource locations (URLs) in Web search engines, or item sets in +data mining techniques. + +The aim of this paper is to describe a new way of constructing minimal perfect +hash functions. Our algorithm shares several features with the one due to +Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also +based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one +correspondence with the key set~$S$ for which we wish to generate the hash +function. +The two main differences between our algorithm and theirs +are as follows: +(\textit{i})~we generate random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ +contains cycles with high probability, +while they generate \textit{acyclic} random graphs +$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, +with a greater number of vertices: $|V|\ge2.09n$; +(\textit{ii})~they generate order preserving minimal perfect hash functions +while our algorithm does not preserve order (a perfect hash function $h$ is +\textit{order preserving} if the keys in~$S$ are arranged in some given order +and~$h$ preserves this order in the hash table). Thus, our algorithm improves +the space requirement at the expense of generating functions that are not +order preserving. + +Our algorithm is efficient and may be tuned to yield a function~$h$ +with a very economical description. +As the algorithm in~\cite{chm92}, our algorithm produces~$h$ +in~$O(n)$ expected time for a set of~$n$ keys. +The description of~$h$ requires~$1.15n$ computer words, +and evaluating~$h(x)$ +requires two accesses to an array of~$1.15n$ integers. +We further derive a heuristic that improves the space requirement +from~$1.15n$ words down to~$0.93n$ words. +Our scheme is very practical: to generate a minimal perfect hash function for +a collection of 100~million universe resource locations (URLs), each 63 bytes +long on average, our algorithm running on a commodity PC takes 811 seconds on +average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/ingles/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/ingles/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex new file mode 100755 index 0000000..e32c52e --- /dev/null +++ b/vldb/ingles/relatedwork.tex @@ -0,0 +1,67 @@ +\section{Related Work} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical results +on perfect hashing. +In the following, we review some of those results. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Many methods for generating minimal perfect hash functions use a +{\em mapping}, {\em ordering} and {\em searching} +(MOS) approach, +a description coined by Fox, Chen and Heath~\cite{fch92}. +In the MOS approach, the construction of a minimal perfect hash function +is accomplished in three steps. +First, the mapping step transforms the key set from the original universe +to a new universe. +Second, the ordering step places the keys in a sequential order that +determines the order in which hash values are assigned to keys. +Third, the searching step attempts to assign hash values to the keys. +Our algorithm and the algorithm presented in~\cite{chm92} use the +MOS approach. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing minimal perfect hash functions. +The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n$ computer words. +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer +words required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +Differently from the works in~\cite{p99,dh01}, our algorithm uses two +universal hash functions $h_1$ and $h_2$ randomly selected from a class +of universal hash functions that do not need to meet any additional +requirements. + +The work in~\cite{chm92} presents an efficient and practical algorithm +for generating order preserving minimal perfect hash functions. +Their method involves the generation of acyclic random graphs +$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. +They showed that an order preserving minimal perfect hash function +can be found in optimal time if~$G$ is acyclic. +To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are +computed for each key $x \in S$. +Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, +\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. +In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects +$h_1$ and $h_2$ from a family of universal hash functions +until the corresponding graph is acyclic. +Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, +then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. +For $c=2.09$, this probability is +$p \simeq 0.342$, and +the expected number of iterations to obtain an acyclic graph +is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/ingles/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/ingles/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/ingles/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex new file mode 100755 index 0000000..61d26cd --- /dev/null +++ b/vldb/pt/algorithms.tex @@ -0,0 +1,19 @@ +\section{Os Algoritmos} +\label{sec:thealgorithm} + +\subsection{Um Algoritmo Baseado em Mem\'oria Principal} + +\subsection{Um Algoritmo Baseado em Mem\'oria Externa} +% For two-column wide figures use +\begin{figure} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/brz.ps} +% figure caption is below the figure +\caption{Main steps of the new algorithm.} +\label{fig:new-algo-main-steps} +\end{figure} + +\subsubsection{Segmenta\c{c}\~ao} +\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex new file mode 100644 index 0000000..785ccc0 --- /dev/null +++ b/vldb/pt/applications.tex @@ -0,0 +1,2 @@ +\section{Aplica\c{c}\~oes} +\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex new file mode 100755 index 0000000..08f3cd4 --- /dev/null +++ b/vldb/pt/conclusions.tex @@ -0,0 +1,3 @@ +\section{Conclus\~oes} + + diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex new file mode 100755 index 0000000..5152c0e --- /dev/null +++ b/vldb/pt/experimentalresults.tex @@ -0,0 +1 @@ +\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig new file mode 100644 index 0000000..4f11d1e --- /dev/null +++ b/vldb/pt/figs/brz.fig @@ -0,0 +1,135 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 3285 3600 3555 4230 +6 3285 3780 3555 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 +-6 +6 1800 4500 3330 5175 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 + 2565 5175 1800 4770 +4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 +-6 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +6 2250 3060 2880 3600 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 + 2565 3600 2250 3330 +-6 +-6 +4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 +-6 +4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 +-6 +6 1395 2655 3825 2970 +2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 +4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1395 4230 3825 4230 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 5400 4230 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 +4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps new file mode 100644 index 0000000..ca75ee1 --- /dev/null +++ b/vldb/pt/figs/brz.ps @@ -0,0 +1,324 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: brz.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Mon Sep 26 12:23:23 2005 +%%For: fbotelho@cronos (Fabiano Cupertino,,,) +%%BoundingBox: 0 0 240 186 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath +-27.4 352.4 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l + cp gs col0 s gr +% Polyline +n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l + cp gs col0 s gr +% Polyline +n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l + cp gs col0 s gr +% Polyline +n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l + cp gs col0 s gr +% Polyline +n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l + cp gs col0 s gr +% Polyline +n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l + cp gs col0 s gr +% Polyline +n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l + cp gs col0 s gr +% Polyline +n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l + 2565 5175 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2265 4867 m +gs 1 -1 sc (Spreading) col0 sh gr +% Polyline +n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l + 2565 3600 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2521 3382 m +gs 1 -1 sc (h) col0 sh gr +/Times-Roman-iso ff 95.25 scf sf +2589 3419 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat + 1395 2970 3720 2970 105 arcto 4 {pop} repeat + 3825 2970 3825 2760 105 arcto 4 {pop} repeat + 3825 2655 1500 2655 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +2212 2850 m +gs 1 -1 sc (Set of Keys S) col0 sh gr +% Polyline +n 1395 4230 m + 3825 4230 l gs col0 s gr +% Polyline +n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l + cp gs col0 s gr +% Polyline +n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l + cp gs col0 s gr +% Polyline +n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l + cp gs col0 s gr +% Polyline +n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l + cp gs col0 s gr +% Polyline +n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l + cp gs col0 s gr +% Polyline +n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l + cp gs col0 s gr +% Polyline +n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l + cp gs col0 s gr +% Polyline +n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l + cp gs col0 s gr +% Polyline +n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l + cp gs col0 s gr +% Polyline +n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l + cp gs col0 s gr +% Polyline +n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l + cp gs col0 s gr +% Polyline +n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l + cp gs col0 s gr +% Polyline +n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l + cp gs col0 s gr +% Polyline +n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l + cp gs col0 s gr +% Polyline +n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l + cp gs col0 s gr +% Polyline +n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l + cp gs col0 s gr +% Polyline +n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l + cp gs col0 s gr +% Polyline +n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l + cp gs col0 s gr +% Polyline +n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l + cp gs col0 s gr +% Polyline +n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l + cp gs col0 s gr +% Polyline +n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l + cp gs col0 s gr +% Polyline +n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l + cp gs col0 s gr +% Polyline +n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l + cp gs col0 s gr +% Polyline +n 1260 5400 m + 4230 5400 l gs col0 s gr +% Polyline +n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l + cp gs col0 s gr +% Polyline +n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l + cp gs col0 s gr +% Polyline +n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l + cp gs col0 s gr +% Polyline +n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l + cp gs col0 s gr +% Polyline +n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l + cp gs col0 s gr +% Polyline +n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l + cp gs col0 s gr +% Polyline +n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l + cp gs col0 s gr +% Polyline +n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l + cp gs col0 s gr +% Polyline +n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l + cp gs col0 s gr +% Polyline +n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l + cp gs col0 s gr +% Polyline +n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l + cp gs col0 s gr +% Polyline +n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l + cp gs col0 s gr +% Polyline +n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l + cp gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +1485 4410 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +3600 4410 m +gs 1 -1 sc (b-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +720 4050 m +gs 1 -1 sc (Buckets) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +900 4230 m +gs 1 -1 sc (B) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +4005 5580 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +1350 5580 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +450 5400 m +gs 1 -1 sc (Hash Table) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig new file mode 100755 index 0000000..6217edc --- /dev/null +++ b/vldb/pt/figs/grafordering.fig @@ -0,0 +1,206 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 2340 2970 4095 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 +6 3825 3870 4050 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 +-6 +6 3330 4545 3555 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 +-6 +6 2880 4455 3105 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 +-6 +6 2745 3690 2970 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 +-6 +6 3195 3420 3420 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 +-6 +6 3285 3960 3510 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 +-6 +6 2655 4050 2880 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 +-6 +6 3600 3510 3825 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 +-6 +6 3690 4320 3915 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 +-6 +6 3285 2970 3465 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 +4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 +-6 +6 450 2970 2115 4905 +6 450 3240 2115 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 +6 1845 3870 2070 4095 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 +-6 +6 1710 4320 1935 4545 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 +-6 +6 1350 4545 1575 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 +-6 +6 900 4455 1125 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 +-6 +6 765 3690 990 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 +-6 +6 1215 3420 1440 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 +-6 +6 1305 3960 1530 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 +-6 +6 675 4050 900 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 +-6 +6 1620 3510 1845 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 +-6 +6 1080 2970 1485 3150 +6 1305 2970 1485 3150 +2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 + 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 +4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 +-6 +-6 +6 4320 2970 6075 4905 +6 4410 3015 6075 4905 +6 5085 3015 5360 3156 +6 5225 3015 5360 3150 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5330 3020 5293 3141 +-6 +4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 +-6 +6 4410 3240 6075 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 +6 5310 4545 5535 4770 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 +4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 +-6 +6 4860 4455 5085 4680 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 +4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 +-6 +6 4725 3690 4950 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 +-6 +6 5175 3420 5400 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 +-6 +6 5265 3960 5490 4185 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 +4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 +-6 +6 4635 4050 4860 4275 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 +4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 +-6 +6 5580 3510 5805 3735 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 +4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 +-6 +6 5670 4320 5895 4545 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 +4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 +-6 +6 5805 3870 6030 4095 +1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 +4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 +4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 +-6 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 +-6 +4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig new file mode 100755 index 0000000..e3eb20f --- /dev/null +++ b/vldb/pt/figs/grafordering2.fig @@ -0,0 +1,219 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +6 270 5220 1980 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 +-6 +6 1665 5310 1980 5490 +6 1800 5310 1980 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 +-6 +6 4410 5220 6120 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 +6 4590 5625 4770 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 +-6 +6 4905 5310 5085 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 +-6 +6 5355 5310 5535 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 +-6 +6 5355 6390 5535 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 +-6 +6 4905 6390 5085 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 +-6 +6 4590 6075 4770 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 +-6 +6 5130 5850 5310 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 +-6 +6 5670 6075 5850 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 +-6 +6 5670 5625 5850 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 +-6 +6 5965 5332 6100 5467 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 6070 5337 6033 5458 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 5445 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 5220 5940 4995 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5445 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 4995 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 5940 5760 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 5943 5761 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 +4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 +-6 +6 2340 5220 4050 6615 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 +-6 +6 3735 5310 4050 5490 +6 3870 5310 4050 5490 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 +4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 +-6 +4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 +-6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig new file mode 100755 index 0000000..e4e46df --- /dev/null +++ b/vldb/pt/figs/grafordering3.fig @@ -0,0 +1,130 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d6d3d6 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 +6 450 5625 630 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 +-6 +6 765 5310 945 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 +-6 +6 1215 5310 1395 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 +-6 +6 1530 5625 1710 5805 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 +-6 +6 1530 6075 1710 6255 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 +-6 +6 1215 6390 1395 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 +-6 +6 765 6390 945 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 +-6 +6 450 6075 630 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 +-6 +6 990 5850 1170 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 +-6 +6 2520 5625 2700 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 +-6 +6 2835 5310 3015 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 +-6 +6 3285 5310 3465 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 +-6 +6 3285 6390 3465 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 +-6 +6 2835 6390 3015 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 +4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 +-6 +6 2520 6075 2700 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 +-6 +6 3060 5850 3240 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 +4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 +-6 +6 3600 6075 3780 6255 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 +-6 +6 3600 5625 3780 5805 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 +4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 1305 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 1080 5940 855 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1305 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 855 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1080 5940 1620 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 3375 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 3150 5940 2925 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3375 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 2925 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5940 3690 5715 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3151 5943 3691 5718 +4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 +4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig new file mode 100755 index 0000000..5fe082e --- /dev/null +++ b/vldb/pt/figs/grafsearching.fig @@ -0,0 +1,168 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 +6 5130 4275 5355 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 +-6 +6 4680 4185 4905 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 +-6 +6 4545 3420 4770 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 +-6 +6 5085 3690 5310 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 +-6 +6 4995 3150 5220 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 +-6 +6 7200 2970 8460 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 +6 7560 4185 7785 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 +-6 +6 7425 3420 7650 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 +-6 +6 7875 3150 8100 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 +-6 +6 7965 3690 8190 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 +-6 +6 8010 4275 8235 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7553 4891 7733 4666 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7560 3825 7785 3645 +4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 +-6 +6 9000 4185 9225 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 +-6 +6 8865 3420 9090 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 +-6 +6 9315 3150 9540 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 +-6 +6 9405 3690 9630 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 +-6 +6 9450 4275 9675 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 +-6 +6 5760 2835 7020 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 +6 6120 4185 6345 4410 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 +4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 +-6 +6 5985 3420 6210 3645 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 +4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 +-6 +6 6435 3150 6660 3375 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 +4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 +-6 +6 6525 3690 6750 3915 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 +4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 +-6 +6 6570 4275 6795 4500 +1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 +4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 +-6 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6030 2835 6120 3105 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6113 4891 6293 4666 +4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 +-6 +4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 +4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 +4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig new file mode 100755 index 0000000..6e6a78d --- /dev/null +++ b/vldb/pt/figs/grafsearching2.fig @@ -0,0 +1,180 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 +6 5895 5310 6075 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 +-6 +6 6345 5310 6525 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 +-6 +6 6345 6390 6525 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 +-6 +6 5895 6390 6075 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 +-6 +6 6120 5850 6300 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 +-6 +6 7425 5310 7605 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 +-6 +6 7875 5310 8055 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 +-6 +6 7875 6390 8055 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 +-6 +6 7425 6390 7605 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 +-6 +6 7650 5850 7830 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 +-6 +6 8955 5310 9135 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 +-6 +6 9405 5310 9585 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 +-6 +6 9405 6390 9585 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 +-6 +6 8955 6390 9135 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 +-6 +6 9180 5850 9360 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 +-6 +6 4545 5310 4725 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 +-6 +6 4995 5310 5175 5490 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 +-6 +6 4995 6390 5175 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 +-6 +6 4545 6390 4725 6570 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 +4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 +-6 +6 4770 5850 4950 6030 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 +4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 +-6 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 6435 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 6210 5940 5985 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 6435 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 5940 5985 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6255 5220 6615 5040 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5760 6840 6120 6660 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7965 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 7740 5940 7515 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7965 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7740 5940 7515 6480 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7290 6840 7650 6660 +2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7110 5895 7470 5715 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9495 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 9270 5940 9045 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9495 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9270 5940 9045 6480 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 5085 5400 +2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 + 4860 5940 4635 5400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 5085 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4860 5940 4635 6480 +4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 +4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 +4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig new file mode 100755 index 0000000..12ca8f7 --- /dev/null +++ b/vldb/pt/figs/grafsearchingncv.fig @@ -0,0 +1,124 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 33 #d3d3d3 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 +6 585 1125 765 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 +-6 +6 585 1575 765 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 +-6 +6 1125 1350 1305 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 +-6 +6 1665 1575 1845 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 +-6 +6 1665 1125 1845 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 +-6 +6 1035 1890 1395 2070 +6 1035 1890 1215 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 +-6 +6 1215 1890 1395 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 +-6 +-6 +6 2475 1125 2655 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 +-6 +6 2475 1575 2655 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 +-6 +6 3015 1350 3195 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 +-6 +6 3555 1575 3735 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 +-6 +6 3555 1125 3735 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 +-6 +6 3015 1890 3195 2070 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 +4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 +-6 +6 4590 1125 4770 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 +-6 +6 4590 1575 4770 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 +-6 +6 5130 1350 5310 1530 +1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 +4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 +-6 +6 5670 1575 5850 1755 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 +-6 +6 5670 1125 5850 1305 +1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 +4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 +-6 +6 5130 1935 5265 2070 +1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 +2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 + 5235 1940 5198 2061 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1215 1440 1755 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1216 1443 1756 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3105 1440 3645 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3106 1443 3646 1218 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5220 1440 5760 1215 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5221 1443 5761 1218 +4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 +4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 +4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 +4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 +4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig new file mode 100755 index 0000000..938ff8d --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.fig @@ -0,0 +1,176 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha5 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #bebebe +6 -2700 3060 -540 3240 +6 -2700 3060 -540 3240 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 +-6 +-6 +6 -2610 2835 -540 2970 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 +-6 +6 -3600 4230 270 5490 +6 -2700 4455 -540 5265 +6 -2700 4455 -540 4635 +6 -2700 4455 -540 4635 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 +-6 +-6 +6 -2700 5085 -540 5265 +6 -2700 5085 -540 5265 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 +-6 +-6 +-6 +6 -2610 4230 -540 4365 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 +-6 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 4635 -1980 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 4635 -2565 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1980 4635 -2295 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 4635 -900 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 4635 -1755 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 4635 -1485 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 4635 -1215 5085 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 4635 -675 5085 +4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 +4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 +-6 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -270 3690 0 3690 0 3870 -270 3870 -270 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 +2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 + -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 +2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 + -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2565 3240 -2025 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2295 3240 -2565 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -2025 3240 -3150 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1755 3240 -1215 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1485 3240 -1755 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -1215 3240 -90 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -675 3240 -945 3690 +2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 + 2 1 1.00 60.00 60.00 + -945 3240 -675 3690 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 +4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 +4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 +4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 +4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 +4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 +4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps new file mode 100755 index 0000000..5c7498b --- /dev/null +++ b/vldb/pt/figs/minimalperfecthash-ph-mph.ps @@ -0,0 +1,488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: minimalperfecthash-ph-mph.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 +%%CreationDate: Wed Jul 7 12:02:51 2004 +%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) +%%BoundingBox: 0 0 279 168 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.745 0.745 0.745 srgb} bind def + +end +save +newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath +227.7 346.8 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06299 0.06299 sc +% +% Fig objects follow +% +% +% here starts figure with depth 45 +% Polyline +0 slj +0 slc +7.500 slw +n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3060 m -540 3060 l -540 3240 l -810 3240 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 2970 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 2970 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 2970 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 2970 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 2970 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 4455 m -540 4455 l -540 4635 l -810 4635 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 5085 m -540 5085 l -540 5265 l -810 5265 l + cp gs col7 1.00 shd ef gr gs col0 s gr +/Times-Roman-iso ff 158.75 scf sf +-2610 4365 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 4365 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4365 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 4365 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 4365 m +gs 1 -1 sc (1) col0 sh gr +% Polyline +gs clippath +-2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp +eoclip +n -2565 4635 m + -1980 5085 l gs col0 s gr gr + +% arrowhead +n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp +eoclip +n -2295 4635 m + -2565 5085 l gs col0 s gr gr + +% arrowhead +n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp +eoclip +n -1980 4635 m + -2295 5085 l gs col0 s gr gr + +% arrowhead +n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp +eoclip +n -1755 4635 m + -900 5085 l gs col0 s gr gr + +% arrowhead +n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp +eoclip +n -1485 4635 m + -1755 5085 l gs col0 s gr gr + +% arrowhead +n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp +eoclip +n -1215 4635 m + -1485 5085 l gs col0 s gr gr + +% arrowhead +n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp +eoclip +n -675 4635 m + -1215 5085 l gs col0 s gr gr + +% arrowhead +n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp +eoclip +n -945 4635 m + -675 5085 l gs col0 s gr gr + +% arrowhead +n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-450 5220 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 4590 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2610 5490 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-765 5490 m +gs 1 -1 sc (n-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2070 5490 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2340 5490 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 5445 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 4860 m +gs 1 -1 sc (\(b\)) col0 sh gr +% Polyline +n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -810 3690 m -540 3690 l -540 3870 l -810 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -270 3690 m 0 3690 l 0 3870 l -270 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -540 3690 m -270 3690 l -270 3870 l -540 3870 l + cp gs col32 1.00 shd ef gr gs col0 s gr +% Polyline +n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +gs clippath +-2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp +eoclip +n -2565 3240 m + -2025 3690 l gs col0 s gr gr + +% arrowhead +n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp +eoclip +n -2295 3240 m + -2565 3690 l gs col0 s gr gr + +% arrowhead +n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp +eoclip +n -2025 3240 m + -3150 3690 l gs col0 s gr gr + +% arrowhead +n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp +eoclip +n -1755 3240 m + -1215 3690 l gs col0 s gr gr + +% arrowhead +n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp +eoclip +n -1485 3240 m + -1755 3690 l gs col0 s gr gr + +% arrowhead +n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp +eoclip +n -1215 3240 m + -90 3690 l gs col0 s gr gr + +% arrowhead +n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp +eoclip +n -675 3240 m + -945 3690 l gs col0 s gr gr + +% arrowhead +n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l + cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +-749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp +eoclip +n -945 3240 m + -675 3690 l gs col0 s gr gr + +% arrowhead +n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l + cp gs 0.00 setgray ef gr col0 s +/Times-Roman-iso ff 158.75 scf sf +-2610 4095 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-2880 4095 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-3150 4095 m +gs 1 -1 sc (0) col0 sh gr +/Times-Roman-iso ff 285.75 scf sf +-1575 4050 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-270 4095 m +gs 1 -1 sc (m-1) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +-450 3195 m +gs 1 -1 sc (Key Set) col0 sh gr +/Times-Roman-iso ff 158.75 scf sf +90 3825 m +gs 1 -1 sc (Hash Table) col0 sh gr +/Times-Roman-iso ff 174.63 scf sf +-3600 3465 m +gs 1 -1 sc (\(a\)) col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex new file mode 100755 index 0000000..bf4ef85 --- /dev/null +++ b/vldb/pt/introduction.tex @@ -0,0 +1,13 @@ +\section{Introdu\c{c}\~ao} +\label{sec:introduction} +% For two-column wide figures use +\begin{figure*} +% Use the relevant command to insert your figure file. +% For example, with the graphicx package use +\centering + \includegraphics{figs/minimalperfecthash-ph-mph.ps} +% figure caption is below the figure +\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} +\label{fig:minimalperfecthash-ph-mph} +\end{figure*} + diff --git a/vldb/pt/makefile b/vldb/pt/makefile new file mode 100755 index 0000000..c1a738f --- /dev/null +++ b/vldb/pt/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log + diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib new file mode 100755 index 0000000..6f54cbe --- /dev/null +++ b/vldb/pt/references.bib @@ -0,0 +1,669 @@ +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, + school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar�}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa�es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi�o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex new file mode 100755 index 0000000..554b9db --- /dev/null +++ b/vldb/pt/relatedwork.tex @@ -0,0 +1,2 @@ +\section{Trabalhos Relacionados} +\cite{bkz05} \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb/pt/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb/pt/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex new file mode 100644 index 0000000..807080a --- /dev/null +++ b/vldb/pt/vldb.tex @@ -0,0 +1,150 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% +\begin{document} + +\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +Insert your abstract here. Include up to five keywords. +\keywords{First keyword \and Second keyword \and More} +\end{abstract} + +% main text +\input{introduction} +\input{relatedwork} +\input{algorithms} +\input{experimentalresults} +\input{applications} +\input{conclusions} + + +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\end{document} From a36080a274337c93212b16e90c752d8353c474ea Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 28 Sep 2005 21:37:19 +0000 Subject: [PATCH 229/739] trabalhei na secao de trabalhos relacionados --- vldb/ingles/references.bib | 18 ++++++++++++++++++ vldb/pt/algorithms.tex | 2 +- vldb/pt/introduction.tex | 16 +++++++++++++--- vldb/pt/references.bib | 18 ++++++++++++++++++ vldb/pt/relatedwork.tex | 31 +++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/ingles/references.bib +++ b/vldb/ingles/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index 61d26cd..b92ae0b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} - +Nesta se\c{c}\~ao apresentamos \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index bf4ef85..131b1d2 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,13 +1,23 @@ \section{Introdu\c{c}\~ao} + \label{sec:introduction} % For two-column wide figures use -\begin{figure*} +\begin{figure} % Use the relevant command to insert your figure file. % For example, with the graphicx package use \centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} + \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} % figure caption is below the figure \caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} \label{fig:minimalperfecthash-ph-mph} -\end{figure*} +\end{figure} + +A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +\begin{enumerate} +\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de mem\'oria exigida para encontrar $h$. +\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\end{enumerate} diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 554b9db..6954ea0 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -1,2 +1,33 @@ \section{Trabalhos Relacionados} +As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade +cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e +apresentado um survey completo da \'area at\'e 1997. +Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que +est\~ao diretamente relacionados aos algoritmos aqui propostos e +fazemos um survey dos algoritmos propostos desde ent\~ao. + +Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir +FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em +tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: +$m=O(n)$. +No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma +palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo +$O(1)$. +Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo +experada de $O(n)$: +Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. + +Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +FHPs e FHPMs deterministicamente. +As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* +Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +limitar a utiliza\c{c}\~ao na pr\'atica. + \cite{bkz05} \ No newline at end of file From 884d7ff8f21cdea97c421caa56119ebb483646f5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 28 Sep 2005 21:37:19 +0000 Subject: [PATCH 230/739] trabalhei na secao de trabalhos relacionados --- vldb/ingles/references.bib | 18 ++++++++++++++++++ vldb/pt/algorithms.tex | 2 +- vldb/pt/introduction.tex | 16 +++++++++++++--- vldb/pt/references.bib | 18 ++++++++++++++++++ vldb/pt/relatedwork.tex | 31 +++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/ingles/references.bib +++ b/vldb/ingles/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index 61d26cd..b92ae0b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} - +Nesta se\c{c}\~ao apresentamos \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index bf4ef85..131b1d2 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,13 +1,23 @@ \section{Introdu\c{c}\~ao} + \label{sec:introduction} % For two-column wide figures use -\begin{figure*} +\begin{figure} % Use the relevant command to insert your figure file. % For example, with the graphicx package use \centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} + \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} % figure caption is below the figure \caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} \label{fig:minimalperfecthash-ph-mph} -\end{figure*} +\end{figure} + +A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +\begin{enumerate} +\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de mem\'oria exigida para encontrar $h$. +\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\end{enumerate} diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 554b9db..6954ea0 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -1,2 +1,33 @@ \section{Trabalhos Relacionados} +As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade +cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e +apresentado um survey completo da \'area at\'e 1997. +Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que +est\~ao diretamente relacionados aos algoritmos aqui propostos e +fazemos um survey dos algoritmos propostos desde ent\~ao. + +Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir +FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em +tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: +$m=O(n)$. +No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma +palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo +$O(1)$. +Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo +experada de $O(n)$: +Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. + +Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +FHPs e FHPMs deterministicamente. +As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* +Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +limitar a utiliza\c{c}\~ao na pr\'atica. + \cite{bkz05} \ No newline at end of file From 766607a897f248b45d97c31e1479684b0bb1a177 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 28 Sep 2005 21:37:19 +0000 Subject: [PATCH 231/739] trabalhei na secao de trabalhos relacionados --- vldb/ingles/references.bib | 18 ++++++++++++++++++ vldb/pt/algorithms.tex | 2 +- vldb/pt/introduction.tex | 16 +++++++++++++--- vldb/pt/references.bib | 18 ++++++++++++++++++ vldb/pt/relatedwork.tex | 31 +++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/ingles/references.bib +++ b/vldb/ingles/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index 61d26cd..b92ae0b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} - +Nesta se\c{c}\~ao apresentamos \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index bf4ef85..131b1d2 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,13 +1,23 @@ \section{Introdu\c{c}\~ao} + \label{sec:introduction} % For two-column wide figures use -\begin{figure*} +\begin{figure} % Use the relevant command to insert your figure file. % For example, with the graphicx package use \centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} + \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} % figure caption is below the figure \caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} \label{fig:minimalperfecthash-ph-mph} -\end{figure*} +\end{figure} + +A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +\begin{enumerate} +\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de mem\'oria exigida para encontrar $h$. +\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\end{enumerate} diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 554b9db..6954ea0 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -1,2 +1,33 @@ \section{Trabalhos Relacionados} +As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade +cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e +apresentado um survey completo da \'area at\'e 1997. +Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que +est\~ao diretamente relacionados aos algoritmos aqui propostos e +fazemos um survey dos algoritmos propostos desde ent\~ao. + +Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir +FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em +tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: +$m=O(n)$. +No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma +palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo +$O(1)$. +Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo +experada de $O(n)$: +Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. + +Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +FHPs e FHPMs deterministicamente. +As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* +Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +limitar a utiliza\c{c}\~ao na pr\'atica. + \cite{bkz05} \ No newline at end of file From 386dcbf9e41bb68c21cf25c676274bb76419fbb8 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 28 Sep 2005 21:37:19 +0000 Subject: [PATCH 232/739] trabalhei na secao de trabalhos relacionados --- vldb/ingles/references.bib | 18 ++++++++++++++++++ vldb/pt/algorithms.tex | 2 +- vldb/pt/introduction.tex | 16 +++++++++++++--- vldb/pt/references.bib | 18 ++++++++++++++++++ vldb/pt/relatedwork.tex | 31 +++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/ingles/references.bib +++ b/vldb/ingles/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index 61d26cd..b92ae0b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} - +Nesta se\c{c}\~ao apresentamos \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index bf4ef85..131b1d2 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,13 +1,23 @@ \section{Introdu\c{c}\~ao} + \label{sec:introduction} % For two-column wide figures use -\begin{figure*} +\begin{figure} % Use the relevant command to insert your figure file. % For example, with the graphicx package use \centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} + \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} % figure caption is below the figure \caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} \label{fig:minimalperfecthash-ph-mph} -\end{figure*} +\end{figure} + +A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +\begin{enumerate} +\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de mem\'oria exigida para encontrar $h$. +\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\end{enumerate} diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 6f54cbe..02f50aa 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -27,6 +27,24 @@ pages = {355--366} } +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + @inproceedings{ht01, author = {T. Hagerup and T. Tholey}, title = {Efficient minimal perfect hashing in nearly minimal space}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 554b9db..6954ea0 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -1,2 +1,33 @@ \section{Trabalhos Relacionados} +As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade +cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e +apresentado um survey completo da \'area at\'e 1997. +Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que +est\~ao diretamente relacionados aos algoritmos aqui propostos e +fazemos um survey dos algoritmos propostos desde ent\~ao. + +Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir +FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em +tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: +$m=O(n)$. +No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma +palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo +$O(1)$. +Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo +experada de $O(n)$: +Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. + +Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +FHPs e FHPMs deterministicamente. +As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* +Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +limitar a utiliza\c{c}\~ao na pr\'atica. + \cite{bkz05} \ No newline at end of file From ad495643bf44fd8401fed9210ca0afe6f14d896c Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 30 Sep 2005 20:14:51 +0000 Subject: [PATCH 233/739] Alterei introducao e trabalhos relacionados --- vldb/pt/introduction.tex | 37 ++++++++++++++++++++++++++++++++++++- vldb/pt/references.bib | 13 +++++++++++++ vldb/pt/relatedwork.tex | 3 +++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 131b1d2..10063d4 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,6 +1,41 @@ \section{Introdu\c{c}\~ao} - \label{sec:introduction} +Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da +Ci\^encia da Computa\c{c}\~ao. +Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, +para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. +Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em +$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. +Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento +m\'aximo $L$. Portanto $u = 2^L$. + +M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para +construir estruturas de dados para armazenar $S$ e suportar consultas do tipo +``$k \in S$?'' em tempo esperado $O(1)$. +No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido +a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas +chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. + + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + % For two-column wide figures use \begin{figure} % Use the relevant command to insert your figure file. diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 02f50aa..7a1a9fb 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -18,6 +18,19 @@ year = {2000} } +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + + @InProceedings{ss89, author = {P. Schmidt and A. Siegel}, title = {On aspects of universality and performance for closed hashing}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 6954ea0..a7dfe7c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -30,4 +30,7 @@ FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. +/* Descrever compressao de tabelas */ +\cite{gss01} + \cite{bkz05} \ No newline at end of file From d0c7c1cd1ffc630464eacfc4fd220f212152d04f Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 30 Sep 2005 20:14:51 +0000 Subject: [PATCH 234/739] Alterei introducao e trabalhos relacionados --- vldb/pt/introduction.tex | 37 ++++++++++++++++++++++++++++++++++++- vldb/pt/references.bib | 13 +++++++++++++ vldb/pt/relatedwork.tex | 3 +++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 131b1d2..10063d4 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,6 +1,41 @@ \section{Introdu\c{c}\~ao} - \label{sec:introduction} +Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da +Ci\^encia da Computa\c{c}\~ao. +Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, +para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. +Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em +$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. +Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento +m\'aximo $L$. Portanto $u = 2^L$. + +M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para +construir estruturas de dados para armazenar $S$ e suportar consultas do tipo +``$k \in S$?'' em tempo esperado $O(1)$. +No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido +a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas +chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. + + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + % For two-column wide figures use \begin{figure} % Use the relevant command to insert your figure file. diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 02f50aa..7a1a9fb 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -18,6 +18,19 @@ year = {2000} } +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + + @InProceedings{ss89, author = {P. Schmidt and A. Siegel}, title = {On aspects of universality and performance for closed hashing}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 6954ea0..a7dfe7c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -30,4 +30,7 @@ FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. +/* Descrever compressao de tabelas */ +\cite{gss01} + \cite{bkz05} \ No newline at end of file From 7d742eaeaba0bdff5572eb3a68acc790e6d487be Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 30 Sep 2005 20:14:51 +0000 Subject: [PATCH 235/739] Alterei introducao e trabalhos relacionados --- vldb/pt/introduction.tex | 37 ++++++++++++++++++++++++++++++++++++- vldb/pt/references.bib | 13 +++++++++++++ vldb/pt/relatedwork.tex | 3 +++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 131b1d2..10063d4 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,6 +1,41 @@ \section{Introdu\c{c}\~ao} - \label{sec:introduction} +Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da +Ci\^encia da Computa\c{c}\~ao. +Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, +para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. +Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em +$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. +Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento +m\'aximo $L$. Portanto $u = 2^L$. + +M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para +construir estruturas de dados para armazenar $S$ e suportar consultas do tipo +``$k \in S$?'' em tempo esperado $O(1)$. +No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido +a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas +chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. + + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + % For two-column wide figures use \begin{figure} % Use the relevant command to insert your figure file. diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 02f50aa..7a1a9fb 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -18,6 +18,19 @@ year = {2000} } +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + + @InProceedings{ss89, author = {P. Schmidt and A. Siegel}, title = {On aspects of universality and performance for closed hashing}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 6954ea0..a7dfe7c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -30,4 +30,7 @@ FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. +/* Descrever compressao de tabelas */ +\cite{gss01} + \cite{bkz05} \ No newline at end of file From 1592c86c28d5a2932c1f389f92ad9167d0e127ee Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 30 Sep 2005 20:14:51 +0000 Subject: [PATCH 236/739] Alterei introducao e trabalhos relacionados --- vldb/pt/introduction.tex | 37 ++++++++++++++++++++++++++++++++++++- vldb/pt/references.bib | 13 +++++++++++++ vldb/pt/relatedwork.tex | 3 +++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 131b1d2..10063d4 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -1,6 +1,41 @@ \section{Introdu\c{c}\~ao} - \label{sec:introduction} +Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da +Ci\^encia da Computa\c{c}\~ao. +Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, +para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. +Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em +$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. +Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento +m\'aximo $L$. Portanto $u = 2^L$. + +M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para +construir estruturas de dados para armazenar $S$ e suportar consultas do tipo +``$k \in S$?'' em tempo esperado $O(1)$. +No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido +a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas +chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. + + +For {\em static sets} of keys it is possible to compute a function +to find any key in a table in one probe; such hash functions are called +\textit{perfect}. +Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a +\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, +that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ +and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash +function. +Since no collisions occur, each key can be retrieved from the table +with a single probe. +If~$m=n$, that is, the table has the same size as~$S$, +then~$h$ is a \textit{minimal perfect hash function} for~$S$. +Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates +a~minimal perfect hash function. +Minimal perfect hash functions totally avoid the problem of wasted +space and time. + % For two-column wide figures use \begin{figure} % Use the relevant command to insert your figure file. diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib index 02f50aa..7a1a9fb 100755 --- a/vldb/pt/references.bib +++ b/vldb/pt/references.bib @@ -18,6 +18,19 @@ year = {2000} } +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + + @InProceedings{ss89, author = {P. Schmidt and A. Siegel}, title = {On aspects of universality and performance for closed hashing}, diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 6954ea0..a7dfe7c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -30,4 +30,7 @@ FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. +/* Descrever compressao de tabelas */ +\cite{gss01} + \cite{bkz05} \ No newline at end of file From 93d49e044c518ffa17c1cbe058a8b0e07ecf90b9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 21:28:13 +0000 Subject: [PATCH 237/739] *** empty log message *** --- vldb/pt/introduction.tex | 41 +++++++++++++++++++--------------------- vldb/pt/relatedwork.tex | 6 ++++-- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 10063d4..077d092 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -18,23 +18,19 @@ a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes qua chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. +Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao +para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes +s\~ao chamadas de \textit{perfeitas}. +Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma +\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, +isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ +e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. +A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. +Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, +ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). +A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma +fun\c{c}\~ao hash perfeita m\'{\i}nima. +FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. % For two-column wide figures use \begin{figure} @@ -47,12 +43,13 @@ space and time. \label{fig:minimalperfecthash-ph-mph} \end{figure} -A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: \begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de tempo gasto para encontrar uma FHPM $h$. \item Quantidade de mem\'oria exigida para encontrar $h$. -\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Escalabilidade dos algoritmos com o crescimento de $S$. \end{enumerate} +Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a7dfe7c..a987006 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -23,10 +23,12 @@ As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. From 83982b231707c00c19e465e1c56a26f5fa14a856 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 21:28:13 +0000 Subject: [PATCH 238/739] *** empty log message *** --- vldb/pt/introduction.tex | 41 +++++++++++++++++++--------------------- vldb/pt/relatedwork.tex | 6 ++++-- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 10063d4..077d092 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -18,23 +18,19 @@ a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes qua chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. +Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao +para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes +s\~ao chamadas de \textit{perfeitas}. +Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma +\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, +isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ +e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. +A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. +Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, +ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). +A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma +fun\c{c}\~ao hash perfeita m\'{\i}nima. +FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. % For two-column wide figures use \begin{figure} @@ -47,12 +43,13 @@ space and time. \label{fig:minimalperfecthash-ph-mph} \end{figure} -A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: \begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de tempo gasto para encontrar uma FHPM $h$. \item Quantidade de mem\'oria exigida para encontrar $h$. -\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Escalabilidade dos algoritmos com o crescimento de $S$. \end{enumerate} +Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a7dfe7c..a987006 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -23,10 +23,12 @@ As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. From 797b6c01230a2e6c5fdce81925bf476ac6740f89 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 21:28:13 +0000 Subject: [PATCH 239/739] *** empty log message *** --- vldb/pt/introduction.tex | 41 +++++++++++++++++++--------------------- vldb/pt/relatedwork.tex | 6 ++++-- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 10063d4..077d092 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -18,23 +18,19 @@ a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes qua chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. +Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao +para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes +s\~ao chamadas de \textit{perfeitas}. +Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma +\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, +isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ +e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. +A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. +Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, +ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). +A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma +fun\c{c}\~ao hash perfeita m\'{\i}nima. +FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. % For two-column wide figures use \begin{figure} @@ -47,12 +43,13 @@ space and time. \label{fig:minimalperfecthash-ph-mph} \end{figure} -A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: \begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de tempo gasto para encontrar uma FHPM $h$. \item Quantidade de mem\'oria exigida para encontrar $h$. -\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Escalabilidade dos algoritmos com o crescimento de $S$. \end{enumerate} +Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a7dfe7c..a987006 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -23,10 +23,12 @@ As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. From 4b707bc9fcf1b00575e4fa2940deafcfeb134dcf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 21:28:13 +0000 Subject: [PATCH 240/739] *** empty log message *** --- vldb/pt/introduction.tex | 41 +++++++++++++++++++--------------------- vldb/pt/relatedwork.tex | 6 ++++-- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex index 10063d4..077d092 100755 --- a/vldb/pt/introduction.tex +++ b/vldb/pt/introduction.tex @@ -18,23 +18,19 @@ a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes qua chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. +Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao +para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes +s\~ao chamadas de \textit{perfeitas}. +Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma +\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, +isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ +e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. +A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. +Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, +ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). +A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma +fun\c{c}\~ao hash perfeita m\'{\i}nima. +FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. % For two-column wide figures use \begin{figure} @@ -47,12 +43,13 @@ space and time. \label{fig:minimalperfecthash-ph-mph} \end{figure} -A efici\^encia dos algoritmos ser\'a medida atrav\'es das seguintes m\'etricas: +A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: \begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma fun\c{c}\~ao hash perfeita m\'{\i}nima $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Quantidade de tempo gasto para encontrar uma FHPM $h$. \item Quantidade de mem\'oria exigida para encontrar $h$. -\item Escalabilidade dos algoritmos a medida que o conjunto de chaves cresce. +\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. +\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. +\item Escalabilidade dos algoritmos com o crescimento de $S$. \end{enumerate} +Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a7dfe7c..a987006 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -23,10 +23,12 @@ As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -*Falar do limite inferiors para descrever um FHP Mehlhorn~\cite{m84}* Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs e n\~ao geram as fun\c{c}\~oes com complexidade linear. +FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. From a1e0b08debbe1e75043bce10286eeee2f6b6a1c2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 23:56:51 +0000 Subject: [PATCH 241/739] trabalhei em trabalhos relacionados --- vldb/pt/algorithms.tex | 2 +- vldb/pt/relatedwork.tex | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index b92ae0b..0ae2e7b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos +Nesta se\c{c}\~ao apresentamos \cite{bkz05} \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a987006..028c48c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -32,7 +32,42 @@ fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. -/* Descrever compressao de tabelas */ -\cite{gss01} +Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir +FHPMs. +A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, +onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de +valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. +Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou +que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada +em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador +(ou $O((2+\epsilon)n \log n)$ bits.) +Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, +reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) +o n\'umero de palavras de +computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ +devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos +adicionais. -\cite{bkz05} \ No newline at end of file +Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. + +Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do +conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes +hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um +n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior +do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade +\'otima para descrever FHPMs. + +Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam +fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe +de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. +Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas +com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da +complexidade \'otima. +Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao +os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na +ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file From 4825611cd0c26e63942dc7e0e45a383b8844d4bf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 23:56:51 +0000 Subject: [PATCH 242/739] trabalhei em trabalhos relacionados --- vldb/pt/algorithms.tex | 2 +- vldb/pt/relatedwork.tex | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index b92ae0b..0ae2e7b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos +Nesta se\c{c}\~ao apresentamos \cite{bkz05} \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a987006..028c48c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -32,7 +32,42 @@ fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. -/* Descrever compressao de tabelas */ -\cite{gss01} +Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir +FHPMs. +A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, +onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de +valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. +Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou +que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada +em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador +(ou $O((2+\epsilon)n \log n)$ bits.) +Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, +reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) +o n\'umero de palavras de +computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ +devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos +adicionais. -\cite{bkz05} \ No newline at end of file +Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. + +Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do +conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes +hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um +n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior +do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade +\'otima para descrever FHPMs. + +Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam +fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe +de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. +Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas +com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da +complexidade \'otima. +Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao +os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na +ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file From d30103fcb0e310146361609ef1af78c540d913cb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 23:56:51 +0000 Subject: [PATCH 243/739] trabalhei em trabalhos relacionados --- vldb/pt/algorithms.tex | 2 +- vldb/pt/relatedwork.tex | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index b92ae0b..0ae2e7b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos +Nesta se\c{c}\~ao apresentamos \cite{bkz05} \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a987006..028c48c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -32,7 +32,42 @@ fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. -/* Descrever compressao de tabelas */ -\cite{gss01} +Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir +FHPMs. +A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, +onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de +valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. +Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou +que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada +em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador +(ou $O((2+\epsilon)n \log n)$ bits.) +Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, +reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) +o n\'umero de palavras de +computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ +devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos +adicionais. -\cite{bkz05} \ No newline at end of file +Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. + +Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do +conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes +hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um +n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior +do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade +\'otima para descrever FHPMs. + +Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam +fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe +de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. +Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas +com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da +complexidade \'otima. +Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao +os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na +ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file From b4863fbce906e935309ea7ee017fdb87bbfdaaae Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Sun, 2 Oct 2005 23:56:51 +0000 Subject: [PATCH 244/739] trabalhei em trabalhos relacionados --- vldb/pt/algorithms.tex | 2 +- vldb/pt/relatedwork.tex | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex index b92ae0b..0ae2e7b 100755 --- a/vldb/pt/algorithms.tex +++ b/vldb/pt/algorithms.tex @@ -1,6 +1,6 @@ \section{Os Algoritmos} \label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos +Nesta se\c{c}\~ao apresentamos \cite{bkz05} \subsection{Um Algoritmo Baseado em Mem\'oria Principal} \subsection{Um Algoritmo Baseado em Mem\'oria Externa} diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index a987006..028c48c 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -32,7 +32,42 @@ fun\c{c}\~oes com complexidade linear. Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode limitar a utiliza\c{c}\~ao na pr\'atica. -/* Descrever compressao de tabelas */ -\cite{gss01} +Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir +FHPMs. +A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, +onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de +valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. +Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou +que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada +em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador +(ou $O((2+\epsilon)n \log n)$ bits.) +Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, +reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) +o n\'umero de palavras de +computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ +devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos +adicionais. -\cite{bkz05} \ No newline at end of file +Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. + +Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do +conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes +hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um +n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior +do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade +\'otima para descrever FHPMs. + +Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam +fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe +de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. +Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas +com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da +complexidade \'otima. +Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao +os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na +ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file From dab54e510c30b7fc6e49f09c68e56d2465e7ede2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Oct 2005 00:01:27 +0000 Subject: [PATCH 245/739] *** empty log message *** --- vldb/pt/relatedwork.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 028c48c..b250e4b 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -58,7 +58,7 @@ Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever FHPMs. From a2af7dfa6927199f7ba4d5194d1620fd63307f22 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Oct 2005 00:01:27 +0000 Subject: [PATCH 246/739] *** empty log message *** --- vldb/pt/relatedwork.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 028c48c..b250e4b 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -58,7 +58,7 @@ Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever FHPMs. From da288dc849c4934e031893ef09b13af25b7f7e5d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Oct 2005 00:01:27 +0000 Subject: [PATCH 247/739] *** empty log message *** --- vldb/pt/relatedwork.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 028c48c..b250e4b 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -58,7 +58,7 @@ Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever FHPMs. From 54b8ded9ed540b7da11d274143848ecfc0243294 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 3 Oct 2005 00:01:27 +0000 Subject: [PATCH 248/739] *** empty log message *** --- vldb/pt/relatedwork.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex index 028c48c..b250e4b 100755 --- a/vldb/pt/relatedwork.tex +++ b/vldb/pt/relatedwork.tex @@ -58,7 +58,7 @@ Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes que envolvem $n^2$ aparecem no c\'alculo da FHPM. +do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever FHPMs. From 2fd4b6a46d809b3da752eb71a52787a175b61891 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 10 Oct 2005 17:43:21 +0000 Subject: [PATCH 249/739] thread-safe vector adapter --- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 2 +- src/cmph.c | 81 +++++++++++++++++++++++++---------- src/cmph.h | 5 +++ tests/graph_tests.c | 6 +-- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 57ec5b6..92a9770 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -26,7 +26,7 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 1ae8abb..3e0bd85 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -21,6 +21,6 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } diff --git a/src/cmph.c b/src/cmph.c index d03bc74..07e888a 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -13,7 +13,14 @@ const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ -static cmph_uint32 position; // access position when data is a vector +typedef struct +{ + void *vector; + cmph_uint32 position; // access position when data is a vector +} cmph_vector_t; + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys); +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source); static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { @@ -42,19 +49,14 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys_vd = (char **)data; - if (keys_vd + position == NULL) return -1; - *keylen = strlen(*(keys_vd + position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + position)); - position ++; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; -/* char **keys_vd = (char **)data; - if (keys_vd[position] == NULL) return -1; - *keylen = strlen(keys_vd[position]); + if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(*(keys_vd + cmph_vector->position)); *key = (char *)malloc(*keylen + 1); - strcpy(*key, keys_vd[position]); - position ++;*/ + strcpy(*key, *(keys_vd + cmph_vector->position)); + cmph_vector->position = cmph_vector->position + 1; return *keylen; } @@ -66,7 +68,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - free(key); + key_nlfile_dispose(data, key, keylen); } static void key_nlfile_rewind(void *data) @@ -77,10 +79,10 @@ static void key_nlfile_rewind(void *data) static void key_vector_rewind(void *data) { - position = 0; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_vector->position = 0; } - static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -109,6 +111,11 @@ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) return key_source; } +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); @@ -121,16 +128,44 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + assert(key_source); + assert(cmph_vector); + cmph_vector->vector = vector; + cmph_vector->position = 0; + key_source->data = (void *)cmph_vector; + key_source->nkeys = nkeys; + return key_source; +} + +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)key_source->data; + cmph_vector->vector = NULL; + free(cmph_vector); + free(key_source); +} + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - assert(key_source); - key_source->data = (void *)vector; - key_source->nkeys = nkeys; - key_source->read = key_vector_read; - key_source->dispose = key_vector_dispose; - key_source->rewind = key_vector_rewind; - return key_source; + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} + +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index 88ed317..50b2d66 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -26,8 +26,13 @@ typedef struct /** Adapter pattern API **/ /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 39e9b3e..74dd32e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10, 0); + graph_t *g = graph_new(5, 10); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5, 0); + g = graph_new(4, 5); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4, 0); + g = graph_new(5, 4); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From 26550aad88a42aa8a19739f003c664a97cb738bc Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 10 Oct 2005 17:43:21 +0000 Subject: [PATCH 250/739] thread-safe vector adapter --- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 2 +- src/cmph.c | 81 +++++++++++++++++++++++++---------- src/cmph.h | 5 +++ tests/graph_tests.c | 6 +-- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 57ec5b6..92a9770 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -26,7 +26,7 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 1ae8abb..3e0bd85 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -21,6 +21,6 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } diff --git a/src/cmph.c b/src/cmph.c index d03bc74..07e888a 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -13,7 +13,14 @@ const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ -static cmph_uint32 position; // access position when data is a vector +typedef struct +{ + void *vector; + cmph_uint32 position; // access position when data is a vector +} cmph_vector_t; + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys); +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source); static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { @@ -42,19 +49,14 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys_vd = (char **)data; - if (keys_vd + position == NULL) return -1; - *keylen = strlen(*(keys_vd + position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + position)); - position ++; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; -/* char **keys_vd = (char **)data; - if (keys_vd[position] == NULL) return -1; - *keylen = strlen(keys_vd[position]); + if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(*(keys_vd + cmph_vector->position)); *key = (char *)malloc(*keylen + 1); - strcpy(*key, keys_vd[position]); - position ++;*/ + strcpy(*key, *(keys_vd + cmph_vector->position)); + cmph_vector->position = cmph_vector->position + 1; return *keylen; } @@ -66,7 +68,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - free(key); + key_nlfile_dispose(data, key, keylen); } static void key_nlfile_rewind(void *data) @@ -77,10 +79,10 @@ static void key_nlfile_rewind(void *data) static void key_vector_rewind(void *data) { - position = 0; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_vector->position = 0; } - static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -109,6 +111,11 @@ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) return key_source; } +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); @@ -121,16 +128,44 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + assert(key_source); + assert(cmph_vector); + cmph_vector->vector = vector; + cmph_vector->position = 0; + key_source->data = (void *)cmph_vector; + key_source->nkeys = nkeys; + return key_source; +} + +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)key_source->data; + cmph_vector->vector = NULL; + free(cmph_vector); + free(key_source); +} + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - assert(key_source); - key_source->data = (void *)vector; - key_source->nkeys = nkeys; - key_source->read = key_vector_read; - key_source->dispose = key_vector_dispose; - key_source->rewind = key_vector_rewind; - return key_source; + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} + +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index 88ed317..50b2d66 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -26,8 +26,13 @@ typedef struct /** Adapter pattern API **/ /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 39e9b3e..74dd32e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10, 0); + graph_t *g = graph_new(5, 10); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5, 0); + g = graph_new(4, 5); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4, 0); + g = graph_new(5, 4); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From 312947b34f2827ca163e359e9d68bae7aa5fe945 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 10 Oct 2005 17:43:21 +0000 Subject: [PATCH 251/739] thread-safe vector adapter --- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 2 +- src/cmph.c | 81 +++++++++++++++++++++++++---------- src/cmph.h | 5 +++ tests/graph_tests.c | 6 +-- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 57ec5b6..92a9770 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -26,7 +26,7 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 1ae8abb..3e0bd85 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -21,6 +21,6 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } diff --git a/src/cmph.c b/src/cmph.c index d03bc74..07e888a 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -13,7 +13,14 @@ const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ -static cmph_uint32 position; // access position when data is a vector +typedef struct +{ + void *vector; + cmph_uint32 position; // access position when data is a vector +} cmph_vector_t; + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys); +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source); static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { @@ -42,19 +49,14 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys_vd = (char **)data; - if (keys_vd + position == NULL) return -1; - *keylen = strlen(*(keys_vd + position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + position)); - position ++; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; -/* char **keys_vd = (char **)data; - if (keys_vd[position] == NULL) return -1; - *keylen = strlen(keys_vd[position]); + if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(*(keys_vd + cmph_vector->position)); *key = (char *)malloc(*keylen + 1); - strcpy(*key, keys_vd[position]); - position ++;*/ + strcpy(*key, *(keys_vd + cmph_vector->position)); + cmph_vector->position = cmph_vector->position + 1; return *keylen; } @@ -66,7 +68,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - free(key); + key_nlfile_dispose(data, key, keylen); } static void key_nlfile_rewind(void *data) @@ -77,10 +79,10 @@ static void key_nlfile_rewind(void *data) static void key_vector_rewind(void *data) { - position = 0; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_vector->position = 0; } - static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -109,6 +111,11 @@ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) return key_source; } +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); @@ -121,16 +128,44 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + assert(key_source); + assert(cmph_vector); + cmph_vector->vector = vector; + cmph_vector->position = 0; + key_source->data = (void *)cmph_vector; + key_source->nkeys = nkeys; + return key_source; +} + +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)key_source->data; + cmph_vector->vector = NULL; + free(cmph_vector); + free(key_source); +} + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - assert(key_source); - key_source->data = (void *)vector; - key_source->nkeys = nkeys; - key_source->read = key_vector_read; - key_source->dispose = key_vector_dispose; - key_source->rewind = key_vector_rewind; - return key_source; + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} + +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index 88ed317..50b2d66 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -26,8 +26,13 @@ typedef struct /** Adapter pattern API **/ /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 39e9b3e..74dd32e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10, 0); + graph_t *g = graph_new(5, 10); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5, 0); + g = graph_new(4, 5); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4, 0); + g = graph_new(5, 4); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From bb8335f65bd683db7f4fc09df8a761cd84fec1b3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 10 Oct 2005 17:43:21 +0000 Subject: [PATCH 252/739] thread-safe vector adapter --- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 2 +- src/cmph.c | 81 +++++++++++++++++++++++++---------- src/cmph.h | 5 +++ tests/graph_tests.c | 6 +-- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 57ec5b6..92a9770 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -26,7 +26,7 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 1ae8abb..3e0bd85 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -21,6 +21,6 @@ int main(int argc, char **argv) fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } diff --git a/src/cmph.c b/src/cmph.c index d03bc74..07e888a 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -13,7 +13,14 @@ const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ -static cmph_uint32 position; // access position when data is a vector +typedef struct +{ + void *vector; + cmph_uint32 position; // access position when data is a vector +} cmph_vector_t; + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys); +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source); static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) { @@ -42,19 +49,14 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - char **keys_vd = (char **)data; - if (keys_vd + position == NULL) return -1; - *keylen = strlen(*(keys_vd + position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + position)); - position ++; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; -/* char **keys_vd = (char **)data; - if (keys_vd[position] == NULL) return -1; - *keylen = strlen(keys_vd[position]); + if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(*(keys_vd + cmph_vector->position)); *key = (char *)malloc(*keylen + 1); - strcpy(*key, keys_vd[position]); - position ++;*/ + strcpy(*key, *(keys_vd + cmph_vector->position)); + cmph_vector->position = cmph_vector->position + 1; return *keylen; } @@ -66,7 +68,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - free(key); + key_nlfile_dispose(data, key, keylen); } static void key_nlfile_rewind(void *data) @@ -77,10 +79,10 @@ static void key_nlfile_rewind(void *data) static void key_vector_rewind(void *data) { - position = 0; + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_vector->position = 0; } - static cmph_uint32 count_nlfile_keys(FILE *fd) { cmph_uint32 count = 0; @@ -109,6 +111,11 @@ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) return key_source; } +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); @@ -121,16 +128,44 @@ cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) return key_source; } +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + assert(key_source); + assert(cmph_vector); + cmph_vector->vector = vector; + cmph_vector->position = 0; + key_source->data = (void *)cmph_vector; + key_source->nkeys = nkeys; + return key_source; +} + +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)key_source->data; + cmph_vector->vector = NULL; + free(cmph_vector); + free(key_source); +} + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - assert(key_source); - key_source->data = (void *)vector; - key_source->nkeys = nkeys; - key_source->read = key_vector_read; - key_source->dispose = key_vector_dispose; - key_source->rewind = key_vector_rewind; - return key_source; + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} + +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); } cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) diff --git a/src/cmph.h b/src/cmph.h index 88ed317..50b2d66 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -26,8 +26,13 @@ typedef struct /** Adapter pattern API **/ /* please call free() in the created adapters */ cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); + cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); diff --git a/tests/graph_tests.c b/tests/graph_tests.c index 39e9b3e..74dd32e 100644 --- a/tests/graph_tests.c +++ b/tests/graph_tests.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { graph_iterator_t it; cmph_uint32 i, neighbor; - graph_t *g = graph_new(5, 10, 0); + graph_t *g = graph_new(5, 10); fprintf(stderr, "Building random graph\n"); for (i = 0; i < 10; ++i) @@ -26,7 +26,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building cyclic graph\n"); - g = graph_new(4, 5, 0); + g = graph_new(4, 5); graph_add_edge(g, 0, 3); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); @@ -38,7 +38,7 @@ int main(int argc, char **argv) graph_destroy(g); fprintf(stderr, "Building non-cyclic graph\n"); - g = graph_new(5, 4, 0); + g = graph_new(5, 4); graph_add_edge(g, 0, 1); graph_add_edge(g, 1, 2); graph_add_edge(g, 2, 3); From ab38f8e13f344b50dba37bac60b23652631947e0 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:45:14 +0000 Subject: [PATCH 253/739] stable version of BRZ algorithm using buffers --- src/Makefile.am | 6 +- src/bmz.c | 11 +- src/bmz8.c | 23 +-- src/brz.c | 364 +++++++++++++++++++++---------------------- src/brz.h | 2 + src/brz_structs.h | 7 +- src/cmph.c | 51 +++++- src/cmph.h | 2 + src/jenkins_hash.c | 12 +- src/jenkins_hash.h | 2 - src/main.c | 39 +++-- src/vqueue.c | 2 +- vldb/pt/figs/brz.fig | 204 +++++++++++++----------- 13 files changed, 398 insertions(+), 327 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = debug.h\ +libcmph_la_SOURCES = util.h debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ @@ -17,9 +17,11 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ + buffer_manage.h buffer_manage.c\ + buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c index 2fba0c2..be31b1a 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -64,7 +64,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 *used_edges = NULL; cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; @@ -93,7 +93,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -109,20 +109,18 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) } if (iterations == 0) break; } - else break; + else break; } if (iterations == 0) { graph_destroy(bmz->graph); return NULL; } - // Ordering step if (mph->verbosity) { fprintf(stderr, "Starting ordering step\n"); } - graph_obtain_critical_nodes(bmz->graph); // Searching step @@ -164,7 +162,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - graph_destroy(bmz->graph); + graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) { @@ -181,6 +179,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmzf->m = bmz->m; mphf->data = bmzf; mphf->size = bmz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { diff --git a/src/bmz8.c b/src/bmz8.c index c4837c2..0ebb3ce 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -5,7 +5,6 @@ #include "hash.h" #include "vqueue.h" #include "bitbool.h" - #include #include #include @@ -66,7 +65,6 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; - if (mph->key_source->nkeys >= 256) { if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); @@ -168,9 +166,11 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) iterations_map--; if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); } + free(used_edges); free(visited); - }while(restart_mapping && iterations_map > 0); + + }while(restart_mapping && iterations_map > 0); graph_destroy(bmz8->graph); bmz8->graph = NULL; if (iterations_map == 0) @@ -266,8 +266,8 @@ static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_ui static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint8 next_g; - cmph_uint32 u; /* Auxiliary vertex */ - cmph_uint32 lav; /* lookahead vertex */ + cmph_uint32 u; + cmph_uint32 lav; cmph_uint8 collision; cmph_uint8 * unused_g_values = NULL; cmph_uint8 unused_g_values_capacity = 0; @@ -278,7 +278,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz DEBUGP("Labelling critical vertices\n"); bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); vqueue_insert(q, v); while(!vqueue_is_empty(q)) { @@ -324,14 +324,15 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; } if (next_g > *biggest_g_value) *biggest_g_value = next_g; - } + } + next_g_index--; if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; @@ -345,9 +346,11 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; } } + bmz8->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - vqueue_insert(q, u); + vqueue_insert(q, u); + } } @@ -537,7 +540,7 @@ cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) void bmz8_destroy(cmph_t *mphf) { bmz8_data_t *data = (bmz8_data_t *)mphf->data; - free(data->g); + free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); free(data->hashes); diff --git a/src/brz.c b/src/brz.c index 44dcaa7..10d0367 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,10 +4,10 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" +#include "buffer_manage.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" - #include #include #include @@ -21,12 +21,14 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; brz->hashfuncs[2] = CMPH_HASH_JENKINS; @@ -35,10 +37,11 @@ brz_config_data_t *brz_config_new() brz->g = NULL; brz->h1 = NULL; brz->h2 = NULL; - brz->h3 = NULL; + brz->h0 = NULL; brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); - strcpy(brz->tmp_dir, "/var/tmp/\0"); + brz->mphf_fd = NULL; + strcpy((char *)(brz->tmp_dir), "/var/tmp/"); assert(brz); return brz; } @@ -46,6 +49,7 @@ brz_config_data_t *brz_config_new() void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; + free(data->tmp_dir); DEBUGP("Destroying algorithm dependent data\n"); free(data); } @@ -74,22 +78,35 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) brz_config_data_t *brz = (brz_config_data_t *)mph->data; if(tmp_dir) { - cmph_uint32 len = strlen(tmp_dir); + cmph_uint32 len = strlen((char *)tmp_dir); free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } } } +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->mphf_fd = mphf_fd; + assert(brz->mphf_fd); +} + +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->b = b; +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; @@ -102,7 +119,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/170); + brz->k = ceil(brz->m/(brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -112,22 +129,22 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Partioning the set of keys.\n"); } - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); +// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); while(1) { int ok; DEBUGP("hash function 3\n"); - brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); ok = brz_gen_graphs(mph); if (!ok) { --iterations; - hash_state_destroy(brz->h3); - brz->h3 = NULL; + hash_state_destroy(brz->h0); + brz->h0 = NULL; DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); if (mph->verbosity) { @@ -150,7 +167,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -161,14 +177,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = NULL; //transfer memory ownership brzf->h2 = brz->h2; brz->h2 = NULL; //transfer memory ownership - brzf->h3 = brz->h3; - brz->h3 = NULL; //transfer memory ownership + brzf->h0 = brz->h0; + brz->h0 = NULL; //transfer memory ownership brzf->size = brz->size; brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership - brzf->tmp_dir = brz->tmp_dir; - brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -186,47 +200,42 @@ static int brz_gen_graphs(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); - cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; - cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 *buffer_h0 = NULL; cmph_uint32 nflushes = 0; - cmph_uint32 h3; + cmph_uint32 h0; FILE * tmp_fd = NULL; - FILE ** tmp_fds = NULL; + buffer_manage_t * buff_manage = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - cmph_uint32 start_index = 0; char ** keys_vd = NULL; - mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning for (e = 0; e < brz->m; ++e) { mph->key_source->read(mph->key_source->data, &key, &keylen); - + /* Buffers management */ if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers - { + { if(mph->verbosity) { fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; - - cmph_uint32 keylen1 = 0; - buckets_size[0] = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; for(i = 1; i < brz->k; i++) { if(buckets_size[i] == 0) continue; @@ -239,20 +248,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -264,17 +273,16 @@ static int brz_gen_graphs(cmph_config_t *mph) } memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; - h3 = hash(brz->h3, key, keylen) % brz->k; - if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) + h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); free(buckets_size); return 0; } - brz->size[h3] = brz->size[h3] + 1; - buckets_size[h3] ++; + brz->size[h0] = brz->size[h0] + 1; + buckets_size[h0] ++; nkeys_in_buffer++; - mph->key_source->dispose(mph->key_source->data, key, keylen); } @@ -299,20 +307,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -322,66 +330,70 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } + free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // mphf generation if(mph->verbosity) { fprintf(stderr, "\nMPHF generation \n"); } - tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + /* Starting to dump to disk the resultant MPHF: __cmph_dump function */ + fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); + fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); + fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs + fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); + + //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buff_manage = buffer_manage_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); - buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",brz->tmp_dir); - tmp_fd = fopen(filename, "w"); - free(filename); + buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + memory_usage = 0; for(i = 0; i < nflushes; i++) { - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - tmp_fds[i] = fopen(filename, "rb"); + buffer_manage_open(buff_manage, i, filename); free(filename); filename = NULL; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - buffer_h3[i] = h3; + h0 = hash(brz->h0, key, keylen) % brz->k; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } - e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; while(e < brz->m) { - i = brz_min_index(buffer_h3, nflushes); - cur_bucket = buffer_h3[i]; - key = brz_read_key(tmp_fds[i]); + i = brz_min_index(buffer_h0, nflushes); + cur_bucket = buffer_h0[i]; + key = (char *)buffer_manage_read_key(buff_manage, i); if(key) { while(key) { keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - - if (h3 != buffer_h3[i]) break; - + h0 = hash(brz->h0, key, keylen) % brz->k; + if (h0 != buffer_h0[i]) break; keys_vd[nkeys_vd++] = key; + key = NULL; //transfer memory ownership e++; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = h3; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -390,10 +402,10 @@ static int brz_gen_graphs(cmph_config_t *mph) if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = UINT_MAX; - buffer_merge[i] = NULL; + buffer_h0[i] = UINT_MAX; } if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. @@ -402,35 +414,33 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; bmz8_data_t * bmzf = NULL; + char *bufmphf = NULL; + cmph_uint32 buflenmphf = 0; // Source of keys - if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); - memory_usage += brz->size[cur_bucket]; - if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) - { - brz_flush_g(brz, &start_index, tmp_fd); - memory_usage = 0; - } + bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); + bmzf = NULL; + fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); + free(bufmphf); + bufmphf = NULL; cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys_vd); + brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - free(source); + cmph_io_vector_adapter_destroy(source); + nkeys_vd = 0; } } - fclose(tmp_fd); - for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - free(tmp_fds); + + buffer_manage_destroy(buff_manage); free(keys_vd); free(buffer_merge); - free(buffer_h3); - fprintf(stderr, "Maximal Size: %u\n", max_size); + free(buffer_h0); return 1; } @@ -467,7 +477,7 @@ static char * brz_read_key(FILE * fd) static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; - for(i = 0; i < nkeys; i++) free(keys_vd[i]); + for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) @@ -481,93 +491,84 @@ static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * } } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = ceil(brz->c * brz->size[index]); + hash_state_dump(bmzf->hashes[0], &bufh1, &buflenh1); + hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + //fprintf(stderr,"entrei passei\n"); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2,bmzf->g, n); + free(bufh1); + free(bufh2); + return buf; +} +/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); - + if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + } + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } - +*/ int brz_dump(cmph_t *mphf, FILE *fd) { + brz_data_t *data = (brz_data_t *)mphf->data; char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; - brz_data_t *data = (brz_data_t *)mphf->data; - FILE * tmpg_fd = NULL; - char * filename = NULL; - filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",data->tmp_dir); - tmpg_fd = fopen(filename, "rb"); - free(filename); DEBUGP("Dumping brzf\n"); - __cmph_dump(mphf, fd); - - fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); - //dumping h1 and h2. - for(i = 0; i < data->k; i++) - { - // h1 - hash_state_dump(data->h1[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - // h2 - hash_state_dump(data->h2[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - } - // Dumping h3. - hash_state_dump(data->h3, &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - // Dumping c, m, size vector and offset vector. - fwrite(&(data->c), sizeof(cmph_float32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + // The initial part of the MPHF have already been dumped to disk during construction + // Dumping h0 + hash_state_dump(data->h0, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // Dumping m and the vector offset. + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); - - // Dumping g function. - for(i = 0; i < data->k; i++) - { - cmph_uint32 n = ceil(data->c * data->size[i]); - buf = (char *)calloc(n, sizeof(cmph_uint8)); - fread(buf, sizeof(cmph_uint8), n, tmpg_fd); - fwrite(buf, sizeof(cmph_uint8), n, fd); - free(buf); - } - fclose(tmpg_fd); return 1; } + + + void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; + cmph_uint32 i, n; brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); DEBUGP("Loading brz mphf\n"); mphf->data = brz; + fread(&(brz->c), sizeof(cmph_float32), 1, f); fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); - //loading h1 and h2. + //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 @@ -583,69 +584,62 @@ void brz_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); - free(buf); + free(buf); + n = ceil(brz->c * brz->size[i]); + DEBUGP("g_i has %u bytes\n", n); + brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); } - //loading h3 + //loading h0 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - brz->h3 = hash_state_load(buf, buflen); - free(buf); + brz->h0 = hash_state_load(buf, buflen); + free(buf); - //loading c, m, size vector and offset vector. - fread(&(brz->c), sizeof(cmph_float32), 1, f); + //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); - - //loading g function. - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); - for(i = 0; i < brz->k; i++) - { - cmph_uint32 n = ceil(brz->c * brz->size[i]); - brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); - fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); - } + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } - cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { brz_data_t *brz = mphf->data; - cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; - cmph_uint32 m = brz->size[h3]; + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); - cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; - cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % n; cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; - mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; - DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); - DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); - return (mphf_bucket + brz->offset[h3]); + mphf_bucket = brz->g[h0][h1] + brz->g[h0][h2]; + DEBUGP("key: %s h1: %u h2: %u h0: %u\n", key, h1, h2, h0); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h0]: %u edges: %u\n", key, brz->g[h0][h1], brz->g[h0][h2], brz->offset[h0], brz->m); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); + return (mphf_bucket + brz->offset[h0]); } void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - for(i = 0; i < data->k; i++) + if(data->g) { - free(data->g[i]); - hash_state_destroy(data->h1[i]); - hash_state_destroy(data->h2[i]); + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + free(data->g); + free(data->h1); + free(data->h2); } - hash_state_destroy(data->h3); - free(data->g); - free(data->h1); - free(data->h2); + hash_state_destroy(data->h0); free(data->size); free(data->offset); - free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz.h b/src/brz.h index e1c932e..88b9487 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,8 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index e76e717..537dc12 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,8 +13,7 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; - cmph_uint8 * tmp_dir; // temporary directory + hash_state_t * h0; }; struct __brz_config_data_t @@ -25,12 +24,14 @@ struct __brz_config_data_t cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. + cmph_uint8 b; // parameter b. cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h0; cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory + FILE * mphf_fd; // mphf file }; #endif diff --git a/src/cmph.c b/src/cmph.c index 07e888a..be4e64d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -49,7 +49,8 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; +/* + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; if (keys_vd + cmph_vector->position == NULL) return -1; @@ -57,7 +58,17 @@ static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) *key = (char *)malloc(*keylen + 1); strcpy(*key, *(keys_vd + cmph_vector->position)); cmph_vector->position = cmph_vector->position + 1; +*/ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; + +// if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(keys_vd[cmph_vector->position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[cmph_vector->position]); + cmph_vector->position = cmph_vector->position + 1; return *keylen; + } @@ -68,7 +79,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - key_nlfile_dispose(data, key, keylen); + free(key); } static void key_nlfile_rewind(void *data) @@ -236,7 +247,43 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) default: assert(0); } +} + +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_mphf_fd(mph, mphf_fd); + break; + default: + assert(0); + } +} + +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_b(mph, b); + break; + default: + assert(0); + } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) diff --git a/src/cmph.h b/src/cmph.h index 50b2d66..0d42bcb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -41,6 +41,8 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b); void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 4ed64f5..d720fcd 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -89,9 +89,6 @@ jenkins_state_t *jenkins_state_new(cmph_uint32 size) //size of hash table jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; - state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); - state->size = size; - DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } void jenkins_state_destroy(jenkins_state_t *state) @@ -164,7 +161,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { - *buflen = sizeof(cmph_uint32)*3; + *buflen = sizeof(cmph_uint32); *buf = malloc(*buflen); if (!*buf) { @@ -172,10 +169,7 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32), &(state->nbits), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32)*2, &(state->size), sizeof(cmph_uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); - return; } @@ -184,8 +178,6 @@ jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); dest_state->hashfunc = src_state->hashfunc; dest_state->seed = src_state->seed; - dest_state->nbits = src_state->nbits; - dest_state->size = src_state->size; return dest_state; } @@ -193,8 +185,6 @@ jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); state->seed = *(cmph_uint32 *)buf; - state->nbits = *(((cmph_uint32 *)buf) + 1); - state->size = *(((cmph_uint32 *)buf) + 2); state->hashfunc = CMPH_HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index e259ee2..17b0cf9 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -7,8 +7,6 @@ typedef struct __jenkins_state_t { CMPH_HASH hashfunc; cmph_uint32 seed; - cmph_uint32 nbits; - cmph_uint32 size; } jenkins_state_t; jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table diff --git a/src/main.c b/src/main.c index 8a7f977..4db2104 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -43,13 +43,13 @@ void usage_long(const char *prg) fprintf(stderr, " -m\t minimum perfect hash function file \n"); fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); + fprintf(stderr, " -b\t parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256\n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } - int main(int argc, char **argv) { - char verbosity = 0; + char verbosity = 0; char generate = 0; char *mphf_file = NULL; FILE *mphf_fd = stdout; @@ -67,9 +67,10 @@ int main(int argc, char **argv) cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; + cmph_uint32 b = 128; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:b:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -122,6 +123,16 @@ int main(int argc, char **argv) } } break; + case 'b': + { + char *cptr; + b = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Parameter b was not found: %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -184,9 +195,9 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); - int ret = 0; if (mphf_file == NULL) { @@ -196,6 +207,7 @@ int main(int argc, char **argv) } keys_fd = fopen(keys_file, "r"); + if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -209,33 +221,35 @@ int main(int argc, char **argv) if (generate) { //Create mphf + mphf_fd = fopen(mphf_file, "w"); config = cmph_config_new(source); cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); + cmph_config_set_b(config, b); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); - + cmph_config_destroy(config); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - cmph_config_destroy(config); + //cmph_config_destroy(config); free(mphf_file); return -1; } - mphf_fd = fopen(mphf_file, "w"); if (mphf_fd == NULL) { fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); free(mphf_file); return -1; } - cmph_dump(mphf, mphf_fd); - cmph_destroy(mphf); + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); fclose(mphf_fd); } else @@ -289,6 +303,7 @@ int main(int argc, char **argv) fclose(keys_fd); free(mphf_file); free(tmp_dir); - free(source); + cmph_io_nlfile_adapter_destroy(source); return ret; + } diff --git a/src/vqueue.c b/src/vqueue.c index 0e55095..c2cf3bb 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -46,5 +46,5 @@ void vqueue_print(vqueue_t * q) void vqueue_destroy(vqueue_t *q) { - free(q->values); q->values = NULL; + free(q->values); q->values = NULL; free(q); } diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig index 4f11d1e..e08aae4 100644 --- a/vldb/pt/figs/brz.fig +++ b/vldb/pt/figs/brz.fig @@ -8,96 +8,79 @@ Single -2 1200 2 0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 +6 2025 3015 3555 3690 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 + 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 + 2790 3690 2025 3285 +4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 -6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 +6 1890 3735 3780 4365 +6 2430 3735 2700 4365 +6 2430 3915 2700 4365 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 -6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 -6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 + 1890 4365 3780 4365 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 + 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 +-6 +6 1260 5310 4230 5580 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1260 5400 4230 5400 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 @@ -122,14 +105,49 @@ Single 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 2925 4230 2925 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3510 4590 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3600 4410 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3690 4410 3780 4410 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 + 2790 5220 2025 4815 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3780 4410 3780 4590 +4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 From 59ddeb6379dc47469bde475b1e30b7dc5f295e4b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:45:14 +0000 Subject: [PATCH 254/739] stable version of BRZ algorithm using buffers --- src/Makefile.am | 6 +- src/bmz.c | 11 +- src/bmz8.c | 23 +-- src/brz.c | 364 +++++++++++++++++++++---------------------- src/brz.h | 2 + src/brz_structs.h | 7 +- src/cmph.c | 51 +++++- src/cmph.h | 2 + src/jenkins_hash.c | 12 +- src/jenkins_hash.h | 2 - src/main.c | 39 +++-- src/vqueue.c | 2 +- vldb/pt/figs/brz.fig | 204 +++++++++++++----------- 13 files changed, 398 insertions(+), 327 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = debug.h\ +libcmph_la_SOURCES = util.h debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ @@ -17,9 +17,11 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ + buffer_manage.h buffer_manage.c\ + buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c index 2fba0c2..be31b1a 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -64,7 +64,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 *used_edges = NULL; cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; @@ -93,7 +93,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -109,20 +109,18 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) } if (iterations == 0) break; } - else break; + else break; } if (iterations == 0) { graph_destroy(bmz->graph); return NULL; } - // Ordering step if (mph->verbosity) { fprintf(stderr, "Starting ordering step\n"); } - graph_obtain_critical_nodes(bmz->graph); // Searching step @@ -164,7 +162,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - graph_destroy(bmz->graph); + graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) { @@ -181,6 +179,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmzf->m = bmz->m; mphf->data = bmzf; mphf->size = bmz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { diff --git a/src/bmz8.c b/src/bmz8.c index c4837c2..0ebb3ce 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -5,7 +5,6 @@ #include "hash.h" #include "vqueue.h" #include "bitbool.h" - #include #include #include @@ -66,7 +65,6 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; - if (mph->key_source->nkeys >= 256) { if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); @@ -168,9 +166,11 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) iterations_map--; if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); } + free(used_edges); free(visited); - }while(restart_mapping && iterations_map > 0); + + }while(restart_mapping && iterations_map > 0); graph_destroy(bmz8->graph); bmz8->graph = NULL; if (iterations_map == 0) @@ -266,8 +266,8 @@ static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_ui static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint8 next_g; - cmph_uint32 u; /* Auxiliary vertex */ - cmph_uint32 lav; /* lookahead vertex */ + cmph_uint32 u; + cmph_uint32 lav; cmph_uint8 collision; cmph_uint8 * unused_g_values = NULL; cmph_uint8 unused_g_values_capacity = 0; @@ -278,7 +278,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz DEBUGP("Labelling critical vertices\n"); bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); vqueue_insert(q, v); while(!vqueue_is_empty(q)) { @@ -324,14 +324,15 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; } if (next_g > *biggest_g_value) *biggest_g_value = next_g; - } + } + next_g_index--; if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; @@ -345,9 +346,11 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; } } + bmz8->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - vqueue_insert(q, u); + vqueue_insert(q, u); + } } @@ -537,7 +540,7 @@ cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) void bmz8_destroy(cmph_t *mphf) { bmz8_data_t *data = (bmz8_data_t *)mphf->data; - free(data->g); + free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); free(data->hashes); diff --git a/src/brz.c b/src/brz.c index 44dcaa7..10d0367 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,10 +4,10 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" +#include "buffer_manage.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" - #include #include #include @@ -21,12 +21,14 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; brz->hashfuncs[2] = CMPH_HASH_JENKINS; @@ -35,10 +37,11 @@ brz_config_data_t *brz_config_new() brz->g = NULL; brz->h1 = NULL; brz->h2 = NULL; - brz->h3 = NULL; + brz->h0 = NULL; brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); - strcpy(brz->tmp_dir, "/var/tmp/\0"); + brz->mphf_fd = NULL; + strcpy((char *)(brz->tmp_dir), "/var/tmp/"); assert(brz); return brz; } @@ -46,6 +49,7 @@ brz_config_data_t *brz_config_new() void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; + free(data->tmp_dir); DEBUGP("Destroying algorithm dependent data\n"); free(data); } @@ -74,22 +78,35 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) brz_config_data_t *brz = (brz_config_data_t *)mph->data; if(tmp_dir) { - cmph_uint32 len = strlen(tmp_dir); + cmph_uint32 len = strlen((char *)tmp_dir); free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } } } +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->mphf_fd = mphf_fd; + assert(brz->mphf_fd); +} + +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->b = b; +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; @@ -102,7 +119,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/170); + brz->k = ceil(brz->m/(brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -112,22 +129,22 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Partioning the set of keys.\n"); } - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); +// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); while(1) { int ok; DEBUGP("hash function 3\n"); - brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); ok = brz_gen_graphs(mph); if (!ok) { --iterations; - hash_state_destroy(brz->h3); - brz->h3 = NULL; + hash_state_destroy(brz->h0); + brz->h0 = NULL; DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); if (mph->verbosity) { @@ -150,7 +167,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -161,14 +177,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = NULL; //transfer memory ownership brzf->h2 = brz->h2; brz->h2 = NULL; //transfer memory ownership - brzf->h3 = brz->h3; - brz->h3 = NULL; //transfer memory ownership + brzf->h0 = brz->h0; + brz->h0 = NULL; //transfer memory ownership brzf->size = brz->size; brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership - brzf->tmp_dir = brz->tmp_dir; - brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -186,47 +200,42 @@ static int brz_gen_graphs(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); - cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; - cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 *buffer_h0 = NULL; cmph_uint32 nflushes = 0; - cmph_uint32 h3; + cmph_uint32 h0; FILE * tmp_fd = NULL; - FILE ** tmp_fds = NULL; + buffer_manage_t * buff_manage = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - cmph_uint32 start_index = 0; char ** keys_vd = NULL; - mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning for (e = 0; e < brz->m; ++e) { mph->key_source->read(mph->key_source->data, &key, &keylen); - + /* Buffers management */ if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers - { + { if(mph->verbosity) { fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; - - cmph_uint32 keylen1 = 0; - buckets_size[0] = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; for(i = 1; i < brz->k; i++) { if(buckets_size[i] == 0) continue; @@ -239,20 +248,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -264,17 +273,16 @@ static int brz_gen_graphs(cmph_config_t *mph) } memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; - h3 = hash(brz->h3, key, keylen) % brz->k; - if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) + h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); free(buckets_size); return 0; } - brz->size[h3] = brz->size[h3] + 1; - buckets_size[h3] ++; + brz->size[h0] = brz->size[h0] + 1; + buckets_size[h0] ++; nkeys_in_buffer++; - mph->key_source->dispose(mph->key_source->data, key, keylen); } @@ -299,20 +307,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -322,66 +330,70 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } + free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // mphf generation if(mph->verbosity) { fprintf(stderr, "\nMPHF generation \n"); } - tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + /* Starting to dump to disk the resultant MPHF: __cmph_dump function */ + fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); + fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); + fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs + fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); + + //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buff_manage = buffer_manage_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); - buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",brz->tmp_dir); - tmp_fd = fopen(filename, "w"); - free(filename); + buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + memory_usage = 0; for(i = 0; i < nflushes; i++) { - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - tmp_fds[i] = fopen(filename, "rb"); + buffer_manage_open(buff_manage, i, filename); free(filename); filename = NULL; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - buffer_h3[i] = h3; + h0 = hash(brz->h0, key, keylen) % brz->k; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } - e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; while(e < brz->m) { - i = brz_min_index(buffer_h3, nflushes); - cur_bucket = buffer_h3[i]; - key = brz_read_key(tmp_fds[i]); + i = brz_min_index(buffer_h0, nflushes); + cur_bucket = buffer_h0[i]; + key = (char *)buffer_manage_read_key(buff_manage, i); if(key) { while(key) { keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - - if (h3 != buffer_h3[i]) break; - + h0 = hash(brz->h0, key, keylen) % brz->k; + if (h0 != buffer_h0[i]) break; keys_vd[nkeys_vd++] = key; + key = NULL; //transfer memory ownership e++; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = h3; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -390,10 +402,10 @@ static int brz_gen_graphs(cmph_config_t *mph) if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = UINT_MAX; - buffer_merge[i] = NULL; + buffer_h0[i] = UINT_MAX; } if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. @@ -402,35 +414,33 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; bmz8_data_t * bmzf = NULL; + char *bufmphf = NULL; + cmph_uint32 buflenmphf = 0; // Source of keys - if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); - memory_usage += brz->size[cur_bucket]; - if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) - { - brz_flush_g(brz, &start_index, tmp_fd); - memory_usage = 0; - } + bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); + bmzf = NULL; + fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); + free(bufmphf); + bufmphf = NULL; cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys_vd); + brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - free(source); + cmph_io_vector_adapter_destroy(source); + nkeys_vd = 0; } } - fclose(tmp_fd); - for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - free(tmp_fds); + + buffer_manage_destroy(buff_manage); free(keys_vd); free(buffer_merge); - free(buffer_h3); - fprintf(stderr, "Maximal Size: %u\n", max_size); + free(buffer_h0); return 1; } @@ -467,7 +477,7 @@ static char * brz_read_key(FILE * fd) static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; - for(i = 0; i < nkeys; i++) free(keys_vd[i]); + for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) @@ -481,93 +491,84 @@ static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * } } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = ceil(brz->c * brz->size[index]); + hash_state_dump(bmzf->hashes[0], &bufh1, &buflenh1); + hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + //fprintf(stderr,"entrei passei\n"); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2,bmzf->g, n); + free(bufh1); + free(bufh2); + return buf; +} +/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); - + if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + } + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } - +*/ int brz_dump(cmph_t *mphf, FILE *fd) { + brz_data_t *data = (brz_data_t *)mphf->data; char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; - brz_data_t *data = (brz_data_t *)mphf->data; - FILE * tmpg_fd = NULL; - char * filename = NULL; - filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",data->tmp_dir); - tmpg_fd = fopen(filename, "rb"); - free(filename); DEBUGP("Dumping brzf\n"); - __cmph_dump(mphf, fd); - - fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); - //dumping h1 and h2. - for(i = 0; i < data->k; i++) - { - // h1 - hash_state_dump(data->h1[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - // h2 - hash_state_dump(data->h2[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - } - // Dumping h3. - hash_state_dump(data->h3, &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - // Dumping c, m, size vector and offset vector. - fwrite(&(data->c), sizeof(cmph_float32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + // The initial part of the MPHF have already been dumped to disk during construction + // Dumping h0 + hash_state_dump(data->h0, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // Dumping m and the vector offset. + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); - - // Dumping g function. - for(i = 0; i < data->k; i++) - { - cmph_uint32 n = ceil(data->c * data->size[i]); - buf = (char *)calloc(n, sizeof(cmph_uint8)); - fread(buf, sizeof(cmph_uint8), n, tmpg_fd); - fwrite(buf, sizeof(cmph_uint8), n, fd); - free(buf); - } - fclose(tmpg_fd); return 1; } + + + void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; + cmph_uint32 i, n; brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); DEBUGP("Loading brz mphf\n"); mphf->data = brz; + fread(&(brz->c), sizeof(cmph_float32), 1, f); fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); - //loading h1 and h2. + //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 @@ -583,69 +584,62 @@ void brz_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); - free(buf); + free(buf); + n = ceil(brz->c * brz->size[i]); + DEBUGP("g_i has %u bytes\n", n); + brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); } - //loading h3 + //loading h0 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - brz->h3 = hash_state_load(buf, buflen); - free(buf); + brz->h0 = hash_state_load(buf, buflen); + free(buf); - //loading c, m, size vector and offset vector. - fread(&(brz->c), sizeof(cmph_float32), 1, f); + //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); - - //loading g function. - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); - for(i = 0; i < brz->k; i++) - { - cmph_uint32 n = ceil(brz->c * brz->size[i]); - brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); - fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); - } + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } - cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { brz_data_t *brz = mphf->data; - cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; - cmph_uint32 m = brz->size[h3]; + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); - cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; - cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % n; cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; - mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; - DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); - DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); - return (mphf_bucket + brz->offset[h3]); + mphf_bucket = brz->g[h0][h1] + brz->g[h0][h2]; + DEBUGP("key: %s h1: %u h2: %u h0: %u\n", key, h1, h2, h0); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h0]: %u edges: %u\n", key, brz->g[h0][h1], brz->g[h0][h2], brz->offset[h0], brz->m); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); + return (mphf_bucket + brz->offset[h0]); } void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - for(i = 0; i < data->k; i++) + if(data->g) { - free(data->g[i]); - hash_state_destroy(data->h1[i]); - hash_state_destroy(data->h2[i]); + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + free(data->g); + free(data->h1); + free(data->h2); } - hash_state_destroy(data->h3); - free(data->g); - free(data->h1); - free(data->h2); + hash_state_destroy(data->h0); free(data->size); free(data->offset); - free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz.h b/src/brz.h index e1c932e..88b9487 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,8 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index e76e717..537dc12 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,8 +13,7 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; - cmph_uint8 * tmp_dir; // temporary directory + hash_state_t * h0; }; struct __brz_config_data_t @@ -25,12 +24,14 @@ struct __brz_config_data_t cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. + cmph_uint8 b; // parameter b. cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h0; cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory + FILE * mphf_fd; // mphf file }; #endif diff --git a/src/cmph.c b/src/cmph.c index 07e888a..be4e64d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -49,7 +49,8 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; +/* + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; if (keys_vd + cmph_vector->position == NULL) return -1; @@ -57,7 +58,17 @@ static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) *key = (char *)malloc(*keylen + 1); strcpy(*key, *(keys_vd + cmph_vector->position)); cmph_vector->position = cmph_vector->position + 1; +*/ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; + +// if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(keys_vd[cmph_vector->position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[cmph_vector->position]); + cmph_vector->position = cmph_vector->position + 1; return *keylen; + } @@ -68,7 +79,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - key_nlfile_dispose(data, key, keylen); + free(key); } static void key_nlfile_rewind(void *data) @@ -236,7 +247,43 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) default: assert(0); } +} + +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_mphf_fd(mph, mphf_fd); + break; + default: + assert(0); + } +} + +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_b(mph, b); + break; + default: + assert(0); + } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) diff --git a/src/cmph.h b/src/cmph.h index 50b2d66..0d42bcb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -41,6 +41,8 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b); void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 4ed64f5..d720fcd 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -89,9 +89,6 @@ jenkins_state_t *jenkins_state_new(cmph_uint32 size) //size of hash table jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; - state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); - state->size = size; - DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } void jenkins_state_destroy(jenkins_state_t *state) @@ -164,7 +161,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { - *buflen = sizeof(cmph_uint32)*3; + *buflen = sizeof(cmph_uint32); *buf = malloc(*buflen); if (!*buf) { @@ -172,10 +169,7 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32), &(state->nbits), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32)*2, &(state->size), sizeof(cmph_uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); - return; } @@ -184,8 +178,6 @@ jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); dest_state->hashfunc = src_state->hashfunc; dest_state->seed = src_state->seed; - dest_state->nbits = src_state->nbits; - dest_state->size = src_state->size; return dest_state; } @@ -193,8 +185,6 @@ jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); state->seed = *(cmph_uint32 *)buf; - state->nbits = *(((cmph_uint32 *)buf) + 1); - state->size = *(((cmph_uint32 *)buf) + 2); state->hashfunc = CMPH_HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index e259ee2..17b0cf9 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -7,8 +7,6 @@ typedef struct __jenkins_state_t { CMPH_HASH hashfunc; cmph_uint32 seed; - cmph_uint32 nbits; - cmph_uint32 size; } jenkins_state_t; jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table diff --git a/src/main.c b/src/main.c index 8a7f977..4db2104 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -43,13 +43,13 @@ void usage_long(const char *prg) fprintf(stderr, " -m\t minimum perfect hash function file \n"); fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); + fprintf(stderr, " -b\t parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256\n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } - int main(int argc, char **argv) { - char verbosity = 0; + char verbosity = 0; char generate = 0; char *mphf_file = NULL; FILE *mphf_fd = stdout; @@ -67,9 +67,10 @@ int main(int argc, char **argv) cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; + cmph_uint32 b = 128; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:b:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -122,6 +123,16 @@ int main(int argc, char **argv) } } break; + case 'b': + { + char *cptr; + b = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Parameter b was not found: %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -184,9 +195,9 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); - int ret = 0; if (mphf_file == NULL) { @@ -196,6 +207,7 @@ int main(int argc, char **argv) } keys_fd = fopen(keys_file, "r"); + if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -209,33 +221,35 @@ int main(int argc, char **argv) if (generate) { //Create mphf + mphf_fd = fopen(mphf_file, "w"); config = cmph_config_new(source); cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); + cmph_config_set_b(config, b); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); - + cmph_config_destroy(config); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - cmph_config_destroy(config); + //cmph_config_destroy(config); free(mphf_file); return -1; } - mphf_fd = fopen(mphf_file, "w"); if (mphf_fd == NULL) { fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); free(mphf_file); return -1; } - cmph_dump(mphf, mphf_fd); - cmph_destroy(mphf); + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); fclose(mphf_fd); } else @@ -289,6 +303,7 @@ int main(int argc, char **argv) fclose(keys_fd); free(mphf_file); free(tmp_dir); - free(source); + cmph_io_nlfile_adapter_destroy(source); return ret; + } diff --git a/src/vqueue.c b/src/vqueue.c index 0e55095..c2cf3bb 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -46,5 +46,5 @@ void vqueue_print(vqueue_t * q) void vqueue_destroy(vqueue_t *q) { - free(q->values); q->values = NULL; + free(q->values); q->values = NULL; free(q); } diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig index 4f11d1e..e08aae4 100644 --- a/vldb/pt/figs/brz.fig +++ b/vldb/pt/figs/brz.fig @@ -8,96 +8,79 @@ Single -2 1200 2 0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 +6 2025 3015 3555 3690 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 + 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 + 2790 3690 2025 3285 +4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 -6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 +6 1890 3735 3780 4365 +6 2430 3735 2700 4365 +6 2430 3915 2700 4365 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 -6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 -6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 + 1890 4365 3780 4365 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 + 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 +-6 +6 1260 5310 4230 5580 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1260 5400 4230 5400 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 @@ -122,14 +105,49 @@ Single 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 2925 4230 2925 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3510 4590 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3600 4410 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3690 4410 3780 4410 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 + 2790 5220 2025 4815 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3780 4410 3780 4590 +4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 From dcd8e025e23b5c70545dedcc073393fc4793a7ad Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:45:14 +0000 Subject: [PATCH 255/739] stable version of BRZ algorithm using buffers --- INSTALL | 166 +++++++++++++------- src/Makefile.am | 6 +- src/bmz.c | 11 +- src/bmz8.c | 23 +-- src/brz.c | 364 +++++++++++++++++++++---------------------- src/brz.h | 2 + src/brz_structs.h | 7 +- src/cmph.c | 51 +++++- src/cmph.h | 2 + src/jenkins_hash.c | 12 +- src/jenkins_hash.h | 2 - src/main.c | 39 +++-- src/vqueue.c | 2 +- vldb/pt/figs/brz.fig | 204 +++++++++++++----------- 14 files changed, 508 insertions(+), 383 deletions(-) diff --git a/INSTALL b/INSTALL index b42a17a..56b077d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,27 +1,43 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. The simplest way to compile this package is: @@ -54,20 +70,22 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -75,28 +93,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -107,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -122,48 +140,86 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + CPU-COMPANY-SYSTEM -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. +where SYSTEM can have one of these forms: - If you are building compiler tools for cross-compiling, you can also + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Operation Controls +Defining Variables ================== - `configure' recognizes the following options to control how it -operates. +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. `--help' +`-h' Print a summary of the options to `configure', and exit. +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + `--quiet' `--silent' `-q' @@ -175,8 +231,6 @@ operates. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. -`configure' also accepts some other, not widely useful, options. diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = debug.h\ +libcmph_la_SOURCES = util.h debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ @@ -17,9 +17,11 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ + buffer_manage.h buffer_manage.c\ + buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c index 2fba0c2..be31b1a 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -64,7 +64,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 *used_edges = NULL; cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; @@ -93,7 +93,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -109,20 +109,18 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) } if (iterations == 0) break; } - else break; + else break; } if (iterations == 0) { graph_destroy(bmz->graph); return NULL; } - // Ordering step if (mph->verbosity) { fprintf(stderr, "Starting ordering step\n"); } - graph_obtain_critical_nodes(bmz->graph); // Searching step @@ -164,7 +162,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - graph_destroy(bmz->graph); + graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) { @@ -181,6 +179,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmzf->m = bmz->m; mphf->data = bmzf; mphf->size = bmz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { diff --git a/src/bmz8.c b/src/bmz8.c index c4837c2..0ebb3ce 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -5,7 +5,6 @@ #include "hash.h" #include "vqueue.h" #include "bitbool.h" - #include #include #include @@ -66,7 +65,6 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; - if (mph->key_source->nkeys >= 256) { if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); @@ -168,9 +166,11 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) iterations_map--; if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); } + free(used_edges); free(visited); - }while(restart_mapping && iterations_map > 0); + + }while(restart_mapping && iterations_map > 0); graph_destroy(bmz8->graph); bmz8->graph = NULL; if (iterations_map == 0) @@ -266,8 +266,8 @@ static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_ui static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint8 next_g; - cmph_uint32 u; /* Auxiliary vertex */ - cmph_uint32 lav; /* lookahead vertex */ + cmph_uint32 u; + cmph_uint32 lav; cmph_uint8 collision; cmph_uint8 * unused_g_values = NULL; cmph_uint8 unused_g_values_capacity = 0; @@ -278,7 +278,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz DEBUGP("Labelling critical vertices\n"); bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); vqueue_insert(q, v); while(!vqueue_is_empty(q)) { @@ -324,14 +324,15 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; } if (next_g > *biggest_g_value) *biggest_g_value = next_g; - } + } + next_g_index--; if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; @@ -345,9 +346,11 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; } } + bmz8->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - vqueue_insert(q, u); + vqueue_insert(q, u); + } } @@ -537,7 +540,7 @@ cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) void bmz8_destroy(cmph_t *mphf) { bmz8_data_t *data = (bmz8_data_t *)mphf->data; - free(data->g); + free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); free(data->hashes); diff --git a/src/brz.c b/src/brz.c index 44dcaa7..10d0367 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,10 +4,10 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" +#include "buffer_manage.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" - #include #include #include @@ -21,12 +21,14 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; brz->hashfuncs[2] = CMPH_HASH_JENKINS; @@ -35,10 +37,11 @@ brz_config_data_t *brz_config_new() brz->g = NULL; brz->h1 = NULL; brz->h2 = NULL; - brz->h3 = NULL; + brz->h0 = NULL; brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); - strcpy(brz->tmp_dir, "/var/tmp/\0"); + brz->mphf_fd = NULL; + strcpy((char *)(brz->tmp_dir), "/var/tmp/"); assert(brz); return brz; } @@ -46,6 +49,7 @@ brz_config_data_t *brz_config_new() void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; + free(data->tmp_dir); DEBUGP("Destroying algorithm dependent data\n"); free(data); } @@ -74,22 +78,35 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) brz_config_data_t *brz = (brz_config_data_t *)mph->data; if(tmp_dir) { - cmph_uint32 len = strlen(tmp_dir); + cmph_uint32 len = strlen((char *)tmp_dir); free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } } } +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->mphf_fd = mphf_fd; + assert(brz->mphf_fd); +} + +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->b = b; +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; @@ -102,7 +119,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/170); + brz->k = ceil(brz->m/(brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -112,22 +129,22 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Partioning the set of keys.\n"); } - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); +// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); while(1) { int ok; DEBUGP("hash function 3\n"); - brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); ok = brz_gen_graphs(mph); if (!ok) { --iterations; - hash_state_destroy(brz->h3); - brz->h3 = NULL; + hash_state_destroy(brz->h0); + brz->h0 = NULL; DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); if (mph->verbosity) { @@ -150,7 +167,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -161,14 +177,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = NULL; //transfer memory ownership brzf->h2 = brz->h2; brz->h2 = NULL; //transfer memory ownership - brzf->h3 = brz->h3; - brz->h3 = NULL; //transfer memory ownership + brzf->h0 = brz->h0; + brz->h0 = NULL; //transfer memory ownership brzf->size = brz->size; brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership - brzf->tmp_dir = brz->tmp_dir; - brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -186,47 +200,42 @@ static int brz_gen_graphs(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); - cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; - cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 *buffer_h0 = NULL; cmph_uint32 nflushes = 0; - cmph_uint32 h3; + cmph_uint32 h0; FILE * tmp_fd = NULL; - FILE ** tmp_fds = NULL; + buffer_manage_t * buff_manage = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - cmph_uint32 start_index = 0; char ** keys_vd = NULL; - mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning for (e = 0; e < brz->m; ++e) { mph->key_source->read(mph->key_source->data, &key, &keylen); - + /* Buffers management */ if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers - { + { if(mph->verbosity) { fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; - - cmph_uint32 keylen1 = 0; - buckets_size[0] = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; for(i = 1; i < brz->k; i++) { if(buckets_size[i] == 0) continue; @@ -239,20 +248,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -264,17 +273,16 @@ static int brz_gen_graphs(cmph_config_t *mph) } memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; - h3 = hash(brz->h3, key, keylen) % brz->k; - if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) + h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); free(buckets_size); return 0; } - brz->size[h3] = brz->size[h3] + 1; - buckets_size[h3] ++; + brz->size[h0] = brz->size[h0] + 1; + buckets_size[h0] ++; nkeys_in_buffer++; - mph->key_source->dispose(mph->key_source->data, key, keylen); } @@ -299,20 +307,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -322,66 +330,70 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } + free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // mphf generation if(mph->verbosity) { fprintf(stderr, "\nMPHF generation \n"); } - tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + /* Starting to dump to disk the resultant MPHF: __cmph_dump function */ + fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); + fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); + fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs + fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); + + //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buff_manage = buffer_manage_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); - buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",brz->tmp_dir); - tmp_fd = fopen(filename, "w"); - free(filename); + buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + memory_usage = 0; for(i = 0; i < nflushes; i++) { - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - tmp_fds[i] = fopen(filename, "rb"); + buffer_manage_open(buff_manage, i, filename); free(filename); filename = NULL; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - buffer_h3[i] = h3; + h0 = hash(brz->h0, key, keylen) % brz->k; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } - e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; while(e < brz->m) { - i = brz_min_index(buffer_h3, nflushes); - cur_bucket = buffer_h3[i]; - key = brz_read_key(tmp_fds[i]); + i = brz_min_index(buffer_h0, nflushes); + cur_bucket = buffer_h0[i]; + key = (char *)buffer_manage_read_key(buff_manage, i); if(key) { while(key) { keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - - if (h3 != buffer_h3[i]) break; - + h0 = hash(brz->h0, key, keylen) % brz->k; + if (h0 != buffer_h0[i]) break; keys_vd[nkeys_vd++] = key; + key = NULL; //transfer memory ownership e++; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = h3; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -390,10 +402,10 @@ static int brz_gen_graphs(cmph_config_t *mph) if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = UINT_MAX; - buffer_merge[i] = NULL; + buffer_h0[i] = UINT_MAX; } if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. @@ -402,35 +414,33 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; bmz8_data_t * bmzf = NULL; + char *bufmphf = NULL; + cmph_uint32 buflenmphf = 0; // Source of keys - if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); - memory_usage += brz->size[cur_bucket]; - if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) - { - brz_flush_g(brz, &start_index, tmp_fd); - memory_usage = 0; - } + bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); + bmzf = NULL; + fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); + free(bufmphf); + bufmphf = NULL; cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys_vd); + brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - free(source); + cmph_io_vector_adapter_destroy(source); + nkeys_vd = 0; } } - fclose(tmp_fd); - for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - free(tmp_fds); + + buffer_manage_destroy(buff_manage); free(keys_vd); free(buffer_merge); - free(buffer_h3); - fprintf(stderr, "Maximal Size: %u\n", max_size); + free(buffer_h0); return 1; } @@ -467,7 +477,7 @@ static char * brz_read_key(FILE * fd) static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; - for(i = 0; i < nkeys; i++) free(keys_vd[i]); + for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) @@ -481,93 +491,84 @@ static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * } } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = ceil(brz->c * brz->size[index]); + hash_state_dump(bmzf->hashes[0], &bufh1, &buflenh1); + hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + //fprintf(stderr,"entrei passei\n"); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2,bmzf->g, n); + free(bufh1); + free(bufh2); + return buf; +} +/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); - + if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + } + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } - +*/ int brz_dump(cmph_t *mphf, FILE *fd) { + brz_data_t *data = (brz_data_t *)mphf->data; char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; - brz_data_t *data = (brz_data_t *)mphf->data; - FILE * tmpg_fd = NULL; - char * filename = NULL; - filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",data->tmp_dir); - tmpg_fd = fopen(filename, "rb"); - free(filename); DEBUGP("Dumping brzf\n"); - __cmph_dump(mphf, fd); - - fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); - //dumping h1 and h2. - for(i = 0; i < data->k; i++) - { - // h1 - hash_state_dump(data->h1[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - // h2 - hash_state_dump(data->h2[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - } - // Dumping h3. - hash_state_dump(data->h3, &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - // Dumping c, m, size vector and offset vector. - fwrite(&(data->c), sizeof(cmph_float32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + // The initial part of the MPHF have already been dumped to disk during construction + // Dumping h0 + hash_state_dump(data->h0, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // Dumping m and the vector offset. + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); - - // Dumping g function. - for(i = 0; i < data->k; i++) - { - cmph_uint32 n = ceil(data->c * data->size[i]); - buf = (char *)calloc(n, sizeof(cmph_uint8)); - fread(buf, sizeof(cmph_uint8), n, tmpg_fd); - fwrite(buf, sizeof(cmph_uint8), n, fd); - free(buf); - } - fclose(tmpg_fd); return 1; } + + + void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; + cmph_uint32 i, n; brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); DEBUGP("Loading brz mphf\n"); mphf->data = brz; + fread(&(brz->c), sizeof(cmph_float32), 1, f); fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); - //loading h1 and h2. + //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 @@ -583,69 +584,62 @@ void brz_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); - free(buf); + free(buf); + n = ceil(brz->c * brz->size[i]); + DEBUGP("g_i has %u bytes\n", n); + brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); } - //loading h3 + //loading h0 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - brz->h3 = hash_state_load(buf, buflen); - free(buf); + brz->h0 = hash_state_load(buf, buflen); + free(buf); - //loading c, m, size vector and offset vector. - fread(&(brz->c), sizeof(cmph_float32), 1, f); + //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); - - //loading g function. - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); - for(i = 0; i < brz->k; i++) - { - cmph_uint32 n = ceil(brz->c * brz->size[i]); - brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); - fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); - } + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } - cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { brz_data_t *brz = mphf->data; - cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; - cmph_uint32 m = brz->size[h3]; + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); - cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; - cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % n; cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; - mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; - DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); - DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); - return (mphf_bucket + brz->offset[h3]); + mphf_bucket = brz->g[h0][h1] + brz->g[h0][h2]; + DEBUGP("key: %s h1: %u h2: %u h0: %u\n", key, h1, h2, h0); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h0]: %u edges: %u\n", key, brz->g[h0][h1], brz->g[h0][h2], brz->offset[h0], brz->m); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); + return (mphf_bucket + brz->offset[h0]); } void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - for(i = 0; i < data->k; i++) + if(data->g) { - free(data->g[i]); - hash_state_destroy(data->h1[i]); - hash_state_destroy(data->h2[i]); + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + free(data->g); + free(data->h1); + free(data->h2); } - hash_state_destroy(data->h3); - free(data->g); - free(data->h1); - free(data->h2); + hash_state_destroy(data->h0); free(data->size); free(data->offset); - free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz.h b/src/brz.h index e1c932e..88b9487 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,8 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index e76e717..537dc12 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,8 +13,7 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; - cmph_uint8 * tmp_dir; // temporary directory + hash_state_t * h0; }; struct __brz_config_data_t @@ -25,12 +24,14 @@ struct __brz_config_data_t cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. + cmph_uint8 b; // parameter b. cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h0; cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory + FILE * mphf_fd; // mphf file }; #endif diff --git a/src/cmph.c b/src/cmph.c index 07e888a..be4e64d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -49,7 +49,8 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; +/* + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; if (keys_vd + cmph_vector->position == NULL) return -1; @@ -57,7 +58,17 @@ static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) *key = (char *)malloc(*keylen + 1); strcpy(*key, *(keys_vd + cmph_vector->position)); cmph_vector->position = cmph_vector->position + 1; +*/ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; + +// if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(keys_vd[cmph_vector->position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[cmph_vector->position]); + cmph_vector->position = cmph_vector->position + 1; return *keylen; + } @@ -68,7 +79,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - key_nlfile_dispose(data, key, keylen); + free(key); } static void key_nlfile_rewind(void *data) @@ -236,7 +247,43 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) default: assert(0); } +} + +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_mphf_fd(mph, mphf_fd); + break; + default: + assert(0); + } +} + +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_b(mph, b); + break; + default: + assert(0); + } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) diff --git a/src/cmph.h b/src/cmph.h index 50b2d66..0d42bcb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -41,6 +41,8 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b); void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 4ed64f5..d720fcd 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -89,9 +89,6 @@ jenkins_state_t *jenkins_state_new(cmph_uint32 size) //size of hash table jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; - state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); - state->size = size; - DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } void jenkins_state_destroy(jenkins_state_t *state) @@ -164,7 +161,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { - *buflen = sizeof(cmph_uint32)*3; + *buflen = sizeof(cmph_uint32); *buf = malloc(*buflen); if (!*buf) { @@ -172,10 +169,7 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32), &(state->nbits), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32)*2, &(state->size), sizeof(cmph_uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); - return; } @@ -184,8 +178,6 @@ jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); dest_state->hashfunc = src_state->hashfunc; dest_state->seed = src_state->seed; - dest_state->nbits = src_state->nbits; - dest_state->size = src_state->size; return dest_state; } @@ -193,8 +185,6 @@ jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); state->seed = *(cmph_uint32 *)buf; - state->nbits = *(((cmph_uint32 *)buf) + 1); - state->size = *(((cmph_uint32 *)buf) + 2); state->hashfunc = CMPH_HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index e259ee2..17b0cf9 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -7,8 +7,6 @@ typedef struct __jenkins_state_t { CMPH_HASH hashfunc; cmph_uint32 seed; - cmph_uint32 nbits; - cmph_uint32 size; } jenkins_state_t; jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table diff --git a/src/main.c b/src/main.c index 8a7f977..4db2104 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -43,13 +43,13 @@ void usage_long(const char *prg) fprintf(stderr, " -m\t minimum perfect hash function file \n"); fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); + fprintf(stderr, " -b\t parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256\n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } - int main(int argc, char **argv) { - char verbosity = 0; + char verbosity = 0; char generate = 0; char *mphf_file = NULL; FILE *mphf_fd = stdout; @@ -67,9 +67,10 @@ int main(int argc, char **argv) cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; + cmph_uint32 b = 128; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:b:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -122,6 +123,16 @@ int main(int argc, char **argv) } } break; + case 'b': + { + char *cptr; + b = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Parameter b was not found: %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -184,9 +195,9 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); - int ret = 0; if (mphf_file == NULL) { @@ -196,6 +207,7 @@ int main(int argc, char **argv) } keys_fd = fopen(keys_file, "r"); + if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -209,33 +221,35 @@ int main(int argc, char **argv) if (generate) { //Create mphf + mphf_fd = fopen(mphf_file, "w"); config = cmph_config_new(source); cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); + cmph_config_set_b(config, b); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); - + cmph_config_destroy(config); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - cmph_config_destroy(config); + //cmph_config_destroy(config); free(mphf_file); return -1; } - mphf_fd = fopen(mphf_file, "w"); if (mphf_fd == NULL) { fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); free(mphf_file); return -1; } - cmph_dump(mphf, mphf_fd); - cmph_destroy(mphf); + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); fclose(mphf_fd); } else @@ -289,6 +303,7 @@ int main(int argc, char **argv) fclose(keys_fd); free(mphf_file); free(tmp_dir); - free(source); + cmph_io_nlfile_adapter_destroy(source); return ret; + } diff --git a/src/vqueue.c b/src/vqueue.c index 0e55095..c2cf3bb 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -46,5 +46,5 @@ void vqueue_print(vqueue_t * q) void vqueue_destroy(vqueue_t *q) { - free(q->values); q->values = NULL; + free(q->values); q->values = NULL; free(q); } diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig index 4f11d1e..e08aae4 100644 --- a/vldb/pt/figs/brz.fig +++ b/vldb/pt/figs/brz.fig @@ -8,96 +8,79 @@ Single -2 1200 2 0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 +6 2025 3015 3555 3690 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 + 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 + 2790 3690 2025 3285 +4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 -6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 +6 1890 3735 3780 4365 +6 2430 3735 2700 4365 +6 2430 3915 2700 4365 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 -6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 -6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 + 1890 4365 3780 4365 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 + 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 +-6 +6 1260 5310 4230 5580 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1260 5400 4230 5400 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 @@ -122,14 +105,49 @@ Single 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 2925 4230 2925 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3510 4590 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3600 4410 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3690 4410 3780 4410 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 + 2790 5220 2025 4815 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3780 4410 3780 4590 +4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 From 6284bb94a578ba8d89e7528c2e846716484aaeee Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:45:14 +0000 Subject: [PATCH 256/739] stable version of BRZ algorithm using buffers --- INSTALL | 166 +++++++++++++------- src/Makefile.am | 6 +- src/bmz.c | 11 +- src/bmz8.c | 23 +-- src/brz.c | 364 +++++++++++++++++++++---------------------- src/brz.h | 2 + src/brz_structs.h | 7 +- src/cmph.c | 51 +++++- src/cmph.h | 2 + src/jenkins_hash.c | 12 +- src/jenkins_hash.h | 2 - src/main.c | 39 +++-- src/vqueue.c | 2 +- vldb/pt/figs/brz.fig | 204 +++++++++++++----------- 14 files changed, 508 insertions(+), 383 deletions(-) diff --git a/INSTALL b/INSTALL index b42a17a..56b077d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,27 +1,43 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. The simplest way to compile this package is: @@ -54,20 +70,22 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -75,28 +93,28 @@ directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -107,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -122,48 +140,86 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + CPU-COMPANY-SYSTEM -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. +where SYSTEM can have one of these forms: - If you are building compiler tools for cross-compiling, you can also + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. -Operation Controls +Defining Variables ================== - `configure' recognizes the following options to control how it -operates. +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. `--help' +`-h' Print a summary of the options to `configure', and exit. +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + `--quiet' `--silent' `-q' @@ -175,8 +231,6 @@ operates. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. -`configure' also accepts some other, not widely useful, options. diff --git a/src/Makefile.am b/src/Makefile.am index 1d05357..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = debug.h\ +libcmph_la_SOURCES = util.h debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ @@ -17,9 +17,11 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ + buffer_manage.h buffer_manage.c\ + buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la diff --git a/src/bmz.c b/src/bmz.c index 2fba0c2..be31b1a 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -64,7 +64,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 *used_edges = NULL; cmph_uint8 restart_mapping = 0; cmph_uint8 * visited = NULL; - + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; @@ -93,7 +93,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); DEBUGP("hash function 2\n"); bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); - DEBUGP("Generating edges\n"); + DEBUGP("Generating edges\n"); ok = bmz_gen_edges(mph); if (!ok) { @@ -109,20 +109,18 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) } if (iterations == 0) break; } - else break; + else break; } if (iterations == 0) { graph_destroy(bmz->graph); return NULL; } - // Ordering step if (mph->verbosity) { fprintf(stderr, "Starting ordering step\n"); } - graph_obtain_critical_nodes(bmz->graph); // Searching step @@ -164,7 +162,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) free(used_edges); free(visited); }while(restart_mapping && iterations_map > 0); - graph_destroy(bmz->graph); + graph_destroy(bmz->graph); bmz->graph = NULL; if (iterations_map == 0) { @@ -181,6 +179,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) bmzf->m = bmz->m; mphf->data = bmzf; mphf->size = bmz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { diff --git a/src/bmz8.c b/src/bmz8.c index c4837c2..0ebb3ce 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -5,7 +5,6 @@ #include "hash.h" #include "vqueue.h" #include "bitbool.h" - #include #include #include @@ -66,7 +65,6 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; - if (mph->key_source->nkeys >= 256) { if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); @@ -168,9 +166,11 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) iterations_map--; if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); } + free(used_edges); free(visited); - }while(restart_mapping && iterations_map > 0); + + }while(restart_mapping && iterations_map > 0); graph_destroy(bmz8->graph); bmz8->graph = NULL; if (iterations_map == 0) @@ -266,8 +266,8 @@ static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_ui static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint8 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) { cmph_uint8 next_g; - cmph_uint32 u; /* Auxiliary vertex */ - cmph_uint32 lav; /* lookahead vertex */ + cmph_uint32 u; + cmph_uint32 lav; cmph_uint8 collision; cmph_uint8 * unused_g_values = NULL; cmph_uint8 unused_g_values_capacity = 0; @@ -278,7 +278,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz DEBUGP("Labelling critical vertices\n"); bmz8->g[v] = (cmph_uint8)ceil ((double)(*biggest_edge_value)/2) - 1; SETBIT(visited, v); - next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); vqueue_insert(q, v); while(!vqueue_is_empty(q)) { @@ -324,14 +324,15 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; } if (next_g > *biggest_g_value) *biggest_g_value = next_g; - } + } + next_g_index--; if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; @@ -345,9 +346,11 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz if(next_g + bmz8->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz8->g[lav]; } } + bmz8->g[u] = next_g; // Labelling vertex u. SETBIT(visited, u); - vqueue_insert(q, u); + vqueue_insert(q, u); + } } @@ -537,7 +540,7 @@ cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) void bmz8_destroy(cmph_t *mphf) { bmz8_data_t *data = (bmz8_data_t *)mphf->data; - free(data->g); + free(data->g); hash_state_destroy(data->hashes[0]); hash_state_destroy(data->hashes[1]); free(data->hashes); diff --git a/src/brz.c b/src/brz.c index 44dcaa7..10d0367 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,10 +4,10 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" +#include "buffer_manage.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" - #include #include #include @@ -21,12 +21,14 @@ static int brz_gen_graphs(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source); +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; brz->hashfuncs[2] = CMPH_HASH_JENKINS; @@ -35,10 +37,11 @@ brz_config_data_t *brz_config_new() brz->g = NULL; brz->h1 = NULL; brz->h2 = NULL; - brz->h3 = NULL; + brz->h0 = NULL; brz->memory_availability = 1024*1024; brz->tmp_dir = (cmph_uint8 *)calloc(10, sizeof(cmph_uint8)); - strcpy(brz->tmp_dir, "/var/tmp/\0"); + brz->mphf_fd = NULL; + strcpy((char *)(brz->tmp_dir), "/var/tmp/"); assert(brz); return brz; } @@ -46,6 +49,7 @@ brz_config_data_t *brz_config_new() void brz_config_destroy(cmph_config_t *mph) { brz_config_data_t *data = (brz_config_data_t *)mph->data; + free(data->tmp_dir); DEBUGP("Destroying algorithm dependent data\n"); free(data); } @@ -74,22 +78,35 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) brz_config_data_t *brz = (brz_config_data_t *)mph->data; if(tmp_dir) { - cmph_uint32 len = strlen(tmp_dir); + cmph_uint32 len = strlen((char *)tmp_dir); free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s/", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); - sprintf(brz->tmp_dir, "%s", tmp_dir); + sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } } } +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->mphf_fd = mphf_fd; + assert(brz->mphf_fd); +} + +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->b = b; +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; @@ -102,7 +119,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/170); + brz->k = ceil(brz->m/(brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -112,22 +129,22 @@ cmph_t *brz_new(cmph_config_t *mph, float c) fprintf(stderr, "Partioning the set of keys.\n"); } - brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *) *brz->k); +// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); +// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); while(1) { int ok; DEBUGP("hash function 3\n"); - brz->h3 = hash_state_new(brz->hashfuncs[2], brz->k); + brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); ok = brz_gen_graphs(mph); if (!ok) { --iterations; - hash_state_destroy(brz->h3); - brz->h3 = NULL; + hash_state_destroy(brz->h0); + brz->h0 = NULL; DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); if (mph->verbosity) { @@ -150,7 +167,6 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; } - // Generating a mphf mphf = (cmph_t *)malloc(sizeof(cmph_t)); mphf->algo = mph->algo; @@ -161,14 +177,12 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->h1 = NULL; //transfer memory ownership brzf->h2 = brz->h2; brz->h2 = NULL; //transfer memory ownership - brzf->h3 = brz->h3; - brz->h3 = NULL; //transfer memory ownership + brzf->h0 = brz->h0; + brz->h0 = NULL; //transfer memory ownership brzf->size = brz->size; brz->size = NULL; //transfer memory ownership brzf->offset = brz->offset; brz->offset = NULL; //transfer memory ownership - brzf->tmp_dir = brz->tmp_dir; - brz->tmp_dir = NULL; //transfer memory ownership brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; @@ -186,47 +200,42 @@ static int brz_gen_graphs(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; - //cmph_uint32 memory_availability = 200*1024*1024; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; cmph_uint8 *buffer = (cmph_uint8 *)malloc(brz->memory_availability); - cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc(brz->k, sizeof(cmph_uint32)); cmph_uint32 *keys_index = NULL; cmph_uint8 **buffer_merge = NULL; - cmph_uint32 *buffer_h3 = NULL; + cmph_uint32 *buffer_h0 = NULL; cmph_uint32 nflushes = 0; - cmph_uint32 h3; + cmph_uint32 h0; FILE * tmp_fd = NULL; - FILE ** tmp_fds = NULL; + buffer_manage_t * buff_manage = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; - cmph_uint32 max_size = 0; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - cmph_uint32 start_index = 0; char ** keys_vd = NULL; - mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); // Partitioning for (e = 0; e < brz->m; ++e) { mph->key_source->read(mph->key_source->data, &key, &keylen); - + /* Buffers management */ if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers - { + { if(mph->verbosity) { fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); } cmph_uint32 value = buckets_size[0]; cmph_uint32 sum = 0; - - cmph_uint32 keylen1 = 0; - buckets_size[0] = 0; + cmph_uint32 keylen1 = 0; + buckets_size[0] = 0; for(i = 1; i < brz->k; i++) { if(buckets_size[i] == 0) continue; @@ -239,20 +248,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -264,17 +273,16 @@ static int brz_gen_graphs(cmph_config_t *mph) } memcpy(buffer + memory_usage, key, keylen + 1); memory_usage = memory_usage + keylen + 1; - h3 = hash(brz->h3, key, keylen) % brz->k; - if ((brz->size[h3] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h3]) < brz->size[h3])) + h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); free(buckets_size); return 0; } - brz->size[h3] = brz->size[h3] + 1; - buckets_size[h3] ++; + brz->size[h0] = brz->size[h0] + 1; + buckets_size[h0] ++; nkeys_in_buffer++; - mph->key_source->dispose(mph->key_source->data, key, keylen); } @@ -299,20 +307,20 @@ static int brz_gen_graphs(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + memory_usage); - h3 = hash(brz->h3, buffer + memory_usage, keylen1) % brz->k; - keys_index[buckets_size[h3]] = memory_usage; - buckets_size[h3]++; + keylen1 = strlen((char *)(buffer + memory_usage)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; memory_usage = memory_usage + keylen1 + 1; } - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); tmp_fd = fopen(filename, "wb"); free(filename); filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen(buffer + keys_index[i]) + 1; + keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); } nkeys_in_buffer = 0; @@ -322,66 +330,70 @@ static int brz_gen_graphs(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } + free(buffer); free(buckets_size); if(nflushes > 1024) return 0; // Too many files generated. - // mphf generation if(mph->verbosity) { fprintf(stderr, "\nMPHF generation \n"); } - tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + /* Starting to dump to disk the resultant MPHF: __cmph_dump function */ + fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); + fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); + fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs + fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); + + //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buff_manage = buffer_manage_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); - buffer_h3 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",brz->tmp_dir); - tmp_fd = fopen(filename, "w"); - free(filename); + buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); + memory_usage = 0; for(i = 0; i < nflushes; i++) { - filename = (char *)calloc(strlen(brz->tmp_dir) + 11, sizeof(char)); + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - tmp_fds[i] = fopen(filename, "rb"); + buffer_manage_open(buff_manage, i, filename); free(filename); filename = NULL; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - buffer_h3[i] = h3; + h0 = hash(brz->h0, key, keylen) % brz->k; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); } - e = 0; keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); nkeys_vd = 0; while(e < brz->m) { - i = brz_min_index(buffer_h3, nflushes); - cur_bucket = buffer_h3[i]; - key = brz_read_key(tmp_fds[i]); + i = brz_min_index(buffer_h0, nflushes); + cur_bucket = buffer_h0[i]; + key = (char *)buffer_manage_read_key(buff_manage, i); if(key) { while(key) { keylen = strlen(key); - h3 = hash(brz->h3, key, keylen) % brz->k; - - if (h3 != buffer_h3[i]) break; - + h0 = hash(brz->h0, key, keylen) % brz->k; + if (h0 != buffer_h0[i]) break; keys_vd[nkeys_vd++] = key; + key = NULL; //transfer memory ownership e++; - key = brz_read_key(tmp_fds[i]); + key = (char *)buffer_manage_read_key(buff_manage, i); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = h3; + buffer_h0[i] = h0; buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); memcpy(buffer_merge[i], key, keylen + 1); free(key); @@ -390,10 +402,10 @@ static int brz_gen_graphs(cmph_config_t *mph) if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = buffer_merge[i]; + keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership e++; - buffer_h3[i] = UINT_MAX; - buffer_merge[i] = NULL; + buffer_h0[i] = UINT_MAX; } if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. @@ -402,35 +414,33 @@ static int brz_gen_graphs(cmph_config_t *mph) cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; bmz8_data_t * bmzf = NULL; + char *bufmphf = NULL; + cmph_uint32 buflenmphf = 0; // Source of keys - if(nkeys_vd > max_size) max_size = nkeys_vd; source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); bmzf = (bmz8_data_t *)mphf_tmp->data; - brz_copy_partial_mphf(brz, bmzf, cur_bucket, source); - memory_usage += brz->size[cur_bucket]; - if((cur_bucket+1 == brz->k)||(memory_usage > brz->memory_availability)) - { - brz_flush_g(brz, &start_index, tmp_fd); - memory_usage = 0; - } + bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); + bmzf = NULL; + fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); + free(bufmphf); + bufmphf = NULL; cmph_config_destroy(config); - brz_destroy_keys_vd(keys_vd, nkeys_vd); + brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - free(source); + cmph_io_vector_adapter_destroy(source); + nkeys_vd = 0; } } - fclose(tmp_fd); - for(i = 0; i < nflushes; i++) fclose(tmp_fds[i]); - free(tmp_fds); + + buffer_manage_destroy(buff_manage); free(keys_vd); free(buffer_merge); - free(buffer_h3); - fprintf(stderr, "Maximal Size: %u\n", max_size); + free(buffer_h0); return 1; } @@ -467,7 +477,7 @@ static char * brz_read_key(FILE * fd) static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; - for(i = 0; i < nkeys; i++) free(keys_vd[i]); + for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) @@ -481,93 +491,84 @@ static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * } } -static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_io_adapter_t *source) +static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = ceil(brz->c * brz->size[index]); + hash_state_dump(bmzf->hashes[0], &bufh1, &buflenh1); + hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + //fprintf(stderr,"entrei passei\n"); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2,bmzf->g, n); + free(bufh1); + free(bufh2); + return buf; +} +/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) { cmph_uint32 i; cmph_uint32 n = ceil(brz->c * brz->size[index]); - + if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); for(i = 0; i < n; i++) { brz->g[index][i] = bmzf->g[i]; //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); + } + brz->h1[index] = hash_state_copy(bmzf->hashes[0]); + brz->h2[index] = hash_state_copy(bmzf->hashes[1]); } - +*/ int brz_dump(cmph_t *mphf, FILE *fd) { + brz_data_t *data = (brz_data_t *)mphf->data; char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; - brz_data_t *data = (brz_data_t *)mphf->data; - FILE * tmpg_fd = NULL; - char * filename = NULL; - filename = (char *)calloc(strlen(data->tmp_dir) + 11, sizeof(char)); - sprintf(filename, "%stmpg.cmph",data->tmp_dir); - tmpg_fd = fopen(filename, "rb"); - free(filename); DEBUGP("Dumping brzf\n"); - __cmph_dump(mphf, fd); - - fwrite(&(data->k), sizeof(cmph_uint32), 1, fd); - //dumping h1 and h2. - for(i = 0; i < data->k; i++) - { - // h1 - hash_state_dump(data->h1[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - // h2 - hash_state_dump(data->h2[i], &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - } - // Dumping h3. - hash_state_dump(data->h3, &buf, &buflen); - DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); - fwrite(&buflen, sizeof(cmph_uint32), 1, fd); - fwrite(buf, buflen, 1, fd); - free(buf); - - // Dumping c, m, size vector and offset vector. - fwrite(&(data->c), sizeof(cmph_float32), 1, fd); - fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); - fwrite(data->size, sizeof(cmph_uint8)*(data->k), 1, fd); + // The initial part of the MPHF have already been dumped to disk during construction + // Dumping h0 + hash_state_dump(data->h0, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + // Dumping m and the vector offset. + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); fwrite(data->offset, sizeof(cmph_uint32)*(data->k), 1, fd); - - // Dumping g function. - for(i = 0; i < data->k; i++) - { - cmph_uint32 n = ceil(data->c * data->size[i]); - buf = (char *)calloc(n, sizeof(cmph_uint8)); - fread(buf, sizeof(cmph_uint8), n, tmpg_fd); - fwrite(buf, sizeof(cmph_uint8), n, fd); - free(buf); - } - fclose(tmpg_fd); return 1; } + + + void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; cmph_uint32 buflen; - cmph_uint32 i; + cmph_uint32 i, n; brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); DEBUGP("Loading brz mphf\n"); mphf->data = brz; + fread(&(brz->c), sizeof(cmph_float32), 1, f); fread(&(brz->k), sizeof(cmph_uint32), 1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); - //loading h1 and h2. + //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 @@ -583,69 +584,62 @@ void brz_load(FILE *f, cmph_t *mphf) buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); - free(buf); + free(buf); + n = ceil(brz->c * brz->size[i]); + DEBUGP("g_i has %u bytes\n", n); + brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); + fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); } - //loading h3 + //loading h0 fread(&buflen, sizeof(cmph_uint32), 1, f); DEBUGP("Hash state has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); - brz->h3 = hash_state_load(buf, buflen); - free(buf); + brz->h0 = hash_state_load(buf, buflen); + free(buf); - //loading c, m, size vector and offset vector. - fread(&(brz->c), sizeof(cmph_float32), 1, f); + //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); - brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); - - //loading g function. - brz->g = (cmph_uint8 **) malloc(sizeof(cmph_uint8 *)*brz->k); - for(i = 0; i < brz->k; i++) - { - cmph_uint32 n = ceil(brz->c * brz->size[i]); - brz->g[i] = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*n); - fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); - } + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } - cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) { brz_data_t *brz = mphf->data; - cmph_uint32 h3 = hash(brz->h3, key, keylen) % brz->k; - cmph_uint32 m = brz->size[h3]; + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); - cmph_uint32 h1 = hash(brz->h1[h3], key, keylen) % n; - cmph_uint32 h2 = hash(brz->h2[h3], key, keylen) % n; + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % n; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % n; cmph_uint8 mphf_bucket; if (h1 == h2 && ++h2 >= n) h2 = 0; - mphf_bucket = brz->g[h3][h1] + brz->g[h3][h2]; - DEBUGP("key: %s h1: %u h2: %u h3: %u\n", key, h1, h2, h3); - DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h3]: %u edges: %u\n", key, brz->g[h3][h1], brz->g[h3][h2], brz->offset[h3], brz->m); - DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h3]); - return (mphf_bucket + brz->offset[h3]); + mphf_bucket = brz->g[h0][h1] + brz->g[h0][h2]; + DEBUGP("key: %s h1: %u h2: %u h0: %u\n", key, h1, h2, h0); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h0]: %u edges: %u\n", key, brz->g[h0][h1], brz->g[h0][h2], brz->offset[h0], brz->m); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); + return (mphf_bucket + brz->offset[h0]); } void brz_destroy(cmph_t *mphf) { cmph_uint32 i; brz_data_t *data = (brz_data_t *)mphf->data; - for(i = 0; i < data->k; i++) + if(data->g) { - free(data->g[i]); - hash_state_destroy(data->h1[i]); - hash_state_destroy(data->h2[i]); + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + free(data->g); + free(data->h1); + free(data->h2); } - hash_state_destroy(data->h3); - free(data->g); - free(data->h1); - free(data->h2); + hash_state_destroy(data->h0); free(data->size); free(data->offset); - free(data->tmp_dir); free(data); free(mphf); } diff --git a/src/brz.h b/src/brz.h index e1c932e..88b9487 100644 --- a/src/brz.h +++ b/src/brz.h @@ -9,6 +9,8 @@ typedef struct __brz_config_data_t brz_config_data_t; brz_config_data_t *brz_config_new(); void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/brz_structs.h b/src/brz_structs.h index e76e717..537dc12 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -13,8 +13,7 @@ struct __brz_data_t cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; - cmph_uint8 * tmp_dir; // temporary directory + hash_state_t * h0; }; struct __brz_config_data_t @@ -25,12 +24,14 @@ struct __brz_config_data_t cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. cmph_uint8 **g; // g function. + cmph_uint8 b; // parameter b. cmph_uint32 k; // number of components hash_state_t **h1; hash_state_t **h2; - hash_state_t * h3; + hash_state_t * h0; cmph_uint32 memory_availability; cmph_uint8 * tmp_dir; // temporary directory + FILE * mphf_fd; // mphf file }; #endif diff --git a/src/cmph.c b/src/cmph.c index 07e888a..be4e64d 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -49,7 +49,8 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; +/* + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; if (keys_vd + cmph_vector->position == NULL) return -1; @@ -57,7 +58,17 @@ static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) *key = (char *)malloc(*keylen + 1); strcpy(*key, *(keys_vd + cmph_vector->position)); cmph_vector->position = cmph_vector->position + 1; +*/ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; + +// if (keys_vd + cmph_vector->position == NULL) return -1; + *keylen = strlen(keys_vd[cmph_vector->position]); + *key = (char *)malloc(*keylen + 1); + strcpy(*key, keys_vd[cmph_vector->position]); + cmph_vector->position = cmph_vector->position + 1; return *keylen; + } @@ -68,7 +79,7 @@ static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) { - key_nlfile_dispose(data, key, keylen); + free(key); } static void key_nlfile_rewind(void *data) @@ -236,7 +247,43 @@ void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) default: assert(0); } +} + +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_mphf_fd(mph, mphf_fd); + break; + default: + assert(0); + } +} + +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) +{ + switch (mph->algo) + { + case CMPH_CHM: + break; + case CMPH_BMZ: /* included -- Fabiano */ + break; + case CMPH_BMZ8: /* included -- Fabiano */ + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_b(mph, b); + break; + default: + assert(0); + } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) diff --git a/src/cmph.h b/src/cmph.h index 50b2d66..0d42bcb 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -41,6 +41,8 @@ void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); void cmph_config_set_graphsize(cmph_config_t *mph, float c); void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b); void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void cmph_config_destroy(cmph_config_t *mph); diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index 4ed64f5..d720fcd 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -89,9 +89,6 @@ jenkins_state_t *jenkins_state_new(cmph_uint32 size) //size of hash table jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); DEBUGP("Initializing jenkins hash\n"); state->seed = rand() % size; - state->nbits = (cmph_uint32)ceil(log(size)/M_LOG2E); - state->size = size; - DEBUGP("Initialized jenkins with size %u, nbits %u and seed %u\n", size, state->nbits, state->seed); return state; } void jenkins_state_destroy(jenkins_state_t *state) @@ -164,7 +161,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { - *buflen = sizeof(cmph_uint32)*3; + *buflen = sizeof(cmph_uint32); *buf = malloc(*buflen); if (!*buf) { @@ -172,10 +169,7 @@ void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) return; } memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32), &(state->nbits), sizeof(cmph_uint32)); - memcpy(*buf + sizeof(cmph_uint32)*2, &(state->size), sizeof(cmph_uint32)); DEBUGP("Dumped jenkins state with seed %u\n", state->seed); - return; } @@ -184,8 +178,6 @@ jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); dest_state->hashfunc = src_state->hashfunc; dest_state->seed = src_state->seed; - dest_state->nbits = src_state->nbits; - dest_state->size = src_state->size; return dest_state; } @@ -193,8 +185,6 @@ jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) { jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); state->seed = *(cmph_uint32 *)buf; - state->nbits = *(((cmph_uint32 *)buf) + 1); - state->size = *(((cmph_uint32 *)buf) + 2); state->hashfunc = CMPH_HASH_JENKINS; DEBUGP("Loaded jenkins state with seed %u\n", state->seed); return state; diff --git a/src/jenkins_hash.h b/src/jenkins_hash.h index e259ee2..17b0cf9 100644 --- a/src/jenkins_hash.h +++ b/src/jenkins_hash.h @@ -7,8 +7,6 @@ typedef struct __jenkins_state_t { CMPH_HASH hashfunc; cmph_uint32 seed; - cmph_uint32 nbits; - cmph_uint32 size; } jenkins_state_t; jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table diff --git a/src/main.c b/src/main.c index 8a7f977..4db2104 100644 --- a/src/main.c +++ b/src/main.c @@ -22,12 +22,12 @@ void usage(const char *prg) { - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); } void usage_long(const char *prg) { cmph_uint32 i; - fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile\n", prg); fprintf(stderr, "Minimum perfect hashing tool\n\n"); fprintf(stderr, " -h\t print this help message\n"); fprintf(stderr, " -c\t c value that determines the number of vertices in the graph\n"); @@ -43,13 +43,13 @@ void usage_long(const char *prg) fprintf(stderr, " -m\t minimum perfect hash function file \n"); fprintf(stderr, " -M\t main memory availability (in MB)\n"); fprintf(stderr, " -d\t temporary directory used in brz algorithm \n"); + fprintf(stderr, " -b\t parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256\n"); fprintf(stderr, " keysfile\t line separated file with keys\n"); } - int main(int argc, char **argv) { - char verbosity = 0; + char verbosity = 0; char generate = 0; char *mphf_file = NULL; FILE *mphf_fd = stdout; @@ -67,9 +67,10 @@ int main(int argc, char **argv) cmph_uint8 * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; + cmph_uint32 b = 128; while (1) { - char ch = getopt(argc, argv, "hVvgc:k:a:M:f:m:d:s:"); + char ch = getopt(argc, argv, "hVvgc:k:a:M:b:f:m:d:s:"); if (ch == -1) break; switch (ch) { @@ -122,6 +123,16 @@ int main(int argc, char **argv) } } break; + case 'b': + { + char *cptr; + b = strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Parameter b was not found: %s\n", optarg); + exit(1); + } + } + break; case 'v': ++verbosity; break; @@ -184,9 +195,9 @@ int main(int argc, char **argv) return 1; } keys_file = argv[optind]; + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); srand(seed); - int ret = 0; if (mphf_file == NULL) { @@ -196,6 +207,7 @@ int main(int argc, char **argv) } keys_fd = fopen(keys_file, "r"); + if (keys_fd == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); @@ -209,33 +221,35 @@ int main(int argc, char **argv) if (generate) { //Create mphf + mphf_fd = fopen(mphf_file, "w"); config = cmph_config_new(source); cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); + cmph_config_set_b(config, b); if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); - + cmph_config_destroy(config); if (mphf == NULL) { fprintf(stderr, "Unable to create minimum perfect hashing function\n"); - cmph_config_destroy(config); + //cmph_config_destroy(config); free(mphf_file); return -1; } - mphf_fd = fopen(mphf_file, "w"); if (mphf_fd == NULL) { fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); free(mphf_file); return -1; } - cmph_dump(mphf, mphf_fd); - cmph_destroy(mphf); + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); fclose(mphf_fd); } else @@ -289,6 +303,7 @@ int main(int argc, char **argv) fclose(keys_fd); free(mphf_file); free(tmp_dir); - free(source); + cmph_io_nlfile_adapter_destroy(source); return ret; + } diff --git a/src/vqueue.c b/src/vqueue.c index 0e55095..c2cf3bb 100644 --- a/src/vqueue.c +++ b/src/vqueue.c @@ -46,5 +46,5 @@ void vqueue_print(vqueue_t * q) void vqueue_destroy(vqueue_t *q) { - free(q->values); q->values = NULL; + free(q->values); q->values = NULL; free(q); } diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig index 4f11d1e..e08aae4 100644 --- a/vldb/pt/figs/brz.fig +++ b/vldb/pt/figs/brz.fig @@ -8,96 +8,79 @@ Single -2 1200 2 0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 +6 2025 3015 3555 3690 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 + 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 + 2790 3690 2025 3285 +4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 -6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 +6 1890 3735 3780 4365 +6 2430 3735 2700 4365 +6 2430 3915 2700 4365 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 -6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 -6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 + 1890 4365 3780 4365 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 + 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 +-6 +6 1260 5310 4230 5580 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1260 5400 4230 5400 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 @@ -122,14 +105,49 @@ Single 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1260 2925 4230 2925 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3510 4590 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 4410 3600 4410 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3690 4410 3780 4410 +2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 + 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 + 2790 5220 2025 4815 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3780 4410 3780 4590 +4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 +4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 +4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 +4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 +4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 +4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 From 14744749a3b49b3654ecdaaf014571e84e1b34b3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:54:53 +0000 Subject: [PATCH 257/739] stable version of BRZ algorithm using buffers --- src/brz.c | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/src/brz.c b/src/brz.c index 10d0367..c5936d7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -17,12 +17,11 @@ //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph); +static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { @@ -128,18 +127,14 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - -// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - + while(1) { int ok; DEBUGP("hash function 3\n"); brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph); + ok = brz_gen_mphf(mph); if (!ok) { --iterations; @@ -196,7 +191,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph) +static int brz_gen_mphf(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -480,17 +475,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) -{ - while(*start_index < brz->k && brz->g[*start_index] != NULL) - { - fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); - free(brz->g[*start_index]); - brz->g[*start_index] = NULL; - *start_index = *start_index + 1; - } -} - static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 i; @@ -514,21 +498,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } -/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) -{ - cmph_uint32 i; - cmph_uint32 n = ceil(brz->c * brz->size[index]); - if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} - brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); - for(i = 0; i < n; i++) - { - brz->g[index][i] = bmzf->g[i]; - //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); -} -*/ int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; From c12535761c9a6aca3407f41185240e1cdd4860e8 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:54:53 +0000 Subject: [PATCH 258/739] stable version of BRZ algorithm using buffers --- src/brz.c | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/src/brz.c b/src/brz.c index 10d0367..c5936d7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -17,12 +17,11 @@ //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph); +static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { @@ -128,18 +127,14 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - -// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - + while(1) { int ok; DEBUGP("hash function 3\n"); brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph); + ok = brz_gen_mphf(mph); if (!ok) { --iterations; @@ -196,7 +191,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph) +static int brz_gen_mphf(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -480,17 +475,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) -{ - while(*start_index < brz->k && brz->g[*start_index] != NULL) - { - fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); - free(brz->g[*start_index]); - brz->g[*start_index] = NULL; - *start_index = *start_index + 1; - } -} - static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 i; @@ -514,21 +498,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } -/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) -{ - cmph_uint32 i; - cmph_uint32 n = ceil(brz->c * brz->size[index]); - if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} - brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); - for(i = 0; i < n; i++) - { - brz->g[index][i] = bmzf->g[i]; - //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); -} -*/ int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; From a0cf4648a4b6768bb21061f53a900730bcaab8ab Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:54:53 +0000 Subject: [PATCH 259/739] stable version of BRZ algorithm using buffers --- src/brz.c | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/src/brz.c b/src/brz.c index 10d0367..c5936d7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -17,12 +17,11 @@ //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph); +static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { @@ -128,18 +127,14 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - -// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - + while(1) { int ok; DEBUGP("hash function 3\n"); brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph); + ok = brz_gen_mphf(mph); if (!ok) { --iterations; @@ -196,7 +191,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph) +static int brz_gen_mphf(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -480,17 +475,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) -{ - while(*start_index < brz->k && brz->g[*start_index] != NULL) - { - fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); - free(brz->g[*start_index]); - brz->g[*start_index] = NULL; - *start_index = *start_index + 1; - } -} - static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 i; @@ -514,21 +498,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } -/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) -{ - cmph_uint32 i; - cmph_uint32 n = ceil(brz->c * brz->size[index]); - if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} - brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); - for(i = 0; i < n; i++) - { - brz->g[index][i] = bmzf->g[i]; - //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); -} -*/ int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; From 9aa43a09948e6ef54fc7b9b4bcafc557c2d27871 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 25 Jan 2006 19:54:53 +0000 Subject: [PATCH 260/739] stable version of BRZ algorithm using buffers --- src/brz.c | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/src/brz.c b/src/brz.c index 10d0367..c5936d7 100755 --- a/src/brz.c +++ b/src/brz.c @@ -17,12 +17,11 @@ //#define DEBUG #include "debug.h" -static int brz_gen_graphs(cmph_config_t *mph); +static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -//static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index); static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { @@ -128,18 +127,14 @@ cmph_t *brz_new(cmph_config_t *mph, float c) { fprintf(stderr, "Partioning the set of keys.\n"); } - -// brz->h1 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->h2 = (hash_state_t **)calloc(brz->k, sizeof(hash_state_t *)); -// brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - + while(1) { int ok; DEBUGP("hash function 3\n"); brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); DEBUGP("Generating graphs\n"); - ok = brz_gen_graphs(mph); + ok = brz_gen_mphf(mph); if (!ok) { --iterations; @@ -196,7 +191,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) return mphf; } -static int brz_gen_graphs(cmph_config_t *mph) +static int brz_gen_mphf(cmph_config_t *mph) { cmph_uint32 i, e; brz_config_data_t *brz = (brz_config_data_t *)mph->data; @@ -480,17 +475,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd) -{ - while(*start_index < brz->k && brz->g[*start_index] != NULL) - { - fwrite(brz->g[*start_index], sizeof(cmph_uint8), brz->size[*start_index], fd); - free(brz->g[*start_index]); - brz->g[*start_index] = NULL; - *start_index = *start_index + 1; - } -} - static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 i; @@ -514,21 +498,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } -/*static void brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index) -{ - cmph_uint32 i; - cmph_uint32 n = ceil(brz->c * brz->size[index]); - if( brz->g[index]) {fprintf(stderr, "index:%u\n",index);exit(10);} - brz->g[index] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); - for(i = 0; i < n; i++) - { - brz->g[index][i] = bmzf->g[i]; - //fprintf(stderr, "gsrc[%u]: %u gdest: %u\n", i, (cmph_uint8) bmzf->g[i], brz->g[index][i]); - } - brz->h1[index] = hash_state_copy(bmzf->hashes[0]); - brz->h2[index] = hash_state_copy(bmzf->hashes[1]); -} -*/ int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; From ec7d16e77f66472470f0bea8d56dc5129de756c9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:02:40 +0000 Subject: [PATCH 261/739] buffer_manage.c and buffer_manage.h added --- src/buffer_manage.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manage.h | 12 +++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/buffer_manage.c create mode 100644 src/buffer_manage.h diff --git a/src/buffer_manage.c b/src/buffer_manage.c new file mode 100644 index 0000000..5b518d5 --- /dev/null +++ b/src/buffer_manage.c @@ -0,0 +1,66 @@ +#include "buffer_manage.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manage_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manage_t *buff_manage = (buffer_manage_t *)malloc(sizeof(buffer_manage_t)); + assert(buff_manage); + buff_manage->memory_avail = memory_avail; + buff_manage->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manage->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manage->pos_avail_list = -1; + buff_manage->nentries = nentries; + memory_avail_entry = buff_manage->memory_avail/buff_manage->nentries + 1; + for(i = 0; i < buff_manage->nentries; i++) + { + buff_manage->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manage; +} + +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manage->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manage->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]) + buffer_manage->memory_avail_list[(buffer_manage->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manage->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manage->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manage->memory_avail_list[++(buffer_manage->pos_avail_list)] = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manage_destroy(buffer_manage_t * buffer_manage) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manage->nentries; i++) + { + buffer_entry_destroy(buffer_manage->buffer_entries[i]); + } + free(buffer_manage->memory_avail_list); + free(buffer_manage->buffer_entries); + free(buffer_manage); +} diff --git a/src/buffer_manage.h b/src/buffer_manage.h new file mode 100644 index 0000000..8c66cff --- /dev/null +++ b/src/buffer_manage.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manage_t buffer_manage_t; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index); +void buffer_manage_destroy(buffer_manage_t * buffer_manage); +#endif From d2a51f12317640acb6892d9e43baf985d1339e80 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:02:40 +0000 Subject: [PATCH 262/739] buffer_manage.c and buffer_manage.h added --- src/buffer_manage.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manage.h | 12 +++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/buffer_manage.c create mode 100644 src/buffer_manage.h diff --git a/src/buffer_manage.c b/src/buffer_manage.c new file mode 100644 index 0000000..5b518d5 --- /dev/null +++ b/src/buffer_manage.c @@ -0,0 +1,66 @@ +#include "buffer_manage.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manage_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manage_t *buff_manage = (buffer_manage_t *)malloc(sizeof(buffer_manage_t)); + assert(buff_manage); + buff_manage->memory_avail = memory_avail; + buff_manage->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manage->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manage->pos_avail_list = -1; + buff_manage->nentries = nentries; + memory_avail_entry = buff_manage->memory_avail/buff_manage->nentries + 1; + for(i = 0; i < buff_manage->nentries; i++) + { + buff_manage->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manage; +} + +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manage->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manage->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]) + buffer_manage->memory_avail_list[(buffer_manage->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manage->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manage->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manage->memory_avail_list[++(buffer_manage->pos_avail_list)] = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manage_destroy(buffer_manage_t * buffer_manage) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manage->nentries; i++) + { + buffer_entry_destroy(buffer_manage->buffer_entries[i]); + } + free(buffer_manage->memory_avail_list); + free(buffer_manage->buffer_entries); + free(buffer_manage); +} diff --git a/src/buffer_manage.h b/src/buffer_manage.h new file mode 100644 index 0000000..8c66cff --- /dev/null +++ b/src/buffer_manage.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manage_t buffer_manage_t; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index); +void buffer_manage_destroy(buffer_manage_t * buffer_manage); +#endif From f7d0e5b7fd6298a81057603b854589ee4a09d69d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:02:40 +0000 Subject: [PATCH 263/739] buffer_manage.c and buffer_manage.h added --- src/buffer_manage.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manage.h | 12 +++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/buffer_manage.c create mode 100644 src/buffer_manage.h diff --git a/src/buffer_manage.c b/src/buffer_manage.c new file mode 100644 index 0000000..5b518d5 --- /dev/null +++ b/src/buffer_manage.c @@ -0,0 +1,66 @@ +#include "buffer_manage.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manage_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manage_t *buff_manage = (buffer_manage_t *)malloc(sizeof(buffer_manage_t)); + assert(buff_manage); + buff_manage->memory_avail = memory_avail; + buff_manage->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manage->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manage->pos_avail_list = -1; + buff_manage->nentries = nentries; + memory_avail_entry = buff_manage->memory_avail/buff_manage->nentries + 1; + for(i = 0; i < buff_manage->nentries; i++) + { + buff_manage->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manage; +} + +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manage->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manage->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]) + buffer_manage->memory_avail_list[(buffer_manage->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manage->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manage->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manage->memory_avail_list[++(buffer_manage->pos_avail_list)] = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manage_destroy(buffer_manage_t * buffer_manage) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manage->nentries; i++) + { + buffer_entry_destroy(buffer_manage->buffer_entries[i]); + } + free(buffer_manage->memory_avail_list); + free(buffer_manage->buffer_entries); + free(buffer_manage); +} diff --git a/src/buffer_manage.h b/src/buffer_manage.h new file mode 100644 index 0000000..8c66cff --- /dev/null +++ b/src/buffer_manage.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manage_t buffer_manage_t; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index); +void buffer_manage_destroy(buffer_manage_t * buffer_manage); +#endif From 99d2a2527df46d0a8f07455cade0ccf728f4b6f3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:02:40 +0000 Subject: [PATCH 264/739] buffer_manage.c and buffer_manage.h added --- src/buffer_manage.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manage.h | 12 +++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/buffer_manage.c create mode 100644 src/buffer_manage.h diff --git a/src/buffer_manage.c b/src/buffer_manage.c new file mode 100644 index 0000000..5b518d5 --- /dev/null +++ b/src/buffer_manage.c @@ -0,0 +1,66 @@ +#include "buffer_manage.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manage_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manage_t *buff_manage = (buffer_manage_t *)malloc(sizeof(buffer_manage_t)); + assert(buff_manage); + buff_manage->memory_avail = memory_avail; + buff_manage->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manage->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manage->pos_avail_list = -1; + buff_manage->nentries = nentries; + memory_avail_entry = buff_manage->memory_avail/buff_manage->nentries + 1; + for(i = 0; i < buff_manage->nentries; i++) + { + buff_manage->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manage; +} + +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manage->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manage->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]) + buffer_manage->memory_avail_list[(buffer_manage->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manage->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manage->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manage->memory_avail_list[++(buffer_manage->pos_avail_list)] = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manage_destroy(buffer_manage_t * buffer_manage) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manage->nentries; i++) + { + buffer_entry_destroy(buffer_manage->buffer_entries[i]); + } + free(buffer_manage->memory_avail_list); + free(buffer_manage->buffer_entries); + free(buffer_manage); +} diff --git a/src/buffer_manage.h b/src/buffer_manage.h new file mode 100644 index 0000000..8c66cff --- /dev/null +++ b/src/buffer_manage.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manage_t buffer_manage_t; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index); +void buffer_manage_destroy(buffer_manage_t * buffer_manage); +#endif From 86ad50024986f1747ec7a55777f0c5d74cd4be5f Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:44:29 +0000 Subject: [PATCH 265/739] buffer_entry.c and buffer_entry.h added --- src/buffer_entry.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++ src/buffer_entry.h | 14 ++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/buffer_entry.c create mode 100644 src/buffer_entry.h diff --git a/src/buffer_entry.c b/src/buffer_entry.c new file mode 100644 index 0000000..bd9f82d --- /dev/null +++ b/src/buffer_entry.c @@ -0,0 +1,86 @@ +#include "buffer_entry.h" +#include +#include +#include + +struct __buffer_entry_t +{ + FILE *fd; + cmph_uint8 * buff; + cmph_uint32 capacity, // buffer entry capacity + nbytes, // buffer entry used bytes + pos; // current read position in buffer entry + cmph_uint8 eof; // flag to indicate end of file +}; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity) +{ + buffer_entry_t *buff_entry = (buffer_entry_t *)malloc(sizeof(buffer_entry_t)); + assert(buff_entry); + buff_entry->fd = NULL; + buff_entry->buff = NULL; + buff_entry->capacity = capacity; + buff_entry->nbytes = capacity; + buff_entry->pos = capacity; + buff_entry->eof = 0; + return buff_entry; +} + +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename) +{ + buffer_entry->fd = fopen(filename, "rb"); +} + +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity) +{ + buffer_entry->capacity = capacity; +} + + +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry) +{ + return buffer_entry->capacity; +} + +void buffer_entry_load(buffer_entry_t * buffer_entry) +{ + free(buffer_entry->buff); + buffer_entry->buff = (cmph_uint8 *)calloc(buffer_entry->capacity, sizeof(cmph_uint8)); + buffer_entry->nbytes = fread(buffer_entry->buff, 1, buffer_entry->capacity, buffer_entry->fd); + if (buffer_entry->nbytes != buffer_entry->capacity) buffer_entry->eof = 1; + buffer_entry->pos = 0; +} + +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +{ + cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + cmph_uint8 c; + while(1) + { + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end + { + free(buf); + return NULL; + } + if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); + c = buffer_entry->buff[(buffer_entry->pos)++]; + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; +} + +void buffer_entry_destroy(buffer_entry_t * buffer_entry) +{ + fclose(buffer_entry->fd); + buffer_entry->fd = NULL; + free(buffer_entry->buff); + buffer_entry->buff = NULL; + buffer_entry->capacity = 0; + buffer_entry->nbytes = 0; + buffer_entry->pos = 0; + buffer_entry->eof = 0; + free(buffer_entry); +} diff --git a/src/buffer_entry.h b/src/buffer_entry.h new file mode 100644 index 0000000..6f94924 --- /dev/null +++ b/src/buffer_entry.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_BUFFER_ENTRY_H__ +#define __CMPH_BUFFER_ENTRY_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_entry_t buffer_entry_t; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +void buffer_entry_destroy(buffer_entry_t * buffer_entry); +#endif From c97ea937a8f601c966ab66e1e71e7f073999b2cc Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:44:29 +0000 Subject: [PATCH 266/739] buffer_entry.c and buffer_entry.h added --- src/buffer_entry.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++ src/buffer_entry.h | 14 ++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/buffer_entry.c create mode 100644 src/buffer_entry.h diff --git a/src/buffer_entry.c b/src/buffer_entry.c new file mode 100644 index 0000000..bd9f82d --- /dev/null +++ b/src/buffer_entry.c @@ -0,0 +1,86 @@ +#include "buffer_entry.h" +#include +#include +#include + +struct __buffer_entry_t +{ + FILE *fd; + cmph_uint8 * buff; + cmph_uint32 capacity, // buffer entry capacity + nbytes, // buffer entry used bytes + pos; // current read position in buffer entry + cmph_uint8 eof; // flag to indicate end of file +}; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity) +{ + buffer_entry_t *buff_entry = (buffer_entry_t *)malloc(sizeof(buffer_entry_t)); + assert(buff_entry); + buff_entry->fd = NULL; + buff_entry->buff = NULL; + buff_entry->capacity = capacity; + buff_entry->nbytes = capacity; + buff_entry->pos = capacity; + buff_entry->eof = 0; + return buff_entry; +} + +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename) +{ + buffer_entry->fd = fopen(filename, "rb"); +} + +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity) +{ + buffer_entry->capacity = capacity; +} + + +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry) +{ + return buffer_entry->capacity; +} + +void buffer_entry_load(buffer_entry_t * buffer_entry) +{ + free(buffer_entry->buff); + buffer_entry->buff = (cmph_uint8 *)calloc(buffer_entry->capacity, sizeof(cmph_uint8)); + buffer_entry->nbytes = fread(buffer_entry->buff, 1, buffer_entry->capacity, buffer_entry->fd); + if (buffer_entry->nbytes != buffer_entry->capacity) buffer_entry->eof = 1; + buffer_entry->pos = 0; +} + +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +{ + cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + cmph_uint8 c; + while(1) + { + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end + { + free(buf); + return NULL; + } + if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); + c = buffer_entry->buff[(buffer_entry->pos)++]; + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; +} + +void buffer_entry_destroy(buffer_entry_t * buffer_entry) +{ + fclose(buffer_entry->fd); + buffer_entry->fd = NULL; + free(buffer_entry->buff); + buffer_entry->buff = NULL; + buffer_entry->capacity = 0; + buffer_entry->nbytes = 0; + buffer_entry->pos = 0; + buffer_entry->eof = 0; + free(buffer_entry); +} diff --git a/src/buffer_entry.h b/src/buffer_entry.h new file mode 100644 index 0000000..6f94924 --- /dev/null +++ b/src/buffer_entry.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_BUFFER_ENTRY_H__ +#define __CMPH_BUFFER_ENTRY_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_entry_t buffer_entry_t; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +void buffer_entry_destroy(buffer_entry_t * buffer_entry); +#endif From 2fb21586d573d8c7a62fb0e5fdd7bbb18f6f1d13 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:44:29 +0000 Subject: [PATCH 267/739] buffer_entry.c and buffer_entry.h added --- src/buffer_entry.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++ src/buffer_entry.h | 14 ++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/buffer_entry.c create mode 100644 src/buffer_entry.h diff --git a/src/buffer_entry.c b/src/buffer_entry.c new file mode 100644 index 0000000..bd9f82d --- /dev/null +++ b/src/buffer_entry.c @@ -0,0 +1,86 @@ +#include "buffer_entry.h" +#include +#include +#include + +struct __buffer_entry_t +{ + FILE *fd; + cmph_uint8 * buff; + cmph_uint32 capacity, // buffer entry capacity + nbytes, // buffer entry used bytes + pos; // current read position in buffer entry + cmph_uint8 eof; // flag to indicate end of file +}; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity) +{ + buffer_entry_t *buff_entry = (buffer_entry_t *)malloc(sizeof(buffer_entry_t)); + assert(buff_entry); + buff_entry->fd = NULL; + buff_entry->buff = NULL; + buff_entry->capacity = capacity; + buff_entry->nbytes = capacity; + buff_entry->pos = capacity; + buff_entry->eof = 0; + return buff_entry; +} + +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename) +{ + buffer_entry->fd = fopen(filename, "rb"); +} + +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity) +{ + buffer_entry->capacity = capacity; +} + + +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry) +{ + return buffer_entry->capacity; +} + +void buffer_entry_load(buffer_entry_t * buffer_entry) +{ + free(buffer_entry->buff); + buffer_entry->buff = (cmph_uint8 *)calloc(buffer_entry->capacity, sizeof(cmph_uint8)); + buffer_entry->nbytes = fread(buffer_entry->buff, 1, buffer_entry->capacity, buffer_entry->fd); + if (buffer_entry->nbytes != buffer_entry->capacity) buffer_entry->eof = 1; + buffer_entry->pos = 0; +} + +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +{ + cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + cmph_uint8 c; + while(1) + { + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end + { + free(buf); + return NULL; + } + if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); + c = buffer_entry->buff[(buffer_entry->pos)++]; + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; +} + +void buffer_entry_destroy(buffer_entry_t * buffer_entry) +{ + fclose(buffer_entry->fd); + buffer_entry->fd = NULL; + free(buffer_entry->buff); + buffer_entry->buff = NULL; + buffer_entry->capacity = 0; + buffer_entry->nbytes = 0; + buffer_entry->pos = 0; + buffer_entry->eof = 0; + free(buffer_entry); +} diff --git a/src/buffer_entry.h b/src/buffer_entry.h new file mode 100644 index 0000000..6f94924 --- /dev/null +++ b/src/buffer_entry.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_BUFFER_ENTRY_H__ +#define __CMPH_BUFFER_ENTRY_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_entry_t buffer_entry_t; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +void buffer_entry_destroy(buffer_entry_t * buffer_entry); +#endif From 7767312143537bf38fd622f18d0918f629926ca2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 18:44:29 +0000 Subject: [PATCH 268/739] buffer_entry.c and buffer_entry.h added --- src/buffer_entry.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++ src/buffer_entry.h | 14 ++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/buffer_entry.c create mode 100644 src/buffer_entry.h diff --git a/src/buffer_entry.c b/src/buffer_entry.c new file mode 100644 index 0000000..bd9f82d --- /dev/null +++ b/src/buffer_entry.c @@ -0,0 +1,86 @@ +#include "buffer_entry.h" +#include +#include +#include + +struct __buffer_entry_t +{ + FILE *fd; + cmph_uint8 * buff; + cmph_uint32 capacity, // buffer entry capacity + nbytes, // buffer entry used bytes + pos; // current read position in buffer entry + cmph_uint8 eof; // flag to indicate end of file +}; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity) +{ + buffer_entry_t *buff_entry = (buffer_entry_t *)malloc(sizeof(buffer_entry_t)); + assert(buff_entry); + buff_entry->fd = NULL; + buff_entry->buff = NULL; + buff_entry->capacity = capacity; + buff_entry->nbytes = capacity; + buff_entry->pos = capacity; + buff_entry->eof = 0; + return buff_entry; +} + +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename) +{ + buffer_entry->fd = fopen(filename, "rb"); +} + +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity) +{ + buffer_entry->capacity = capacity; +} + + +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry) +{ + return buffer_entry->capacity; +} + +void buffer_entry_load(buffer_entry_t * buffer_entry) +{ + free(buffer_entry->buff); + buffer_entry->buff = (cmph_uint8 *)calloc(buffer_entry->capacity, sizeof(cmph_uint8)); + buffer_entry->nbytes = fread(buffer_entry->buff, 1, buffer_entry->capacity, buffer_entry->fd); + if (buffer_entry->nbytes != buffer_entry->capacity) buffer_entry->eof = 1; + buffer_entry->pos = 0; +} + +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +{ + cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); + cmph_uint32 buf_pos = 0; + cmph_uint8 c; + while(1) + { + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end + { + free(buf); + return NULL; + } + if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); + c = buffer_entry->buff[(buffer_entry->pos)++]; + buf[buf_pos++] = c; + if(c == '\0') break; + if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + } + return buf; +} + +void buffer_entry_destroy(buffer_entry_t * buffer_entry) +{ + fclose(buffer_entry->fd); + buffer_entry->fd = NULL; + free(buffer_entry->buff); + buffer_entry->buff = NULL; + buffer_entry->capacity = 0; + buffer_entry->nbytes = 0; + buffer_entry->pos = 0; + buffer_entry->eof = 0; + free(buffer_entry); +} diff --git a/src/buffer_entry.h b/src/buffer_entry.h new file mode 100644 index 0000000..6f94924 --- /dev/null +++ b/src/buffer_entry.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_BUFFER_ENTRY_H__ +#define __CMPH_BUFFER_ENTRY_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_entry_t buffer_entry_t; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +void buffer_entry_destroy(buffer_entry_t * buffer_entry); +#endif From 1c450d1365fae76142e8be7ed9f922464034dcbe Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:38:41 +0000 Subject: [PATCH 269/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..fd2aa70 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c wingetopt.h wingetopt.c +cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c cmph_LDADD = libcmph.la From 618bd598151e6f7cbedb7ef1e560cc83caeb76e0 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:38:41 +0000 Subject: [PATCH 270/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..fd2aa70 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c wingetopt.h wingetopt.c +cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c cmph_LDADD = libcmph.la From 27b33e82ceb5e81e7d06675ff6f93f85c1d0a14d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:38:41 +0000 Subject: [PATCH 271/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..fd2aa70 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c wingetopt.h wingetopt.c +cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c cmph_LDADD = libcmph.la From 12fbab96cc2e7d52a9224d026b54ecef16eee77f Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:38:41 +0000 Subject: [PATCH 272/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..fd2aa70 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c wingetopt.h wingetopt.c +cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c cmph_LDADD = libcmph.la From 4a693772537be81e293a78a778b21d2c434e8dd4 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:44:03 +0000 Subject: [PATCH 273/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index fd2aa70..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la From 8959513c6ef7389c1275e7bfc3c5f13c971e96af Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:44:03 +0000 Subject: [PATCH 274/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index fd2aa70..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la From 1afd893d0d1920401e13089a9e6cf3607763ae90 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:44:03 +0000 Subject: [PATCH 275/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index fd2aa70..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la From e3893430f6ce5b4461f7372688e3f5cbc0e9b5c1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:44:03 +0000 Subject: [PATCH 276/739] Makefile.am fixed --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index fd2aa70..6eb41d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,5 +23,5 @@ libcmph_la_SOURCES = util.h debug.h\ libcmph_la_LDFLAGS = -version-info 0:0:0 -cmph_SOURCES = main.c ../wingetopt.h ../wingetopt.c +cmph_SOURCES = main.c wingetopt.h wingetopt.c cmph_LDADD = libcmph.la From 27cd2b7978c90f49c6fea256f6bd2665de8dfa67 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:46:12 +0000 Subject: [PATCH 277/739] Makefile.am fixed and, wingetopt.c and wingetopt.h were moved to src directory --- src/wingetopt.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ src/wingetopt.h | 25 +++++++ 2 files changed, 204 insertions(+) create mode 100644 src/wingetopt.c create mode 100644 src/wingetopt.h diff --git a/src/wingetopt.c b/src/wingetopt.c new file mode 100644 index 0000000..c981d0f --- /dev/null +++ b/src/wingetopt.c @@ -0,0 +1,179 @@ +#ifdef WIN32 +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + +#endif //WIN32 diff --git a/src/wingetopt.h b/src/wingetopt.h new file mode 100644 index 0000000..9596853 --- /dev/null +++ b/src/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif //_GETOPT_ +#endif //WIN32 + +#ifdef __cplusplus +} +#endif + From 5ecd08726ec24fa787aca7331eb2514bc8182c11 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:46:12 +0000 Subject: [PATCH 278/739] Makefile.am fixed and, wingetopt.c and wingetopt.h were moved to src directory --- src/wingetopt.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ src/wingetopt.h | 25 +++++++ 2 files changed, 204 insertions(+) create mode 100644 src/wingetopt.c create mode 100644 src/wingetopt.h diff --git a/src/wingetopt.c b/src/wingetopt.c new file mode 100644 index 0000000..c981d0f --- /dev/null +++ b/src/wingetopt.c @@ -0,0 +1,179 @@ +#ifdef WIN32 +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + +#endif //WIN32 diff --git a/src/wingetopt.h b/src/wingetopt.h new file mode 100644 index 0000000..9596853 --- /dev/null +++ b/src/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif //_GETOPT_ +#endif //WIN32 + +#ifdef __cplusplus +} +#endif + From baec893907a202c8ee54e820e5587ceec4d2a5c5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:46:12 +0000 Subject: [PATCH 279/739] Makefile.am fixed and, wingetopt.c and wingetopt.h were moved to src directory --- src/wingetopt.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ src/wingetopt.h | 25 +++++++ 2 files changed, 204 insertions(+) create mode 100644 src/wingetopt.c create mode 100644 src/wingetopt.h diff --git a/src/wingetopt.c b/src/wingetopt.c new file mode 100644 index 0000000..c981d0f --- /dev/null +++ b/src/wingetopt.c @@ -0,0 +1,179 @@ +#ifdef WIN32 +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + +#endif //WIN32 diff --git a/src/wingetopt.h b/src/wingetopt.h new file mode 100644 index 0000000..9596853 --- /dev/null +++ b/src/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif //_GETOPT_ +#endif //WIN32 + +#ifdef __cplusplus +} +#endif + From 7b9cee37fe11bde01e2575da46bd11228d7d5c9a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 19 Apr 2006 19:46:12 +0000 Subject: [PATCH 280/739] Makefile.am fixed and, wingetopt.c and wingetopt.h were moved to src directory --- src/wingetopt.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ src/wingetopt.h | 25 +++++++ 2 files changed, 204 insertions(+) create mode 100644 src/wingetopt.c create mode 100644 src/wingetopt.h diff --git a/src/wingetopt.c b/src/wingetopt.c new file mode 100644 index 0000000..c981d0f --- /dev/null +++ b/src/wingetopt.c @@ -0,0 +1,179 @@ +#ifdef WIN32 +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + +#endif //WIN32 diff --git a/src/wingetopt.h b/src/wingetopt.h new file mode 100644 index 0000000..9596853 --- /dev/null +++ b/src/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif //_GETOPT_ +#endif //WIN32 + +#ifdef __cplusplus +} +#endif + From bc1dac6891832721a2557b58511f630f0f395220 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 16:51:02 +0000 Subject: [PATCH 281/739] external memory based algorithm documentation added --- ALGORITHMS.t2t | 6 + BMZ.t2t | 6 +- BRZ.t2t | 323 +++++++++++++++++++++++++++++++++++++++++++++++++ CHM.t2t | 4 +- COMPARISON.t2t | 5 +- CONCEPTS.t2t | 4 +- FAQ.t2t | 4 +- GPERF.t2t | 4 +- README.t2t | 7 +- TABLEBRZ1.t2t | 72 +++++++++++ gendocs | 2 + 11 files changed, 417 insertions(+), 20 deletions(-) create mode 100644 ALGORITHMS.t2t create mode 100644 BRZ.t2t create mode 100644 TABLEBRZ1.t2t diff --git a/ALGORITHMS.t2t b/ALGORITHMS.t2t new file mode 100644 index 0000000..4d475ff --- /dev/null +++ b/ALGORITHMS.t2t @@ -0,0 +1,6 @@ + + + +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] | [External Memory Based Algorithm brz.html] +---------------------------------------- diff --git a/BMZ.t2t b/BMZ.t2t index b7ec249..23700c8 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -395,11 +395,9 @@ Again we have: + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. -+ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps] (Submitted). ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/BRZ.t2t b/BRZ.t2t new file mode 100644 index 0000000..250504c --- /dev/null +++ b/BRZ.t2t @@ -0,0 +1,323 @@ +External Memory Based Algorithm + + +%!includeconf: CONFIG.t2t + +---------------------------------------- +==Introduction== + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: + ++ The amount of CPU time required by the algorithms for constructing MPHFs. + ++ The space requirements of the algorithms for constructing MPHFs. + ++ The amount of CPU time required by a MPHF for each retrieval. + ++ The space requirements of the description of the resulting MPHFs to be used at retrieval time. + + +We present here a novel external memory based algorithm for constructing MPHFs that +are very efficient in the four requirements mentioned previously. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of [figs/brz/img23.png] one +byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using [figs/brz/img4.png], the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is [figs/brz/img24.png] bits per key. + +---------------------------------------- + + +==The Algorithm== + +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF //h// for a set //S// of //n// keys. +Figure 1 illustrates the two steps of the +algorithm: the partitioning step and the searching step. + + | [figs/brz/brz.png] + | **Figure 1:** Main steps of our algorithm. + +The partitioning step takes a key set //S// and uses a universal hash +function [figs/brz/img42.png] proposed by Jenkins[[5 #papers]] +to transform each key [figs/brz/img43.png] into an integer [figs/brz/img44.png]. +Reducing [figs/brz/img44.png] modulo [figs/brz/img23.png], we partition //S// +into [figs/brz/img23.png] buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF[figs/brz/img46.png] for each bucket //i//, [figs/brz/img47.png]. +The resulting MPHF //h(k)//, [figs/brz/img43.png], is given by + + | [figs/brz/img49.png] + +where [figs/brz/img50.png]. +The //i//th entry //offset[i]// of the displacement vector +//offset//, [figs/brz/img47.png], contains the total number +of keys in the buckets from 0 to //i-1//, that is, it gives the interval of the +keys in the hash table addressed by the MPHF[figs/brz/img46.png]. In the following we explain +each step in detail. + +---------------------------------------- + +=== Partitioning step === + +The set //S// of //n// keys is partitioned into [figs/brz/img23.png], +where //b// is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see [[2 #papers]] for details). +The partitioning step works as follows: + + | [figs/brz/img54.png] + | **Figure 2:** Partitioning step. + +Statement 1.1 of the **for** loop presented in Figure 2 +reads sequentially all the keys of block [figs/brz/img55.png] from disk into an internal area +of size [figs/brz/img8.png]. + +Statement 1.2 performs an indirect bucket sort of the keys in block [figs/brz/img55.png] and +at the same time updates the entries in the vector //size//. +Let us briefly describe how [figs/brz/img55.png] is partitioned among +the [figs/brz/img23.png] buckets. +We use a local array of [figs/brz/img23.png] counters to store a +count of how many keys from [figs/brz/img55.png] belong to each bucket. +The pointers to the keys in each bucket //i//, [figs/brz/img47.png], +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +To find the bucket address of a given key +we use the universal hash function [figs/brz/img44.png][[5 #papers]]. +Key //k// goes into bucket //i//, where + + | [figs/brz/img57.png] (1) + +Figure 3(a) shows a //logical// view of the [figs/brz/img23.png] buckets +generated in the partitioning step. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure 3(b). +In the example of Figure 3(b), the keys in bucket 0 +appear in files 1 and //N//, the keys in bucket 1 appear in files 1, 2 +and //N//, and so on. + + | [figs/brz/brz-partitioning.png] + | **Figure 3:** Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view. + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the //N// files in disk +during the searching step. +But, as we show in [[2 #papers]], the number of seeks +can be kept small using buffering techniques. +Considering that only the vector //size//, which has [figs/brz/img23.png] one-byte +entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the //offset// vector and dump it to the disk. +We use the vector //size// to compute the +//offset// displacement vector. +The //offset[i]// entry contains the number of keys +in the buckets //0, 1, ..., i-1//. +As //size[i]// stores the number of keys +in bucket //i//, where [figs/brz/img47.png], we have + + | [figs/brz/img63.png] + +---------------------------------------- + +=== Searching step === + +The searching step is responsible for generating a MPHF for each +bucket. Figure 4 presents the searching step algorithm. + + | [figs/brz/img64.png] + | **Figure 4:** Searching step. + +Statement 1 of Figure 4 inserts one key from each file +in a minimum heap //H// of size //N//. +The order relation in //H// is given by the bucket address //i// given by +Eq. (1). + +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +In statement 2.2, a MPHF is generated for each bucket //i//, as described +in the following. +The description of MPHF[figs/brz/img46.png] is a vector [figs/brz/img66.png] of 8-bit integers. +Finally, statement 2.3 writes the description [figs/brz/img66.png] of MPHF[figs/brz/img46.png] to disk. + +---------------------------------------- + +==== Reading a bucket from disk ==== + +In this section we present the refinement of statement 2.1 of +Figure 4. +The algorithm to read bucket //i// from disk is presented +in Figure 5. + + | [figs/brz/img67.png] + | **Figure 5:** Reading a bucket. + +Bucket //i// is distributed among many files and the heap //H// is used to drive a +multiway merge operation. +In Figure 5, statement 1.1 extracts and removes triple +//(i, j, k)// from //H//, where //i// is a minimum value in //H//. +Statement 1.2 inserts key //k// in bucket //i//. +Notice that the //k// in the triple //(i, j, k)// is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure 4). +Statement 1.3 performs a seek operation in File //j// on disk for the first +read operation and reads sequentially all keys //k// that have the same //i// +and inserts them all in bucket //i//. +Finally, statement 1.4 inserts in //H// the triple //(i, j, x)//, +where //x// is the first key read from File //j// (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in [[2, Section 5.1 #papers]], +where we present a buffering technique that brings down +the time spent with seeks. + +---------------------------------------- + +==== Generating a MPHF for each bucket ==== + +To the best of our knowledge the [BMZ algorithm bmz.html] we have designed in +our previous works [[1,3 #papers]] is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. In reality, we are using +an optimized version of BMZ (BMZ8) for small set of keys (at most 256 keys). +[Click here to see details about BMZ algorithm bmz.html]. + +---------------------------------------- + +==Analysis of the Algorithm== + +Analytical results and the complete analysis of the external memory based algorithm +can be found in [[2 #papers]]. + +---------------------------------------- + +==Experimental Results== + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm ([the BMZ algorithm bmz.html]) +and for our external memory based algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of the external memory based algorithm. + +---------------------------------------- + +===The data and the experimental setup=== + +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + +---------------------------------------- + +===Performance of the BMZ Algorithm=== + +[The BMZ algorithm bmz.html] is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have +the form [figs/brz/img159.png] for an input of //n// keys, +where [figs/brz/img160.png] is some machine dependent +constant that further depends on the length of the keys and //Z// is a random +variable with geometric distribution with mean [figs/brz/img162.png]. All results +in our experiments were obtained taking //c=1//; the value of //c//, with //c// in //[0.93,1.15]//, +in fact has little influence in the runtime, as shown in [[3 #papers]]. + +The values chosen for //n// were 1, 2, 4, 8, 16 and 32 million. +Although we have a dataset with 1 billion URLs, on a PC with +1 gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires //25n + O(1)// bytes for constructing +a MPHF ([click here to get details about the data structures used by the BMZ algorithm bmz.html]). + +In order to estimate the number of trials for each value of //n// we use +a statistical method for determining a suitable sample size (see, e.g., [[6, Chapter 13 #papers]]). +As we obtained different values for each //n//, +we used the maximal value obtained, namely, 300 trials in order to have +a confidence level of 95 %. + + +Table 1 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in [[3 #papers]]. + +%!include(html): ''TABLEBRZ1.t2t'' + | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +---------------------------------------- + +==Papers==[papers] + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [An Approach for Minimal Perfect Hash Functions for Very Large Databases papers/tr06.pdf], Technical Report TR003/06, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. + ++ [M. Seltzer. Beyond relational databases. ACM Queue, 3(3), April 2005. http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299] + ++ [Bob Jenkins. Algorithm alley: Hash functions. Dr. Dobb's Journal of Software Tools, 22(9), september 1997. http://burtleburtle.net/bob/hash/doobs.html] + ++ R. Jain. The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. John Wiley, first edition, 1991. + + +%!include: ALGORITHMS.t2t + +%!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index e3090dc..712723e 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -81,8 +81,6 @@ Again we have: The Computer Journal, 39(6):547--554, 1996. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index 1a6e328..21b3dd1 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -103,8 +103,7 @@ to [figs/img250.png] seconds for [figs/img6.png]. %!include(html): ''TABLE5.t2t'' | **Table 5:** Time measurements for BMZ tuned algorithm with [figs/img5.png] and [figs/img6.png]. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- + +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/CONCEPTS.t2t b/CONCEPTS.t2t index 49bedde..745a03d 100644 --- a/CONCEPTS.t2t +++ b/CONCEPTS.t2t @@ -49,8 +49,6 @@ languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/FAQ.t2t b/FAQ.t2t index 05ca410..eb11038 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -26,8 +26,6 @@ one is executed? is reset when you call the cmph_config_set_algo function. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/GPERF.t2t b/GPERF.t2t index 67d5d40..218ce52 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -32,8 +32,6 @@ gperf. The first problem is common in the information retrieval field (e.g. assigning ids to millions of documents), while the former is usually found in the compiler programming area (detect reserved keywords). ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index d51e705..c31a917 100644 --- a/README.t2t +++ b/README.t2t @@ -46,7 +46,12 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. + can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. +%html% - [External Memory Based Algorithm for sets in the order of billion of keys brz.html] +%txt% - BMZ Algorithm. + A very fast external memory based algorithm for constructing minimal perfect hash functions + for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and + can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal diff --git a/TABLEBRZ1.t2t b/TABLEBRZ1.t2t new file mode 100644 index 0000000..e8a021f --- /dev/null +++ b/TABLEBRZ1.t2t @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16 32
+ + Average time (s) $6.1 \pm 0.3$ $12.2 \pm 0.6$ $25.4 \pm 1.1$ $51.4 \pm 2.0$ $117.3 \pm 4.4$ $262.2 \pm 8.7$
+ SD (s) $2.6$ $5.4$ $9.8$ $17.6$ $37.3$ $76.3$
diff --git a/gendocs b/gendocs index 7885281..d38c3db 100755 --- a/gendocs +++ b/gendocs @@ -1,5 +1,6 @@ txt2tags -t html --mask-email -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html +txt2tags -t html -i BRZ.t2t -o brz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html @@ -8,6 +9,7 @@ txt2tags -t html -i CONCEPTS.t2t -o concepts.html txt2tags -t txt --mask-email -i README.t2t -o README txt2tags -t txt -i BMZ.t2t -o BMZ +txt2tags -t txt -i BRZ.t2t -o BRZ txt2tags -t txt -i CHM.t2t -o CHM txt2tags -t txt -i COMPARISON.t2t -o COMPARISON txt2tags -t txt -i GPERF.t2t -o GPERF From e44ecbdbbc929803c376c6ff319aeb1042ff1533 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 16:51:02 +0000 Subject: [PATCH 282/739] external memory based algorithm documentation added --- ALGORITHMS.t2t | 6 + BMZ.t2t | 6 +- BRZ.t2t | 323 +++++++++++++++++++++++++++++++++++++++++++++++++ CHM.t2t | 4 +- COMPARISON.t2t | 5 +- CONCEPTS.t2t | 4 +- FAQ.t2t | 4 +- GPERF.t2t | 4 +- README.t2t | 7 +- TABLEBRZ1.t2t | 72 +++++++++++ gendocs | 2 + 11 files changed, 417 insertions(+), 20 deletions(-) create mode 100644 ALGORITHMS.t2t create mode 100644 BRZ.t2t create mode 100644 TABLEBRZ1.t2t diff --git a/ALGORITHMS.t2t b/ALGORITHMS.t2t new file mode 100644 index 0000000..4d475ff --- /dev/null +++ b/ALGORITHMS.t2t @@ -0,0 +1,6 @@ + + + +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] | [External Memory Based Algorithm brz.html] +---------------------------------------- diff --git a/BMZ.t2t b/BMZ.t2t index b7ec249..23700c8 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -395,11 +395,9 @@ Again we have: + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. -+ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps] (Submitted). ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/BRZ.t2t b/BRZ.t2t new file mode 100644 index 0000000..250504c --- /dev/null +++ b/BRZ.t2t @@ -0,0 +1,323 @@ +External Memory Based Algorithm + + +%!includeconf: CONFIG.t2t + +---------------------------------------- +==Introduction== + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: + ++ The amount of CPU time required by the algorithms for constructing MPHFs. + ++ The space requirements of the algorithms for constructing MPHFs. + ++ The amount of CPU time required by a MPHF for each retrieval. + ++ The space requirements of the description of the resulting MPHFs to be used at retrieval time. + + +We present here a novel external memory based algorithm for constructing MPHFs that +are very efficient in the four requirements mentioned previously. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of [figs/brz/img23.png] one +byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using [figs/brz/img4.png], the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is [figs/brz/img24.png] bits per key. + +---------------------------------------- + + +==The Algorithm== + +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF //h// for a set //S// of //n// keys. +Figure 1 illustrates the two steps of the +algorithm: the partitioning step and the searching step. + + | [figs/brz/brz.png] + | **Figure 1:** Main steps of our algorithm. + +The partitioning step takes a key set //S// and uses a universal hash +function [figs/brz/img42.png] proposed by Jenkins[[5 #papers]] +to transform each key [figs/brz/img43.png] into an integer [figs/brz/img44.png]. +Reducing [figs/brz/img44.png] modulo [figs/brz/img23.png], we partition //S// +into [figs/brz/img23.png] buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF[figs/brz/img46.png] for each bucket //i//, [figs/brz/img47.png]. +The resulting MPHF //h(k)//, [figs/brz/img43.png], is given by + + | [figs/brz/img49.png] + +where [figs/brz/img50.png]. +The //i//th entry //offset[i]// of the displacement vector +//offset//, [figs/brz/img47.png], contains the total number +of keys in the buckets from 0 to //i-1//, that is, it gives the interval of the +keys in the hash table addressed by the MPHF[figs/brz/img46.png]. In the following we explain +each step in detail. + +---------------------------------------- + +=== Partitioning step === + +The set //S// of //n// keys is partitioned into [figs/brz/img23.png], +where //b// is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see [[2 #papers]] for details). +The partitioning step works as follows: + + | [figs/brz/img54.png] + | **Figure 2:** Partitioning step. + +Statement 1.1 of the **for** loop presented in Figure 2 +reads sequentially all the keys of block [figs/brz/img55.png] from disk into an internal area +of size [figs/brz/img8.png]. + +Statement 1.2 performs an indirect bucket sort of the keys in block [figs/brz/img55.png] and +at the same time updates the entries in the vector //size//. +Let us briefly describe how [figs/brz/img55.png] is partitioned among +the [figs/brz/img23.png] buckets. +We use a local array of [figs/brz/img23.png] counters to store a +count of how many keys from [figs/brz/img55.png] belong to each bucket. +The pointers to the keys in each bucket //i//, [figs/brz/img47.png], +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +To find the bucket address of a given key +we use the universal hash function [figs/brz/img44.png][[5 #papers]]. +Key //k// goes into bucket //i//, where + + | [figs/brz/img57.png] (1) + +Figure 3(a) shows a //logical// view of the [figs/brz/img23.png] buckets +generated in the partitioning step. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure 3(b). +In the example of Figure 3(b), the keys in bucket 0 +appear in files 1 and //N//, the keys in bucket 1 appear in files 1, 2 +and //N//, and so on. + + | [figs/brz/brz-partitioning.png] + | **Figure 3:** Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view. + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the //N// files in disk +during the searching step. +But, as we show in [[2 #papers]], the number of seeks +can be kept small using buffering techniques. +Considering that only the vector //size//, which has [figs/brz/img23.png] one-byte +entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the //offset// vector and dump it to the disk. +We use the vector //size// to compute the +//offset// displacement vector. +The //offset[i]// entry contains the number of keys +in the buckets //0, 1, ..., i-1//. +As //size[i]// stores the number of keys +in bucket //i//, where [figs/brz/img47.png], we have + + | [figs/brz/img63.png] + +---------------------------------------- + +=== Searching step === + +The searching step is responsible for generating a MPHF for each +bucket. Figure 4 presents the searching step algorithm. + + | [figs/brz/img64.png] + | **Figure 4:** Searching step. + +Statement 1 of Figure 4 inserts one key from each file +in a minimum heap //H// of size //N//. +The order relation in //H// is given by the bucket address //i// given by +Eq. (1). + +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +In statement 2.2, a MPHF is generated for each bucket //i//, as described +in the following. +The description of MPHF[figs/brz/img46.png] is a vector [figs/brz/img66.png] of 8-bit integers. +Finally, statement 2.3 writes the description [figs/brz/img66.png] of MPHF[figs/brz/img46.png] to disk. + +---------------------------------------- + +==== Reading a bucket from disk ==== + +In this section we present the refinement of statement 2.1 of +Figure 4. +The algorithm to read bucket //i// from disk is presented +in Figure 5. + + | [figs/brz/img67.png] + | **Figure 5:** Reading a bucket. + +Bucket //i// is distributed among many files and the heap //H// is used to drive a +multiway merge operation. +In Figure 5, statement 1.1 extracts and removes triple +//(i, j, k)// from //H//, where //i// is a minimum value in //H//. +Statement 1.2 inserts key //k// in bucket //i//. +Notice that the //k// in the triple //(i, j, k)// is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure 4). +Statement 1.3 performs a seek operation in File //j// on disk for the first +read operation and reads sequentially all keys //k// that have the same //i// +and inserts them all in bucket //i//. +Finally, statement 1.4 inserts in //H// the triple //(i, j, x)//, +where //x// is the first key read from File //j// (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in [[2, Section 5.1 #papers]], +where we present a buffering technique that brings down +the time spent with seeks. + +---------------------------------------- + +==== Generating a MPHF for each bucket ==== + +To the best of our knowledge the [BMZ algorithm bmz.html] we have designed in +our previous works [[1,3 #papers]] is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. In reality, we are using +an optimized version of BMZ (BMZ8) for small set of keys (at most 256 keys). +[Click here to see details about BMZ algorithm bmz.html]. + +---------------------------------------- + +==Analysis of the Algorithm== + +Analytical results and the complete analysis of the external memory based algorithm +can be found in [[2 #papers]]. + +---------------------------------------- + +==Experimental Results== + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm ([the BMZ algorithm bmz.html]) +and for our external memory based algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of the external memory based algorithm. + +---------------------------------------- + +===The data and the experimental setup=== + +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + +---------------------------------------- + +===Performance of the BMZ Algorithm=== + +[The BMZ algorithm bmz.html] is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have +the form [figs/brz/img159.png] for an input of //n// keys, +where [figs/brz/img160.png] is some machine dependent +constant that further depends on the length of the keys and //Z// is a random +variable with geometric distribution with mean [figs/brz/img162.png]. All results +in our experiments were obtained taking //c=1//; the value of //c//, with //c// in //[0.93,1.15]//, +in fact has little influence in the runtime, as shown in [[3 #papers]]. + +The values chosen for //n// were 1, 2, 4, 8, 16 and 32 million. +Although we have a dataset with 1 billion URLs, on a PC with +1 gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires //25n + O(1)// bytes for constructing +a MPHF ([click here to get details about the data structures used by the BMZ algorithm bmz.html]). + +In order to estimate the number of trials for each value of //n// we use +a statistical method for determining a suitable sample size (see, e.g., [[6, Chapter 13 #papers]]). +As we obtained different values for each //n//, +we used the maximal value obtained, namely, 300 trials in order to have +a confidence level of 95 %. + + +Table 1 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in [[3 #papers]]. + +%!include(html): ''TABLEBRZ1.t2t'' + | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +---------------------------------------- + +==Papers==[papers] + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [An Approach for Minimal Perfect Hash Functions for Very Large Databases papers/tr06.pdf], Technical Report TR003/06, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. + ++ [M. Seltzer. Beyond relational databases. ACM Queue, 3(3), April 2005. http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299] + ++ [Bob Jenkins. Algorithm alley: Hash functions. Dr. Dobb's Journal of Software Tools, 22(9), september 1997. http://burtleburtle.net/bob/hash/doobs.html] + ++ R. Jain. The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. John Wiley, first edition, 1991. + + +%!include: ALGORITHMS.t2t + +%!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index e3090dc..712723e 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -81,8 +81,6 @@ Again we have: The Computer Journal, 39(6):547--554, 1996. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index 1a6e328..21b3dd1 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -103,8 +103,7 @@ to [figs/img250.png] seconds for [figs/img6.png]. %!include(html): ''TABLE5.t2t'' | **Table 5:** Time measurements for BMZ tuned algorithm with [figs/img5.png] and [figs/img6.png]. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- + +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/CONCEPTS.t2t b/CONCEPTS.t2t index 49bedde..745a03d 100644 --- a/CONCEPTS.t2t +++ b/CONCEPTS.t2t @@ -49,8 +49,6 @@ languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/FAQ.t2t b/FAQ.t2t index 05ca410..eb11038 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -26,8 +26,6 @@ one is executed? is reset when you call the cmph_config_set_algo function. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/GPERF.t2t b/GPERF.t2t index 67d5d40..218ce52 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -32,8 +32,6 @@ gperf. The first problem is common in the information retrieval field (e.g. assigning ids to millions of documents), while the former is usually found in the compiler programming area (detect reserved keywords). ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index d51e705..c31a917 100644 --- a/README.t2t +++ b/README.t2t @@ -46,7 +46,12 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. + can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. +%html% - [External Memory Based Algorithm for sets in the order of billion of keys brz.html] +%txt% - BMZ Algorithm. + A very fast external memory based algorithm for constructing minimal perfect hash functions + for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and + can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal diff --git a/TABLEBRZ1.t2t b/TABLEBRZ1.t2t new file mode 100644 index 0000000..e8a021f --- /dev/null +++ b/TABLEBRZ1.t2t @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16 32
+ + Average time (s) $6.1 \pm 0.3$ $12.2 \pm 0.6$ $25.4 \pm 1.1$ $51.4 \pm 2.0$ $117.3 \pm 4.4$ $262.2 \pm 8.7$
+ SD (s) $2.6$ $5.4$ $9.8$ $17.6$ $37.3$ $76.3$
diff --git a/gendocs b/gendocs index 7885281..d38c3db 100755 --- a/gendocs +++ b/gendocs @@ -1,5 +1,6 @@ txt2tags -t html --mask-email -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html +txt2tags -t html -i BRZ.t2t -o brz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html @@ -8,6 +9,7 @@ txt2tags -t html -i CONCEPTS.t2t -o concepts.html txt2tags -t txt --mask-email -i README.t2t -o README txt2tags -t txt -i BMZ.t2t -o BMZ +txt2tags -t txt -i BRZ.t2t -o BRZ txt2tags -t txt -i CHM.t2t -o CHM txt2tags -t txt -i COMPARISON.t2t -o COMPARISON txt2tags -t txt -i GPERF.t2t -o GPERF From ef8eb858327ee4db43514a912e895da0e4b1adeb Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 16:51:02 +0000 Subject: [PATCH 283/739] external memory based algorithm documentation added --- ALGORITHMS.t2t | 6 + BMZ.t2t | 6 +- BRZ.t2t | 323 +++++++++++++++++++++++++++++++++++++++++++++++++ CHM.t2t | 4 +- COMPARISON.t2t | 5 +- CONCEPTS.t2t | 4 +- FAQ.t2t | 4 +- GPERF.t2t | 4 +- README.t2t | 7 +- TABLEBRZ1.t2t | 72 +++++++++++ gendocs | 2 + 11 files changed, 417 insertions(+), 20 deletions(-) create mode 100644 ALGORITHMS.t2t create mode 100644 BRZ.t2t create mode 100644 TABLEBRZ1.t2t diff --git a/ALGORITHMS.t2t b/ALGORITHMS.t2t new file mode 100644 index 0000000..4d475ff --- /dev/null +++ b/ALGORITHMS.t2t @@ -0,0 +1,6 @@ + + + +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] | [External Memory Based Algorithm brz.html] +---------------------------------------- diff --git a/BMZ.t2t b/BMZ.t2t index b7ec249..23700c8 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -395,11 +395,9 @@ Again we have: + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. -+ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps] (Submitted). ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/BRZ.t2t b/BRZ.t2t new file mode 100644 index 0000000..250504c --- /dev/null +++ b/BRZ.t2t @@ -0,0 +1,323 @@ +External Memory Based Algorithm + + +%!includeconf: CONFIG.t2t + +---------------------------------------- +==Introduction== + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: + ++ The amount of CPU time required by the algorithms for constructing MPHFs. + ++ The space requirements of the algorithms for constructing MPHFs. + ++ The amount of CPU time required by a MPHF for each retrieval. + ++ The space requirements of the description of the resulting MPHFs to be used at retrieval time. + + +We present here a novel external memory based algorithm for constructing MPHFs that +are very efficient in the four requirements mentioned previously. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of [figs/brz/img23.png] one +byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using [figs/brz/img4.png], the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is [figs/brz/img24.png] bits per key. + +---------------------------------------- + + +==The Algorithm== + +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF //h// for a set //S// of //n// keys. +Figure 1 illustrates the two steps of the +algorithm: the partitioning step and the searching step. + + | [figs/brz/brz.png] + | **Figure 1:** Main steps of our algorithm. + +The partitioning step takes a key set //S// and uses a universal hash +function [figs/brz/img42.png] proposed by Jenkins[[5 #papers]] +to transform each key [figs/brz/img43.png] into an integer [figs/brz/img44.png]. +Reducing [figs/brz/img44.png] modulo [figs/brz/img23.png], we partition //S// +into [figs/brz/img23.png] buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF[figs/brz/img46.png] for each bucket //i//, [figs/brz/img47.png]. +The resulting MPHF //h(k)//, [figs/brz/img43.png], is given by + + | [figs/brz/img49.png] + +where [figs/brz/img50.png]. +The //i//th entry //offset[i]// of the displacement vector +//offset//, [figs/brz/img47.png], contains the total number +of keys in the buckets from 0 to //i-1//, that is, it gives the interval of the +keys in the hash table addressed by the MPHF[figs/brz/img46.png]. In the following we explain +each step in detail. + +---------------------------------------- + +=== Partitioning step === + +The set //S// of //n// keys is partitioned into [figs/brz/img23.png], +where //b// is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see [[2 #papers]] for details). +The partitioning step works as follows: + + | [figs/brz/img54.png] + | **Figure 2:** Partitioning step. + +Statement 1.1 of the **for** loop presented in Figure 2 +reads sequentially all the keys of block [figs/brz/img55.png] from disk into an internal area +of size [figs/brz/img8.png]. + +Statement 1.2 performs an indirect bucket sort of the keys in block [figs/brz/img55.png] and +at the same time updates the entries in the vector //size//. +Let us briefly describe how [figs/brz/img55.png] is partitioned among +the [figs/brz/img23.png] buckets. +We use a local array of [figs/brz/img23.png] counters to store a +count of how many keys from [figs/brz/img55.png] belong to each bucket. +The pointers to the keys in each bucket //i//, [figs/brz/img47.png], +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +To find the bucket address of a given key +we use the universal hash function [figs/brz/img44.png][[5 #papers]]. +Key //k// goes into bucket //i//, where + + | [figs/brz/img57.png] (1) + +Figure 3(a) shows a //logical// view of the [figs/brz/img23.png] buckets +generated in the partitioning step. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure 3(b). +In the example of Figure 3(b), the keys in bucket 0 +appear in files 1 and //N//, the keys in bucket 1 appear in files 1, 2 +and //N//, and so on. + + | [figs/brz/brz-partitioning.png] + | **Figure 3:** Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view. + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the //N// files in disk +during the searching step. +But, as we show in [[2 #papers]], the number of seeks +can be kept small using buffering techniques. +Considering that only the vector //size//, which has [figs/brz/img23.png] one-byte +entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the //offset// vector and dump it to the disk. +We use the vector //size// to compute the +//offset// displacement vector. +The //offset[i]// entry contains the number of keys +in the buckets //0, 1, ..., i-1//. +As //size[i]// stores the number of keys +in bucket //i//, where [figs/brz/img47.png], we have + + | [figs/brz/img63.png] + +---------------------------------------- + +=== Searching step === + +The searching step is responsible for generating a MPHF for each +bucket. Figure 4 presents the searching step algorithm. + + | [figs/brz/img64.png] + | **Figure 4:** Searching step. + +Statement 1 of Figure 4 inserts one key from each file +in a minimum heap //H// of size //N//. +The order relation in //H// is given by the bucket address //i// given by +Eq. (1). + +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +In statement 2.2, a MPHF is generated for each bucket //i//, as described +in the following. +The description of MPHF[figs/brz/img46.png] is a vector [figs/brz/img66.png] of 8-bit integers. +Finally, statement 2.3 writes the description [figs/brz/img66.png] of MPHF[figs/brz/img46.png] to disk. + +---------------------------------------- + +==== Reading a bucket from disk ==== + +In this section we present the refinement of statement 2.1 of +Figure 4. +The algorithm to read bucket //i// from disk is presented +in Figure 5. + + | [figs/brz/img67.png] + | **Figure 5:** Reading a bucket. + +Bucket //i// is distributed among many files and the heap //H// is used to drive a +multiway merge operation. +In Figure 5, statement 1.1 extracts and removes triple +//(i, j, k)// from //H//, where //i// is a minimum value in //H//. +Statement 1.2 inserts key //k// in bucket //i//. +Notice that the //k// in the triple //(i, j, k)// is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure 4). +Statement 1.3 performs a seek operation in File //j// on disk for the first +read operation and reads sequentially all keys //k// that have the same //i// +and inserts them all in bucket //i//. +Finally, statement 1.4 inserts in //H// the triple //(i, j, x)//, +where //x// is the first key read from File //j// (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in [[2, Section 5.1 #papers]], +where we present a buffering technique that brings down +the time spent with seeks. + +---------------------------------------- + +==== Generating a MPHF for each bucket ==== + +To the best of our knowledge the [BMZ algorithm bmz.html] we have designed in +our previous works [[1,3 #papers]] is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. In reality, we are using +an optimized version of BMZ (BMZ8) for small set of keys (at most 256 keys). +[Click here to see details about BMZ algorithm bmz.html]. + +---------------------------------------- + +==Analysis of the Algorithm== + +Analytical results and the complete analysis of the external memory based algorithm +can be found in [[2 #papers]]. + +---------------------------------------- + +==Experimental Results== + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm ([the BMZ algorithm bmz.html]) +and for our external memory based algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of the external memory based algorithm. + +---------------------------------------- + +===The data and the experimental setup=== + +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + +---------------------------------------- + +===Performance of the BMZ Algorithm=== + +[The BMZ algorithm bmz.html] is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have +the form [figs/brz/img159.png] for an input of //n// keys, +where [figs/brz/img160.png] is some machine dependent +constant that further depends on the length of the keys and //Z// is a random +variable with geometric distribution with mean [figs/brz/img162.png]. All results +in our experiments were obtained taking //c=1//; the value of //c//, with //c// in //[0.93,1.15]//, +in fact has little influence in the runtime, as shown in [[3 #papers]]. + +The values chosen for //n// were 1, 2, 4, 8, 16 and 32 million. +Although we have a dataset with 1 billion URLs, on a PC with +1 gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires //25n + O(1)// bytes for constructing +a MPHF ([click here to get details about the data structures used by the BMZ algorithm bmz.html]). + +In order to estimate the number of trials for each value of //n// we use +a statistical method for determining a suitable sample size (see, e.g., [[6, Chapter 13 #papers]]). +As we obtained different values for each //n//, +we used the maximal value obtained, namely, 300 trials in order to have +a confidence level of 95 %. + + +Table 1 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in [[3 #papers]]. + +%!include(html): ''TABLEBRZ1.t2t'' + | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +---------------------------------------- + +==Papers==[papers] + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [An Approach for Minimal Perfect Hash Functions for Very Large Databases papers/tr06.pdf], Technical Report TR003/06, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. + ++ [M. Seltzer. Beyond relational databases. ACM Queue, 3(3), April 2005. http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299] + ++ [Bob Jenkins. Algorithm alley: Hash functions. Dr. Dobb's Journal of Software Tools, 22(9), september 1997. http://burtleburtle.net/bob/hash/doobs.html] + ++ R. Jain. The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. John Wiley, first edition, 1991. + + +%!include: ALGORITHMS.t2t + +%!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index e3090dc..712723e 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -81,8 +81,6 @@ Again we have: The Computer Journal, 39(6):547--554, 1996. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index 1a6e328..21b3dd1 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -103,8 +103,7 @@ to [figs/img250.png] seconds for [figs/img6.png]. %!include(html): ''TABLE5.t2t'' | **Table 5:** Time measurements for BMZ tuned algorithm with [figs/img5.png] and [figs/img6.png]. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- + +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/CONCEPTS.t2t b/CONCEPTS.t2t index 49bedde..745a03d 100644 --- a/CONCEPTS.t2t +++ b/CONCEPTS.t2t @@ -49,8 +49,6 @@ languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/FAQ.t2t b/FAQ.t2t index 05ca410..eb11038 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -26,8 +26,6 @@ one is executed? is reset when you call the cmph_config_set_algo function. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/GPERF.t2t b/GPERF.t2t index 67d5d40..218ce52 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -32,8 +32,6 @@ gperf. The first problem is common in the information retrieval field (e.g. assigning ids to millions of documents), while the former is usually found in the compiler programming area (detect reserved keywords). ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index d51e705..c31a917 100644 --- a/README.t2t +++ b/README.t2t @@ -46,7 +46,12 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. + can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. +%html% - [External Memory Based Algorithm for sets in the order of billion of keys brz.html] +%txt% - BMZ Algorithm. + A very fast external memory based algorithm for constructing minimal perfect hash functions + for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and + can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal diff --git a/TABLEBRZ1.t2t b/TABLEBRZ1.t2t new file mode 100644 index 0000000..e8a021f --- /dev/null +++ b/TABLEBRZ1.t2t @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16 32
+ + Average time (s) $6.1 \pm 0.3$ $12.2 \pm 0.6$ $25.4 \pm 1.1$ $51.4 \pm 2.0$ $117.3 \pm 4.4$ $262.2 \pm 8.7$
+ SD (s) $2.6$ $5.4$ $9.8$ $17.6$ $37.3$ $76.3$
diff --git a/gendocs b/gendocs index 7885281..d38c3db 100755 --- a/gendocs +++ b/gendocs @@ -1,5 +1,6 @@ txt2tags -t html --mask-email -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html +txt2tags -t html -i BRZ.t2t -o brz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html @@ -8,6 +9,7 @@ txt2tags -t html -i CONCEPTS.t2t -o concepts.html txt2tags -t txt --mask-email -i README.t2t -o README txt2tags -t txt -i BMZ.t2t -o BMZ +txt2tags -t txt -i BRZ.t2t -o BRZ txt2tags -t txt -i CHM.t2t -o CHM txt2tags -t txt -i COMPARISON.t2t -o COMPARISON txt2tags -t txt -i GPERF.t2t -o GPERF From a15a9ee01832c9fe72089c9d57c705ac85ea2c29 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 16:51:02 +0000 Subject: [PATCH 284/739] external memory based algorithm documentation added --- ALGORITHMS.t2t | 6 + BMZ.t2t | 6 +- BRZ.t2t | 323 +++++++++++++++++++++++++++++++++++++++++++++++++ CHM.t2t | 4 +- COMPARISON.t2t | 5 +- CONCEPTS.t2t | 4 +- FAQ.t2t | 4 +- GPERF.t2t | 4 +- README.t2t | 7 +- TABLEBRZ1.t2t | 72 +++++++++++ gendocs | 2 + 11 files changed, 417 insertions(+), 20 deletions(-) create mode 100644 ALGORITHMS.t2t create mode 100644 BRZ.t2t create mode 100644 TABLEBRZ1.t2t diff --git a/ALGORITHMS.t2t b/ALGORITHMS.t2t new file mode 100644 index 0000000..4d475ff --- /dev/null +++ b/ALGORITHMS.t2t @@ -0,0 +1,6 @@ + + + +---------------------------------------- + | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] | [External Memory Based Algorithm brz.html] +---------------------------------------- diff --git a/BMZ.t2t b/BMZ.t2t index b7ec249..23700c8 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -395,11 +395,9 @@ Again we have: + [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. -+ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/bmz_wea2005.ps] (Submitted). ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/BRZ.t2t b/BRZ.t2t new file mode 100644 index 0000000..250504c --- /dev/null +++ b/BRZ.t2t @@ -0,0 +1,323 @@ +External Memory Based Algorithm + + +%!includeconf: CONFIG.t2t + +---------------------------------------- +==Introduction== + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: + ++ The amount of CPU time required by the algorithms for constructing MPHFs. + ++ The space requirements of the algorithms for constructing MPHFs. + ++ The amount of CPU time required by a MPHF for each retrieval. + ++ The space requirements of the description of the resulting MPHFs to be used at retrieval time. + + +We present here a novel external memory based algorithm for constructing MPHFs that +are very efficient in the four requirements mentioned previously. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of [figs/brz/img23.png] one +byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using [figs/brz/img4.png], the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is [figs/brz/img24.png] bits per key. + +---------------------------------------- + + +==The Algorithm== + +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF //h// for a set //S// of //n// keys. +Figure 1 illustrates the two steps of the +algorithm: the partitioning step and the searching step. + + | [figs/brz/brz.png] + | **Figure 1:** Main steps of our algorithm. + +The partitioning step takes a key set //S// and uses a universal hash +function [figs/brz/img42.png] proposed by Jenkins[[5 #papers]] +to transform each key [figs/brz/img43.png] into an integer [figs/brz/img44.png]. +Reducing [figs/brz/img44.png] modulo [figs/brz/img23.png], we partition //S// +into [figs/brz/img23.png] buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF[figs/brz/img46.png] for each bucket //i//, [figs/brz/img47.png]. +The resulting MPHF //h(k)//, [figs/brz/img43.png], is given by + + | [figs/brz/img49.png] + +where [figs/brz/img50.png]. +The //i//th entry //offset[i]// of the displacement vector +//offset//, [figs/brz/img47.png], contains the total number +of keys in the buckets from 0 to //i-1//, that is, it gives the interval of the +keys in the hash table addressed by the MPHF[figs/brz/img46.png]. In the following we explain +each step in detail. + +---------------------------------------- + +=== Partitioning step === + +The set //S// of //n// keys is partitioned into [figs/brz/img23.png], +where //b// is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see [[2 #papers]] for details). +The partitioning step works as follows: + + | [figs/brz/img54.png] + | **Figure 2:** Partitioning step. + +Statement 1.1 of the **for** loop presented in Figure 2 +reads sequentially all the keys of block [figs/brz/img55.png] from disk into an internal area +of size [figs/brz/img8.png]. + +Statement 1.2 performs an indirect bucket sort of the keys in block [figs/brz/img55.png] and +at the same time updates the entries in the vector //size//. +Let us briefly describe how [figs/brz/img55.png] is partitioned among +the [figs/brz/img23.png] buckets. +We use a local array of [figs/brz/img23.png] counters to store a +count of how many keys from [figs/brz/img55.png] belong to each bucket. +The pointers to the keys in each bucket //i//, [figs/brz/img47.png], +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +To find the bucket address of a given key +we use the universal hash function [figs/brz/img44.png][[5 #papers]]. +Key //k// goes into bucket //i//, where + + | [figs/brz/img57.png] (1) + +Figure 3(a) shows a //logical// view of the [figs/brz/img23.png] buckets +generated in the partitioning step. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure 3(b). +In the example of Figure 3(b), the keys in bucket 0 +appear in files 1 and //N//, the keys in bucket 1 appear in files 1, 2 +and //N//, and so on. + + | [figs/brz/brz-partitioning.png] + | **Figure 3:** Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view. + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the //N// files in disk +during the searching step. +But, as we show in [[2 #papers]], the number of seeks +can be kept small using buffering techniques. +Considering that only the vector //size//, which has [figs/brz/img23.png] one-byte +entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the //offset// vector and dump it to the disk. +We use the vector //size// to compute the +//offset// displacement vector. +The //offset[i]// entry contains the number of keys +in the buckets //0, 1, ..., i-1//. +As //size[i]// stores the number of keys +in bucket //i//, where [figs/brz/img47.png], we have + + | [figs/brz/img63.png] + +---------------------------------------- + +=== Searching step === + +The searching step is responsible for generating a MPHF for each +bucket. Figure 4 presents the searching step algorithm. + + | [figs/brz/img64.png] + | **Figure 4:** Searching step. + +Statement 1 of Figure 4 inserts one key from each file +in a minimum heap //H// of size //N//. +The order relation in //H// is given by the bucket address //i// given by +Eq. (1). + +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +In statement 2.2, a MPHF is generated for each bucket //i//, as described +in the following. +The description of MPHF[figs/brz/img46.png] is a vector [figs/brz/img66.png] of 8-bit integers. +Finally, statement 2.3 writes the description [figs/brz/img66.png] of MPHF[figs/brz/img46.png] to disk. + +---------------------------------------- + +==== Reading a bucket from disk ==== + +In this section we present the refinement of statement 2.1 of +Figure 4. +The algorithm to read bucket //i// from disk is presented +in Figure 5. + + | [figs/brz/img67.png] + | **Figure 5:** Reading a bucket. + +Bucket //i// is distributed among many files and the heap //H// is used to drive a +multiway merge operation. +In Figure 5, statement 1.1 extracts and removes triple +//(i, j, k)// from //H//, where //i// is a minimum value in //H//. +Statement 1.2 inserts key //k// in bucket //i//. +Notice that the //k// in the triple //(i, j, k)// is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure 4). +Statement 1.3 performs a seek operation in File //j// on disk for the first +read operation and reads sequentially all keys //k// that have the same //i// +and inserts them all in bucket //i//. +Finally, statement 1.4 inserts in //H// the triple //(i, j, x)//, +where //x// is the first key read from File //j// (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in [[2, Section 5.1 #papers]], +where we present a buffering technique that brings down +the time spent with seeks. + +---------------------------------------- + +==== Generating a MPHF for each bucket ==== + +To the best of our knowledge the [BMZ algorithm bmz.html] we have designed in +our previous works [[1,3 #papers]] is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. In reality, we are using +an optimized version of BMZ (BMZ8) for small set of keys (at most 256 keys). +[Click here to see details about BMZ algorithm bmz.html]. + +---------------------------------------- + +==Analysis of the Algorithm== + +Analytical results and the complete analysis of the external memory based algorithm +can be found in [[2 #papers]]. + +---------------------------------------- + +==Experimental Results== + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm ([the BMZ algorithm bmz.html]) +and for our external memory based algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of the external memory based algorithm. + +---------------------------------------- + +===The data and the experimental setup=== + +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + +---------------------------------------- + +===Performance of the BMZ Algorithm=== + +[The BMZ algorithm bmz.html] is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have +the form [figs/brz/img159.png] for an input of //n// keys, +where [figs/brz/img160.png] is some machine dependent +constant that further depends on the length of the keys and //Z// is a random +variable with geometric distribution with mean [figs/brz/img162.png]. All results +in our experiments were obtained taking //c=1//; the value of //c//, with //c// in //[0.93,1.15]//, +in fact has little influence in the runtime, as shown in [[3 #papers]]. + +The values chosen for //n// were 1, 2, 4, 8, 16 and 32 million. +Although we have a dataset with 1 billion URLs, on a PC with +1 gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires //25n + O(1)// bytes for constructing +a MPHF ([click here to get details about the data structures used by the BMZ algorithm bmz.html]). + +In order to estimate the number of trials for each value of //n// we use +a statistical method for determining a suitable sample size (see, e.g., [[6, Chapter 13 #papers]]). +As we obtained different values for each //n//, +we used the maximal value obtained, namely, 300 trials in order to have +a confidence level of 95 %. + + +Table 1 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in [[3 #papers]]. + +%!include(html): ''TABLEBRZ1.t2t'' + | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +---------------------------------------- + +==Papers==[papers] + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], D. Menoti, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A New algorithm for constructing minimal perfect hash functions papers/bmz_tr004_04.ps], Technical Report TR004/04, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [An Approach for Minimal Perfect Hash Functions for Very Large Databases papers/tr06.pdf], Technical Report TR003/06, Department of Computer Science, Federal University of Minas Gerais, 2004. + ++ [F. C. Botelho http://www.dcc.ufmg.br/~fbotelho], Y. Kohayakawa, and [N. Ziviani http://www.dcc.ufmg.br/~nivio]. [A Practical Minimal Perfect Hashing Method papers/wea05.pdf]. //4th International Workshop on efficient and Experimental Algorithms (WEA05),// Springer-Verlag Lecture Notes in Computer Science, vol. 3505, Santorini Island, Greece, May 2005, 488-500. + ++ [M. Seltzer. Beyond relational databases. ACM Queue, 3(3), April 2005. http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=299] + ++ [Bob Jenkins. Algorithm alley: Hash functions. Dr. Dobb's Journal of Software Tools, 22(9), september 1997. http://burtleburtle.net/bob/hash/doobs.html] + ++ R. Jain. The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. John Wiley, first edition, 1991. + + +%!include: ALGORITHMS.t2t + +%!include: FOOTER.t2t diff --git a/CHM.t2t b/CHM.t2t index e3090dc..712723e 100644 --- a/CHM.t2t +++ b/CHM.t2t @@ -81,8 +81,6 @@ Again we have: The Computer Journal, 39(6):547--554, 1996. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/COMPARISON.t2t b/COMPARISON.t2t index 1a6e328..21b3dd1 100644 --- a/COMPARISON.t2t +++ b/COMPARISON.t2t @@ -103,8 +103,7 @@ to [figs/img250.png] seconds for [figs/img6.png]. %!include(html): ''TABLE5.t2t'' | **Table 5:** Time measurements for BMZ tuned algorithm with [figs/img5.png] and [figs/img6.png]. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- + +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/CONCEPTS.t2t b/CONCEPTS.t2t index 49bedde..745a03d 100644 --- a/CONCEPTS.t2t +++ b/CONCEPTS.t2t @@ -49,8 +49,6 @@ languages, reserved words in programming languages or interactive systems, universal resource locations (URLs) in Web search engines, or item sets in data mining techniques. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/FAQ.t2t b/FAQ.t2t index 05ca410..eb11038 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -26,8 +26,6 @@ one is executed? is reset when you call the cmph_config_set_algo function. ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/GPERF.t2t b/GPERF.t2t index 67d5d40..218ce52 100644 --- a/GPERF.t2t +++ b/GPERF.t2t @@ -32,8 +32,6 @@ gperf. The first problem is common in the information retrieval field (e.g. assigning ids to millions of documents), while the former is usually found in the compiler programming area (detect reserved keywords). ----------------------------------------- - | [Home index.html] | [CHM chm.html] | [BMZ bmz.html] ----------------------------------------- +%!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index d51e705..c31a917 100644 --- a/README.t2t +++ b/README.t2t @@ -46,7 +46,12 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast algorithm based on cyclic random graphs to construct minimal perfect hash functions in linear time. The resulting functions are not order preserving and - can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. + can be stored in only //4cn// bytes, where //c// is between 0.93 and 1.15. +%html% - [External Memory Based Algorithm for sets in the order of billion of keys brz.html] +%txt% - BMZ Algorithm. + A very fast external memory based algorithm for constructing minimal perfect hash functions + for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and + can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal diff --git a/TABLEBRZ1.t2t b/TABLEBRZ1.t2t new file mode 100644 index 0000000..e8a021f --- /dev/null +++ b/TABLEBRZ1.t2t @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16 32
+ + Average time (s) $6.1 \pm 0.3$ $12.2 \pm 0.6$ $25.4 \pm 1.1$ $51.4 \pm 2.0$ $117.3 \pm 4.4$ $262.2 \pm 8.7$
+ SD (s) $2.6$ $5.4$ $9.8$ $17.6$ $37.3$ $76.3$
diff --git a/gendocs b/gendocs index 7885281..d38c3db 100755 --- a/gendocs +++ b/gendocs @@ -1,5 +1,6 @@ txt2tags -t html --mask-email -i README.t2t -o index.html txt2tags -t html -i BMZ.t2t -o bmz.html +txt2tags -t html -i BRZ.t2t -o brz.html txt2tags -t html -i CHM.t2t -o chm.html txt2tags -t html -i COMPARISON.t2t -o comparison.html txt2tags -t html -i GPERF.t2t -o gperf.html @@ -8,6 +9,7 @@ txt2tags -t html -i CONCEPTS.t2t -o concepts.html txt2tags -t txt --mask-email -i README.t2t -o README txt2tags -t txt -i BMZ.t2t -o BMZ +txt2tags -t txt -i BRZ.t2t -o BRZ txt2tags -t txt -i CHM.t2t -o CHM txt2tags -t txt -i COMPARISON.t2t -o COMPARISON txt2tags -t txt -i GPERF.t2t -o GPERF From 7522a90f27c65e8a1a5d2612c0aff694dbbf56bd Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 19:34:06 +0000 Subject: [PATCH 285/739] external memory based algorithm documentation updated --- BRZ.t2t | 117 +++++++++++++++++++++++++++++++++++++++- TABLEBRZ2.t2t | 133 +++++++++++++++++++++++++++++++++++++++++++++ TABLEBRZ3.t2t | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 TABLEBRZ2.t2t create mode 100644 TABLEBRZ3.t2t diff --git a/BRZ.t2t b/BRZ.t2t index 250504c..079029a 100644 --- a/BRZ.t2t +++ b/BRZ.t2t @@ -16,7 +16,7 @@ a daily task. For instance, the simple assignment of number identifiers to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working -set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +set of URLs does not fit in main memory anymore[[4 #papers]], the algorithm we propose here to construct MPHFs can easily scale to billions of entries. As there are many applications for MPHFs, it is @@ -301,6 +301,121 @@ as shown in [[3 #papers]]. %!include(html): ''TABLEBRZ1.t2t'' | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. +Figure 6 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given //n// has a considerable +fluctuation. However, the fluctuation also grows linearly with //n//. + + | [figs/brz/bmz_temporegressao.png] + | **Figure 6:** Time versus number of keys in //S// for the internal memory based algorithm. The solid line corresponds to a linear regression model. + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form [figs/brz/img159.png] with //Z// a geometric random variable with +mean //1/p=e//. Thus, the runtime has mean [figs/brz/img181.png] and standard +deviation [figs/brz/img182.png]. +Therefore, the standard deviation also grows +linearly with //n//, as experimentally verified +in Table 1 and in Figure 6. + +---------------------------------------- + +===Performance of the External Memory Based Algorithm=== + +The runtime of the external memory based algorithm is also a random variable, +but now it follows a (highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +[[2, Section 5.1 #papers]]. Therefore, we ran the algorithm for +several numbers //n// of keys in //S//. + +The values chosen for //n// were 1, 2, 4, 8, 16, 32, 64, 128, 512 and 1000 +million. +We limited the main memory in 500 megabytes for the experiments. +The size [figs/brz/img8.png] of the a priori reserved internal memory area +was set to 250 megabytes, the parameter //b// was set to //175// and +the building block algorithm parameter //c// was again set to //1//. +We show later on how [figs/brz/img8.png] affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +to estimate the number of trials to be run for each value of //n//. We got that +just one trial for each //n// would be enough with a confidence level of 95 %. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table 2 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in [[2, Section 5.1 #papers]]. Better still, +it is only approximately 60 % slower than the BMZ algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for the external memory based algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes, +we have brought the time to 3.09 hours. In this case, the external memory based algorithm is +just 34 % slower in this setup. + +%!include(html): ''TABLEBRZ2.t2t'' + | **Table 2:**The external memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +Figure 7 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given //n// has almost no +variation. + + | [figs/brz/brz_temporegressao.png] + | **Figure 7:** Time versus number of keys in //S// for our algorithm. The solid line corresponds to a linear regression model. + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket +//i//, [figs/brz/img47.png], is a small set of keys (at most 256 keys) and, +as argued in last Section, the runtime of the +building block algorithm is a random variable [figs/brz/img207.png] with high fluctuation. +However, the runtime //Y// of the searching step of the external memory based algorithm is given +by [figs/brz/img209.png]. Under the hypothesis that +the [figs/brz/img207.png] are independent and bounded, the {\it law of large numbers} (see, +e.g., [[6 #papers]]) implies that the random variable [figs/brz/img210.png] converges +to a constant as [figs/brz/img83.png]. This explains why the runtime of our +algorithm is almost deterministic. + +---------------------------------------- + +=== Controlling disk accesses === + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter [figs/brz/img8.png] affects the runtime of our algorithm. +For that we fixed //n// in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used [figs/brz/img8.png] equal to 100, 200, 300, 400, 500 and 600 +megabytes. + +Table 3 presents the number of files //N//, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in [[2, Section 5.1 #papers]], and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table 3 we noticed that the time spent in the construction +decreases as the value of [figs/brz/img8.png] increases. However, for [figs/brz/img213.png], the variation +on the time is not as significant as for [figs/brz/img214.png]. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies for avoiding seeks and diminishing the average seek time +(see [http://www.linuxjournal.com/article/6931 http://www.linuxjournal.com/article/6931]). + +%!include(html): ''TABLEBRZ3.t2t'' + | **Table 3:**Influence of the internal memory area size ([figs/brz/img8.png]) in the external memory based algorithm runtime. + + ---------------------------------------- ==Papers==[papers] diff --git a/TABLEBRZ2.t2t b/TABLEBRZ2.t2t new file mode 100644 index 0000000..a72094c --- /dev/null +++ b/TABLEBRZ2.t2t @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16
+ Average time (s) $6.9 \pm 0.3$ $13.8 \pm 0.2$ $31.9 \pm 0.7$ $69.9 \pm 1.1$ $140.6 \pm 2.5$
+ SD $0.4$ $0.2$ $0.9$ $1.5$ $3.5$
+ + $n$ (millions) 32 64 128 512 1000
+ Average time (s) $284.3 \pm 1.1$ $587.9 \pm 3.9$ + $1223.6 \pm 4.9$ + $5966.4 \pm 9.5$ + $13229.5 \pm 12.7$
+ SD $1.6$ $5.5$ $6.8$ $13.2$ $18.6$
diff --git a/TABLEBRZ3.t2t b/TABLEBRZ3.t2t new file mode 100644 index 0000000..516dcab --- /dev/null +++ b/TABLEBRZ3.t2t @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$\mu $ (MB) $100$ $200$ $300$ $400$ $500$ $600$
+ + $N$ (files) $619$ $310$ $207$ $155$ $124$ $104$
+  (buffer size in KB) $165$ $661$ $1,484$ $2,643$ $4,129$ $5,908$
+ $\beta$/ (# of seeks in the worst case) $384,478$ $95,974$ $42,749$ $24,003$ $15,365$ $10,738$
+ Time (hours) $4.04$ $3.64$ $3.34$ $3.20$ $3.13$ $3.09$
From 1acdcba4b745a01f5b3a5b39a828aa2295a938b3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 19:34:06 +0000 Subject: [PATCH 286/739] external memory based algorithm documentation updated --- BRZ.t2t | 117 +++++++++++++++++++++++++++++++++++++++- TABLEBRZ2.t2t | 133 +++++++++++++++++++++++++++++++++++++++++++++ TABLEBRZ3.t2t | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 TABLEBRZ2.t2t create mode 100644 TABLEBRZ3.t2t diff --git a/BRZ.t2t b/BRZ.t2t index 250504c..079029a 100644 --- a/BRZ.t2t +++ b/BRZ.t2t @@ -16,7 +16,7 @@ a daily task. For instance, the simple assignment of number identifiers to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working -set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +set of URLs does not fit in main memory anymore[[4 #papers]], the algorithm we propose here to construct MPHFs can easily scale to billions of entries. As there are many applications for MPHFs, it is @@ -301,6 +301,121 @@ as shown in [[3 #papers]]. %!include(html): ''TABLEBRZ1.t2t'' | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. +Figure 6 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given //n// has a considerable +fluctuation. However, the fluctuation also grows linearly with //n//. + + | [figs/brz/bmz_temporegressao.png] + | **Figure 6:** Time versus number of keys in //S// for the internal memory based algorithm. The solid line corresponds to a linear regression model. + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form [figs/brz/img159.png] with //Z// a geometric random variable with +mean //1/p=e//. Thus, the runtime has mean [figs/brz/img181.png] and standard +deviation [figs/brz/img182.png]. +Therefore, the standard deviation also grows +linearly with //n//, as experimentally verified +in Table 1 and in Figure 6. + +---------------------------------------- + +===Performance of the External Memory Based Algorithm=== + +The runtime of the external memory based algorithm is also a random variable, +but now it follows a (highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +[[2, Section 5.1 #papers]]. Therefore, we ran the algorithm for +several numbers //n// of keys in //S//. + +The values chosen for //n// were 1, 2, 4, 8, 16, 32, 64, 128, 512 and 1000 +million. +We limited the main memory in 500 megabytes for the experiments. +The size [figs/brz/img8.png] of the a priori reserved internal memory area +was set to 250 megabytes, the parameter //b// was set to //175// and +the building block algorithm parameter //c// was again set to //1//. +We show later on how [figs/brz/img8.png] affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +to estimate the number of trials to be run for each value of //n//. We got that +just one trial for each //n// would be enough with a confidence level of 95 %. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table 2 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in [[2, Section 5.1 #papers]]. Better still, +it is only approximately 60 % slower than the BMZ algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for the external memory based algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes, +we have brought the time to 3.09 hours. In this case, the external memory based algorithm is +just 34 % slower in this setup. + +%!include(html): ''TABLEBRZ2.t2t'' + | **Table 2:**The external memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +Figure 7 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given //n// has almost no +variation. + + | [figs/brz/brz_temporegressao.png] + | **Figure 7:** Time versus number of keys in //S// for our algorithm. The solid line corresponds to a linear regression model. + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket +//i//, [figs/brz/img47.png], is a small set of keys (at most 256 keys) and, +as argued in last Section, the runtime of the +building block algorithm is a random variable [figs/brz/img207.png] with high fluctuation. +However, the runtime //Y// of the searching step of the external memory based algorithm is given +by [figs/brz/img209.png]. Under the hypothesis that +the [figs/brz/img207.png] are independent and bounded, the {\it law of large numbers} (see, +e.g., [[6 #papers]]) implies that the random variable [figs/brz/img210.png] converges +to a constant as [figs/brz/img83.png]. This explains why the runtime of our +algorithm is almost deterministic. + +---------------------------------------- + +=== Controlling disk accesses === + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter [figs/brz/img8.png] affects the runtime of our algorithm. +For that we fixed //n// in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used [figs/brz/img8.png] equal to 100, 200, 300, 400, 500 and 600 +megabytes. + +Table 3 presents the number of files //N//, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in [[2, Section 5.1 #papers]], and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table 3 we noticed that the time spent in the construction +decreases as the value of [figs/brz/img8.png] increases. However, for [figs/brz/img213.png], the variation +on the time is not as significant as for [figs/brz/img214.png]. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies for avoiding seeks and diminishing the average seek time +(see [http://www.linuxjournal.com/article/6931 http://www.linuxjournal.com/article/6931]). + +%!include(html): ''TABLEBRZ3.t2t'' + | **Table 3:**Influence of the internal memory area size ([figs/brz/img8.png]) in the external memory based algorithm runtime. + + ---------------------------------------- ==Papers==[papers] diff --git a/TABLEBRZ2.t2t b/TABLEBRZ2.t2t new file mode 100644 index 0000000..a72094c --- /dev/null +++ b/TABLEBRZ2.t2t @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16
+ Average time (s) $6.9 \pm 0.3$ $13.8 \pm 0.2$ $31.9 \pm 0.7$ $69.9 \pm 1.1$ $140.6 \pm 2.5$
+ SD $0.4$ $0.2$ $0.9$ $1.5$ $3.5$
+ + $n$ (millions) 32 64 128 512 1000
+ Average time (s) $284.3 \pm 1.1$ $587.9 \pm 3.9$ + $1223.6 \pm 4.9$ + $5966.4 \pm 9.5$ + $13229.5 \pm 12.7$
+ SD $1.6$ $5.5$ $6.8$ $13.2$ $18.6$
diff --git a/TABLEBRZ3.t2t b/TABLEBRZ3.t2t new file mode 100644 index 0000000..516dcab --- /dev/null +++ b/TABLEBRZ3.t2t @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$\mu $ (MB) $100$ $200$ $300$ $400$ $500$ $600$
+ + $N$ (files) $619$ $310$ $207$ $155$ $124$ $104$
+  (buffer size in KB) $165$ $661$ $1,484$ $2,643$ $4,129$ $5,908$
+ $\beta$/ (# of seeks in the worst case) $384,478$ $95,974$ $42,749$ $24,003$ $15,365$ $10,738$
+ Time (hours) $4.04$ $3.64$ $3.34$ $3.20$ $3.13$ $3.09$
From 7e37e5009ee401cfd942893ea627e7323dde2cb2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 19:34:06 +0000 Subject: [PATCH 287/739] external memory based algorithm documentation updated --- BRZ.t2t | 117 +++++++++++++++++++++++++++++++++++++++- TABLEBRZ2.t2t | 133 +++++++++++++++++++++++++++++++++++++++++++++ TABLEBRZ3.t2t | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 TABLEBRZ2.t2t create mode 100644 TABLEBRZ3.t2t diff --git a/BRZ.t2t b/BRZ.t2t index 250504c..079029a 100644 --- a/BRZ.t2t +++ b/BRZ.t2t @@ -16,7 +16,7 @@ a daily task. For instance, the simple assignment of number identifiers to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working -set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +set of URLs does not fit in main memory anymore[[4 #papers]], the algorithm we propose here to construct MPHFs can easily scale to billions of entries. As there are many applications for MPHFs, it is @@ -301,6 +301,121 @@ as shown in [[3 #papers]]. %!include(html): ''TABLEBRZ1.t2t'' | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. +Figure 6 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given //n// has a considerable +fluctuation. However, the fluctuation also grows linearly with //n//. + + | [figs/brz/bmz_temporegressao.png] + | **Figure 6:** Time versus number of keys in //S// for the internal memory based algorithm. The solid line corresponds to a linear regression model. + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form [figs/brz/img159.png] with //Z// a geometric random variable with +mean //1/p=e//. Thus, the runtime has mean [figs/brz/img181.png] and standard +deviation [figs/brz/img182.png]. +Therefore, the standard deviation also grows +linearly with //n//, as experimentally verified +in Table 1 and in Figure 6. + +---------------------------------------- + +===Performance of the External Memory Based Algorithm=== + +The runtime of the external memory based algorithm is also a random variable, +but now it follows a (highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +[[2, Section 5.1 #papers]]. Therefore, we ran the algorithm for +several numbers //n// of keys in //S//. + +The values chosen for //n// were 1, 2, 4, 8, 16, 32, 64, 128, 512 and 1000 +million. +We limited the main memory in 500 megabytes for the experiments. +The size [figs/brz/img8.png] of the a priori reserved internal memory area +was set to 250 megabytes, the parameter //b// was set to //175// and +the building block algorithm parameter //c// was again set to //1//. +We show later on how [figs/brz/img8.png] affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +to estimate the number of trials to be run for each value of //n//. We got that +just one trial for each //n// would be enough with a confidence level of 95 %. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table 2 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in [[2, Section 5.1 #papers]]. Better still, +it is only approximately 60 % slower than the BMZ algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for the external memory based algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes, +we have brought the time to 3.09 hours. In this case, the external memory based algorithm is +just 34 % slower in this setup. + +%!include(html): ''TABLEBRZ2.t2t'' + | **Table 2:**The external memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +Figure 7 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given //n// has almost no +variation. + + | [figs/brz/brz_temporegressao.png] + | **Figure 7:** Time versus number of keys in //S// for our algorithm. The solid line corresponds to a linear regression model. + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket +//i//, [figs/brz/img47.png], is a small set of keys (at most 256 keys) and, +as argued in last Section, the runtime of the +building block algorithm is a random variable [figs/brz/img207.png] with high fluctuation. +However, the runtime //Y// of the searching step of the external memory based algorithm is given +by [figs/brz/img209.png]. Under the hypothesis that +the [figs/brz/img207.png] are independent and bounded, the {\it law of large numbers} (see, +e.g., [[6 #papers]]) implies that the random variable [figs/brz/img210.png] converges +to a constant as [figs/brz/img83.png]. This explains why the runtime of our +algorithm is almost deterministic. + +---------------------------------------- + +=== Controlling disk accesses === + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter [figs/brz/img8.png] affects the runtime of our algorithm. +For that we fixed //n// in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used [figs/brz/img8.png] equal to 100, 200, 300, 400, 500 and 600 +megabytes. + +Table 3 presents the number of files //N//, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in [[2, Section 5.1 #papers]], and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table 3 we noticed that the time spent in the construction +decreases as the value of [figs/brz/img8.png] increases. However, for [figs/brz/img213.png], the variation +on the time is not as significant as for [figs/brz/img214.png]. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies for avoiding seeks and diminishing the average seek time +(see [http://www.linuxjournal.com/article/6931 http://www.linuxjournal.com/article/6931]). + +%!include(html): ''TABLEBRZ3.t2t'' + | **Table 3:**Influence of the internal memory area size ([figs/brz/img8.png]) in the external memory based algorithm runtime. + + ---------------------------------------- ==Papers==[papers] diff --git a/TABLEBRZ2.t2t b/TABLEBRZ2.t2t new file mode 100644 index 0000000..a72094c --- /dev/null +++ b/TABLEBRZ2.t2t @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16
+ Average time (s) $6.9 \pm 0.3$ $13.8 \pm 0.2$ $31.9 \pm 0.7$ $69.9 \pm 1.1$ $140.6 \pm 2.5$
+ SD $0.4$ $0.2$ $0.9$ $1.5$ $3.5$
+ + $n$ (millions) 32 64 128 512 1000
+ Average time (s) $284.3 \pm 1.1$ $587.9 \pm 3.9$ + $1223.6 \pm 4.9$ + $5966.4 \pm 9.5$ + $13229.5 \pm 12.7$
+ SD $1.6$ $5.5$ $6.8$ $13.2$ $18.6$
diff --git a/TABLEBRZ3.t2t b/TABLEBRZ3.t2t new file mode 100644 index 0000000..516dcab --- /dev/null +++ b/TABLEBRZ3.t2t @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$\mu $ (MB) $100$ $200$ $300$ $400$ $500$ $600$
+ + $N$ (files) $619$ $310$ $207$ $155$ $124$ $104$
+  (buffer size in KB) $165$ $661$ $1,484$ $2,643$ $4,129$ $5,908$
+ $\beta$/ (# of seeks in the worst case) $384,478$ $95,974$ $42,749$ $24,003$ $15,365$ $10,738$
+ Time (hours) $4.04$ $3.64$ $3.34$ $3.20$ $3.13$ $3.09$
From 8673ed16e19edaf6bdef1ebf158d501270ae4c04 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Tue, 25 Apr 2006 19:34:06 +0000 Subject: [PATCH 288/739] external memory based algorithm documentation updated --- BRZ.t2t | 117 +++++++++++++++++++++++++++++++++++++++- TABLEBRZ2.t2t | 133 +++++++++++++++++++++++++++++++++++++++++++++ TABLEBRZ3.t2t | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 TABLEBRZ2.t2t create mode 100644 TABLEBRZ3.t2t diff --git a/BRZ.t2t b/BRZ.t2t index 250504c..079029a 100644 --- a/BRZ.t2t +++ b/BRZ.t2t @@ -16,7 +16,7 @@ a daily task. For instance, the simple assignment of number identifiers to web pages of a collection can be a challenging task. While traditional databases simply cannot handle more traffic once the working -set of URLs does not fit in main memory anymorei[[4 #papers]], the algorithm we propose here to +set of URLs does not fit in main memory anymore[[4 #papers]], the algorithm we propose here to construct MPHFs can easily scale to billions of entries. As there are many applications for MPHFs, it is @@ -301,6 +301,121 @@ as shown in [[3 #papers]]. %!include(html): ''TABLEBRZ1.t2t'' | **Table 1:** Internal memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. +Figure 6 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given //n// has a considerable +fluctuation. However, the fluctuation also grows linearly with //n//. + + | [figs/brz/bmz_temporegressao.png] + | **Figure 6:** Time versus number of keys in //S// for the internal memory based algorithm. The solid line corresponds to a linear regression model. + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form [figs/brz/img159.png] with //Z// a geometric random variable with +mean //1/p=e//. Thus, the runtime has mean [figs/brz/img181.png] and standard +deviation [figs/brz/img182.png]. +Therefore, the standard deviation also grows +linearly with //n//, as experimentally verified +in Table 1 and in Figure 6. + +---------------------------------------- + +===Performance of the External Memory Based Algorithm=== + +The runtime of the external memory based algorithm is also a random variable, +but now it follows a (highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +[[2, Section 5.1 #papers]]. Therefore, we ran the algorithm for +several numbers //n// of keys in //S//. + +The values chosen for //n// were 1, 2, 4, 8, 16, 32, 64, 128, 512 and 1000 +million. +We limited the main memory in 500 megabytes for the experiments. +The size [figs/brz/img8.png] of the a priori reserved internal memory area +was set to 250 megabytes, the parameter //b// was set to //175// and +the building block algorithm parameter //c// was again set to //1//. +We show later on how [figs/brz/img8.png] affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +to estimate the number of trials to be run for each value of //n//. We got that +just one trial for each //n// would be enough with a confidence level of 95 %. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table 2 presents the runtime average for each //n//, +the respective standard deviations, and +the respective confidence intervals given by +the average time [figs/brz/img167.png] the distance from average time +considering a confidence level of 95 %. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in [[2, Section 5.1 #papers]]. Better still, +it is only approximately 60 % slower than the BMZ algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for the external memory based algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes, +we have brought the time to 3.09 hours. In this case, the external memory based algorithm is +just 34 % slower in this setup. + +%!include(html): ''TABLEBRZ2.t2t'' + | **Table 2:**The external memory based algorithm: average time in seconds for constructing a MPHF, the standard deviation (SD), and the confidence intervals considering a confidence level of 95 %. + +Figure 7 presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given //n// has almost no +variation. + + | [figs/brz/brz_temporegressao.png] + | **Figure 7:** Time versus number of keys in //S// for our algorithm. The solid line corresponds to a linear regression model. + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket +//i//, [figs/brz/img47.png], is a small set of keys (at most 256 keys) and, +as argued in last Section, the runtime of the +building block algorithm is a random variable [figs/brz/img207.png] with high fluctuation. +However, the runtime //Y// of the searching step of the external memory based algorithm is given +by [figs/brz/img209.png]. Under the hypothesis that +the [figs/brz/img207.png] are independent and bounded, the {\it law of large numbers} (see, +e.g., [[6 #papers]]) implies that the random variable [figs/brz/img210.png] converges +to a constant as [figs/brz/img83.png]. This explains why the runtime of our +algorithm is almost deterministic. + +---------------------------------------- + +=== Controlling disk accesses === + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter [figs/brz/img8.png] affects the runtime of our algorithm. +For that we fixed //n// in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used [figs/brz/img8.png] equal to 100, 200, 300, 400, 500 and 600 +megabytes. + +Table 3 presents the number of files //N//, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in [[2, Section 5.1 #papers]], and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table 3 we noticed that the time spent in the construction +decreases as the value of [figs/brz/img8.png] increases. However, for [figs/brz/img213.png], the variation +on the time is not as significant as for [figs/brz/img214.png]. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies for avoiding seeks and diminishing the average seek time +(see [http://www.linuxjournal.com/article/6931 http://www.linuxjournal.com/article/6931]). + +%!include(html): ''TABLEBRZ3.t2t'' + | **Table 3:**Influence of the internal memory area size ([figs/brz/img8.png]) in the external memory based algorithm runtime. + + ---------------------------------------- ==Papers==[papers] diff --git a/TABLEBRZ2.t2t b/TABLEBRZ2.t2t new file mode 100644 index 0000000..a72094c --- /dev/null +++ b/TABLEBRZ2.t2t @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$n$ (millions) 1 2 4 8 16
+ Average time (s) $6.9 \pm 0.3$ $13.8 \pm 0.2$ $31.9 \pm 0.7$ $69.9 \pm 1.1$ $140.6 \pm 2.5$
+ SD $0.4$ $0.2$ $0.9$ $1.5$ $3.5$
+ + $n$ (millions) 32 64 128 512 1000
+ Average time (s) $284.3 \pm 1.1$ $587.9 \pm 3.9$ + $1223.6 \pm 4.9$ + $5966.4 \pm 9.5$ + $13229.5 \pm 12.7$
+ SD $1.6$ $5.5$ $6.8$ $13.2$ $18.6$
diff --git a/TABLEBRZ3.t2t b/TABLEBRZ3.t2t new file mode 100644 index 0000000..516dcab --- /dev/null +++ b/TABLEBRZ3.t2t @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+$\mu $ (MB) $100$ $200$ $300$ $400$ $500$ $600$
+ + $N$ (files) $619$ $310$ $207$ $155$ $124$ $104$
+  (buffer size in KB) $165$ $661$ $1,484$ $2,643$ $4,129$ $5,908$
+ $\beta$/ (# of seeks in the worst case) $384,478$ $95,974$ $42,749$ $24,003$ $15,365$ $10,738$
+ Time (hours) $4.04$ $3.64$ $3.34$ $3.20$ $3.13$ $3.09$
From a73afcb8c21ce9309f97ae248fa55067f214afd2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 26 Apr 2006 17:59:34 +0000 Subject: [PATCH 289/739] Makefile.am and configure.ac updated --- BMZ.t2t | 2 +- configure.ac | 2 +- src/Makefile.am | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 23700c8..72921a6 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -39,7 +39,7 @@ minimal perfect hash functions had been designed. We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho, David **M**enoti and Nivio **Z**iviani. The algorithm is described in [[1 #papers]]. To analyse BMZ algorithm we needed some results from the random graph theory, so -we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. +we invited professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. The final description and analysis of BMZ algorithm is presented in [[2 #papers]]. ---------------------------------------- diff --git a/configure.ac b/configure.ac index 31aa872..5a27c37 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.4) +AM_INIT_AUTOMAKE(cmph, 0.5) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..386e68d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = util.h debug.h\ +libcmph_la_SOURCES = debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ From d5bfc912893f3ea02ce08aba06f73381517a0a39 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 26 Apr 2006 17:59:34 +0000 Subject: [PATCH 290/739] Makefile.am and configure.ac updated --- BMZ.t2t | 2 +- configure.ac | 2 +- src/Makefile.am | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 23700c8..72921a6 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -39,7 +39,7 @@ minimal perfect hash functions had been designed. We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho, David **M**enoti and Nivio **Z**iviani. The algorithm is described in [[1 #papers]]. To analyse BMZ algorithm we needed some results from the random graph theory, so -we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. +we invited professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. The final description and analysis of BMZ algorithm is presented in [[2 #papers]]. ---------------------------------------- diff --git a/configure.ac b/configure.ac index 31aa872..5a27c37 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.4) +AM_INIT_AUTOMAKE(cmph, 0.5) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..386e68d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = util.h debug.h\ +libcmph_la_SOURCES = debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ From dcba8ec14fcb9dcb91e8e929676681ffe6567c8e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 26 Apr 2006 17:59:34 +0000 Subject: [PATCH 291/739] Makefile.am and configure.ac updated --- BMZ.t2t | 2 +- configure.ac | 2 +- src/Makefile.am | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 23700c8..72921a6 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -39,7 +39,7 @@ minimal perfect hash functions had been designed. We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho, David **M**enoti and Nivio **Z**iviani. The algorithm is described in [[1 #papers]]. To analyse BMZ algorithm we needed some results from the random graph theory, so -we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. +we invited professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. The final description and analysis of BMZ algorithm is presented in [[2 #papers]]. ---------------------------------------- diff --git a/configure.ac b/configure.ac index 31aa872..5a27c37 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.4) +AM_INIT_AUTOMAKE(cmph, 0.5) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..386e68d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = util.h debug.h\ +libcmph_la_SOURCES = debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ From 9eccc3d4e50533e5a7cd1c6d86b089443bc2f225 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 26 Apr 2006 17:59:34 +0000 Subject: [PATCH 292/739] Makefile.am and configure.ac updated --- BMZ.t2t | 2 +- configure.ac | 2 +- src/Makefile.am | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BMZ.t2t b/BMZ.t2t index 23700c8..72921a6 100644 --- a/BMZ.t2t +++ b/BMZ.t2t @@ -39,7 +39,7 @@ minimal perfect hash functions had been designed. We refer the algorithm to as **BMZ**, because it was conceived by Fabiano C. **B**otelho, David **M**enoti and Nivio **Z**iviani. The algorithm is described in [[1 #papers]]. To analyse BMZ algorithm we needed some results from the random graph theory, so -we invite professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. +we invited professor [Yoshiharu Kohayakawa http://www.ime.usp.br/~yoshi] to help us. The final description and analysis of BMZ algorithm is presented in [[2 #papers]]. ---------------------------------------- diff --git a/configure.ac b/configure.ac index 31aa872..5a27c37 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) -AM_INIT_AUTOMAKE(cmph, 0.4) +AM_INIT_AUTOMAKE(cmph, 0.5) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/src/Makefile.am b/src/Makefile.am index 6eb41d8..386e68d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = cmph lib_LTLIBRARIES = libcmph.la include_HEADERS = cmph.h cmph_types.h -libcmph_la_SOURCES = util.h debug.h\ +libcmph_la_SOURCES = debug.h\ bitbool.h bitbool.c\ cmph_types.h\ hash.h hash_state.h hash.c\ From 9551495b0280ee8dd9226dd0d4d8dd03af30bb10 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Apr 2006 17:30:19 +0000 Subject: [PATCH 293/739] compilation errors corrected and license updated to MOZILLA PUBLIC LICENSE --- COPYING | 701 ++++++++++++++++++++-------------- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 4 +- src/bmz.c | 2 +- src/bmz8.c | 2 +- src/brz.c | 23 -- src/chm.c | 2 +- src/djb2_hash.c | 2 +- src/main.c | 4 +- src/sdbm_hash.c | 2 +- 10 files changed, 425 insertions(+), 319 deletions(-) diff --git a/COPYING b/COPYING index 60549be..06f9651 100644 --- a/COPYING +++ b/COPYING @@ -1,340 +1,469 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + MOZILLA PUBLIC LICENSE + Version 1.1 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + --------------- - Preamble +1. Definitions. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. - 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 -this service 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. + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + 1.5. "Executable" means Covered Code in any form other than Source + Code. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 1.8. "License" means this document. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + B. Any new file that contains any part of the Original Code or + previous Modifications. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. +2. Source Code License. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +3. Distribution Obligations. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. - NO WARRANTY + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs +4. Inability to Comply Due to Statute or Regulation. - 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. + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. +5. Application of this License. - - Copyright (C) 19yy + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. - 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 2 of the License, or - (at your option) any later version. +6. Versions of the License. - 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. + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) -Also add information on how to contact you by electronic and paper mail. +7. DISCLAIMER OF WARRANTY. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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. +8. TERMINATION. -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. - , 1 April 1989 - Ty Coon, President of Vice + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. -This 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 Library General -Public License instead of this License. + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 92a9770..3dce39e 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -1,6 +1,6 @@ #include #include - +#include // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) { diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 3e0bd85..da944e4 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -1,5 +1,5 @@ #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) { @@ -8,7 +8,7 @@ int main(int argc, char **argv) "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); diff --git a/src/bmz.c b/src/bmz.c index be31b1a..683aeb2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -130,7 +130,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz->n/8 + 1); memset(visited, 0, bmz->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); diff --git a/src/bmz8.c b/src/bmz8.c index 0ebb3ce..e8128d2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -137,7 +137,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz8->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz8->n/8 + 1); memset(visited, 0, bmz8->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); diff --git a/src/brz.c b/src/brz.c index c5936d7..2068cee 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,10 +19,8 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -449,26 +447,6 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static char * brz_read_key(FILE * fd) -{ - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - fread(&c, sizeof(char), 1, fd); - if(feof(fd)) - { - free(buf); - return NULL; - } - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } - return buf; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; @@ -477,7 +455,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { - cmph_uint32 i; cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; char * bufh1 = NULL; diff --git a/src/chm.c b/src/chm.c index 7feec29..908c3d3 100644 --- a/src/chm.c +++ b/src/chm.c @@ -106,7 +106,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); + visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); chm->g = malloc(chm->n * sizeof(cmph_uint32)); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 923bbd8..d3b4330 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -16,7 +16,7 @@ void djb2_state_destroy(djb2_state_t *state) cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 5381; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while (i < keylen) { diff --git a/src/main.c b/src/main.c index 4db2104..e381b29 100644 --- a/src/main.c +++ b/src/main.c @@ -64,7 +64,7 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - cmph_uint8 * tmp_dir = NULL; + char * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; cmph_uint32 b = 128; @@ -226,7 +226,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); - cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_tmp_dir(config, (cmph_uint8 *) tmp_dir); cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index b854478..2f706c9 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -16,7 +16,7 @@ void sdbm_state_destroy(sdbm_state_t *state) cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 0; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while(i < keylen) { From 1643b7400bbb203fade63e61b25ed95bfea3e1b5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Apr 2006 17:30:19 +0000 Subject: [PATCH 294/739] compilation errors corrected and license updated to MOZILLA PUBLIC LICENSE --- COPYING | 701 ++++++++++++++++++++-------------- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 4 +- src/bmz.c | 2 +- src/bmz8.c | 2 +- src/brz.c | 23 -- src/chm.c | 2 +- src/djb2_hash.c | 2 +- src/main.c | 4 +- src/sdbm_hash.c | 2 +- 10 files changed, 425 insertions(+), 319 deletions(-) diff --git a/COPYING b/COPYING index 60549be..06f9651 100644 --- a/COPYING +++ b/COPYING @@ -1,340 +1,469 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + MOZILLA PUBLIC LICENSE + Version 1.1 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + --------------- - Preamble +1. Definitions. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. - 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 -this service 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. + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + 1.5. "Executable" means Covered Code in any form other than Source + Code. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 1.8. "License" means this document. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + B. Any new file that contains any part of the Original Code or + previous Modifications. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. +2. Source Code License. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +3. Distribution Obligations. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. - NO WARRANTY + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs +4. Inability to Comply Due to Statute or Regulation. - 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. + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. +5. Application of this License. - - Copyright (C) 19yy + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. - 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 2 of the License, or - (at your option) any later version. +6. Versions of the License. - 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. + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) -Also add information on how to contact you by electronic and paper mail. +7. DISCLAIMER OF WARRANTY. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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. +8. TERMINATION. -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. - , 1 April 1989 - Ty Coon, President of Vice + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. -This 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 Library General -Public License instead of this License. + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 92a9770..3dce39e 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -1,6 +1,6 @@ #include #include - +#include // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) { diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 3e0bd85..da944e4 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -1,5 +1,5 @@ #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) { @@ -8,7 +8,7 @@ int main(int argc, char **argv) "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); diff --git a/src/bmz.c b/src/bmz.c index be31b1a..683aeb2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -130,7 +130,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz->n/8 + 1); memset(visited, 0, bmz->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); diff --git a/src/bmz8.c b/src/bmz8.c index 0ebb3ce..e8128d2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -137,7 +137,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz8->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz8->n/8 + 1); memset(visited, 0, bmz8->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); diff --git a/src/brz.c b/src/brz.c index c5936d7..2068cee 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,10 +19,8 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -449,26 +447,6 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static char * brz_read_key(FILE * fd) -{ - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - fread(&c, sizeof(char), 1, fd); - if(feof(fd)) - { - free(buf); - return NULL; - } - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } - return buf; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; @@ -477,7 +455,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { - cmph_uint32 i; cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; char * bufh1 = NULL; diff --git a/src/chm.c b/src/chm.c index 7feec29..908c3d3 100644 --- a/src/chm.c +++ b/src/chm.c @@ -106,7 +106,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); + visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); chm->g = malloc(chm->n * sizeof(cmph_uint32)); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 923bbd8..d3b4330 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -16,7 +16,7 @@ void djb2_state_destroy(djb2_state_t *state) cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 5381; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while (i < keylen) { diff --git a/src/main.c b/src/main.c index 4db2104..e381b29 100644 --- a/src/main.c +++ b/src/main.c @@ -64,7 +64,7 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - cmph_uint8 * tmp_dir = NULL; + char * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; cmph_uint32 b = 128; @@ -226,7 +226,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); - cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_tmp_dir(config, (cmph_uint8 *) tmp_dir); cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index b854478..2f706c9 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -16,7 +16,7 @@ void sdbm_state_destroy(sdbm_state_t *state) cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 0; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while(i < keylen) { From 6002eb7693a2cf1ad6ae2228feac2f9913c34d48 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Apr 2006 17:30:19 +0000 Subject: [PATCH 295/739] compilation errors corrected and license updated to MOZILLA PUBLIC LICENSE --- COPYING | 701 ++++++++++++++++++++-------------- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 4 +- src/bmz.c | 2 +- src/bmz8.c | 2 +- src/brz.c | 23 -- src/chm.c | 2 +- src/djb2_hash.c | 2 +- src/main.c | 4 +- src/sdbm_hash.c | 2 +- 10 files changed, 425 insertions(+), 319 deletions(-) diff --git a/COPYING b/COPYING index 60549be..06f9651 100644 --- a/COPYING +++ b/COPYING @@ -1,340 +1,469 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + MOZILLA PUBLIC LICENSE + Version 1.1 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + --------------- - Preamble +1. Definitions. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. - 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 -this service 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. + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + 1.5. "Executable" means Covered Code in any form other than Source + Code. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 1.8. "License" means this document. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + B. Any new file that contains any part of the Original Code or + previous Modifications. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. +2. Source Code License. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +3. Distribution Obligations. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. - NO WARRANTY + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs +4. Inability to Comply Due to Statute or Regulation. - 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. + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. +5. Application of this License. - - Copyright (C) 19yy + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. - 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 2 of the License, or - (at your option) any later version. +6. Versions of the License. - 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. + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) -Also add information on how to contact you by electronic and paper mail. +7. DISCLAIMER OF WARRANTY. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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. +8. TERMINATION. -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. - , 1 April 1989 - Ty Coon, President of Vice + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. -This 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 Library General -Public License instead of this License. + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 92a9770..3dce39e 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -1,6 +1,6 @@ #include #include - +#include // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) { diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 3e0bd85..da944e4 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -1,5 +1,5 @@ #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) { @@ -8,7 +8,7 @@ int main(int argc, char **argv) "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); diff --git a/src/bmz.c b/src/bmz.c index be31b1a..683aeb2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -130,7 +130,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz->n/8 + 1); memset(visited, 0, bmz->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); diff --git a/src/bmz8.c b/src/bmz8.c index 0ebb3ce..e8128d2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -137,7 +137,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz8->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz8->n/8 + 1); memset(visited, 0, bmz8->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); diff --git a/src/brz.c b/src/brz.c index c5936d7..2068cee 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,10 +19,8 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -449,26 +447,6 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static char * brz_read_key(FILE * fd) -{ - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - fread(&c, sizeof(char), 1, fd); - if(feof(fd)) - { - free(buf); - return NULL; - } - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } - return buf; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; @@ -477,7 +455,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { - cmph_uint32 i; cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; char * bufh1 = NULL; diff --git a/src/chm.c b/src/chm.c index 7feec29..908c3d3 100644 --- a/src/chm.c +++ b/src/chm.c @@ -106,7 +106,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); + visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); chm->g = malloc(chm->n * sizeof(cmph_uint32)); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 923bbd8..d3b4330 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -16,7 +16,7 @@ void djb2_state_destroy(djb2_state_t *state) cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 5381; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while (i < keylen) { diff --git a/src/main.c b/src/main.c index 4db2104..e381b29 100644 --- a/src/main.c +++ b/src/main.c @@ -64,7 +64,7 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - cmph_uint8 * tmp_dir = NULL; + char * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; cmph_uint32 b = 128; @@ -226,7 +226,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); - cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_tmp_dir(config, (cmph_uint8 *) tmp_dir); cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index b854478..2f706c9 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -16,7 +16,7 @@ void sdbm_state_destroy(sdbm_state_t *state) cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 0; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while(i < keylen) { From 09ef0957fcf0b4d239f232fb4ca8c7ab7766b521 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Apr 2006 17:30:19 +0000 Subject: [PATCH 296/739] compilation errors corrected and license updated to MOZILLA PUBLIC LICENSE --- COPYING | 701 ++++++++++++++++++++-------------- examples/file_adapter_ex2.c | 2 +- examples/vector_adapter_ex1.c | 4 +- src/bmz.c | 2 +- src/bmz8.c | 2 +- src/brz.c | 23 -- src/chm.c | 2 +- src/djb2_hash.c | 2 +- src/main.c | 4 +- src/sdbm_hash.c | 2 +- 10 files changed, 425 insertions(+), 319 deletions(-) diff --git a/COPYING b/COPYING index 60549be..06f9651 100644 --- a/COPYING +++ b/COPYING @@ -1,340 +1,469 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + MOZILLA PUBLIC LICENSE + Version 1.1 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + --------------- - Preamble +1. Definitions. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. - 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 -this service 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. + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + 1.5. "Executable" means Covered Code in any form other than Source + Code. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 1.8. "License" means this document. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + B. Any new file that contains any part of the Original Code or + previous Modifications. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. +2. Source Code License. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +3. Distribution Obligations. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. - 9. The Free Software Foundation may publish revised and/or new versions -of the 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. + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. - NO WARRANTY + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs +4. Inability to Comply Due to Statute or Regulation. - 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. + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. +5. Application of this License. - - Copyright (C) 19yy + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. - 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 2 of the License, or - (at your option) any later version. +6. Versions of the License. - 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. + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) -Also add information on how to contact you by electronic and paper mail. +7. DISCLAIMER OF WARRANTY. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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. +8. TERMINATION. -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. - , 1 April 1989 - Ty Coon, President of Vice + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. -This 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 Library General -Public License instead of this License. + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/examples/file_adapter_ex2.c b/examples/file_adapter_ex2.c index 92a9770..3dce39e 100644 --- a/examples/file_adapter_ex2.c +++ b/examples/file_adapter_ex2.c @@ -1,6 +1,6 @@ #include #include - +#include // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) { diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 3e0bd85..da944e4 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -1,5 +1,5 @@ #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) { @@ -8,7 +8,7 @@ int main(int argc, char **argv) "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); diff --git a/src/bmz.c b/src/bmz.c index be31b1a..683aeb2 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -130,7 +130,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz->n/8 + 1); memset(visited, 0, bmz->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); diff --git a/src/bmz8.c b/src/bmz8.c index 0ebb3ce..e8128d2 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -137,7 +137,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) fprintf(stderr, "\tTraversing critical vertices.\n"); } DEBUGP("Searching step\n"); - visited = (char *)malloc(bmz8->n/8 + 1); + visited = (cmph_uint8 *)malloc(bmz8->n/8 + 1); memset(visited, 0, bmz8->n/8 + 1); used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); diff --git a/src/brz.c b/src/brz.c index c5936d7..2068cee 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,10 +19,8 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static char * brz_read_key(FILE * fd); static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); -static void brz_flush_g(brz_config_data_t *brz, cmph_uint32 *start_index, FILE * fd); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; @@ -449,26 +447,6 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static char * brz_read_key(FILE * fd) -{ - char * buf = (char *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - char c; - while(1) - { - fread(&c, sizeof(char), 1, fd); - if(feof(fd)) - { - free(buf); - return NULL; - } - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (char *)realloc(buf, buf_pos + BUFSIZ); - } - return buf; -} - static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; @@ -477,7 +455,6 @@ static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { - cmph_uint32 i; cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; char * bufh1 = NULL; diff --git a/src/chm.c b/src/chm.c index 7feec29..908c3d3 100644 --- a/src/chm.c +++ b/src/chm.c @@ -106,7 +106,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) fprintf(stderr, "Starting assignment step\n"); } DEBUGP("Assignment step\n"); - visited = (char *)malloc(chm->n/8 + 1); + visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); chm->g = malloc(chm->n * sizeof(cmph_uint32)); diff --git a/src/djb2_hash.c b/src/djb2_hash.c index 923bbd8..d3b4330 100644 --- a/src/djb2_hash.c +++ b/src/djb2_hash.c @@ -16,7 +16,7 @@ void djb2_state_destroy(djb2_state_t *state) cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 5381; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while (i < keylen) { diff --git a/src/main.c b/src/main.c index 4db2104..e381b29 100644 --- a/src/main.c +++ b/src/main.c @@ -64,7 +64,7 @@ int main(int argc, char **argv) float c = 2.09; cmph_config_t *config = NULL; cmph_t *mphf = NULL; - cmph_uint8 * tmp_dir = NULL; + char * tmp_dir = NULL; cmph_io_adapter_t *source; cmph_uint32 memory_availability = 0; cmph_uint32 b = 128; @@ -226,7 +226,7 @@ int main(int argc, char **argv) cmph_config_set_algo(config, mph_algo); if (nhashes) cmph_config_set_hashfuncs(config, hashes); cmph_config_set_verbosity(config, verbosity); - cmph_config_set_tmp_dir(config, tmp_dir); + cmph_config_set_tmp_dir(config, (cmph_uint8 *) tmp_dir); cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); diff --git a/src/sdbm_hash.c b/src/sdbm_hash.c index b854478..2f706c9 100644 --- a/src/sdbm_hash.c +++ b/src/sdbm_hash.c @@ -16,7 +16,7 @@ void sdbm_state_destroy(sdbm_state_t *state) cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) { register cmph_uint32 hash = 0; - const unsigned char *ptr = k; + const unsigned char *ptr = (unsigned char *)k; cmph_uint32 i = 0; while(i < keylen) { From 3578933d4a2fc200357f60a0fe2c842525631394 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Apr 2006 16:35:48 +0000 Subject: [PATCH 297/739] buffer_manage replaced for buffer_manager --- src/Makefile.am | 2 +- src/brz.c | 16 +++++------ src/buffer_manager.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manager.h | 12 ++++++++ 4 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/buffer_manager.c create mode 100644 src/buffer_manager.h diff --git a/src/Makefile.am b/src/Makefile.am index 386e68d..b6430da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,7 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ - buffer_manage.h buffer_manage.c\ + buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c diff --git a/src/brz.c b/src/brz.c index 2068cee..f300272 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,7 +4,7 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" -#include "buffer_manage.h" +#include "buffer_manager.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" @@ -203,7 +203,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 nflushes = 0; cmph_uint32 h0; FILE * tmp_fd = NULL; - buffer_manage_t * buff_manage = NULL; + buffer_manager_t * buff_manager = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -340,7 +340,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); - buff_manage = buffer_manage_new(brz->memory_availability, nflushes); + buff_manager = buffer_manager_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -349,10 +349,10 @@ static int brz_gen_mphf(cmph_config_t *mph) { filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - buffer_manage_open(buff_manage, i, filename); + buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); keylen = strlen(key); h0 = hash(brz->h0, key, keylen) % brz->k; buffer_h0[i] = h0; @@ -367,7 +367,7 @@ static int brz_gen_mphf(cmph_config_t *mph) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); if(key) { while(key) @@ -378,7 +378,7 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_vd[nkeys_vd++] = key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); } if (key) { @@ -430,7 +430,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } } - buffer_manage_destroy(buff_manage); + buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); diff --git a/src/buffer_manager.c b/src/buffer_manager.c new file mode 100644 index 0000000..a23e44d --- /dev/null +++ b/src/buffer_manager.c @@ -0,0 +1,66 @@ +#include "buffer_manager.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manager_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manager_t *buff_manager = (buffer_manager_t *)malloc(sizeof(buffer_manager_t)); + assert(buff_manager); + buff_manager->memory_avail = memory_avail; + buff_manager->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manager->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manager->pos_avail_list = -1; + buff_manager->nentries = nentries; + memory_avail_entry = buff_manager->memory_avail/buff_manager->nentries + 1; + for(i = 0; i < buff_manager->nentries; i++) + { + buff_manager->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manager; +} + +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manager->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manager->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manager_destroy(buffer_manager_t * buffer_manager) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manager->nentries; i++) + { + buffer_entry_destroy(buffer_manager->buffer_entries[i]); + } + free(buffer_manager->memory_avail_list); + free(buffer_manager->buffer_entries); + free(buffer_manager); +} diff --git a/src/buffer_manager.h b/src/buffer_manager.h new file mode 100644 index 0000000..daa2efc --- /dev/null +++ b/src/buffer_manager.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manager_t buffer_manager_t; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +void buffer_manager_destroy(buffer_manager_t * buffer_manager); +#endif From 998648ca4c50a0e2dda8dcf2a188dae3342ef4b1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Apr 2006 16:35:48 +0000 Subject: [PATCH 298/739] buffer_manage replaced for buffer_manager --- src/Makefile.am | 2 +- src/brz.c | 16 +++++------ src/buffer_manager.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manager.h | 12 ++++++++ 4 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/buffer_manager.c create mode 100644 src/buffer_manager.h diff --git a/src/Makefile.am b/src/Makefile.am index 386e68d..b6430da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,7 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ - buffer_manage.h buffer_manage.c\ + buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c diff --git a/src/brz.c b/src/brz.c index 2068cee..f300272 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,7 +4,7 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" -#include "buffer_manage.h" +#include "buffer_manager.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" @@ -203,7 +203,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 nflushes = 0; cmph_uint32 h0; FILE * tmp_fd = NULL; - buffer_manage_t * buff_manage = NULL; + buffer_manager_t * buff_manager = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -340,7 +340,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); - buff_manage = buffer_manage_new(brz->memory_availability, nflushes); + buff_manager = buffer_manager_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -349,10 +349,10 @@ static int brz_gen_mphf(cmph_config_t *mph) { filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - buffer_manage_open(buff_manage, i, filename); + buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); keylen = strlen(key); h0 = hash(brz->h0, key, keylen) % brz->k; buffer_h0[i] = h0; @@ -367,7 +367,7 @@ static int brz_gen_mphf(cmph_config_t *mph) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); if(key) { while(key) @@ -378,7 +378,7 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_vd[nkeys_vd++] = key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); } if (key) { @@ -430,7 +430,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } } - buffer_manage_destroy(buff_manage); + buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); diff --git a/src/buffer_manager.c b/src/buffer_manager.c new file mode 100644 index 0000000..a23e44d --- /dev/null +++ b/src/buffer_manager.c @@ -0,0 +1,66 @@ +#include "buffer_manager.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manager_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manager_t *buff_manager = (buffer_manager_t *)malloc(sizeof(buffer_manager_t)); + assert(buff_manager); + buff_manager->memory_avail = memory_avail; + buff_manager->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manager->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manager->pos_avail_list = -1; + buff_manager->nentries = nentries; + memory_avail_entry = buff_manager->memory_avail/buff_manager->nentries + 1; + for(i = 0; i < buff_manager->nentries; i++) + { + buff_manager->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manager; +} + +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manager->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manager->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manager_destroy(buffer_manager_t * buffer_manager) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manager->nentries; i++) + { + buffer_entry_destroy(buffer_manager->buffer_entries[i]); + } + free(buffer_manager->memory_avail_list); + free(buffer_manager->buffer_entries); + free(buffer_manager); +} diff --git a/src/buffer_manager.h b/src/buffer_manager.h new file mode 100644 index 0000000..daa2efc --- /dev/null +++ b/src/buffer_manager.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manager_t buffer_manager_t; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +void buffer_manager_destroy(buffer_manager_t * buffer_manager); +#endif From ffc2d224248aa8ad8d08f98e48a13aaf86460b70 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Apr 2006 16:35:48 +0000 Subject: [PATCH 299/739] buffer_manage replaced for buffer_manager --- src/Makefile.am | 2 +- src/brz.c | 16 +++++------ src/buffer_manager.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manager.h | 12 ++++++++ 4 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/buffer_manager.c create mode 100644 src/buffer_manager.h diff --git a/src/Makefile.am b/src/Makefile.am index 386e68d..b6430da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,7 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ - buffer_manage.h buffer_manage.c\ + buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c diff --git a/src/brz.c b/src/brz.c index 2068cee..f300272 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,7 +4,7 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" -#include "buffer_manage.h" +#include "buffer_manager.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" @@ -203,7 +203,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 nflushes = 0; cmph_uint32 h0; FILE * tmp_fd = NULL; - buffer_manage_t * buff_manage = NULL; + buffer_manager_t * buff_manager = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -340,7 +340,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); - buff_manage = buffer_manage_new(brz->memory_availability, nflushes); + buff_manager = buffer_manager_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -349,10 +349,10 @@ static int brz_gen_mphf(cmph_config_t *mph) { filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - buffer_manage_open(buff_manage, i, filename); + buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); keylen = strlen(key); h0 = hash(brz->h0, key, keylen) % brz->k; buffer_h0[i] = h0; @@ -367,7 +367,7 @@ static int brz_gen_mphf(cmph_config_t *mph) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); if(key) { while(key) @@ -378,7 +378,7 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_vd[nkeys_vd++] = key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); } if (key) { @@ -430,7 +430,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } } - buffer_manage_destroy(buff_manage); + buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); diff --git a/src/buffer_manager.c b/src/buffer_manager.c new file mode 100644 index 0000000..a23e44d --- /dev/null +++ b/src/buffer_manager.c @@ -0,0 +1,66 @@ +#include "buffer_manager.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manager_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manager_t *buff_manager = (buffer_manager_t *)malloc(sizeof(buffer_manager_t)); + assert(buff_manager); + buff_manager->memory_avail = memory_avail; + buff_manager->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manager->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manager->pos_avail_list = -1; + buff_manager->nentries = nentries; + memory_avail_entry = buff_manager->memory_avail/buff_manager->nentries + 1; + for(i = 0; i < buff_manager->nentries; i++) + { + buff_manager->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manager; +} + +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manager->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manager->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manager_destroy(buffer_manager_t * buffer_manager) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manager->nentries; i++) + { + buffer_entry_destroy(buffer_manager->buffer_entries[i]); + } + free(buffer_manager->memory_avail_list); + free(buffer_manager->buffer_entries); + free(buffer_manager); +} diff --git a/src/buffer_manager.h b/src/buffer_manager.h new file mode 100644 index 0000000..daa2efc --- /dev/null +++ b/src/buffer_manager.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manager_t buffer_manager_t; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +void buffer_manager_destroy(buffer_manager_t * buffer_manager); +#endif From 124e0dfe6898ba9ea3b3caedd25cd1470e032985 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Apr 2006 16:35:48 +0000 Subject: [PATCH 300/739] buffer_manage replaced for buffer_manager --- src/Makefile.am | 2 +- src/brz.c | 16 +++++------ src/buffer_manager.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/buffer_manager.h | 12 ++++++++ 4 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/buffer_manager.c create mode 100644 src/buffer_manager.h diff --git a/src/Makefile.am b/src/Makefile.am index 386e68d..b6430da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,7 @@ libcmph_la_SOURCES = debug.h\ chm.h chm_structs.h chm.c\ bmz.h bmz_structs.h bmz.c\ bmz8.h bmz8_structs.h bmz8.c\ - buffer_manage.h buffer_manage.c\ + buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ brz.h brz_structs.h brz.c diff --git a/src/brz.c b/src/brz.c index 2068cee..f300272 100755 --- a/src/brz.c +++ b/src/brz.c @@ -4,7 +4,7 @@ #include "brz.h" #include "cmph_structs.h" #include "brz_structs.h" -#include "buffer_manage.h" +#include "buffer_manager.h" #include "cmph.h" #include "hash.h" #include "bitbool.h" @@ -203,7 +203,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 nflushes = 0; cmph_uint32 h0; FILE * tmp_fd = NULL; - buffer_manage_t * buff_manage = NULL; + buffer_manager_t * buff_manager = NULL; char *filename = NULL; char *key = NULL; cmph_uint32 keylen; @@ -340,7 +340,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); - buff_manage = buffer_manage_new(brz->memory_availability, nflushes); + buff_manager = buffer_manager_new(brz->memory_availability, nflushes); buffer_merge = (cmph_uint8 **)calloc(nflushes, sizeof(cmph_uint8 *)); buffer_h0 = (cmph_uint32 *)calloc(nflushes, sizeof(cmph_uint32)); @@ -349,10 +349,10 @@ static int brz_gen_mphf(cmph_config_t *mph) { filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); - buffer_manage_open(buff_manage, i, filename); + buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); keylen = strlen(key); h0 = hash(brz->h0, key, keylen) % brz->k; buffer_h0[i] = h0; @@ -367,7 +367,7 @@ static int brz_gen_mphf(cmph_config_t *mph) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); if(key) { while(key) @@ -378,7 +378,7 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_vd[nkeys_vd++] = key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manage_read_key(buff_manage, i); + key = (char *)buffer_manager_read_key(buff_manager, i); } if (key) { @@ -430,7 +430,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } } - buffer_manage_destroy(buff_manage); + buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); diff --git a/src/buffer_manager.c b/src/buffer_manager.c new file mode 100644 index 0000000..a23e44d --- /dev/null +++ b/src/buffer_manager.c @@ -0,0 +1,66 @@ +#include "buffer_manager.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manager_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manager_t *buff_manager = (buffer_manager_t *)malloc(sizeof(buffer_manager_t)); + assert(buff_manager); + buff_manager->memory_avail = memory_avail; + buff_manager->buffer_entries = (buffer_entry_t **)calloc(nentries, sizeof(buffer_entry_t *)); + buff_manager->memory_avail_list = (cmph_uint32 *)calloc(nentries, sizeof(cmph_uint32)); + buff_manager->pos_avail_list = -1; + buff_manager->nentries = nentries; + memory_avail_entry = buff_manager->memory_avail/buff_manager->nentries + 1; + for(i = 0; i < buff_manager->nentries; i++) + { + buff_manager->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manager; +} + +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manager->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manager->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manager_destroy(buffer_manager_t * buffer_manager) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manager->nentries; i++) + { + buffer_entry_destroy(buffer_manager->buffer_entries[i]); + } + free(buffer_manager->memory_avail_list); + free(buffer_manager->buffer_entries); + free(buffer_manager); +} diff --git a/src/buffer_manager.h b/src/buffer_manager.h new file mode 100644 index 0000000..daa2efc --- /dev/null +++ b/src/buffer_manager.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manager_t buffer_manager_t; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +void buffer_manager_destroy(buffer_manager_t * buffer_manager); +#endif From c1aea5cc0f7f5a867a500b6e220b2657d6d7c53a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 3 May 2006 20:25:41 +0000 Subject: [PATCH 301/739] *** empty log message *** --- FAQ.t2t | 7 ++++- README.t2t | 89 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/FAQ.t2t b/FAQ.t2t index eb11038..a013867 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -25,7 +25,12 @@ one is executed? the cmph_config_set_hashfuncs. Therefore, the default hash function is reset when you call the cmph_config_set_algo function. - +- What do I do when the following error is got? + - Error: **error while loading shared libraries: libcmph.so.0: cannot open shared object file: No such file ordirectory** + + - Solution: type **export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/** at the shell or put that shell command + in your .profile file or in the /etc/profile file. + %!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index c31a917..3cb81b4 100644 --- a/README.t2t +++ b/README.t2t @@ -51,7 +51,7 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast external memory based algorithm for constructing minimal perfect hash functions for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and - can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. + can be stored using just 8.1 bits per key. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal @@ -61,6 +61,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.5== + +- A thread safe vector adapter has been added. +- [A new algorithm for sets in the order of billion of keys that requires approximately 8.1 bits per key to store the resulting MPHFs. brz.html] +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.4== @@ -88,29 +97,29 @@ Using cmph is quite simple. Take a look. ``` #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) -{ +{ // Creating a filled vector - const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); - + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); + //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } ``` @@ -120,33 +129,33 @@ Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does ``` #include #include - -// Create minimal perfect hash function from in-disk keys using BMZ algorithm +#include + // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) -{ - //Open file with newline separated list of keys +{ + //Open file with newline separated list of keys FILE * keys_fd = fopen("keys.txt", "r"); cmph_t *hash = NULL; - if (keys_fd == NULL) + if (keys_fd == NULL) { - fprintf(stderr, "File \"keys.txt\" not found\n"); - exit(1); - } + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } // Source of keys cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); - + cmph_config_t *config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } @@ -176,26 +185,32 @@ utility. ``` - usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile Minimum perfect hashing tool - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * bmz - * chm - -f hash function (may be used multiple times) - valid values are - * djb2 - * fnv - * jenkins - * sdbm - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * bmz8 + * chm + * brz + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * jenkins + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + -M main memory availability (in MB) + -d temporary directory used in brz algorithm + -b parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256 + keysfile line separated file with keys + ``` ==Additional Documentation== From 2753738103bf40a99c77190390884d911746fd0a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 3 May 2006 20:25:41 +0000 Subject: [PATCH 302/739] *** empty log message *** --- FAQ.t2t | 7 ++++- README.t2t | 89 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/FAQ.t2t b/FAQ.t2t index eb11038..a013867 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -25,7 +25,12 @@ one is executed? the cmph_config_set_hashfuncs. Therefore, the default hash function is reset when you call the cmph_config_set_algo function. - +- What do I do when the following error is got? + - Error: **error while loading shared libraries: libcmph.so.0: cannot open shared object file: No such file ordirectory** + + - Solution: type **export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/** at the shell or put that shell command + in your .profile file or in the /etc/profile file. + %!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index c31a917..3cb81b4 100644 --- a/README.t2t +++ b/README.t2t @@ -51,7 +51,7 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast external memory based algorithm for constructing minimal perfect hash functions for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and - can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. + can be stored using just 8.1 bits per key. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal @@ -61,6 +61,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.5== + +- A thread safe vector adapter has been added. +- [A new algorithm for sets in the order of billion of keys that requires approximately 8.1 bits per key to store the resulting MPHFs. brz.html] +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.4== @@ -88,29 +97,29 @@ Using cmph is quite simple. Take a look. ``` #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) -{ +{ // Creating a filled vector - const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); - + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); + //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } ``` @@ -120,33 +129,33 @@ Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does ``` #include #include - -// Create minimal perfect hash function from in-disk keys using BMZ algorithm +#include + // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) -{ - //Open file with newline separated list of keys +{ + //Open file with newline separated list of keys FILE * keys_fd = fopen("keys.txt", "r"); cmph_t *hash = NULL; - if (keys_fd == NULL) + if (keys_fd == NULL) { - fprintf(stderr, "File \"keys.txt\" not found\n"); - exit(1); - } + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } // Source of keys cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); - + cmph_config_t *config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } @@ -176,26 +185,32 @@ utility. ``` - usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile Minimum perfect hashing tool - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * bmz - * chm - -f hash function (may be used multiple times) - valid values are - * djb2 - * fnv - * jenkins - * sdbm - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * bmz8 + * chm + * brz + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * jenkins + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + -M main memory availability (in MB) + -d temporary directory used in brz algorithm + -b parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256 + keysfile line separated file with keys + ``` ==Additional Documentation== From f2881c8f2ea75738d0dbc335bc97169d997eacb2 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 3 May 2006 20:25:41 +0000 Subject: [PATCH 303/739] *** empty log message *** --- FAQ.t2t | 7 ++++- README.t2t | 89 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/FAQ.t2t b/FAQ.t2t index eb11038..a013867 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -25,7 +25,12 @@ one is executed? the cmph_config_set_hashfuncs. Therefore, the default hash function is reset when you call the cmph_config_set_algo function. - +- What do I do when the following error is got? + - Error: **error while loading shared libraries: libcmph.so.0: cannot open shared object file: No such file ordirectory** + + - Solution: type **export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/** at the shell or put that shell command + in your .profile file or in the /etc/profile file. + %!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index c31a917..3cb81b4 100644 --- a/README.t2t +++ b/README.t2t @@ -51,7 +51,7 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast external memory based algorithm for constructing minimal perfect hash functions for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and - can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. + can be stored using just 8.1 bits per key. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal @@ -61,6 +61,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.5== + +- A thread safe vector adapter has been added. +- [A new algorithm for sets in the order of billion of keys that requires approximately 8.1 bits per key to store the resulting MPHFs. brz.html] +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.4== @@ -88,29 +97,29 @@ Using cmph is quite simple. Take a look. ``` #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) -{ +{ // Creating a filled vector - const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); - + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); + //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } ``` @@ -120,33 +129,33 @@ Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does ``` #include #include - -// Create minimal perfect hash function from in-disk keys using BMZ algorithm +#include + // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) -{ - //Open file with newline separated list of keys +{ + //Open file with newline separated list of keys FILE * keys_fd = fopen("keys.txt", "r"); cmph_t *hash = NULL; - if (keys_fd == NULL) + if (keys_fd == NULL) { - fprintf(stderr, "File \"keys.txt\" not found\n"); - exit(1); - } + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } // Source of keys cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); - + cmph_config_t *config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } @@ -176,26 +185,32 @@ utility. ``` - usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile Minimum perfect hashing tool - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * bmz - * chm - -f hash function (may be used multiple times) - valid values are - * djb2 - * fnv - * jenkins - * sdbm - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * bmz8 + * chm + * brz + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * jenkins + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + -M main memory availability (in MB) + -d temporary directory used in brz algorithm + -b parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256 + keysfile line separated file with keys + ``` ==Additional Documentation== From b8ac6fb0c1f201e052caae3ce5abaf56b87e6daf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Wed, 3 May 2006 20:25:41 +0000 Subject: [PATCH 304/739] *** empty log message *** --- FAQ.t2t | 7 ++++- README.t2t | 89 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/FAQ.t2t b/FAQ.t2t index eb11038..a013867 100644 --- a/FAQ.t2t +++ b/FAQ.t2t @@ -25,7 +25,12 @@ one is executed? the cmph_config_set_hashfuncs. Therefore, the default hash function is reset when you call the cmph_config_set_algo function. - +- What do I do when the following error is got? + - Error: **error while loading shared libraries: libcmph.so.0: cannot open shared object file: No such file ordirectory** + + - Solution: type **export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/** at the shell or put that shell command + in your .profile file or in the /etc/profile file. + %!include: ALGORITHMS.t2t %!include: FOOTER.t2t diff --git a/README.t2t b/README.t2t index c31a917..3cb81b4 100644 --- a/README.t2t +++ b/README.t2t @@ -51,7 +51,7 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %txt% - BMZ Algorithm. A very fast external memory based algorithm for constructing minimal perfect hash functions for sets in the order of billion of keys in linear time. The resulting functions are not order preserving and - can be stored using just 8.1 bits per key. **This algorithm is available just in the CVS for while**. + can be stored using just 8.1 bits per key. %html% - [CHM Algorithm chm.html]. %txt% - CHM Algorithm. An algorithm based on acyclic random graphs to construct minimal @@ -61,6 +61,15 @@ The CMPH Library encapsulates the newest and more efficient algorithms in an eas %html% [Click Here comparison.html] to see a comparison of the supported algorithms. +---------------------------------------- + +==News for version 0.5== + +- A thread safe vector adapter has been added. +- [A new algorithm for sets in the order of billion of keys that requires approximately 8.1 bits per key to store the resulting MPHFs. brz.html] +- All reported bugs and suggestions have been corrected and included as well. + + ---------------------------------------- ==News for version 0.4== @@ -88,29 +97,29 @@ Using cmph is quite simple. Take a look. ``` #include - +#include // Create minimal perfect hash function from in-memory vector int main(int argc, char **argv) -{ +{ // Creating a filled vector - const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; // Source of keys - cmph_io_adapter_t *source = cmph_io_vector_adapter(vector, nkeys); - + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); + //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_vector_adapter_destroy(source); return 0; } ``` @@ -120,33 +129,33 @@ Download [vector_adapter_ex1.c examples/vector_adapter_ex1.c]. This example does ``` #include #include - -// Create minimal perfect hash function from in-disk keys using BMZ algorithm +#include + // Create minimal perfect hash function from in-disk keys using BMZ algorithm int main(int argc, char **argv) -{ - //Open file with newline separated list of keys +{ + //Open file with newline separated list of keys FILE * keys_fd = fopen("keys.txt", "r"); cmph_t *hash = NULL; - if (keys_fd == NULL) + if (keys_fd == NULL) { - fprintf(stderr, "File \"keys.txt\" not found\n"); - exit(1); - } + fprintf(stderr, "File \"keys.txt\" not found\n"); + exit(1); + } // Source of keys cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); - + cmph_config_t *config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ); hash = cmph_new(config); cmph_config_destroy(config); - + //Find key const char *key = "jjjjjjjjjj"; unsigned int id = cmph_search(hash, key, strlen(key)); fprintf(stderr, "Id:%u\n", id); //Destroy hash cmph_destroy(hash); - free(source); + cmph_io_nlfile_adapter_destroy(source); fclose(keys_fd); return 0; } @@ -176,26 +185,32 @@ utility. ``` - usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-m file.mph] [-a algorithm] keysfile + usage: cmph [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile Minimum perfect hashing tool - -h print this help message - -c c value that determines the number of vertices in the graph - -a algorithm - valid values are - * bmz - * chm - -f hash function (may be used multiple times) - valid values are - * djb2 - * fnv - * jenkins - * sdbm - -V print version number and exit - -v increase verbosity (may be used multiple times) - -k number of keys - -g generation mode - -s random seed - -m minimum perfect hash function file - keysfile line separated file with keys + -h print this help message + -c c value that determines the number of vertices in the graph + -a algorithm - valid values are + * bmz + * bmz8 + * chm + * brz + -f hash function (may be used multiple times) - valid values are + * djb2 + * fnv + * jenkins + * sdbm + -V print version number and exit + -v increase verbosity (may be used multiple times) + -k number of keys + -g generation mode + -s random seed + -m minimum perfect hash function file + -M main memory availability (in MB) + -d temporary directory used in brz algorithm + -b parmeter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256 + keysfile line separated file with keys + ``` ==Additional Documentation== From b5070227c691f50a9fd713e14170ef8eda1a506e Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 25 Jul 2006 15:30:46 +0000 Subject: [PATCH 305/739] Fixes for C++ compilation proposed by Steffan Webb. --- src/bmz.c | 4 ++-- src/bmz8.c | 2 +- src/brz.c | 10 +++++----- src/chm.c | 2 +- src/cmph.c | 8 ++++---- src/cmph_structs.c | 1 - src/cmph_structs.h | 2 +- src/hash.c | 2 +- src/hashtree.c | 2 +- src/jenkins_hash.c | 2 +- 10 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 683aeb2..1424d59 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -135,7 +135,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); + bmz->g = (cmph_uint32 *)calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -316,7 +316,7 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); + unused_g_values = (cmph_uint32 *)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/bmz8.c b/src/bmz8.c index e8128d2..2fb7d88 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index f300272..839081a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -79,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { - brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+2, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { - brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+1, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/(brz->b)); + brz->k = ceil(((float)brz->m)/brz->b); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -259,7 +259,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); @@ -318,7 +318,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); diff --git a/src/chm.c b/src/chm.c index 908c3d3..24bcbc8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -109,7 +109,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); + chm->g = (cmph_uint32 *)malloc(chm->n * sizeof(cmph_uint32)); assert(chm->g); for (i = 0; i < chm->n; ++i) { diff --git a/src/cmph.c b/src/cmph.c index be4e64d..38fda0e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -112,7 +112,7 @@ static cmph_uint32 count_nlfile_keys(FILE *fd) cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = count_nlfile_keys(keys_fd); @@ -129,7 +129,7 @@ void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = nkeys; @@ -146,8 +146,8 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = (cmph_vector_t *)malloc(sizeof(cmph_vector_t)); assert(key_source); assert(cmph_vector); cmph_vector->vector = vector; diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 30790bf..f7b652d 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -9,7 +9,6 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); memset(mph, 0, sizeof(cmph_config_t)); - DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; diff --git a/src/cmph_structs.h b/src/cmph_structs.h index d150a60..4bfe08b 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -25,7 +25,7 @@ struct __cmph_t }; cmph_config_t *__config_new(cmph_io_adapter_t *key_source); -void __config_destroy(); +void __config_destroy(cmph_config_t*); void __cmph_dump(cmph_t *mphf, FILE *); cmph_t *__cmph_load(FILE *f); diff --git a/src/hash.c b/src/hash.c index f09c47b..925043a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -77,7 +77,7 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) default: assert(0); } - *buf = malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + *buf = (char *)malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, *buflen); diff --git a/src/hashtree.c b/src/hashtree.c index 31e64f0..4a480a9 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -105,7 +105,7 @@ cmph_t *hashtree_new(cmph_config_t *mph, float c) visited = (char *)malloc(hashtree->n/8 + 1); memset(visited, 0, hashtree->n/8 + 1); free(hashtree->g); - hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + hashtree->g = (cmph_uint32 *)malloc(hashtree->n * sizeof(cmph_uint32)); assert(hashtree->g); for (i = 0; i < hashtree->n; ++i) { diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index d720fcd..843571c 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -162,7 +162,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { *buflen = sizeof(cmph_uint32); - *buf = malloc(*buflen); + *buf = (char *)malloc(*buflen); if (!*buf) { *buflen = UINT_MAX; From 038f836d0d34bce26c30b411e288d6761c45f2f2 Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 25 Jul 2006 15:30:46 +0000 Subject: [PATCH 306/739] Fixes for C++ compilation proposed by Steffan Webb. --- src/bmz.c | 4 ++-- src/bmz8.c | 2 +- src/brz.c | 10 +++++----- src/chm.c | 2 +- src/cmph.c | 8 ++++---- src/cmph_structs.c | 1 - src/cmph_structs.h | 2 +- src/hash.c | 2 +- src/hashtree.c | 2 +- src/jenkins_hash.c | 2 +- 10 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 683aeb2..1424d59 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -135,7 +135,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); + bmz->g = (cmph_uint32 *)calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -316,7 +316,7 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); + unused_g_values = (cmph_uint32 *)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/bmz8.c b/src/bmz8.c index e8128d2..2fb7d88 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index f300272..839081a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -79,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { - brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+2, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { - brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+1, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/(brz->b)); + brz->k = ceil(((float)brz->m)/brz->b); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -259,7 +259,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); @@ -318,7 +318,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); diff --git a/src/chm.c b/src/chm.c index 908c3d3..24bcbc8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -109,7 +109,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); + chm->g = (cmph_uint32 *)malloc(chm->n * sizeof(cmph_uint32)); assert(chm->g); for (i = 0; i < chm->n; ++i) { diff --git a/src/cmph.c b/src/cmph.c index be4e64d..38fda0e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -112,7 +112,7 @@ static cmph_uint32 count_nlfile_keys(FILE *fd) cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = count_nlfile_keys(keys_fd); @@ -129,7 +129,7 @@ void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = nkeys; @@ -146,8 +146,8 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = (cmph_vector_t *)malloc(sizeof(cmph_vector_t)); assert(key_source); assert(cmph_vector); cmph_vector->vector = vector; diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 30790bf..f7b652d 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -9,7 +9,6 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); memset(mph, 0, sizeof(cmph_config_t)); - DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; diff --git a/src/cmph_structs.h b/src/cmph_structs.h index d150a60..4bfe08b 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -25,7 +25,7 @@ struct __cmph_t }; cmph_config_t *__config_new(cmph_io_adapter_t *key_source); -void __config_destroy(); +void __config_destroy(cmph_config_t*); void __cmph_dump(cmph_t *mphf, FILE *); cmph_t *__cmph_load(FILE *f); diff --git a/src/hash.c b/src/hash.c index f09c47b..925043a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -77,7 +77,7 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) default: assert(0); } - *buf = malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + *buf = (char *)malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, *buflen); diff --git a/src/hashtree.c b/src/hashtree.c index 31e64f0..4a480a9 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -105,7 +105,7 @@ cmph_t *hashtree_new(cmph_config_t *mph, float c) visited = (char *)malloc(hashtree->n/8 + 1); memset(visited, 0, hashtree->n/8 + 1); free(hashtree->g); - hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + hashtree->g = (cmph_uint32 *)malloc(hashtree->n * sizeof(cmph_uint32)); assert(hashtree->g); for (i = 0; i < hashtree->n; ++i) { diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index d720fcd..843571c 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -162,7 +162,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { *buflen = sizeof(cmph_uint32); - *buf = malloc(*buflen); + *buf = (char *)malloc(*buflen); if (!*buf) { *buflen = UINT_MAX; From f0fd02d42e09a42fe153f84f1a746350f4a2ce2b Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 25 Jul 2006 15:30:46 +0000 Subject: [PATCH 307/739] Fixes for C++ compilation proposed by Steffan Webb. --- src/bmz.c | 4 ++-- src/bmz8.c | 2 +- src/brz.c | 10 +++++----- src/chm.c | 2 +- src/cmph.c | 8 ++++---- src/cmph_structs.c | 1 - src/cmph_structs.h | 2 +- src/hash.c | 2 +- src/hashtree.c | 2 +- src/jenkins_hash.c | 2 +- 10 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 683aeb2..1424d59 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -135,7 +135,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); + bmz->g = (cmph_uint32 *)calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -316,7 +316,7 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); + unused_g_values = (cmph_uint32 *)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/bmz8.c b/src/bmz8.c index e8128d2..2fb7d88 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index f300272..839081a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -79,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { - brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+2, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { - brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+1, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/(brz->b)); + brz->k = ceil(((float)brz->m)/brz->b); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -259,7 +259,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); @@ -318,7 +318,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); diff --git a/src/chm.c b/src/chm.c index 908c3d3..24bcbc8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -109,7 +109,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); + chm->g = (cmph_uint32 *)malloc(chm->n * sizeof(cmph_uint32)); assert(chm->g); for (i = 0; i < chm->n; ++i) { diff --git a/src/cmph.c b/src/cmph.c index be4e64d..38fda0e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -112,7 +112,7 @@ static cmph_uint32 count_nlfile_keys(FILE *fd) cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = count_nlfile_keys(keys_fd); @@ -129,7 +129,7 @@ void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = nkeys; @@ -146,8 +146,8 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = (cmph_vector_t *)malloc(sizeof(cmph_vector_t)); assert(key_source); assert(cmph_vector); cmph_vector->vector = vector; diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 30790bf..f7b652d 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -9,7 +9,6 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); memset(mph, 0, sizeof(cmph_config_t)); - DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; diff --git a/src/cmph_structs.h b/src/cmph_structs.h index d150a60..4bfe08b 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -25,7 +25,7 @@ struct __cmph_t }; cmph_config_t *__config_new(cmph_io_adapter_t *key_source); -void __config_destroy(); +void __config_destroy(cmph_config_t*); void __cmph_dump(cmph_t *mphf, FILE *); cmph_t *__cmph_load(FILE *f); diff --git a/src/hash.c b/src/hash.c index f09c47b..925043a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -77,7 +77,7 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) default: assert(0); } - *buf = malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + *buf = (char *)malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, *buflen); diff --git a/src/hashtree.c b/src/hashtree.c index 31e64f0..4a480a9 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -105,7 +105,7 @@ cmph_t *hashtree_new(cmph_config_t *mph, float c) visited = (char *)malloc(hashtree->n/8 + 1); memset(visited, 0, hashtree->n/8 + 1); free(hashtree->g); - hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + hashtree->g = (cmph_uint32 *)malloc(hashtree->n * sizeof(cmph_uint32)); assert(hashtree->g); for (i = 0; i < hashtree->n; ++i) { diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index d720fcd..843571c 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -162,7 +162,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { *buflen = sizeof(cmph_uint32); - *buf = malloc(*buflen); + *buf = (char *)malloc(*buflen); if (!*buf) { *buflen = UINT_MAX; From f730920907648035705c6348ef7922e7bf1aaa2e Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 25 Jul 2006 15:30:46 +0000 Subject: [PATCH 308/739] Fixes for C++ compilation proposed by Steffan Webb. --- src/bmz.c | 4 ++-- src/bmz8.c | 2 +- src/brz.c | 10 +++++----- src/chm.c | 2 +- src/cmph.c | 8 ++++---- src/cmph_structs.c | 1 - src/cmph_structs.h | 2 +- src/hash.c | 2 +- src/hashtree.c | 2 +- src/jenkins_hash.c | 2 +- 10 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 683aeb2..1424d59 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -135,7 +135,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz->m/8 + 1); memset(used_edges, 0, bmz->m/8 + 1); free(bmz->g); - bmz->g = calloc(bmz->n, sizeof(cmph_uint32)); + bmz->g = (cmph_uint32 *)calloc(bmz->n, sizeof(cmph_uint32)); assert(bmz->g); for (i = 0; i < bmz->n; ++i) // critical nodes { @@ -316,7 +316,7 @@ static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); + unused_g_values = (cmph_uint32 *)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/bmz8.c b/src/bmz8.c index e8128d2..2fb7d88 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index f300272..839081a 100755 --- a/src/brz.c +++ b/src/brz.c @@ -79,12 +79,12 @@ void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) free(brz->tmp_dir); if(tmp_dir[len-1] != '/') { - brz->tmp_dir = calloc(len+2, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+2, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); } else { - brz->tmp_dir = calloc(len+1, sizeof(cmph_uint8)); + brz->tmp_dir = (cmph_uint8 *)calloc(len+1, sizeof(cmph_uint8)); sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); } @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(brz->m/(brz->b)); + brz->k = ceil(((float)brz->m)/brz->b); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); @@ -259,7 +259,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); @@ -318,7 +318,7 @@ static int brz_gen_mphf(cmph_config_t *mph) } nkeys_in_buffer = 0; memory_usage = 0; - bzero(buckets_size, brz->k*sizeof(cmph_uint32)); + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); nflushes++; free(keys_index); fclose(tmp_fd); diff --git a/src/chm.c b/src/chm.c index 908c3d3..24bcbc8 100644 --- a/src/chm.c +++ b/src/chm.c @@ -109,7 +109,7 @@ cmph_t *chm_new(cmph_config_t *mph, float c) visited = (cmph_uint8 *)malloc(chm->n/8 + 1); memset(visited, 0, chm->n/8 + 1); free(chm->g); - chm->g = malloc(chm->n * sizeof(cmph_uint32)); + chm->g = (cmph_uint32 *)malloc(chm->n * sizeof(cmph_uint32)); assert(chm->g); for (i = 0; i < chm->n; ++i) { diff --git a/src/cmph.c b/src/cmph.c index be4e64d..38fda0e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -112,7 +112,7 @@ static cmph_uint32 count_nlfile_keys(FILE *fd) cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = count_nlfile_keys(keys_fd); @@ -129,7 +129,7 @@ void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); assert(key_source); key_source->data = (void *)keys_fd; key_source->nkeys = nkeys; @@ -146,8 +146,8 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) { - cmph_io_adapter_t * key_source = malloc(sizeof(cmph_io_adapter_t)); - cmph_vector_t * cmph_vector = malloc(sizeof(cmph_vector_t)); + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = (cmph_vector_t *)malloc(sizeof(cmph_vector_t)); assert(key_source); assert(cmph_vector); cmph_vector->vector = vector; diff --git a/src/cmph_structs.c b/src/cmph_structs.c index 30790bf..f7b652d 100644 --- a/src/cmph_structs.c +++ b/src/cmph_structs.c @@ -9,7 +9,6 @@ cmph_config_t *__config_new(cmph_io_adapter_t *key_source) { cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); memset(mph, 0, sizeof(cmph_config_t)); - DEBUGP("Creating mph with algorithm %s\n", cmph_names[algo]); if (mph == NULL) return NULL; mph->key_source = key_source; mph->verbosity = 0; diff --git a/src/cmph_structs.h b/src/cmph_structs.h index d150a60..4bfe08b 100644 --- a/src/cmph_structs.h +++ b/src/cmph_structs.h @@ -25,7 +25,7 @@ struct __cmph_t }; cmph_config_t *__config_new(cmph_io_adapter_t *key_source); -void __config_destroy(); +void __config_destroy(cmph_config_t*); void __cmph_dump(cmph_t *mphf, FILE *); cmph_t *__cmph_load(FILE *f); diff --git a/src/hash.c b/src/hash.c index f09c47b..925043a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -77,7 +77,7 @@ void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) default: assert(0); } - *buf = malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + *buf = (char *)malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, *buflen); diff --git a/src/hashtree.c b/src/hashtree.c index 31e64f0..4a480a9 100644 --- a/src/hashtree.c +++ b/src/hashtree.c @@ -105,7 +105,7 @@ cmph_t *hashtree_new(cmph_config_t *mph, float c) visited = (char *)malloc(hashtree->n/8 + 1); memset(visited, 0, hashtree->n/8 + 1); free(hashtree->g); - hashtree->g = malloc(hashtree->n * sizeof(cmph_uint32)); + hashtree->g = (cmph_uint32 *)malloc(hashtree->n * sizeof(cmph_uint32)); assert(hashtree->g); for (i = 0; i < hashtree->n; ++i) { diff --git a/src/jenkins_hash.c b/src/jenkins_hash.c index d720fcd..843571c 100644 --- a/src/jenkins_hash.c +++ b/src/jenkins_hash.c @@ -162,7 +162,7 @@ cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keyl void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) { *buflen = sizeof(cmph_uint32); - *buf = malloc(*buflen); + *buf = (char *)malloc(*buflen); if (!*buf) { *buflen = UINT_MAX; From 4f41cdc9560732c023f5adc1fd32ed5e63ccf986 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 00:44:14 +0000 Subject: [PATCH 309/739] More fixes for C++ compilation proposed by Steffan Webb. --- src/bmz8.c | 2 +- src/brz.c | 2 +- src/main.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bmz8.c b/src/bmz8.c index 2fb7d88..db4b275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -324,7 +324,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = (cmph_uint8*)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/brz.c b/src/brz.c index 839081a..a7622ff 100755 --- a/src/brz.c +++ b/src/brz.c @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(((float)brz->m)/brz->b); + brz->k = (cmph_uint32)ceil(brz->m/((float)brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); diff --git a/src/main.c b/src/main.c index e381b29..07765d9 100644 --- a/src/main.c +++ b/src/main.c @@ -230,7 +230,7 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From 99e6763c2f296f635b59142e6b6db884fea3f6be Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 00:44:14 +0000 Subject: [PATCH 310/739] More fixes for C++ compilation proposed by Steffan Webb. --- src/bmz8.c | 2 +- src/brz.c | 2 +- src/main.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bmz8.c b/src/bmz8.c index 2fb7d88..db4b275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -324,7 +324,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = (cmph_uint8*)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/brz.c b/src/brz.c index 839081a..a7622ff 100755 --- a/src/brz.c +++ b/src/brz.c @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(((float)brz->m)/brz->b); + brz->k = (cmph_uint32)ceil(brz->m/((float)brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); diff --git a/src/main.c b/src/main.c index e381b29..07765d9 100644 --- a/src/main.c +++ b/src/main.c @@ -230,7 +230,7 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From 9c3a26110c2864843acf0918873e87df60e6b2bf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 00:44:14 +0000 Subject: [PATCH 311/739] More fixes for C++ compilation proposed by Steffan Webb. --- INSTALL | 61 ++++++++++++++++++++++++------------------------------ src/bmz8.c | 2 +- src/brz.c | 2 +- src/main.c | 2 +- 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/INSTALL b/INSTALL index 56b077d..54caf7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,16 +1,13 @@ -Installation Instructions -************************* +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives + This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -70,9 +67,9 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -85,7 +82,7 @@ is an example: Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -102,19 +99,19 @@ for another architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +122,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,11 +137,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -170,9 +167,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -181,7 +178,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== -Variables not defined in a site shell script can be set in the + Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -189,18 +186,14 @@ them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). Here is a another example: - - /bin/bash ./configure CONFIG_SHELL=/bin/bash - -Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent -configuration-related scripts to be executed by `/bin/bash'. +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' diff --git a/src/bmz8.c b/src/bmz8.c index 2fb7d88..db4b275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -324,7 +324,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = (cmph_uint8*)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/brz.c b/src/brz.c index 839081a..a7622ff 100755 --- a/src/brz.c +++ b/src/brz.c @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(((float)brz->m)/brz->b); + brz->k = (cmph_uint32)ceil(brz->m/((float)brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); diff --git a/src/main.c b/src/main.c index e381b29..07765d9 100644 --- a/src/main.c +++ b/src/main.c @@ -230,7 +230,7 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From f114562f1095aaa0511834803f8a313d37b5222e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 00:44:14 +0000 Subject: [PATCH 312/739] More fixes for C++ compilation proposed by Steffan Webb. --- INSTALL | 61 ++++++++++++++++++++++++------------------------------ src/bmz8.c | 2 +- src/brz.c | 2 +- src/main.c | 2 +- 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/INSTALL b/INSTALL index 56b077d..54caf7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,16 +1,13 @@ -Installation Instructions -************************* +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives + This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== -These are generic installation instructions. + These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -70,9 +67,9 @@ The simplest way to compile this package is: Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -85,7 +82,7 @@ is an example: Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -102,19 +99,19 @@ for another architecture. Installation Names ================== -By default, `make install' will install the package's files in + By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PREFIX'. +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PREFIX', the package will -use PREFIX as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular +options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -125,7 +122,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -140,11 +137,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -170,9 +167,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -181,7 +178,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== -Variables not defined in a site shell script can be set in the + Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -189,18 +186,14 @@ them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). Here is a another example: - - /bin/bash ./configure CONFIG_SHELL=/bin/bash - -Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent -configuration-related scripts to be executed by `/bin/bash'. +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' diff --git a/src/bmz8.c b/src/bmz8.c index 2fb7d88..db4b275 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -324,7 +324,7 @@ static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz { if(nunused_g_values == unused_g_values_capacity) { - unused_g_values = realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); + unused_g_values = (cmph_uint8*)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint8)); unused_g_values_capacity += BUFSIZ; } unused_g_values[nunused_g_values++] = next_g; diff --git a/src/brz.c b/src/brz.c index 839081a..a7622ff 100755 --- a/src/brz.c +++ b/src/brz.c @@ -116,7 +116,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); - brz->k = ceil(((float)brz->m)/brz->b); + brz->k = (cmph_uint32)ceil(brz->m/((float)brz->b)); DEBUGP("k: %u\n", brz->k); brz->size = (cmph_uint8 *) calloc(brz->k, sizeof(cmph_uint8)); diff --git a/src/main.c b/src/main.c index e381b29..07765d9 100644 --- a/src/main.c +++ b/src/main.c @@ -230,7 +230,7 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From 293ae3c811b9e66369cafb7989fe06541d22387b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:27:34 +0000 Subject: [PATCH 313/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index da944e4..962b586 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -4,23 +4,38 @@ int main(int argc, char **argv) { // Creating a filled vector + unsigned int i = 0; const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; + FILE* mphf_fd = fopen("temp.mph", "w"); // Source of keys cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); + cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function + cmph_config_set_algo(config, CMPH_BRZ); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); + cmph_dump(hash, mphf_fd); + cmph_destroy(hash); + fclose(mphf_fd); //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); + mphf_fd = fopen("temp.mph", "r"); + hash = cmph_load(mphf_fd); + while (i < nkeys) { + const char *key = vector[i]; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "key:%s -- hash:%u\n", key, id); + i++; + } + //Destroy hash cmph_destroy(hash); cmph_io_vector_adapter_destroy(source); + fclose(mphf_fd); return 0; } From 3ecdcb88f7ce4f0a48df38000e2890228b041684 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:27:34 +0000 Subject: [PATCH 314/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index da944e4..962b586 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -4,23 +4,38 @@ int main(int argc, char **argv) { // Creating a filled vector + unsigned int i = 0; const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; + FILE* mphf_fd = fopen("temp.mph", "w"); // Source of keys cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); + cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function + cmph_config_set_algo(config, CMPH_BRZ); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); + cmph_dump(hash, mphf_fd); + cmph_destroy(hash); + fclose(mphf_fd); //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); + mphf_fd = fopen("temp.mph", "r"); + hash = cmph_load(mphf_fd); + while (i < nkeys) { + const char *key = vector[i]; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "key:%s -- hash:%u\n", key, id); + i++; + } + //Destroy hash cmph_destroy(hash); cmph_io_vector_adapter_destroy(source); + fclose(mphf_fd); return 0; } From dafb408c10d3a76d29fb3d09972f4dd9bc3beb64 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:27:34 +0000 Subject: [PATCH 315/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index da944e4..962b586 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -4,23 +4,38 @@ int main(int argc, char **argv) { // Creating a filled vector + unsigned int i = 0; const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; + FILE* mphf_fd = fopen("temp.mph", "w"); // Source of keys cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); + cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function + cmph_config_set_algo(config, CMPH_BRZ); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); + cmph_dump(hash, mphf_fd); + cmph_destroy(hash); + fclose(mphf_fd); //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); + mphf_fd = fopen("temp.mph", "r"); + hash = cmph_load(mphf_fd); + while (i < nkeys) { + const char *key = vector[i]; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "key:%s -- hash:%u\n", key, id); + i++; + } + //Destroy hash cmph_destroy(hash); cmph_io_vector_adapter_destroy(source); + fclose(mphf_fd); return 0; } From ce21b7044ba61e39d652cf0555938b03aea2651a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:27:34 +0000 Subject: [PATCH 316/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index da944e4..962b586 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -4,23 +4,38 @@ int main(int argc, char **argv) { // Creating a filled vector + unsigned int i = 0; const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; unsigned int nkeys = 10; + FILE* mphf_fd = fopen("temp.mph", "w"); // Source of keys cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); + cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function + cmph_config_set_algo(config, CMPH_BRZ); + cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); cmph_config_destroy(config); + cmph_dump(hash, mphf_fd); + cmph_destroy(hash); + fclose(mphf_fd); //Find key - const char *key = "jjjjjjjjjj"; - unsigned int id = cmph_search(hash, key, strlen(key)); - fprintf(stderr, "Id:%u\n", id); + mphf_fd = fopen("temp.mph", "r"); + hash = cmph_load(mphf_fd); + while (i < nkeys) { + const char *key = vector[i]; + unsigned int id = cmph_search(hash, key, strlen(key)); + fprintf(stderr, "key:%s -- hash:%u\n", key, id); + i++; + } + //Destroy hash cmph_destroy(hash); cmph_io_vector_adapter_destroy(source); + fclose(mphf_fd); return 0; } From 32829274c4600b3c7d958338882c1b08e8845c39 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:28:41 +0000 Subject: [PATCH 317/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 962b586..f25ceef 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -14,7 +14,6 @@ int main(int argc, char **argv) //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); - cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function cmph_config_set_algo(config, CMPH_BRZ); cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); From 9d762c4bc02a0e054431b4c94d0fc0618e341e18 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:28:41 +0000 Subject: [PATCH 318/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 962b586..f25ceef 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -14,7 +14,6 @@ int main(int argc, char **argv) //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); - cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function cmph_config_set_algo(config, CMPH_BRZ); cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); From 79377900f9f97612de73632d7863d06c0500f9dd Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:28:41 +0000 Subject: [PATCH 319/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 962b586..f25ceef 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -14,7 +14,6 @@ int main(int argc, char **argv) //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); - cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function cmph_config_set_algo(config, CMPH_BRZ); cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); From 789e5d39b16f7821de02a2510ce03f0a26629ee4 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 27 Jul 2006 12:28:41 +0000 Subject: [PATCH 320/739] vector adapter example updated to be used with brz algorithm --- examples/vector_adapter_ex1.c | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/vector_adapter_ex1.c b/examples/vector_adapter_ex1.c index 962b586..f25ceef 100755 --- a/examples/vector_adapter_ex1.c +++ b/examples/vector_adapter_ex1.c @@ -14,7 +14,6 @@ int main(int argc, char **argv) //Create minimal perfect hash function using the default (chm) algorithm. cmph_config_t *config = cmph_config_new(source); - cmph_config_set_graphsize(config, 1.0); // this is not required, just to get a smaller function cmph_config_set_algo(config, CMPH_BRZ); cmph_config_set_mphf_fd(config, mphf_fd); cmph_t *hash = cmph_new(config); From 6bc95ace44fc5266ed7b42a4ee6bcd351f716d2f Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jul 2006 22:36:50 +0000 Subject: [PATCH 321/739] strlen fuction removed from BRZ algorithm --- src/bmz8.c | 2 +- src/brz.c | 73 +++++++++++++++++++++----------------------- src/buffer_entry.c | 47 +++++++++++++++++++--------- src/buffer_entry.h | 2 +- src/buffer_manager.c | 6 ++-- src/buffer_manager.h | 2 +- src/cmph.c | 36 ++++++++++++++-------- src/cmph.h | 3 ++ 8 files changed, 98 insertions(+), 73 deletions(-) diff --git a/src/bmz8.c b/src/bmz8.c index db4b275..f0690dc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint8 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index a7622ff..dad31d1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { @@ -209,7 +209,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 keylen; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - char ** keys_vd = NULL; + cmph_uint8 ** keys_vd = NULL; mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); @@ -219,7 +219,7 @@ static int brz_gen_mphf(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers + if (memory_usage + keylen + sizeof(keylen) > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -241,11 +241,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -254,8 +254,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -264,9 +264,11 @@ static int brz_gen_mphf(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - memcpy(buffer + memory_usage, key, keylen + 1); - memory_usage = memory_usage + keylen + 1; + memcpy(buffer + memory_usage, &keylen, sizeof(keylen)); + memcpy(buffer + memory_usage + sizeof(keylen), key, keylen); + memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); @@ -278,7 +280,6 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_in_buffer++; mph->key_source->dispose(mph->key_source->data, key, keylen); } - if (memory_usage != 0) // flush buffers { if(mph->verbosity) @@ -300,11 +301,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -313,8 +314,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -352,50 +353,46 @@ static int brz_gen_mphf(cmph_config_t *mph) buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manager_read_key(buff_manager, i); - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; + key = NULL; //transfer memory ownership } e = 0; - keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); if(key) { while(key) { - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; - if (h0 != buffer_h0[i]) break; - keys_vd[nkeys_vd++] = key; + //keylen = strlen(key); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; + if (h0 != buffer_h0[i]) break; + keys_vd[nkeys_vd++] = (cmph_uint8 *)key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; } } if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = UINT_MAX; @@ -410,7 +407,7 @@ static int brz_gen_mphf(cmph_config_t *mph) char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); @@ -424,8 +421,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - cmph_io_vector_adapter_destroy(source); - + cmph_io_byte_vector_adapter_destroy(source); nkeys_vd = 0; } } @@ -447,7 +443,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} @@ -465,7 +461,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); buf = (char *)malloc(*buflen); - //fprintf(stderr,"entrei passei\n"); memcpy(buf, &buflenh1, sizeof(cmph_uint32)); memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); diff --git a/src/buffer_entry.c b/src/buffer_entry.c index bd9f82d..25152ea 100644 --- a/src/buffer_entry.c +++ b/src/buffer_entry.c @@ -2,6 +2,7 @@ #include #include #include +#include struct __buffer_entry_t { @@ -51,24 +52,40 @@ void buffer_entry_load(buffer_entry_t * buffer_entry) buffer_entry->pos = 0; } -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen) { - cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - cmph_uint8 c; - while(1) + cmph_uint8 * buf = NULL; + cmph_uint32 lacked_bytes = sizeof(*keylen); + cmph_uint32 copied_bytes = 0; + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end { - if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end - { - free(buf); - return NULL; - } - if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); - c = buffer_entry->buff[(buffer_entry->pos)++]; - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + free(buf); + return NULL; } + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) + { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) memcpy(keylen, buffer_entry->buff + buffer_entry->pos, copied_bytes); + buffer_entry_load(buffer_entry); + } + memcpy(keylen + copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; + + lacked_bytes = *keylen; + copied_bytes = 0; + buf = (cmph_uint8 *)malloc(*keylen + sizeof(*keylen)); + memcpy(buf, keylen, sizeof(*keylen)); + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) { + memcpy(buf + sizeof(*keylen), buffer_entry->buff + buffer_entry->pos, copied_bytes); + } + buffer_entry_load(buffer_entry); + } + memcpy(buf+sizeof(*keylen)+copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; return buf; } diff --git a/src/buffer_entry.h b/src/buffer_entry.h index 6f94924..62102ba 100644 --- a/src/buffer_entry.h +++ b/src/buffer_entry.h @@ -9,6 +9,6 @@ buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen); void buffer_entry_destroy(buffer_entry_t * buffer_entry); #endif diff --git a/src/buffer_manager.c b/src/buffer_manager.c index a23e44d..3c20490 100644 --- a/src/buffer_manager.c +++ b/src/buffer_manager.c @@ -35,20 +35,18 @@ void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, c buffer_entry_open(buffer_manager->buffer_entries[index], filename); } -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen) { cmph_uint8 * key = NULL; if (buffer_manager->pos_avail_list >= 0 ) // recovering memory { cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); - //fprintf(stderr, "recovering memory\n"); } - key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + key = buffer_entry_read_key(buffer_manager->buffer_entries[index], keylen); if (key == NULL) // storing memory to be recovered { buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); - //fprintf(stderr, "storing memory to be recovered\n"); } return key; } diff --git a/src/buffer_manager.h b/src/buffer_manager.h index daa2efc..af99c20 100644 --- a/src/buffer_manager.h +++ b/src/buffer_manager.h @@ -7,6 +7,6 @@ typedef struct __buffer_manager_t buffer_manager_t; buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen); void buffer_manager_destroy(buffer_manager_t * buffer_manager); #endif diff --git a/src/cmph.c b/src/cmph.c index 38fda0e..eb4bf5e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -47,22 +47,22 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_byte_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_uint8 **keys_vd = (cmph_uint8 **)cmph_vector->vector; + memcpy(keylen, keys_vd[cmph_vector->position], sizeof(*keylen)); + *key = (char *)malloc(*keylen); + memcpy(*key, keys_vd[cmph_vector->position] + sizeof(*keylen), *keylen); + cmph_vector->position = cmph_vector->position + 1; + return *keylen; + +} + static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { -/* - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; - char **keys_vd = (char **)cmph_vector->vector; - - if (keys_vd + cmph_vector->position == NULL) return -1; - *keylen = strlen(*(keys_vd + cmph_vector->position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + cmph_vector->position)); - cmph_vector->position = cmph_vector->position + 1; -*/ cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; - -// if (keys_vd + cmph_vector->position == NULL) return -1; *keylen = strlen(keys_vd[cmph_vector->position]); *key = (char *)malloc(*keylen + 1); strcpy(*key, keys_vd[cmph_vector->position]); @@ -165,6 +165,18 @@ static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) free(key_source); } +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_byte_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); +} cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); diff --git a/src/cmph.h b/src/cmph.h index 0d42bcb..235a1e2 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -34,6 +34,9 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys); +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source); + /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); From e75eb4b616b81b6df3876a23a638ede2a637a143 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jul 2006 22:36:50 +0000 Subject: [PATCH 322/739] strlen fuction removed from BRZ algorithm --- src/bmz8.c | 2 +- src/brz.c | 73 +++++++++++++++++++++----------------------- src/buffer_entry.c | 47 +++++++++++++++++++--------- src/buffer_entry.h | 2 +- src/buffer_manager.c | 6 ++-- src/buffer_manager.h | 2 +- src/cmph.c | 36 ++++++++++++++-------- src/cmph.h | 3 ++ 8 files changed, 98 insertions(+), 73 deletions(-) diff --git a/src/bmz8.c b/src/bmz8.c index db4b275..f0690dc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint8 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index a7622ff..dad31d1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { @@ -209,7 +209,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 keylen; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - char ** keys_vd = NULL; + cmph_uint8 ** keys_vd = NULL; mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); @@ -219,7 +219,7 @@ static int brz_gen_mphf(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers + if (memory_usage + keylen + sizeof(keylen) > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -241,11 +241,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -254,8 +254,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -264,9 +264,11 @@ static int brz_gen_mphf(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - memcpy(buffer + memory_usage, key, keylen + 1); - memory_usage = memory_usage + keylen + 1; + memcpy(buffer + memory_usage, &keylen, sizeof(keylen)); + memcpy(buffer + memory_usage + sizeof(keylen), key, keylen); + memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); @@ -278,7 +280,6 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_in_buffer++; mph->key_source->dispose(mph->key_source->data, key, keylen); } - if (memory_usage != 0) // flush buffers { if(mph->verbosity) @@ -300,11 +301,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -313,8 +314,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -352,50 +353,46 @@ static int brz_gen_mphf(cmph_config_t *mph) buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manager_read_key(buff_manager, i); - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; + key = NULL; //transfer memory ownership } e = 0; - keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); if(key) { while(key) { - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; - if (h0 != buffer_h0[i]) break; - keys_vd[nkeys_vd++] = key; + //keylen = strlen(key); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; + if (h0 != buffer_h0[i]) break; + keys_vd[nkeys_vd++] = (cmph_uint8 *)key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; } } if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = UINT_MAX; @@ -410,7 +407,7 @@ static int brz_gen_mphf(cmph_config_t *mph) char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); @@ -424,8 +421,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - cmph_io_vector_adapter_destroy(source); - + cmph_io_byte_vector_adapter_destroy(source); nkeys_vd = 0; } } @@ -447,7 +443,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} @@ -465,7 +461,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); buf = (char *)malloc(*buflen); - //fprintf(stderr,"entrei passei\n"); memcpy(buf, &buflenh1, sizeof(cmph_uint32)); memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); diff --git a/src/buffer_entry.c b/src/buffer_entry.c index bd9f82d..25152ea 100644 --- a/src/buffer_entry.c +++ b/src/buffer_entry.c @@ -2,6 +2,7 @@ #include #include #include +#include struct __buffer_entry_t { @@ -51,24 +52,40 @@ void buffer_entry_load(buffer_entry_t * buffer_entry) buffer_entry->pos = 0; } -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen) { - cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - cmph_uint8 c; - while(1) + cmph_uint8 * buf = NULL; + cmph_uint32 lacked_bytes = sizeof(*keylen); + cmph_uint32 copied_bytes = 0; + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end { - if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end - { - free(buf); - return NULL; - } - if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); - c = buffer_entry->buff[(buffer_entry->pos)++]; - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + free(buf); + return NULL; } + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) + { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) memcpy(keylen, buffer_entry->buff + buffer_entry->pos, copied_bytes); + buffer_entry_load(buffer_entry); + } + memcpy(keylen + copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; + + lacked_bytes = *keylen; + copied_bytes = 0; + buf = (cmph_uint8 *)malloc(*keylen + sizeof(*keylen)); + memcpy(buf, keylen, sizeof(*keylen)); + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) { + memcpy(buf + sizeof(*keylen), buffer_entry->buff + buffer_entry->pos, copied_bytes); + } + buffer_entry_load(buffer_entry); + } + memcpy(buf+sizeof(*keylen)+copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; return buf; } diff --git a/src/buffer_entry.h b/src/buffer_entry.h index 6f94924..62102ba 100644 --- a/src/buffer_entry.h +++ b/src/buffer_entry.h @@ -9,6 +9,6 @@ buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen); void buffer_entry_destroy(buffer_entry_t * buffer_entry); #endif diff --git a/src/buffer_manager.c b/src/buffer_manager.c index a23e44d..3c20490 100644 --- a/src/buffer_manager.c +++ b/src/buffer_manager.c @@ -35,20 +35,18 @@ void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, c buffer_entry_open(buffer_manager->buffer_entries[index], filename); } -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen) { cmph_uint8 * key = NULL; if (buffer_manager->pos_avail_list >= 0 ) // recovering memory { cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); - //fprintf(stderr, "recovering memory\n"); } - key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + key = buffer_entry_read_key(buffer_manager->buffer_entries[index], keylen); if (key == NULL) // storing memory to be recovered { buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); - //fprintf(stderr, "storing memory to be recovered\n"); } return key; } diff --git a/src/buffer_manager.h b/src/buffer_manager.h index daa2efc..af99c20 100644 --- a/src/buffer_manager.h +++ b/src/buffer_manager.h @@ -7,6 +7,6 @@ typedef struct __buffer_manager_t buffer_manager_t; buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen); void buffer_manager_destroy(buffer_manager_t * buffer_manager); #endif diff --git a/src/cmph.c b/src/cmph.c index 38fda0e..eb4bf5e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -47,22 +47,22 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_byte_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_uint8 **keys_vd = (cmph_uint8 **)cmph_vector->vector; + memcpy(keylen, keys_vd[cmph_vector->position], sizeof(*keylen)); + *key = (char *)malloc(*keylen); + memcpy(*key, keys_vd[cmph_vector->position] + sizeof(*keylen), *keylen); + cmph_vector->position = cmph_vector->position + 1; + return *keylen; + +} + static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { -/* - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; - char **keys_vd = (char **)cmph_vector->vector; - - if (keys_vd + cmph_vector->position == NULL) return -1; - *keylen = strlen(*(keys_vd + cmph_vector->position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + cmph_vector->position)); - cmph_vector->position = cmph_vector->position + 1; -*/ cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; - -// if (keys_vd + cmph_vector->position == NULL) return -1; *keylen = strlen(keys_vd[cmph_vector->position]); *key = (char *)malloc(*keylen + 1); strcpy(*key, keys_vd[cmph_vector->position]); @@ -165,6 +165,18 @@ static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) free(key_source); } +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_byte_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); +} cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); diff --git a/src/cmph.h b/src/cmph.h index 0d42bcb..235a1e2 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -34,6 +34,9 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys); +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source); + /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); From 6b9ee0664341390aa5d362a06a50df7f00c48be7 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jul 2006 22:36:50 +0000 Subject: [PATCH 323/739] strlen fuction removed from BRZ algorithm --- INSTALL | 61 ++++++++++++++++++++---------------- src/bmz8.c | 2 +- src/brz.c | 73 +++++++++++++++++++++----------------------- src/buffer_entry.c | 47 +++++++++++++++++++--------- src/buffer_entry.h | 2 +- src/buffer_manager.c | 6 ++-- src/buffer_manager.h | 2 +- src/cmph.c | 36 ++++++++++++++-------- src/cmph.h | 3 ++ 9 files changed, 132 insertions(+), 100 deletions(-) diff --git a/INSTALL b/INSTALL index 54caf7c..56b077d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,13 +1,16 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. +Installation Instructions +************************* - This file is free documentation; the Free Software Foundation gives +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -67,9 +70,9 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -82,7 +85,7 @@ is an example: Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -99,19 +102,19 @@ for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== - Variables not defined in a site shell script can be set in the +Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -186,14 +189,18 @@ them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== - `configure' recognizes the following options to control how it -operates. +`configure' recognizes the following options to control how it operates. `--help' `-h' diff --git a/src/bmz8.c b/src/bmz8.c index db4b275..f0690dc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint8 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index a7622ff..dad31d1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { @@ -209,7 +209,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 keylen; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - char ** keys_vd = NULL; + cmph_uint8 ** keys_vd = NULL; mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); @@ -219,7 +219,7 @@ static int brz_gen_mphf(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers + if (memory_usage + keylen + sizeof(keylen) > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -241,11 +241,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -254,8 +254,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -264,9 +264,11 @@ static int brz_gen_mphf(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - memcpy(buffer + memory_usage, key, keylen + 1); - memory_usage = memory_usage + keylen + 1; + memcpy(buffer + memory_usage, &keylen, sizeof(keylen)); + memcpy(buffer + memory_usage + sizeof(keylen), key, keylen); + memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); @@ -278,7 +280,6 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_in_buffer++; mph->key_source->dispose(mph->key_source->data, key, keylen); } - if (memory_usage != 0) // flush buffers { if(mph->verbosity) @@ -300,11 +301,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -313,8 +314,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -352,50 +353,46 @@ static int brz_gen_mphf(cmph_config_t *mph) buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manager_read_key(buff_manager, i); - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; + key = NULL; //transfer memory ownership } e = 0; - keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); if(key) { while(key) { - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; - if (h0 != buffer_h0[i]) break; - keys_vd[nkeys_vd++] = key; + //keylen = strlen(key); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; + if (h0 != buffer_h0[i]) break; + keys_vd[nkeys_vd++] = (cmph_uint8 *)key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; } } if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = UINT_MAX; @@ -410,7 +407,7 @@ static int brz_gen_mphf(cmph_config_t *mph) char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); @@ -424,8 +421,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - cmph_io_vector_adapter_destroy(source); - + cmph_io_byte_vector_adapter_destroy(source); nkeys_vd = 0; } } @@ -447,7 +443,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} @@ -465,7 +461,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); buf = (char *)malloc(*buflen); - //fprintf(stderr,"entrei passei\n"); memcpy(buf, &buflenh1, sizeof(cmph_uint32)); memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); diff --git a/src/buffer_entry.c b/src/buffer_entry.c index bd9f82d..25152ea 100644 --- a/src/buffer_entry.c +++ b/src/buffer_entry.c @@ -2,6 +2,7 @@ #include #include #include +#include struct __buffer_entry_t { @@ -51,24 +52,40 @@ void buffer_entry_load(buffer_entry_t * buffer_entry) buffer_entry->pos = 0; } -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen) { - cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - cmph_uint8 c; - while(1) + cmph_uint8 * buf = NULL; + cmph_uint32 lacked_bytes = sizeof(*keylen); + cmph_uint32 copied_bytes = 0; + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end { - if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end - { - free(buf); - return NULL; - } - if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); - c = buffer_entry->buff[(buffer_entry->pos)++]; - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + free(buf); + return NULL; } + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) + { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) memcpy(keylen, buffer_entry->buff + buffer_entry->pos, copied_bytes); + buffer_entry_load(buffer_entry); + } + memcpy(keylen + copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; + + lacked_bytes = *keylen; + copied_bytes = 0; + buf = (cmph_uint8 *)malloc(*keylen + sizeof(*keylen)); + memcpy(buf, keylen, sizeof(*keylen)); + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) { + memcpy(buf + sizeof(*keylen), buffer_entry->buff + buffer_entry->pos, copied_bytes); + } + buffer_entry_load(buffer_entry); + } + memcpy(buf+sizeof(*keylen)+copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; return buf; } diff --git a/src/buffer_entry.h b/src/buffer_entry.h index 6f94924..62102ba 100644 --- a/src/buffer_entry.h +++ b/src/buffer_entry.h @@ -9,6 +9,6 @@ buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen); void buffer_entry_destroy(buffer_entry_t * buffer_entry); #endif diff --git a/src/buffer_manager.c b/src/buffer_manager.c index a23e44d..3c20490 100644 --- a/src/buffer_manager.c +++ b/src/buffer_manager.c @@ -35,20 +35,18 @@ void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, c buffer_entry_open(buffer_manager->buffer_entries[index], filename); } -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen) { cmph_uint8 * key = NULL; if (buffer_manager->pos_avail_list >= 0 ) // recovering memory { cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); - //fprintf(stderr, "recovering memory\n"); } - key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + key = buffer_entry_read_key(buffer_manager->buffer_entries[index], keylen); if (key == NULL) // storing memory to be recovered { buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); - //fprintf(stderr, "storing memory to be recovered\n"); } return key; } diff --git a/src/buffer_manager.h b/src/buffer_manager.h index daa2efc..af99c20 100644 --- a/src/buffer_manager.h +++ b/src/buffer_manager.h @@ -7,6 +7,6 @@ typedef struct __buffer_manager_t buffer_manager_t; buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen); void buffer_manager_destroy(buffer_manager_t * buffer_manager); #endif diff --git a/src/cmph.c b/src/cmph.c index 38fda0e..eb4bf5e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -47,22 +47,22 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_byte_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_uint8 **keys_vd = (cmph_uint8 **)cmph_vector->vector; + memcpy(keylen, keys_vd[cmph_vector->position], sizeof(*keylen)); + *key = (char *)malloc(*keylen); + memcpy(*key, keys_vd[cmph_vector->position] + sizeof(*keylen), *keylen); + cmph_vector->position = cmph_vector->position + 1; + return *keylen; + +} + static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { -/* - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; - char **keys_vd = (char **)cmph_vector->vector; - - if (keys_vd + cmph_vector->position == NULL) return -1; - *keylen = strlen(*(keys_vd + cmph_vector->position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + cmph_vector->position)); - cmph_vector->position = cmph_vector->position + 1; -*/ cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; - -// if (keys_vd + cmph_vector->position == NULL) return -1; *keylen = strlen(keys_vd[cmph_vector->position]); *key = (char *)malloc(*keylen + 1); strcpy(*key, keys_vd[cmph_vector->position]); @@ -165,6 +165,18 @@ static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) free(key_source); } +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_byte_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); +} cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); diff --git a/src/cmph.h b/src/cmph.h index 0d42bcb..235a1e2 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -34,6 +34,9 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys); +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source); + /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); From 0e8b3df9229a4cbbea893e66bcf96db71809c80a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 28 Jul 2006 22:36:50 +0000 Subject: [PATCH 324/739] strlen fuction removed from BRZ algorithm --- INSTALL | 61 ++++++++++++++++++++---------------- src/bmz8.c | 2 +- src/brz.c | 73 +++++++++++++++++++++----------------------- src/buffer_entry.c | 47 +++++++++++++++++++--------- src/buffer_entry.h | 2 +- src/buffer_manager.c | 6 ++-- src/buffer_manager.h | 2 +- src/cmph.c | 36 ++++++++++++++-------- src/cmph.h | 3 ++ 9 files changed, 132 insertions(+), 100 deletions(-) diff --git a/INSTALL b/INSTALL index 54caf7c..56b077d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,13 +1,16 @@ -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software -Foundation, Inc. +Installation Instructions +************************* - This file is free documentation; the Free Software Foundation gives +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== - These are generic installation instructions. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -67,9 +70,9 @@ The simplest way to compile this package is: Compilers and Options ===================== - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -82,7 +85,7 @@ is an example: Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the +You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the @@ -99,19 +102,19 @@ for another architecture. Installation Names ================== - By default, `make install' will install the package's files in +By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. +option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular +options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. @@ -122,7 +125,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= - Some packages pay attention to `--enable-FEATURE' options to +Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,11 +140,11 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -167,9 +170,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -178,7 +181,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== - Variables not defined in a site shell script can be set in the +Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -186,14 +189,18 @@ them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== - `configure' recognizes the following options to control how it -operates. +`configure' recognizes the following options to control how it operates. `--help' `-h' diff --git a/src/bmz8.c b/src/bmz8.c index db4b275..f0690dc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -142,7 +142,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) used_edges = (cmph_uint8 *)malloc(bmz8->m/8 + 1); memset(used_edges, 0, bmz8->m/8 + 1); free(bmz8->g); - bmz8->g = (cmph_uint32 *)calloc(bmz8->n, sizeof(cmph_uint8)); + bmz8->g = (cmph_uint8 *)calloc(bmz8->n, sizeof(cmph_uint8)); assert(bmz8->g); for (i = 0; i < bmz8->n; ++i) // critical nodes { diff --git a/src/brz.c b/src/brz.c index a7622ff..dad31d1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -19,7 +19,7 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys); +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { @@ -209,7 +209,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_uint32 keylen; cmph_uint32 cur_bucket = 0; cmph_uint8 nkeys_vd = 0; - char ** keys_vd = NULL; + cmph_uint8 ** keys_vd = NULL; mph->key_source->rewind(mph->key_source->data); DEBUGP("Generating graphs from %u keys\n", brz->m); @@ -219,7 +219,7 @@ static int brz_gen_mphf(cmph_config_t *mph) mph->key_source->read(mph->key_source->data, &key, &keylen); /* Buffers management */ - if (memory_usage + keylen + 1 > brz->memory_availability) // flush buffers + if (memory_usage + keylen + sizeof(keylen) > brz->memory_availability) // flush buffers { if(mph->verbosity) { @@ -241,11 +241,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -254,8 +254,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -264,9 +264,11 @@ static int brz_gen_mphf(cmph_config_t *mph) free(keys_index); fclose(tmp_fd); } - memcpy(buffer + memory_usage, key, keylen + 1); - memory_usage = memory_usage + keylen + 1; + memcpy(buffer + memory_usage, &keylen, sizeof(keylen)); + memcpy(buffer + memory_usage + sizeof(keylen), key, keylen); + memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; + if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) { free(buffer); @@ -278,7 +280,6 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_in_buffer++; mph->key_source->dispose(mph->key_source->data, key, keylen); } - if (memory_usage != 0) // flush buffers { if(mph->verbosity) @@ -300,11 +301,11 @@ static int brz_gen_mphf(cmph_config_t *mph) keys_index = (cmph_uint32 *)calloc(nkeys_in_buffer, sizeof(cmph_uint32)); for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + memory_usage)); - h0 = hash(brz->h0, (char *)(buffer + memory_usage), keylen1) % brz->k; + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; keys_index[buckets_size[h0]] = memory_usage; buckets_size[h0]++; - memory_usage = memory_usage + keylen1 + 1; + memory_usage += keylen1 + sizeof(keylen1); } filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); @@ -313,8 +314,8 @@ static int brz_gen_mphf(cmph_config_t *mph) filename = NULL; for(i = 0; i < nkeys_in_buffer; i++) { - keylen1 = strlen((char *)(buffer + keys_index[i])) + 1; - fwrite(buffer + keys_index[i], 1, keylen1, tmp_fd); + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + fwrite(buffer + keys_index[i], 1, keylen1 + sizeof(keylen1), tmp_fd); } nkeys_in_buffer = 0; memory_usage = 0; @@ -352,50 +353,46 @@ static int brz_gen_mphf(cmph_config_t *mph) buffer_manager_open(buff_manager, i, filename); free(filename); filename = NULL; - key = (char *)buffer_manager_read_key(buff_manager, i); - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; + key = NULL; //transfer memory ownership } e = 0; - keys_vd = (char **)calloc(MAX_BUCKET_SIZE, sizeof(char *)); + keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); cur_bucket = buffer_h0[i]; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); if(key) { while(key) { - keylen = strlen(key); - h0 = hash(brz->h0, key, keylen) % brz->k; - if (h0 != buffer_h0[i]) break; - keys_vd[nkeys_vd++] = key; + //keylen = strlen(key); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; + if (h0 != buffer_h0[i]) break; + keys_vd[nkeys_vd++] = (cmph_uint8 *)key; key = NULL; //transfer memory ownership e++; - key = (char *)buffer_manager_read_key(buff_manager, i); + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); } if (key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = h0; - buffer_merge[i] = (cmph_uint8 *)calloc(keylen + 1, sizeof(cmph_uint8)); - memcpy(buffer_merge[i], key, keylen + 1); - free(key); + buffer_merge[i] = (cmph_uint8 *)key; } } if(!key) { assert(nkeys_vd < brz->size[cur_bucket]); - keys_vd[nkeys_vd++] = (char *)buffer_merge[i]; + keys_vd[nkeys_vd++] = buffer_merge[i]; buffer_merge[i] = NULL; //transfer memory ownership e++; buffer_h0[i] = UINT_MAX; @@ -410,7 +407,7 @@ static int brz_gen_mphf(cmph_config_t *mph) char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys - source = cmph_io_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); @@ -424,8 +421,7 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_config_destroy(config); brz_destroy_keys_vd(keys_vd, nkeys_vd); cmph_destroy(mphf_tmp); - cmph_io_vector_adapter_destroy(source); - + cmph_io_byte_vector_adapter_destroy(source); nkeys_vd = 0; } } @@ -447,7 +443,7 @@ static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) return min_index; } -static void brz_destroy_keys_vd(char ** keys_vd, cmph_uint8 nkeys) +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) { cmph_uint8 i; for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} @@ -465,7 +461,6 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); buf = (char *)malloc(*buflen); - //fprintf(stderr,"entrei passei\n"); memcpy(buf, &buflenh1, sizeof(cmph_uint32)); memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); diff --git a/src/buffer_entry.c b/src/buffer_entry.c index bd9f82d..25152ea 100644 --- a/src/buffer_entry.c +++ b/src/buffer_entry.c @@ -2,6 +2,7 @@ #include #include #include +#include struct __buffer_entry_t { @@ -51,24 +52,40 @@ void buffer_entry_load(buffer_entry_t * buffer_entry) buffer_entry->pos = 0; } -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry) +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen) { - cmph_uint8 * buf = (cmph_uint8 *)malloc(BUFSIZ); - cmph_uint32 buf_pos = 0; - cmph_uint8 c; - while(1) + cmph_uint8 * buf = NULL; + cmph_uint32 lacked_bytes = sizeof(*keylen); + cmph_uint32 copied_bytes = 0; + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end { - if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end - { - free(buf); - return NULL; - } - if(buffer_entry->pos == buffer_entry->nbytes) buffer_entry_load(buffer_entry); - c = buffer_entry->buff[(buffer_entry->pos)++]; - buf[buf_pos++] = c; - if(c == '\0') break; - if(buf_pos % BUFSIZ == 0) buf = (cmph_uint8 *)realloc(buf, buf_pos + BUFSIZ); + free(buf); + return NULL; } + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) + { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) memcpy(keylen, buffer_entry->buff + buffer_entry->pos, copied_bytes); + buffer_entry_load(buffer_entry); + } + memcpy(keylen + copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; + + lacked_bytes = *keylen; + copied_bytes = 0; + buf = (cmph_uint8 *)malloc(*keylen + sizeof(*keylen)); + memcpy(buf, keylen, sizeof(*keylen)); + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) { + memcpy(buf + sizeof(*keylen), buffer_entry->buff + buffer_entry->pos, copied_bytes); + } + buffer_entry_load(buffer_entry); + } + memcpy(buf+sizeof(*keylen)+copied_bytes, buffer_entry->buff + buffer_entry->pos, lacked_bytes); + buffer_entry->pos += lacked_bytes; return buf; } diff --git a/src/buffer_entry.h b/src/buffer_entry.h index 6f94924..62102ba 100644 --- a/src/buffer_entry.h +++ b/src/buffer_entry.h @@ -9,6 +9,6 @@ buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); -cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen); void buffer_entry_destroy(buffer_entry_t * buffer_entry); #endif diff --git a/src/buffer_manager.c b/src/buffer_manager.c index a23e44d..3c20490 100644 --- a/src/buffer_manager.c +++ b/src/buffer_manager.c @@ -35,20 +35,18 @@ void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, c buffer_entry_open(buffer_manager->buffer_entries[index], filename); } -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index) +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen) { cmph_uint8 * key = NULL; if (buffer_manager->pos_avail_list >= 0 ) // recovering memory { cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); - //fprintf(stderr, "recovering memory\n"); } - key = buffer_entry_read_key(buffer_manager->buffer_entries[index]); + key = buffer_entry_read_key(buffer_manager->buffer_entries[index], keylen); if (key == NULL) // storing memory to be recovered { buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); - //fprintf(stderr, "storing memory to be recovered\n"); } return key; } diff --git a/src/buffer_manager.h b/src/buffer_manager.h index daa2efc..af99c20 100644 --- a/src/buffer_manager.h +++ b/src/buffer_manager.h @@ -7,6 +7,6 @@ typedef struct __buffer_manager_t buffer_manager_t; buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); -cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen); void buffer_manager_destroy(buffer_manager_t * buffer_manager); #endif diff --git a/src/cmph.c b/src/cmph.c index 38fda0e..eb4bf5e 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -47,22 +47,22 @@ static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) return *keylen; } +static int key_byte_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_uint8 **keys_vd = (cmph_uint8 **)cmph_vector->vector; + memcpy(keylen, keys_vd[cmph_vector->position], sizeof(*keylen)); + *key = (char *)malloc(*keylen); + memcpy(*key, keys_vd[cmph_vector->position] + sizeof(*keylen), *keylen); + cmph_vector->position = cmph_vector->position + 1; + return *keylen; + +} + static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) { -/* - cmph_vector_t *cmph_vector = (cmph_vector_t *)data; - char **keys_vd = (char **)cmph_vector->vector; - - if (keys_vd + cmph_vector->position == NULL) return -1; - *keylen = strlen(*(keys_vd + cmph_vector->position)); - *key = (char *)malloc(*keylen + 1); - strcpy(*key, *(keys_vd + cmph_vector->position)); - cmph_vector->position = cmph_vector->position + 1; -*/ cmph_vector_t *cmph_vector = (cmph_vector_t *)data; char **keys_vd = (char **)cmph_vector->vector; - -// if (keys_vd + cmph_vector->position == NULL) return -1; *keylen = strlen(keys_vd[cmph_vector->position]); *key = (char *)malloc(*keylen + 1); strcpy(*key, keys_vd[cmph_vector->position]); @@ -165,6 +165,18 @@ static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) free(key_source); } +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_byte_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); +} cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) { cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); diff --git a/src/cmph.h b/src/cmph.h index 0d42bcb..235a1e2 100644 --- a/src/cmph.h +++ b/src/cmph.h @@ -34,6 +34,9 @@ void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys); +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source); + /** Hash configuration API **/ cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); From 79099c26b8462a2f0a066d0e2aa2e70b0613960a Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 18:27:16 +0000 Subject: [PATCH 325/739] FCH algorithm added but not tested... --- src/Makefile.am | 4 +- src/bmz.c | 1 + src/fch.c | 395 ++++++++++++++++++++++++++++++++++++++++++++++ src/fch.h | 18 +++ src/fch_buckets.c | 214 +++++++++++++++++++++++++ src/fch_buckets.h | 30 ++++ src/fch_structs.h | 30 ++++ 7 files changed, 691 insertions(+), 1 deletion(-) create mode 100644 src/fch.c create mode 100644 src/fch.h create mode 100644 src/fch_buckets.c create mode 100644 src/fch_buckets.h create mode 100755 src/fch_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index b6430da..3140214 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,7 +19,9 @@ libcmph_la_SOURCES = debug.h\ bmz8.h bmz8_structs.h bmz8.c\ buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ - brz.h brz_structs.h brz.c + brz.h brz_structs.h brz.c\ + fch.h fch_structs.h fch.c\ + fch_buckets.h fch_buckets.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 1424d59..0009ce1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -468,6 +468,7 @@ int bmz_dump(cmph_t *mphf, FILE *fd) fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); #ifdef DEBUG + cmph_uint32 i; fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); fprintf(stderr, "\n"); diff --git a/src/fch.c b/src/fch.c new file mode 100644 index 0000000..0477d27 --- /dev/null +++ b/src/fch.c @@ -0,0 +1,395 @@ +#include "fch.h" +#include "cmph_structs.h" +#include "fch_structs.h" +#include "hash.h" +#include "bitbool.h" +#include "fch_buckets.h" +//#include +#include +#include +#include +#include +#include +#include +#define INDEX 0 /* alignment index within a bucket */ +//#define DEBUG +#include "debug.h" + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); +static void calc_parameters(fch_config_data_t *fch); +static fch_buckets_t * mapping(cmph_config_t *mph); +static cmph_uint32 * ordering(fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static void permut(cmph_uint32 * vector, cmph_uint32 n); +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); + +fch_config_data_t *fch_config_new() +{ + fch_config_data_t *fch; + fch = (fch_config_data_t *)malloc(sizeof(fch_config_data_t)); + assert(fch); + memset(fch, 0, sizeof(fch_config_data_t)); + fch->hashfuncs[0] = CMPH_HASH_JENKINS; + fch->hashfuncs[1] = CMPH_HASH_JENKINS; + fch->m = fch->b = 0; + fch->c = fch->p1 = fch->p2 = 0; + fch->g = NULL; + fch->h1 = NULL; + fch->h2 = NULL; + return fch; +} + +void fch_config_destroy(cmph_config_t *mph) +{ + fch_config_data_t *data = (fch_config_data_t *)mph->data; + //DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //fch only uses two hash functions + fch->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +{ + if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ + else { /* h12 o h10 */ + initial_index %= b; + if(initial_index < p2) initial_index += (cmph_uint32)p2; + } + return initial_index; +} + +static void calc_parameters(fch_config_data_t *fch) +{ + fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); + fch->p1 = ceil(0.6*fch->m); + fch->p2 = ceil(0.3*fch->b); +} + +static fch_buckets_t * mapping(cmph_config_t *mph) +{ +// struct timeval seed; + cmph_uint32 i = 0; + fch_buckets_t *buckets = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; +// gettimeofday(&seed,NULL); +// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); + srand((cmph_uint32)time(NULL)); + if (fch->h1) hash_state_destroy(fch->h1); + fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); + calc_parameters (fch); + buckets = fch_buckets_new(fch->b); + + mph->key_source->rewind(mph->key_source->data); + for(i = 0; i < fch->m; i++) + { + cmph_uint32 h1, keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + fch_buckets_insert(buckets, h1, key, keylen); + key = NULL; // transger memory ownership + + } + return buckets; +} + + +// returns the buckets indexes sorted by their sizes. +static cmph_uint32 * ordering(fch_buckets_t * buckets) +{ + return fch_buckets_get_indexes_sorted_by_size(buckets); +} + +/* Check whether function h2 causes collisions among the keys of each bucket */ +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +{ + //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); + cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0, index = 0, j =0; + for (i = 0; i < nbuckets; i++) + { + cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + memset(hashtable, 0, fch->m); + for (j = 0; j < nkeys; j++) + { + char * key = fch_buckets_get_key(buckets, i, j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + index = hash(fch->h2, key, keylen) % fch->m; + if(hashtable[index]) { // collision detected + free(hashtable); + return 1; + } + hashtable[index] = 1; + } + } + free(hashtable); + return 0; +} + +static void permut(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, j, b; + srand((cmph_uint32)time(NULL)); + for (i = 0; i < n; i++) { + j = rand() % n; + b = vector[i]; + vector[i] = vector[j]; + vector[j] = b; + } +} + +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes) +{ + cmph_uint32 * random_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 * map_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 iteration_to_generate_h2 = 0; + cmph_uint32 searching_iterations = 0; + cmph_uint8 restart = 0; + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i, j, z, counter = 0, filled_count = 0; + if (fch->g) free (fch->g); + fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + + for(i = 0; i < fch->m; i++) + { + random_table[i] = i; + } + permut(random_table, fch->m); + for(i = 0; i < fch->m; i++) + { + map_table[random_table[i]] = i; + } + + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + + do { + srand((cmph_uint32)time(NULL)); + if (fch->h2) hash_state_destroy(fch->h2); + fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); + restart = check_for_collisions_h2(fch, buckets); + filled_count = 0; + if (!restart) searching_iterations++; + else iteration_to_generate_h2++; + for(i = 0; (i < nbuckets) && !restart; i++) { + restart = 1; // true + for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + counter = 0; + restart = 0; // false + fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + j = INDEX; + do { + cmph_uint32 index = 0; + key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); + h2 = hash(fch->h2, key, keylen) % fch->m; + index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + if (map_table[index] >= filled_count) { + cmph_uint32 y = map_table[index]; + cmph_uint32 ry = random_table[y]; + random_table[y] = random_table[filled_count]; + random_table[filled_count] = ry; + map_table[random_table[y]] = y; + map_table[random_table[filled_count]] = filled_count; + filled_count++; + counter ++; + } + else { + restart = 1; // true + filled_count = filled_count - counter; + counter = 0; + break; + } + j = (j + 1) % bucketsize; + } while(j % bucketsize != INDEX); + } + } + } while(restart && (searching_iterations < 100000)); + free(map_table); + free(random_table); + return restart; +} + + + +cmph_t *fch_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + fch_data_t *fchf = NULL; + cmph_uint32 iterations = 100; + cmph_uint8 restart_mapping = 0; + fch_buckets_t * buckets = NULL; + cmph_uint32 * sorted_indexes = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + fch->m = mph->key_source->nkeys; + //DEBUGP("m: %f\n", fch->m); + fch->c = c; + //DEBUGP("c: %f\n", fch->c); + fch->h1 = NULL; + fch->h2 = NULL; + fch->g = NULL; + do + { + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys\n", fch->m); + } + if (buckets) fch_buckets_destroy(buckets); + buckets = mapping(mph); + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + if (sorted_indexes) free (sorted_indexes); + sorted_indexes = ordering(buckets); + if (mph->verbosity) + { + fprintf(stderr, "Starting searching step.\n"); + } + restart_mapping = searching(fch, buckets, sorted_indexes); + + } while(restart_mapping && iterations > 0); + if (buckets) fch_buckets_destroy(buckets); + if (sorted_indexes) free (sorted_indexes); + if (iterations == 0) return NULL; + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + fchf = (fch_data_t *)malloc(sizeof(fch_data_t)); + fchf->g = fch->g; + fch->g = NULL; //transfer memory ownership + fchf->h1 = fch->h1; + fch->h1 = NULL; //transfer memory ownership + fchf->h2 = fch->h2; + fch->h2 = NULL; //transfer memory ownership + fchf->p2 = fch->p2; + fchf->p1 = fch->p1; + fchf->b = fch->b; + fchf->c = fch->c; + fchf->m = fch->m; + mphf->data = fchf; + mphf->size = fch->m; + //DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +int fch_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *data = (fch_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + hash_state_dump(data->h1, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->h2, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); + fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < data->b; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void fch_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *fch = (fch_data_t *)malloc(sizeof(fch_data_t)); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h1\n"); + fch->h1 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h1 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h1 = hash_state_load(buf, buflen); + free(buf); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h2\n"); + fch->h2 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h2 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h2 = hash_state_load(buf, buflen); + free(buf); + + + //DEBUGP("Reading m and n\n"); + fread(&(fch->m), sizeof(cmph_uint32), 1, f); + fread(&(fch->c), sizeof(cmph_float32), 1, f); + fread(&(fch->b), sizeof(cmph_uint32), 1, f); + fread(&(fch->p1), sizeof(cmph_float32), 1, f); + fread(&(fch->p2), sizeof(cmph_float32), 1, f); + + fch->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*fch->b); + fread(fch->g, fch->b*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < fch->b; ++i) fprintf(stderr, "%u ", fch->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + fch_data_t *fch = mphf->data; + cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); + return (h2 + fch->g[h1]) % fch->m; +} +void fch_destroy(cmph_t *mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->h1); + hash_state_destroy(data->h2); + free(data); + free(mphf); +} diff --git a/src/fch.h b/src/fch.h new file mode 100644 index 0000000..e56855c --- /dev/null +++ b/src/fch.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_FCH_H__ +#define __CMPH_FCH_H__ + +#include "cmph.h" + +typedef struct __fch_data_t fch_data_t; +typedef struct __fch_config_data_t fch_config_data_t; + +fch_config_data_t *fch_config_new(); +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void fch_config_destroy(cmph_config_t *mph); +cmph_t *fch_new(cmph_config_t *mph, float c); + +void fch_load(FILE *f, cmph_t *mphf); +int fch_dump(cmph_t *mphf, FILE *f); +void fch_destroy(cmph_t *mphf); +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/fch_buckets.c b/src/fch_buckets.c new file mode 100644 index 0000000..471ce78 --- /dev/null +++ b/src/fch_buckets.c @@ -0,0 +1,214 @@ +#include "vqueue.h" +#include "fch_buckets.h" +#include +#include +#include +//#define DEBUG +#include "debug.h" + +typedef struct __fch_bucket_entry_t +{ + char * value; + cmph_uint32 length; +} fch_bucket_entry_t; + +typedef struct __fch_bucket_t +{ + fch_bucket_entry_t * entries; + cmph_uint32 capacity, size; +} fch_bucket_t; + + + +static void fch_bucket_new(fch_bucket_t *bucket) +{ + assert(bucket); + bucket->size = 0; + bucket->entries = NULL; + bucket->capacity = 0; +} + +static void fch_bucket_destroy(fch_bucket_t *bucket) +{ + cmph_uint32 i; + assert(bucket); + for (i = 0; i < bucket->size; i++) + { + free((bucket->entries + i)->value); + } + free(bucket->entries); +} + + +static void fch_bucket_reserve(fch_bucket_t *bucket, cmph_uint32 size) +{ + assert(bucket); + if (bucket->capacity < size) + { + cmph_uint32 new_capacity = bucket->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", bucket->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + bucket->entries = (fch_bucket_entry_t *)realloc(bucket->entries, sizeof(fch_bucket_entry_t)*new_capacity); + assert(bucket->entries); + bucket->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + +static void fch_bucket_insert(fch_bucket_t *bucket, char *val, cmph_uint32 val_length) +{ + assert(bucket); + fch_bucket_reserve(bucket, bucket->size + 1); + (bucket->entries + bucket->size)->value = val; + (bucket->entries + bucket->size)->length = val_length; + ++(bucket->size); +} + + +static cmph_uint8 fch_bucket_is_empty(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size == 0; +} + +static cmph_uint32 fch_bucket_size(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size; +} + +static char * fch_bucket_get_key(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->value; +} + +static cmph_uint32 fch_bucket_get_length(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->length; +} + +static void fch_bucket_print(fch_bucket_t * bucket, cmph_uint32 index) +{ + cmph_uint32 i; + assert(bucket); + fprintf(stderr, "Printing bucket %u ...\n", index); + for (i = 0; i < bucket->size; i++) + { + fprintf(stderr, " key: %s\n", (bucket->entries + i)->value); + } +} + +////////////////////////////////////////////////////////////////////////////////////// + +struct __fch_buckets_t +{ + fch_bucket_t * values; + cmph_uint32 nbuckets, max_size; + +}; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets) +{ + cmph_uint32 i; + fch_buckets_t *buckets = (fch_buckets_t *)malloc(sizeof(fch_buckets_t)); + assert(buckets); + buckets->values = (fch_bucket_t *)calloc(nbuckets, sizeof(fch_bucket_t)); + for (i = 0; i < nbuckets; i++) fch_bucket_new(buckets->values + i); + assert(buckets->values); + buckets->nbuckets = nbuckets; + buckets->max_size = 0; + return buckets; +} + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_is_empty(buckets->values + index); +} + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length) +{ + assert(index < buckets->nbuckets); + fch_bucket_insert(buckets->values + index, key, length); + if (fch_bucket_size(buckets->values + index) > buckets->max_size) + { + buckets->max_size = fch_bucket_size(buckets->values + index); + } +} + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_size(buckets->values + index); +} + + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_key(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_length(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) +{ + return buckets->nbuckets; +} + +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) +{ + return buckets->max_size; +} + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) +{ + int i = 0; + cmph_uint32 sum = 0, value; + cmph_uint32 *nbuckets_size = (cmph_uint32 *) calloc(buckets->max_size + 1, sizeof(cmph_uint32)); + cmph_uint32 * sorted_indexes = (cmph_uint32 *) calloc(buckets->nbuckets, sizeof(cmph_uint32)); + + // collect how many buckets for each size. + for(i = 0; i < buckets->nbuckets; i++) nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + + // calculating offset considering a decreasing order of buckets size. + value = nbuckets_size[buckets->max_size]; + nbuckets_size[buckets->max_size] = sum; + for(i = buckets->max_size - 1; i >= 0; i--) + { + sum += value; + value = nbuckets_size[i]; + nbuckets_size[i] = sum; + + } + for(i = 0; i < buckets->nbuckets; i++) + { + sorted_indexes[nbuckets_size[fch_bucket_size(buckets->values + i)]] = i; + nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + } + free(nbuckets_size); + return sorted_indexes; +} + +void fch_buckets_print(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_print(buckets->values + i, i); +} + +void fch_buckets_destroy(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_destroy(buckets->values + i); + free(buckets->values); + free(buckets); +} diff --git a/src/fch_buckets.h b/src/fch_buckets.h new file mode 100644 index 0000000..2a1b8b2 --- /dev/null +++ b/src/fch_buckets.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_BUCKETS_H__ +#define __CMPH_FCH_BUCKETS_H__ + +#include "cmph_types.h" +typedef struct __fch_buckets_t fch_buckets_t; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets); + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index); + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length); + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index); + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +// returns the size of biggest bucket. +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets); + +// returns the number of buckets. +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets); + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets); + +void fch_buckets_print(fch_buckets_t * buckets); + +void fch_buckets_destroy(fch_buckets_t * buckets); +#endif diff --git a/src/fch_structs.h b/src/fch_structs.h new file mode 100755 index 0000000..f22646b --- /dev/null +++ b/src/fch_structs.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_STRUCTS_H__ +#define __CMPH_FCH_STRUCTS_H__ + +#include "hash_state.h" + +struct __fch_data_t +{ + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; + +struct __fch_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; +#endif From 935256465122a734b4d11dd6a19769f276dc1f9e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 18:27:16 +0000 Subject: [PATCH 326/739] FCH algorithm added but not tested... --- src/Makefile.am | 4 +- src/bmz.c | 1 + src/fch.c | 395 ++++++++++++++++++++++++++++++++++++++++++++++ src/fch.h | 18 +++ src/fch_buckets.c | 214 +++++++++++++++++++++++++ src/fch_buckets.h | 30 ++++ src/fch_structs.h | 30 ++++ 7 files changed, 691 insertions(+), 1 deletion(-) create mode 100644 src/fch.c create mode 100644 src/fch.h create mode 100644 src/fch_buckets.c create mode 100644 src/fch_buckets.h create mode 100755 src/fch_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index b6430da..3140214 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,7 +19,9 @@ libcmph_la_SOURCES = debug.h\ bmz8.h bmz8_structs.h bmz8.c\ buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ - brz.h brz_structs.h brz.c + brz.h brz_structs.h brz.c\ + fch.h fch_structs.h fch.c\ + fch_buckets.h fch_buckets.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 1424d59..0009ce1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -468,6 +468,7 @@ int bmz_dump(cmph_t *mphf, FILE *fd) fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); #ifdef DEBUG + cmph_uint32 i; fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); fprintf(stderr, "\n"); diff --git a/src/fch.c b/src/fch.c new file mode 100644 index 0000000..0477d27 --- /dev/null +++ b/src/fch.c @@ -0,0 +1,395 @@ +#include "fch.h" +#include "cmph_structs.h" +#include "fch_structs.h" +#include "hash.h" +#include "bitbool.h" +#include "fch_buckets.h" +//#include +#include +#include +#include +#include +#include +#include +#define INDEX 0 /* alignment index within a bucket */ +//#define DEBUG +#include "debug.h" + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); +static void calc_parameters(fch_config_data_t *fch); +static fch_buckets_t * mapping(cmph_config_t *mph); +static cmph_uint32 * ordering(fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static void permut(cmph_uint32 * vector, cmph_uint32 n); +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); + +fch_config_data_t *fch_config_new() +{ + fch_config_data_t *fch; + fch = (fch_config_data_t *)malloc(sizeof(fch_config_data_t)); + assert(fch); + memset(fch, 0, sizeof(fch_config_data_t)); + fch->hashfuncs[0] = CMPH_HASH_JENKINS; + fch->hashfuncs[1] = CMPH_HASH_JENKINS; + fch->m = fch->b = 0; + fch->c = fch->p1 = fch->p2 = 0; + fch->g = NULL; + fch->h1 = NULL; + fch->h2 = NULL; + return fch; +} + +void fch_config_destroy(cmph_config_t *mph) +{ + fch_config_data_t *data = (fch_config_data_t *)mph->data; + //DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //fch only uses two hash functions + fch->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +{ + if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ + else { /* h12 o h10 */ + initial_index %= b; + if(initial_index < p2) initial_index += (cmph_uint32)p2; + } + return initial_index; +} + +static void calc_parameters(fch_config_data_t *fch) +{ + fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); + fch->p1 = ceil(0.6*fch->m); + fch->p2 = ceil(0.3*fch->b); +} + +static fch_buckets_t * mapping(cmph_config_t *mph) +{ +// struct timeval seed; + cmph_uint32 i = 0; + fch_buckets_t *buckets = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; +// gettimeofday(&seed,NULL); +// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); + srand((cmph_uint32)time(NULL)); + if (fch->h1) hash_state_destroy(fch->h1); + fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); + calc_parameters (fch); + buckets = fch_buckets_new(fch->b); + + mph->key_source->rewind(mph->key_source->data); + for(i = 0; i < fch->m; i++) + { + cmph_uint32 h1, keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + fch_buckets_insert(buckets, h1, key, keylen); + key = NULL; // transger memory ownership + + } + return buckets; +} + + +// returns the buckets indexes sorted by their sizes. +static cmph_uint32 * ordering(fch_buckets_t * buckets) +{ + return fch_buckets_get_indexes_sorted_by_size(buckets); +} + +/* Check whether function h2 causes collisions among the keys of each bucket */ +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +{ + //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); + cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0, index = 0, j =0; + for (i = 0; i < nbuckets; i++) + { + cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + memset(hashtable, 0, fch->m); + for (j = 0; j < nkeys; j++) + { + char * key = fch_buckets_get_key(buckets, i, j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + index = hash(fch->h2, key, keylen) % fch->m; + if(hashtable[index]) { // collision detected + free(hashtable); + return 1; + } + hashtable[index] = 1; + } + } + free(hashtable); + return 0; +} + +static void permut(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, j, b; + srand((cmph_uint32)time(NULL)); + for (i = 0; i < n; i++) { + j = rand() % n; + b = vector[i]; + vector[i] = vector[j]; + vector[j] = b; + } +} + +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes) +{ + cmph_uint32 * random_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 * map_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 iteration_to_generate_h2 = 0; + cmph_uint32 searching_iterations = 0; + cmph_uint8 restart = 0; + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i, j, z, counter = 0, filled_count = 0; + if (fch->g) free (fch->g); + fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + + for(i = 0; i < fch->m; i++) + { + random_table[i] = i; + } + permut(random_table, fch->m); + for(i = 0; i < fch->m; i++) + { + map_table[random_table[i]] = i; + } + + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + + do { + srand((cmph_uint32)time(NULL)); + if (fch->h2) hash_state_destroy(fch->h2); + fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); + restart = check_for_collisions_h2(fch, buckets); + filled_count = 0; + if (!restart) searching_iterations++; + else iteration_to_generate_h2++; + for(i = 0; (i < nbuckets) && !restart; i++) { + restart = 1; // true + for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + counter = 0; + restart = 0; // false + fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + j = INDEX; + do { + cmph_uint32 index = 0; + key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); + h2 = hash(fch->h2, key, keylen) % fch->m; + index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + if (map_table[index] >= filled_count) { + cmph_uint32 y = map_table[index]; + cmph_uint32 ry = random_table[y]; + random_table[y] = random_table[filled_count]; + random_table[filled_count] = ry; + map_table[random_table[y]] = y; + map_table[random_table[filled_count]] = filled_count; + filled_count++; + counter ++; + } + else { + restart = 1; // true + filled_count = filled_count - counter; + counter = 0; + break; + } + j = (j + 1) % bucketsize; + } while(j % bucketsize != INDEX); + } + } + } while(restart && (searching_iterations < 100000)); + free(map_table); + free(random_table); + return restart; +} + + + +cmph_t *fch_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + fch_data_t *fchf = NULL; + cmph_uint32 iterations = 100; + cmph_uint8 restart_mapping = 0; + fch_buckets_t * buckets = NULL; + cmph_uint32 * sorted_indexes = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + fch->m = mph->key_source->nkeys; + //DEBUGP("m: %f\n", fch->m); + fch->c = c; + //DEBUGP("c: %f\n", fch->c); + fch->h1 = NULL; + fch->h2 = NULL; + fch->g = NULL; + do + { + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys\n", fch->m); + } + if (buckets) fch_buckets_destroy(buckets); + buckets = mapping(mph); + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + if (sorted_indexes) free (sorted_indexes); + sorted_indexes = ordering(buckets); + if (mph->verbosity) + { + fprintf(stderr, "Starting searching step.\n"); + } + restart_mapping = searching(fch, buckets, sorted_indexes); + + } while(restart_mapping && iterations > 0); + if (buckets) fch_buckets_destroy(buckets); + if (sorted_indexes) free (sorted_indexes); + if (iterations == 0) return NULL; + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + fchf = (fch_data_t *)malloc(sizeof(fch_data_t)); + fchf->g = fch->g; + fch->g = NULL; //transfer memory ownership + fchf->h1 = fch->h1; + fch->h1 = NULL; //transfer memory ownership + fchf->h2 = fch->h2; + fch->h2 = NULL; //transfer memory ownership + fchf->p2 = fch->p2; + fchf->p1 = fch->p1; + fchf->b = fch->b; + fchf->c = fch->c; + fchf->m = fch->m; + mphf->data = fchf; + mphf->size = fch->m; + //DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +int fch_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *data = (fch_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + hash_state_dump(data->h1, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->h2, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); + fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < data->b; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void fch_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *fch = (fch_data_t *)malloc(sizeof(fch_data_t)); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h1\n"); + fch->h1 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h1 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h1 = hash_state_load(buf, buflen); + free(buf); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h2\n"); + fch->h2 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h2 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h2 = hash_state_load(buf, buflen); + free(buf); + + + //DEBUGP("Reading m and n\n"); + fread(&(fch->m), sizeof(cmph_uint32), 1, f); + fread(&(fch->c), sizeof(cmph_float32), 1, f); + fread(&(fch->b), sizeof(cmph_uint32), 1, f); + fread(&(fch->p1), sizeof(cmph_float32), 1, f); + fread(&(fch->p2), sizeof(cmph_float32), 1, f); + + fch->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*fch->b); + fread(fch->g, fch->b*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < fch->b; ++i) fprintf(stderr, "%u ", fch->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + fch_data_t *fch = mphf->data; + cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); + return (h2 + fch->g[h1]) % fch->m; +} +void fch_destroy(cmph_t *mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->h1); + hash_state_destroy(data->h2); + free(data); + free(mphf); +} diff --git a/src/fch.h b/src/fch.h new file mode 100644 index 0000000..e56855c --- /dev/null +++ b/src/fch.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_FCH_H__ +#define __CMPH_FCH_H__ + +#include "cmph.h" + +typedef struct __fch_data_t fch_data_t; +typedef struct __fch_config_data_t fch_config_data_t; + +fch_config_data_t *fch_config_new(); +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void fch_config_destroy(cmph_config_t *mph); +cmph_t *fch_new(cmph_config_t *mph, float c); + +void fch_load(FILE *f, cmph_t *mphf); +int fch_dump(cmph_t *mphf, FILE *f); +void fch_destroy(cmph_t *mphf); +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/fch_buckets.c b/src/fch_buckets.c new file mode 100644 index 0000000..471ce78 --- /dev/null +++ b/src/fch_buckets.c @@ -0,0 +1,214 @@ +#include "vqueue.h" +#include "fch_buckets.h" +#include +#include +#include +//#define DEBUG +#include "debug.h" + +typedef struct __fch_bucket_entry_t +{ + char * value; + cmph_uint32 length; +} fch_bucket_entry_t; + +typedef struct __fch_bucket_t +{ + fch_bucket_entry_t * entries; + cmph_uint32 capacity, size; +} fch_bucket_t; + + + +static void fch_bucket_new(fch_bucket_t *bucket) +{ + assert(bucket); + bucket->size = 0; + bucket->entries = NULL; + bucket->capacity = 0; +} + +static void fch_bucket_destroy(fch_bucket_t *bucket) +{ + cmph_uint32 i; + assert(bucket); + for (i = 0; i < bucket->size; i++) + { + free((bucket->entries + i)->value); + } + free(bucket->entries); +} + + +static void fch_bucket_reserve(fch_bucket_t *bucket, cmph_uint32 size) +{ + assert(bucket); + if (bucket->capacity < size) + { + cmph_uint32 new_capacity = bucket->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", bucket->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + bucket->entries = (fch_bucket_entry_t *)realloc(bucket->entries, sizeof(fch_bucket_entry_t)*new_capacity); + assert(bucket->entries); + bucket->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + +static void fch_bucket_insert(fch_bucket_t *bucket, char *val, cmph_uint32 val_length) +{ + assert(bucket); + fch_bucket_reserve(bucket, bucket->size + 1); + (bucket->entries + bucket->size)->value = val; + (bucket->entries + bucket->size)->length = val_length; + ++(bucket->size); +} + + +static cmph_uint8 fch_bucket_is_empty(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size == 0; +} + +static cmph_uint32 fch_bucket_size(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size; +} + +static char * fch_bucket_get_key(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->value; +} + +static cmph_uint32 fch_bucket_get_length(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->length; +} + +static void fch_bucket_print(fch_bucket_t * bucket, cmph_uint32 index) +{ + cmph_uint32 i; + assert(bucket); + fprintf(stderr, "Printing bucket %u ...\n", index); + for (i = 0; i < bucket->size; i++) + { + fprintf(stderr, " key: %s\n", (bucket->entries + i)->value); + } +} + +////////////////////////////////////////////////////////////////////////////////////// + +struct __fch_buckets_t +{ + fch_bucket_t * values; + cmph_uint32 nbuckets, max_size; + +}; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets) +{ + cmph_uint32 i; + fch_buckets_t *buckets = (fch_buckets_t *)malloc(sizeof(fch_buckets_t)); + assert(buckets); + buckets->values = (fch_bucket_t *)calloc(nbuckets, sizeof(fch_bucket_t)); + for (i = 0; i < nbuckets; i++) fch_bucket_new(buckets->values + i); + assert(buckets->values); + buckets->nbuckets = nbuckets; + buckets->max_size = 0; + return buckets; +} + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_is_empty(buckets->values + index); +} + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length) +{ + assert(index < buckets->nbuckets); + fch_bucket_insert(buckets->values + index, key, length); + if (fch_bucket_size(buckets->values + index) > buckets->max_size) + { + buckets->max_size = fch_bucket_size(buckets->values + index); + } +} + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_size(buckets->values + index); +} + + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_key(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_length(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) +{ + return buckets->nbuckets; +} + +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) +{ + return buckets->max_size; +} + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) +{ + int i = 0; + cmph_uint32 sum = 0, value; + cmph_uint32 *nbuckets_size = (cmph_uint32 *) calloc(buckets->max_size + 1, sizeof(cmph_uint32)); + cmph_uint32 * sorted_indexes = (cmph_uint32 *) calloc(buckets->nbuckets, sizeof(cmph_uint32)); + + // collect how many buckets for each size. + for(i = 0; i < buckets->nbuckets; i++) nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + + // calculating offset considering a decreasing order of buckets size. + value = nbuckets_size[buckets->max_size]; + nbuckets_size[buckets->max_size] = sum; + for(i = buckets->max_size - 1; i >= 0; i--) + { + sum += value; + value = nbuckets_size[i]; + nbuckets_size[i] = sum; + + } + for(i = 0; i < buckets->nbuckets; i++) + { + sorted_indexes[nbuckets_size[fch_bucket_size(buckets->values + i)]] = i; + nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + } + free(nbuckets_size); + return sorted_indexes; +} + +void fch_buckets_print(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_print(buckets->values + i, i); +} + +void fch_buckets_destroy(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_destroy(buckets->values + i); + free(buckets->values); + free(buckets); +} diff --git a/src/fch_buckets.h b/src/fch_buckets.h new file mode 100644 index 0000000..2a1b8b2 --- /dev/null +++ b/src/fch_buckets.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_BUCKETS_H__ +#define __CMPH_FCH_BUCKETS_H__ + +#include "cmph_types.h" +typedef struct __fch_buckets_t fch_buckets_t; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets); + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index); + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length); + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index); + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +// returns the size of biggest bucket. +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets); + +// returns the number of buckets. +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets); + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets); + +void fch_buckets_print(fch_buckets_t * buckets); + +void fch_buckets_destroy(fch_buckets_t * buckets); +#endif diff --git a/src/fch_structs.h b/src/fch_structs.h new file mode 100755 index 0000000..f22646b --- /dev/null +++ b/src/fch_structs.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_STRUCTS_H__ +#define __CMPH_FCH_STRUCTS_H__ + +#include "hash_state.h" + +struct __fch_data_t +{ + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; + +struct __fch_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; +#endif From ee06e15f43f1be8b9f7c3d8f6028485a9c613c41 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 18:27:16 +0000 Subject: [PATCH 327/739] FCH algorithm added but not tested... --- src/Makefile.am | 4 +- src/bmz.c | 1 + src/fch.c | 395 ++++++++++++++++++++++++++++++++++++++++++++++ src/fch.h | 18 +++ src/fch_buckets.c | 214 +++++++++++++++++++++++++ src/fch_buckets.h | 30 ++++ src/fch_structs.h | 30 ++++ 7 files changed, 691 insertions(+), 1 deletion(-) create mode 100644 src/fch.c create mode 100644 src/fch.h create mode 100644 src/fch_buckets.c create mode 100644 src/fch_buckets.h create mode 100755 src/fch_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index b6430da..3140214 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,7 +19,9 @@ libcmph_la_SOURCES = debug.h\ bmz8.h bmz8_structs.h bmz8.c\ buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ - brz.h brz_structs.h brz.c + brz.h brz_structs.h brz.c\ + fch.h fch_structs.h fch.c\ + fch_buckets.h fch_buckets.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 1424d59..0009ce1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -468,6 +468,7 @@ int bmz_dump(cmph_t *mphf, FILE *fd) fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); #ifdef DEBUG + cmph_uint32 i; fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); fprintf(stderr, "\n"); diff --git a/src/fch.c b/src/fch.c new file mode 100644 index 0000000..0477d27 --- /dev/null +++ b/src/fch.c @@ -0,0 +1,395 @@ +#include "fch.h" +#include "cmph_structs.h" +#include "fch_structs.h" +#include "hash.h" +#include "bitbool.h" +#include "fch_buckets.h" +//#include +#include +#include +#include +#include +#include +#include +#define INDEX 0 /* alignment index within a bucket */ +//#define DEBUG +#include "debug.h" + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); +static void calc_parameters(fch_config_data_t *fch); +static fch_buckets_t * mapping(cmph_config_t *mph); +static cmph_uint32 * ordering(fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static void permut(cmph_uint32 * vector, cmph_uint32 n); +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); + +fch_config_data_t *fch_config_new() +{ + fch_config_data_t *fch; + fch = (fch_config_data_t *)malloc(sizeof(fch_config_data_t)); + assert(fch); + memset(fch, 0, sizeof(fch_config_data_t)); + fch->hashfuncs[0] = CMPH_HASH_JENKINS; + fch->hashfuncs[1] = CMPH_HASH_JENKINS; + fch->m = fch->b = 0; + fch->c = fch->p1 = fch->p2 = 0; + fch->g = NULL; + fch->h1 = NULL; + fch->h2 = NULL; + return fch; +} + +void fch_config_destroy(cmph_config_t *mph) +{ + fch_config_data_t *data = (fch_config_data_t *)mph->data; + //DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //fch only uses two hash functions + fch->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +{ + if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ + else { /* h12 o h10 */ + initial_index %= b; + if(initial_index < p2) initial_index += (cmph_uint32)p2; + } + return initial_index; +} + +static void calc_parameters(fch_config_data_t *fch) +{ + fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); + fch->p1 = ceil(0.6*fch->m); + fch->p2 = ceil(0.3*fch->b); +} + +static fch_buckets_t * mapping(cmph_config_t *mph) +{ +// struct timeval seed; + cmph_uint32 i = 0; + fch_buckets_t *buckets = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; +// gettimeofday(&seed,NULL); +// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); + srand((cmph_uint32)time(NULL)); + if (fch->h1) hash_state_destroy(fch->h1); + fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); + calc_parameters (fch); + buckets = fch_buckets_new(fch->b); + + mph->key_source->rewind(mph->key_source->data); + for(i = 0; i < fch->m; i++) + { + cmph_uint32 h1, keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + fch_buckets_insert(buckets, h1, key, keylen); + key = NULL; // transger memory ownership + + } + return buckets; +} + + +// returns the buckets indexes sorted by their sizes. +static cmph_uint32 * ordering(fch_buckets_t * buckets) +{ + return fch_buckets_get_indexes_sorted_by_size(buckets); +} + +/* Check whether function h2 causes collisions among the keys of each bucket */ +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +{ + //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); + cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0, index = 0, j =0; + for (i = 0; i < nbuckets; i++) + { + cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + memset(hashtable, 0, fch->m); + for (j = 0; j < nkeys; j++) + { + char * key = fch_buckets_get_key(buckets, i, j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + index = hash(fch->h2, key, keylen) % fch->m; + if(hashtable[index]) { // collision detected + free(hashtable); + return 1; + } + hashtable[index] = 1; + } + } + free(hashtable); + return 0; +} + +static void permut(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, j, b; + srand((cmph_uint32)time(NULL)); + for (i = 0; i < n; i++) { + j = rand() % n; + b = vector[i]; + vector[i] = vector[j]; + vector[j] = b; + } +} + +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes) +{ + cmph_uint32 * random_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 * map_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 iteration_to_generate_h2 = 0; + cmph_uint32 searching_iterations = 0; + cmph_uint8 restart = 0; + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i, j, z, counter = 0, filled_count = 0; + if (fch->g) free (fch->g); + fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + + for(i = 0; i < fch->m; i++) + { + random_table[i] = i; + } + permut(random_table, fch->m); + for(i = 0; i < fch->m; i++) + { + map_table[random_table[i]] = i; + } + + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + + do { + srand((cmph_uint32)time(NULL)); + if (fch->h2) hash_state_destroy(fch->h2); + fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); + restart = check_for_collisions_h2(fch, buckets); + filled_count = 0; + if (!restart) searching_iterations++; + else iteration_to_generate_h2++; + for(i = 0; (i < nbuckets) && !restart; i++) { + restart = 1; // true + for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + counter = 0; + restart = 0; // false + fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + j = INDEX; + do { + cmph_uint32 index = 0; + key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); + h2 = hash(fch->h2, key, keylen) % fch->m; + index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + if (map_table[index] >= filled_count) { + cmph_uint32 y = map_table[index]; + cmph_uint32 ry = random_table[y]; + random_table[y] = random_table[filled_count]; + random_table[filled_count] = ry; + map_table[random_table[y]] = y; + map_table[random_table[filled_count]] = filled_count; + filled_count++; + counter ++; + } + else { + restart = 1; // true + filled_count = filled_count - counter; + counter = 0; + break; + } + j = (j + 1) % bucketsize; + } while(j % bucketsize != INDEX); + } + } + } while(restart && (searching_iterations < 100000)); + free(map_table); + free(random_table); + return restart; +} + + + +cmph_t *fch_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + fch_data_t *fchf = NULL; + cmph_uint32 iterations = 100; + cmph_uint8 restart_mapping = 0; + fch_buckets_t * buckets = NULL; + cmph_uint32 * sorted_indexes = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + fch->m = mph->key_source->nkeys; + //DEBUGP("m: %f\n", fch->m); + fch->c = c; + //DEBUGP("c: %f\n", fch->c); + fch->h1 = NULL; + fch->h2 = NULL; + fch->g = NULL; + do + { + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys\n", fch->m); + } + if (buckets) fch_buckets_destroy(buckets); + buckets = mapping(mph); + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + if (sorted_indexes) free (sorted_indexes); + sorted_indexes = ordering(buckets); + if (mph->verbosity) + { + fprintf(stderr, "Starting searching step.\n"); + } + restart_mapping = searching(fch, buckets, sorted_indexes); + + } while(restart_mapping && iterations > 0); + if (buckets) fch_buckets_destroy(buckets); + if (sorted_indexes) free (sorted_indexes); + if (iterations == 0) return NULL; + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + fchf = (fch_data_t *)malloc(sizeof(fch_data_t)); + fchf->g = fch->g; + fch->g = NULL; //transfer memory ownership + fchf->h1 = fch->h1; + fch->h1 = NULL; //transfer memory ownership + fchf->h2 = fch->h2; + fch->h2 = NULL; //transfer memory ownership + fchf->p2 = fch->p2; + fchf->p1 = fch->p1; + fchf->b = fch->b; + fchf->c = fch->c; + fchf->m = fch->m; + mphf->data = fchf; + mphf->size = fch->m; + //DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +int fch_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *data = (fch_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + hash_state_dump(data->h1, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->h2, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); + fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < data->b; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void fch_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *fch = (fch_data_t *)malloc(sizeof(fch_data_t)); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h1\n"); + fch->h1 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h1 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h1 = hash_state_load(buf, buflen); + free(buf); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h2\n"); + fch->h2 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h2 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h2 = hash_state_load(buf, buflen); + free(buf); + + + //DEBUGP("Reading m and n\n"); + fread(&(fch->m), sizeof(cmph_uint32), 1, f); + fread(&(fch->c), sizeof(cmph_float32), 1, f); + fread(&(fch->b), sizeof(cmph_uint32), 1, f); + fread(&(fch->p1), sizeof(cmph_float32), 1, f); + fread(&(fch->p2), sizeof(cmph_float32), 1, f); + + fch->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*fch->b); + fread(fch->g, fch->b*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < fch->b; ++i) fprintf(stderr, "%u ", fch->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + fch_data_t *fch = mphf->data; + cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); + return (h2 + fch->g[h1]) % fch->m; +} +void fch_destroy(cmph_t *mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->h1); + hash_state_destroy(data->h2); + free(data); + free(mphf); +} diff --git a/src/fch.h b/src/fch.h new file mode 100644 index 0000000..e56855c --- /dev/null +++ b/src/fch.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_FCH_H__ +#define __CMPH_FCH_H__ + +#include "cmph.h" + +typedef struct __fch_data_t fch_data_t; +typedef struct __fch_config_data_t fch_config_data_t; + +fch_config_data_t *fch_config_new(); +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void fch_config_destroy(cmph_config_t *mph); +cmph_t *fch_new(cmph_config_t *mph, float c); + +void fch_load(FILE *f, cmph_t *mphf); +int fch_dump(cmph_t *mphf, FILE *f); +void fch_destroy(cmph_t *mphf); +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/fch_buckets.c b/src/fch_buckets.c new file mode 100644 index 0000000..471ce78 --- /dev/null +++ b/src/fch_buckets.c @@ -0,0 +1,214 @@ +#include "vqueue.h" +#include "fch_buckets.h" +#include +#include +#include +//#define DEBUG +#include "debug.h" + +typedef struct __fch_bucket_entry_t +{ + char * value; + cmph_uint32 length; +} fch_bucket_entry_t; + +typedef struct __fch_bucket_t +{ + fch_bucket_entry_t * entries; + cmph_uint32 capacity, size; +} fch_bucket_t; + + + +static void fch_bucket_new(fch_bucket_t *bucket) +{ + assert(bucket); + bucket->size = 0; + bucket->entries = NULL; + bucket->capacity = 0; +} + +static void fch_bucket_destroy(fch_bucket_t *bucket) +{ + cmph_uint32 i; + assert(bucket); + for (i = 0; i < bucket->size; i++) + { + free((bucket->entries + i)->value); + } + free(bucket->entries); +} + + +static void fch_bucket_reserve(fch_bucket_t *bucket, cmph_uint32 size) +{ + assert(bucket); + if (bucket->capacity < size) + { + cmph_uint32 new_capacity = bucket->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", bucket->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + bucket->entries = (fch_bucket_entry_t *)realloc(bucket->entries, sizeof(fch_bucket_entry_t)*new_capacity); + assert(bucket->entries); + bucket->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + +static void fch_bucket_insert(fch_bucket_t *bucket, char *val, cmph_uint32 val_length) +{ + assert(bucket); + fch_bucket_reserve(bucket, bucket->size + 1); + (bucket->entries + bucket->size)->value = val; + (bucket->entries + bucket->size)->length = val_length; + ++(bucket->size); +} + + +static cmph_uint8 fch_bucket_is_empty(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size == 0; +} + +static cmph_uint32 fch_bucket_size(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size; +} + +static char * fch_bucket_get_key(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->value; +} + +static cmph_uint32 fch_bucket_get_length(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->length; +} + +static void fch_bucket_print(fch_bucket_t * bucket, cmph_uint32 index) +{ + cmph_uint32 i; + assert(bucket); + fprintf(stderr, "Printing bucket %u ...\n", index); + for (i = 0; i < bucket->size; i++) + { + fprintf(stderr, " key: %s\n", (bucket->entries + i)->value); + } +} + +////////////////////////////////////////////////////////////////////////////////////// + +struct __fch_buckets_t +{ + fch_bucket_t * values; + cmph_uint32 nbuckets, max_size; + +}; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets) +{ + cmph_uint32 i; + fch_buckets_t *buckets = (fch_buckets_t *)malloc(sizeof(fch_buckets_t)); + assert(buckets); + buckets->values = (fch_bucket_t *)calloc(nbuckets, sizeof(fch_bucket_t)); + for (i = 0; i < nbuckets; i++) fch_bucket_new(buckets->values + i); + assert(buckets->values); + buckets->nbuckets = nbuckets; + buckets->max_size = 0; + return buckets; +} + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_is_empty(buckets->values + index); +} + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length) +{ + assert(index < buckets->nbuckets); + fch_bucket_insert(buckets->values + index, key, length); + if (fch_bucket_size(buckets->values + index) > buckets->max_size) + { + buckets->max_size = fch_bucket_size(buckets->values + index); + } +} + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_size(buckets->values + index); +} + + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_key(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_length(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) +{ + return buckets->nbuckets; +} + +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) +{ + return buckets->max_size; +} + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) +{ + int i = 0; + cmph_uint32 sum = 0, value; + cmph_uint32 *nbuckets_size = (cmph_uint32 *) calloc(buckets->max_size + 1, sizeof(cmph_uint32)); + cmph_uint32 * sorted_indexes = (cmph_uint32 *) calloc(buckets->nbuckets, sizeof(cmph_uint32)); + + // collect how many buckets for each size. + for(i = 0; i < buckets->nbuckets; i++) nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + + // calculating offset considering a decreasing order of buckets size. + value = nbuckets_size[buckets->max_size]; + nbuckets_size[buckets->max_size] = sum; + for(i = buckets->max_size - 1; i >= 0; i--) + { + sum += value; + value = nbuckets_size[i]; + nbuckets_size[i] = sum; + + } + for(i = 0; i < buckets->nbuckets; i++) + { + sorted_indexes[nbuckets_size[fch_bucket_size(buckets->values + i)]] = i; + nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + } + free(nbuckets_size); + return sorted_indexes; +} + +void fch_buckets_print(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_print(buckets->values + i, i); +} + +void fch_buckets_destroy(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_destroy(buckets->values + i); + free(buckets->values); + free(buckets); +} diff --git a/src/fch_buckets.h b/src/fch_buckets.h new file mode 100644 index 0000000..2a1b8b2 --- /dev/null +++ b/src/fch_buckets.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_BUCKETS_H__ +#define __CMPH_FCH_BUCKETS_H__ + +#include "cmph_types.h" +typedef struct __fch_buckets_t fch_buckets_t; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets); + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index); + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length); + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index); + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +// returns the size of biggest bucket. +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets); + +// returns the number of buckets. +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets); + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets); + +void fch_buckets_print(fch_buckets_t * buckets); + +void fch_buckets_destroy(fch_buckets_t * buckets); +#endif diff --git a/src/fch_structs.h b/src/fch_structs.h new file mode 100755 index 0000000..f22646b --- /dev/null +++ b/src/fch_structs.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_STRUCTS_H__ +#define __CMPH_FCH_STRUCTS_H__ + +#include "hash_state.h" + +struct __fch_data_t +{ + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; + +struct __fch_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; +#endif From 97e8247c4e45172e061d4df21f9ba52cf9a08cfe Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 18:27:16 +0000 Subject: [PATCH 328/739] FCH algorithm added but not tested... --- src/Makefile.am | 4 +- src/bmz.c | 1 + src/fch.c | 395 ++++++++++++++++++++++++++++++++++++++++++++++ src/fch.h | 18 +++ src/fch_buckets.c | 214 +++++++++++++++++++++++++ src/fch_buckets.h | 30 ++++ src/fch_structs.h | 30 ++++ 7 files changed, 691 insertions(+), 1 deletion(-) create mode 100644 src/fch.c create mode 100644 src/fch.h create mode 100644 src/fch_buckets.c create mode 100644 src/fch_buckets.h create mode 100755 src/fch_structs.h diff --git a/src/Makefile.am b/src/Makefile.am index b6430da..3140214 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,7 +19,9 @@ libcmph_la_SOURCES = debug.h\ bmz8.h bmz8_structs.h bmz8.c\ buffer_manager.h buffer_manager.c\ buffer_entry.h buffer_entry.c\ - brz.h brz_structs.h brz.c + brz.h brz_structs.h brz.c\ + fch.h fch_structs.h fch.c\ + fch_buckets.h fch_buckets.c libcmph_la_LDFLAGS = -version-info 0:0:0 diff --git a/src/bmz.c b/src/bmz.c index 1424d59..0009ce1 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -468,6 +468,7 @@ int bmz_dump(cmph_t *mphf, FILE *fd) fwrite(data->g, sizeof(cmph_uint32)*(data->n), 1, fd); #ifdef DEBUG + cmph_uint32 i; fprintf(stderr, "G: "); for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); fprintf(stderr, "\n"); diff --git a/src/fch.c b/src/fch.c new file mode 100644 index 0000000..0477d27 --- /dev/null +++ b/src/fch.c @@ -0,0 +1,395 @@ +#include "fch.h" +#include "cmph_structs.h" +#include "fch_structs.h" +#include "hash.h" +#include "bitbool.h" +#include "fch_buckets.h" +//#include +#include +#include +#include +#include +#include +#include +#define INDEX 0 /* alignment index within a bucket */ +//#define DEBUG +#include "debug.h" + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); +static void calc_parameters(fch_config_data_t *fch); +static fch_buckets_t * mapping(cmph_config_t *mph); +static cmph_uint32 * ordering(fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static void permut(cmph_uint32 * vector, cmph_uint32 n); +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); + +fch_config_data_t *fch_config_new() +{ + fch_config_data_t *fch; + fch = (fch_config_data_t *)malloc(sizeof(fch_config_data_t)); + assert(fch); + memset(fch, 0, sizeof(fch_config_data_t)); + fch->hashfuncs[0] = CMPH_HASH_JENKINS; + fch->hashfuncs[1] = CMPH_HASH_JENKINS; + fch->m = fch->b = 0; + fch->c = fch->p1 = fch->p2 = 0; + fch->g = NULL; + fch->h1 = NULL; + fch->h2 = NULL; + return fch; +} + +void fch_config_destroy(cmph_config_t *mph) +{ + fch_config_data_t *data = (fch_config_data_t *)mph->data; + //DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //fch only uses two hash functions + fch->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +{ + if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ + else { /* h12 o h10 */ + initial_index %= b; + if(initial_index < p2) initial_index += (cmph_uint32)p2; + } + return initial_index; +} + +static void calc_parameters(fch_config_data_t *fch) +{ + fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); + fch->p1 = ceil(0.6*fch->m); + fch->p2 = ceil(0.3*fch->b); +} + +static fch_buckets_t * mapping(cmph_config_t *mph) +{ +// struct timeval seed; + cmph_uint32 i = 0; + fch_buckets_t *buckets = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; +// gettimeofday(&seed,NULL); +// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); + srand((cmph_uint32)time(NULL)); + if (fch->h1) hash_state_destroy(fch->h1); + fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); + calc_parameters (fch); + buckets = fch_buckets_new(fch->b); + + mph->key_source->rewind(mph->key_source->data); + for(i = 0; i < fch->m; i++) + { + cmph_uint32 h1, keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + fch_buckets_insert(buckets, h1, key, keylen); + key = NULL; // transger memory ownership + + } + return buckets; +} + + +// returns the buckets indexes sorted by their sizes. +static cmph_uint32 * ordering(fch_buckets_t * buckets) +{ + return fch_buckets_get_indexes_sorted_by_size(buckets); +} + +/* Check whether function h2 causes collisions among the keys of each bucket */ +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +{ + //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); + cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0, index = 0, j =0; + for (i = 0; i < nbuckets; i++) + { + cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + memset(hashtable, 0, fch->m); + for (j = 0; j < nkeys; j++) + { + char * key = fch_buckets_get_key(buckets, i, j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + index = hash(fch->h2, key, keylen) % fch->m; + if(hashtable[index]) { // collision detected + free(hashtable); + return 1; + } + hashtable[index] = 1; + } + } + free(hashtable); + return 0; +} + +static void permut(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, j, b; + srand((cmph_uint32)time(NULL)); + for (i = 0; i < n; i++) { + j = rand() % n; + b = vector[i]; + vector[i] = vector[j]; + vector[j] = b; + } +} + +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes) +{ + cmph_uint32 * random_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 * map_table = (cmph_uint32 *) calloc(fch->m, sizeof(cmph_uint32)); + cmph_uint32 iteration_to_generate_h2 = 0; + cmph_uint32 searching_iterations = 0; + cmph_uint8 restart = 0; + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i, j, z, counter = 0, filled_count = 0; + if (fch->g) free (fch->g); + fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + + for(i = 0; i < fch->m; i++) + { + random_table[i] = i; + } + permut(random_table, fch->m); + for(i = 0; i < fch->m; i++) + { + map_table[random_table[i]] = i; + } + + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + + do { + srand((cmph_uint32)time(NULL)); + if (fch->h2) hash_state_destroy(fch->h2); + fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); + restart = check_for_collisions_h2(fch, buckets); + filled_count = 0; + if (!restart) searching_iterations++; + else iteration_to_generate_h2++; + for(i = 0; (i < nbuckets) && !restart; i++) { + restart = 1; // true + for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + counter = 0; + restart = 0; // false + fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + j = INDEX; + do { + cmph_uint32 index = 0; + key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); + h2 = hash(fch->h2, key, keylen) % fch->m; + index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + if (map_table[index] >= filled_count) { + cmph_uint32 y = map_table[index]; + cmph_uint32 ry = random_table[y]; + random_table[y] = random_table[filled_count]; + random_table[filled_count] = ry; + map_table[random_table[y]] = y; + map_table[random_table[filled_count]] = filled_count; + filled_count++; + counter ++; + } + else { + restart = 1; // true + filled_count = filled_count - counter; + counter = 0; + break; + } + j = (j + 1) % bucketsize; + } while(j % bucketsize != INDEX); + } + } + } while(restart && (searching_iterations < 100000)); + free(map_table); + free(random_table); + return restart; +} + + + +cmph_t *fch_new(cmph_config_t *mph, float c) +{ + cmph_t *mphf = NULL; + fch_data_t *fchf = NULL; + cmph_uint32 iterations = 100; + cmph_uint8 restart_mapping = 0; + fch_buckets_t * buckets = NULL; + cmph_uint32 * sorted_indexes = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + fch->m = mph->key_source->nkeys; + //DEBUGP("m: %f\n", fch->m); + fch->c = c; + //DEBUGP("c: %f\n", fch->c); + fch->h1 = NULL; + fch->h2 = NULL; + fch->g = NULL; + do + { + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys\n", fch->m); + } + if (buckets) fch_buckets_destroy(buckets); + buckets = mapping(mph); + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + if (sorted_indexes) free (sorted_indexes); + sorted_indexes = ordering(buckets); + if (mph->verbosity) + { + fprintf(stderr, "Starting searching step.\n"); + } + restart_mapping = searching(fch, buckets, sorted_indexes); + + } while(restart_mapping && iterations > 0); + if (buckets) fch_buckets_destroy(buckets); + if (sorted_indexes) free (sorted_indexes); + if (iterations == 0) return NULL; + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + fchf = (fch_data_t *)malloc(sizeof(fch_data_t)); + fchf->g = fch->g; + fch->g = NULL; //transfer memory ownership + fchf->h1 = fch->h1; + fch->h1 = NULL; //transfer memory ownership + fchf->h2 = fch->h2; + fch->h2 = NULL; //transfer memory ownership + fchf->p2 = fch->p2; + fchf->p1 = fch->p1; + fchf->b = fch->b; + fchf->c = fch->c; + fchf->m = fch->m; + mphf->data = fchf; + mphf->size = fch->m; + //DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +int fch_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *data = (fch_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + hash_state_dump(data->h1, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->h2, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->c), sizeof(cmph_float32), 1, fd); + fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); + fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < data->b; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void fch_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + fch_data_t *fch = (fch_data_t *)malloc(sizeof(fch_data_t)); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h1\n"); + fch->h1 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h1 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h1 = hash_state_load(buf, buflen); + free(buf); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h2\n"); + fch->h2 = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + //DEBUGP("Hash state of h2 has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + fch->h2 = hash_state_load(buf, buflen); + free(buf); + + + //DEBUGP("Reading m and n\n"); + fread(&(fch->m), sizeof(cmph_uint32), 1, f); + fread(&(fch->c), sizeof(cmph_float32), 1, f); + fread(&(fch->b), sizeof(cmph_uint32), 1, f); + fread(&(fch->p1), sizeof(cmph_float32), 1, f); + fread(&(fch->p2), sizeof(cmph_float32), 1, f); + + fch->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*fch->b); + fread(fch->g, fch->b*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + cmph_uint32 i; + fprintf(stderr, "G: "); + for (i = 0; i < fch->b; ++i) fprintf(stderr, "%u ", fch->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + fch_data_t *fch = mphf->data; + cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); + return (h2 + fch->g[h1]) % fch->m; +} +void fch_destroy(cmph_t *mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->h1); + hash_state_destroy(data->h2); + free(data); + free(mphf); +} diff --git a/src/fch.h b/src/fch.h new file mode 100644 index 0000000..e56855c --- /dev/null +++ b/src/fch.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_FCH_H__ +#define __CMPH_FCH_H__ + +#include "cmph.h" + +typedef struct __fch_data_t fch_data_t; +typedef struct __fch_config_data_t fch_config_data_t; + +fch_config_data_t *fch_config_new(); +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void fch_config_destroy(cmph_config_t *mph); +cmph_t *fch_new(cmph_config_t *mph, float c); + +void fch_load(FILE *f, cmph_t *mphf); +int fch_dump(cmph_t *mphf, FILE *f); +void fch_destroy(cmph_t *mphf); +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/src/fch_buckets.c b/src/fch_buckets.c new file mode 100644 index 0000000..471ce78 --- /dev/null +++ b/src/fch_buckets.c @@ -0,0 +1,214 @@ +#include "vqueue.h" +#include "fch_buckets.h" +#include +#include +#include +//#define DEBUG +#include "debug.h" + +typedef struct __fch_bucket_entry_t +{ + char * value; + cmph_uint32 length; +} fch_bucket_entry_t; + +typedef struct __fch_bucket_t +{ + fch_bucket_entry_t * entries; + cmph_uint32 capacity, size; +} fch_bucket_t; + + + +static void fch_bucket_new(fch_bucket_t *bucket) +{ + assert(bucket); + bucket->size = 0; + bucket->entries = NULL; + bucket->capacity = 0; +} + +static void fch_bucket_destroy(fch_bucket_t *bucket) +{ + cmph_uint32 i; + assert(bucket); + for (i = 0; i < bucket->size; i++) + { + free((bucket->entries + i)->value); + } + free(bucket->entries); +} + + +static void fch_bucket_reserve(fch_bucket_t *bucket, cmph_uint32 size) +{ + assert(bucket); + if (bucket->capacity < size) + { + cmph_uint32 new_capacity = bucket->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", bucket->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + bucket->entries = (fch_bucket_entry_t *)realloc(bucket->entries, sizeof(fch_bucket_entry_t)*new_capacity); + assert(bucket->entries); + bucket->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + +static void fch_bucket_insert(fch_bucket_t *bucket, char *val, cmph_uint32 val_length) +{ + assert(bucket); + fch_bucket_reserve(bucket, bucket->size + 1); + (bucket->entries + bucket->size)->value = val; + (bucket->entries + bucket->size)->length = val_length; + ++(bucket->size); +} + + +static cmph_uint8 fch_bucket_is_empty(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size == 0; +} + +static cmph_uint32 fch_bucket_size(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size; +} + +static char * fch_bucket_get_key(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->value; +} + +static cmph_uint32 fch_bucket_get_length(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->length; +} + +static void fch_bucket_print(fch_bucket_t * bucket, cmph_uint32 index) +{ + cmph_uint32 i; + assert(bucket); + fprintf(stderr, "Printing bucket %u ...\n", index); + for (i = 0; i < bucket->size; i++) + { + fprintf(stderr, " key: %s\n", (bucket->entries + i)->value); + } +} + +////////////////////////////////////////////////////////////////////////////////////// + +struct __fch_buckets_t +{ + fch_bucket_t * values; + cmph_uint32 nbuckets, max_size; + +}; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets) +{ + cmph_uint32 i; + fch_buckets_t *buckets = (fch_buckets_t *)malloc(sizeof(fch_buckets_t)); + assert(buckets); + buckets->values = (fch_bucket_t *)calloc(nbuckets, sizeof(fch_bucket_t)); + for (i = 0; i < nbuckets; i++) fch_bucket_new(buckets->values + i); + assert(buckets->values); + buckets->nbuckets = nbuckets; + buckets->max_size = 0; + return buckets; +} + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_is_empty(buckets->values + index); +} + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length) +{ + assert(index < buckets->nbuckets); + fch_bucket_insert(buckets->values + index, key, length); + if (fch_bucket_size(buckets->values + index) > buckets->max_size) + { + buckets->max_size = fch_bucket_size(buckets->values + index); + } +} + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_size(buckets->values + index); +} + + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_key(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_length(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) +{ + return buckets->nbuckets; +} + +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) +{ + return buckets->max_size; +} + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) +{ + int i = 0; + cmph_uint32 sum = 0, value; + cmph_uint32 *nbuckets_size = (cmph_uint32 *) calloc(buckets->max_size + 1, sizeof(cmph_uint32)); + cmph_uint32 * sorted_indexes = (cmph_uint32 *) calloc(buckets->nbuckets, sizeof(cmph_uint32)); + + // collect how many buckets for each size. + for(i = 0; i < buckets->nbuckets; i++) nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + + // calculating offset considering a decreasing order of buckets size. + value = nbuckets_size[buckets->max_size]; + nbuckets_size[buckets->max_size] = sum; + for(i = buckets->max_size - 1; i >= 0; i--) + { + sum += value; + value = nbuckets_size[i]; + nbuckets_size[i] = sum; + + } + for(i = 0; i < buckets->nbuckets; i++) + { + sorted_indexes[nbuckets_size[fch_bucket_size(buckets->values + i)]] = i; + nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + } + free(nbuckets_size); + return sorted_indexes; +} + +void fch_buckets_print(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_print(buckets->values + i, i); +} + +void fch_buckets_destroy(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_destroy(buckets->values + i); + free(buckets->values); + free(buckets); +} diff --git a/src/fch_buckets.h b/src/fch_buckets.h new file mode 100644 index 0000000..2a1b8b2 --- /dev/null +++ b/src/fch_buckets.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_BUCKETS_H__ +#define __CMPH_FCH_BUCKETS_H__ + +#include "cmph_types.h" +typedef struct __fch_buckets_t fch_buckets_t; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets); + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index); + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length); + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index); + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +// returns the size of biggest bucket. +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets); + +// returns the number of buckets. +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets); + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets); + +void fch_buckets_print(fch_buckets_t * buckets); + +void fch_buckets_destroy(fch_buckets_t * buckets); +#endif diff --git a/src/fch_structs.h b/src/fch_structs.h new file mode 100755 index 0000000..f22646b --- /dev/null +++ b/src/fch_structs.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_STRUCTS_H__ +#define __CMPH_FCH_STRUCTS_H__ + +#include "hash_state.h" + +struct __fch_data_t +{ + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; + +struct __fch_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; // words count + cmph_float32 c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + cmph_float32 p1; // constant p1 = ceil(0.6*m). Don't need to be stored + cmph_float32 p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; +#endif From 8c7e3e8e9ac52e26ee47ef5be66f9e3b33c6d9a6 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 20:00:11 +0000 Subject: [PATCH 329/739] FCH algorithm added but not tested... --- src/bmz.c | 4 +-- src/cmph.c | 89 +++++++++++++++++++++--------------------------- src/cmph_types.h | 2 +- src/fch.c | 2 +- src/main.c | 2 +- 5 files changed, 44 insertions(+), 55 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 0009ce1..e4d1c31 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -367,7 +367,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; @@ -430,7 +430,7 @@ static int bmz_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); diff --git a/src/cmph.c b/src/cmph.c index eb4bf5e..edd3a43 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -4,6 +4,7 @@ #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ +#include "fch.h" /* included -- Fabiano */ #include #include @@ -11,7 +12,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", "fch", NULL }; /* included -- Fabiano */ typedef struct { @@ -219,6 +220,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: brz_config_destroy(mph); break; + case CMPH_FCH: + fch_config_destroy(mph); + break; default: assert(0); } @@ -236,6 +240,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: mph->data = brz_config_new(); break; + case CMPH_FCH: + mph->data = fch_config_new(); + break; default: assert(0); } @@ -245,76 +252,35 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); - break; - default: - assert(0); + brz_config_set_tmp_dir(mph, tmp_dir); } } void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_mphf_fd(mph, mphf_fd); - break; - default: - assert(0); + brz_config_set_mphf_fd(mph, mphf_fd); } } void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_b(mph, b); - break; - default: - assert(0); + brz_config_set_b(mph, b); } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); - break; - default: - assert(0); + brz_config_set_memory_availability(mph, memory_availability); } - } void cmph_config_destroy(cmph_config_t *mph) @@ -334,6 +300,9 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_destroy(mph); + break; default: assert(0); } @@ -361,6 +330,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -400,6 +372,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Creating fch hash\n"); + if (c <= 2) c = 2.1; + mphf = fch_new(mph, c); + break; default: assert(0); } @@ -418,6 +395,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); + case CMPH_FCH: /* included -- Fabiano */ + return fch_dump(mphf, f); default: assert(0); } @@ -449,6 +428,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Loading fch algorithm dependent parts\n"); + fch_load(f, mphf); + break; default: assert(0); } @@ -473,6 +456,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("fch algorithm search\n"); + return fch_search(mphf, key, keylen); default: assert(0); } @@ -501,6 +487,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; + case CMPH_FCH: /* included -- Fabiano */ + fch_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph_types.h b/src/cmph_types.h index be976ee..941059b 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_FCH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/fch.c b/src/fch.c index 0477d27..b4321b9 100644 --- a/src/fch.c +++ b/src/fch.c @@ -12,7 +12,7 @@ #include #include #define INDEX 0 /* alignment index within a bucket */ -//#define DEBUG +#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); diff --git a/src/main.c b/src/main.c index 07765d9..11459dc 100644 --- a/src/main.c +++ b/src/main.c @@ -61,7 +61,7 @@ int main(int argc, char **argv) cmph_uint32 nhashes = 0; cmph_uint32 i; CMPH_ALGO mph_algo = CMPH_CHM; - float c = 2.09; + float c = 0; cmph_config_t *config = NULL; cmph_t *mphf = NULL; char * tmp_dir = NULL; From 3825c0a511b3f3dd709a37388fc4f2b8b7fab92e Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 20:00:11 +0000 Subject: [PATCH 330/739] FCH algorithm added but not tested... --- src/bmz.c | 4 +-- src/cmph.c | 89 +++++++++++++++++++++--------------------------- src/cmph_types.h | 2 +- src/fch.c | 2 +- src/main.c | 2 +- 5 files changed, 44 insertions(+), 55 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 0009ce1..e4d1c31 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -367,7 +367,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; @@ -430,7 +430,7 @@ static int bmz_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); diff --git a/src/cmph.c b/src/cmph.c index eb4bf5e..edd3a43 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -4,6 +4,7 @@ #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ +#include "fch.h" /* included -- Fabiano */ #include #include @@ -11,7 +12,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", "fch", NULL }; /* included -- Fabiano */ typedef struct { @@ -219,6 +220,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: brz_config_destroy(mph); break; + case CMPH_FCH: + fch_config_destroy(mph); + break; default: assert(0); } @@ -236,6 +240,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: mph->data = brz_config_new(); break; + case CMPH_FCH: + mph->data = fch_config_new(); + break; default: assert(0); } @@ -245,76 +252,35 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); - break; - default: - assert(0); + brz_config_set_tmp_dir(mph, tmp_dir); } } void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_mphf_fd(mph, mphf_fd); - break; - default: - assert(0); + brz_config_set_mphf_fd(mph, mphf_fd); } } void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_b(mph, b); - break; - default: - assert(0); + brz_config_set_b(mph, b); } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); - break; - default: - assert(0); + brz_config_set_memory_availability(mph, memory_availability); } - } void cmph_config_destroy(cmph_config_t *mph) @@ -334,6 +300,9 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_destroy(mph); + break; default: assert(0); } @@ -361,6 +330,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -400,6 +372,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Creating fch hash\n"); + if (c <= 2) c = 2.1; + mphf = fch_new(mph, c); + break; default: assert(0); } @@ -418,6 +395,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); + case CMPH_FCH: /* included -- Fabiano */ + return fch_dump(mphf, f); default: assert(0); } @@ -449,6 +428,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Loading fch algorithm dependent parts\n"); + fch_load(f, mphf); + break; default: assert(0); } @@ -473,6 +456,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("fch algorithm search\n"); + return fch_search(mphf, key, keylen); default: assert(0); } @@ -501,6 +487,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; + case CMPH_FCH: /* included -- Fabiano */ + fch_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph_types.h b/src/cmph_types.h index be976ee..941059b 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_FCH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/fch.c b/src/fch.c index 0477d27..b4321b9 100644 --- a/src/fch.c +++ b/src/fch.c @@ -12,7 +12,7 @@ #include #include #define INDEX 0 /* alignment index within a bucket */ -//#define DEBUG +#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); diff --git a/src/main.c b/src/main.c index 07765d9..11459dc 100644 --- a/src/main.c +++ b/src/main.c @@ -61,7 +61,7 @@ int main(int argc, char **argv) cmph_uint32 nhashes = 0; cmph_uint32 i; CMPH_ALGO mph_algo = CMPH_CHM; - float c = 2.09; + float c = 0; cmph_config_t *config = NULL; cmph_t *mphf = NULL; char * tmp_dir = NULL; From c5ce704d0e3c5185bb8e8f3e7c13180d7aedf393 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 20:00:11 +0000 Subject: [PATCH 331/739] FCH algorithm added but not tested... --- src/bmz.c | 4 +-- src/cmph.c | 89 +++++++++++++++++++++--------------------------- src/cmph_types.h | 2 +- src/fch.c | 2 +- src/main.c | 2 +- 5 files changed, 44 insertions(+), 55 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 0009ce1..e4d1c31 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -367,7 +367,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; @@ -430,7 +430,7 @@ static int bmz_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); diff --git a/src/cmph.c b/src/cmph.c index eb4bf5e..edd3a43 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -4,6 +4,7 @@ #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ +#include "fch.h" /* included -- Fabiano */ #include #include @@ -11,7 +12,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", "fch", NULL }; /* included -- Fabiano */ typedef struct { @@ -219,6 +220,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: brz_config_destroy(mph); break; + case CMPH_FCH: + fch_config_destroy(mph); + break; default: assert(0); } @@ -236,6 +240,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: mph->data = brz_config_new(); break; + case CMPH_FCH: + mph->data = fch_config_new(); + break; default: assert(0); } @@ -245,76 +252,35 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); - break; - default: - assert(0); + brz_config_set_tmp_dir(mph, tmp_dir); } } void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_mphf_fd(mph, mphf_fd); - break; - default: - assert(0); + brz_config_set_mphf_fd(mph, mphf_fd); } } void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_b(mph, b); - break; - default: - assert(0); + brz_config_set_b(mph, b); } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); - break; - default: - assert(0); + brz_config_set_memory_availability(mph, memory_availability); } - } void cmph_config_destroy(cmph_config_t *mph) @@ -334,6 +300,9 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_destroy(mph); + break; default: assert(0); } @@ -361,6 +330,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -400,6 +372,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Creating fch hash\n"); + if (c <= 2) c = 2.1; + mphf = fch_new(mph, c); + break; default: assert(0); } @@ -418,6 +395,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); + case CMPH_FCH: /* included -- Fabiano */ + return fch_dump(mphf, f); default: assert(0); } @@ -449,6 +428,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Loading fch algorithm dependent parts\n"); + fch_load(f, mphf); + break; default: assert(0); } @@ -473,6 +456,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("fch algorithm search\n"); + return fch_search(mphf, key, keylen); default: assert(0); } @@ -501,6 +487,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; + case CMPH_FCH: /* included -- Fabiano */ + fch_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph_types.h b/src/cmph_types.h index be976ee..941059b 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_FCH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/fch.c b/src/fch.c index 0477d27..b4321b9 100644 --- a/src/fch.c +++ b/src/fch.c @@ -12,7 +12,7 @@ #include #include #define INDEX 0 /* alignment index within a bucket */ -//#define DEBUG +#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); diff --git a/src/main.c b/src/main.c index 07765d9..11459dc 100644 --- a/src/main.c +++ b/src/main.c @@ -61,7 +61,7 @@ int main(int argc, char **argv) cmph_uint32 nhashes = 0; cmph_uint32 i; CMPH_ALGO mph_algo = CMPH_CHM; - float c = 2.09; + float c = 0; cmph_config_t *config = NULL; cmph_t *mphf = NULL; char * tmp_dir = NULL; From 2752852d0f9a2874b91b66bc050ff3c4ba1f51a0 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Thu, 3 Aug 2006 20:00:11 +0000 Subject: [PATCH 332/739] FCH algorithm added but not tested... --- src/bmz.c | 4 +-- src/cmph.c | 89 +++++++++++++++++++++--------------------------- src/cmph_types.h | 2 +- src/fch.c | 2 +- src/main.c | 2 +- 5 files changed, 44 insertions(+), 55 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index 0009ce1..e4d1c31 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -367,7 +367,7 @@ static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_u while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) { if(GETBIT(visited,neighbor)) continue; - DEBUGP("Visiting neighbor %u\n", neighbor); + //DEBUGP("Visiting neighbor %u\n", neighbor); *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; @@ -430,7 +430,7 @@ static int bmz_gen_edges(cmph_config_t *mph) mph->key_source->dispose(mph->key_source->data, key, keylen); return 0; } - DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); mph->key_source->dispose(mph->key_source->data, key, keylen); // fprintf(stderr, "key = %s -- dispose BMZ\n", key); multiple_edges = graph_contains_edge(bmz->graph, h1, h2); diff --git a/src/cmph.c b/src/cmph.c index eb4bf5e..edd3a43 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -4,6 +4,7 @@ #include "bmz.h" #include "bmz8.h" /* included -- Fabiano */ #include "brz.h" /* included -- Fabiano */ +#include "fch.h" /* included -- Fabiano */ #include #include @@ -11,7 +12,7 @@ //#define DEBUG #include "debug.h" -const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", NULL }; /* included -- Fabiano */ +const char *cmph_names[] = { "bmz", "bmz8", "chm", "brz", "fch", NULL }; /* included -- Fabiano */ typedef struct { @@ -219,6 +220,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: brz_config_destroy(mph); break; + case CMPH_FCH: + fch_config_destroy(mph); + break; default: assert(0); } @@ -236,6 +240,9 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) case CMPH_BRZ: mph->data = brz_config_new(); break; + case CMPH_FCH: + mph->data = fch_config_new(); + break; default: assert(0); } @@ -245,76 +252,35 @@ void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_tmp_dir(mph, tmp_dir); - break; - default: - assert(0); + brz_config_set_tmp_dir(mph, tmp_dir); } } void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_mphf_fd(mph, mphf_fd); - break; - default: - assert(0); + brz_config_set_mphf_fd(mph, mphf_fd); } } void cmph_config_set_b(cmph_config_t *mph, cmph_uint8 b) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_b(mph, b); - break; - default: - assert(0); + brz_config_set_b(mph, b); } } void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) { - switch (mph->algo) + if (mph->algo == CMPH_BRZ) { - case CMPH_CHM: - break; - case CMPH_BMZ: /* included -- Fabiano */ - break; - case CMPH_BMZ8: /* included -- Fabiano */ - break; - case CMPH_BRZ: /* included -- Fabiano */ - brz_config_set_memory_availability(mph, memory_availability); - break; - default: - assert(0); + brz_config_set_memory_availability(mph, memory_availability); } - } void cmph_config_destroy(cmph_config_t *mph) @@ -334,6 +300,9 @@ void cmph_config_destroy(cmph_config_t *mph) case CMPH_BRZ: /* included -- Fabiano */ brz_config_destroy(mph); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_destroy(mph); + break; default: assert(0); } @@ -361,6 +330,9 @@ void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) case CMPH_BRZ: /* included -- Fabiano */ brz_config_set_hashfuncs(mph, hashfuncs); break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_set_hashfuncs(mph, hashfuncs); + break; default: break; } @@ -400,6 +372,11 @@ cmph_t *cmph_new(cmph_config_t *mph) if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Creating fch hash\n"); + if (c <= 2) c = 2.1; + mphf = fch_new(mph, c); + break; default: assert(0); } @@ -418,6 +395,8 @@ int cmph_dump(cmph_t *mphf, FILE *f) return bmz8_dump(mphf, f); case CMPH_BRZ: /* included -- Fabiano */ return brz_dump(mphf, f); + case CMPH_FCH: /* included -- Fabiano */ + return fch_dump(mphf, f); default: assert(0); } @@ -449,6 +428,10 @@ cmph_t *cmph_load(FILE *f) DEBUGP("Loading brz algorithm dependent parts\n"); brz_load(f, mphf); break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Loading fch algorithm dependent parts\n"); + fch_load(f, mphf); + break; default: assert(0); } @@ -473,6 +456,9 @@ cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("brz algorithm search\n"); return brz_search(mphf, key, keylen); + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("fch algorithm search\n"); + return fch_search(mphf, key, keylen); default: assert(0); } @@ -501,6 +487,9 @@ void cmph_destroy(cmph_t *mphf) case CMPH_BRZ: /* included -- Fabiano */ brz_destroy(mphf); return; + case CMPH_FCH: /* included -- Fabiano */ + fch_destroy(mphf); + return; default: assert(0); } diff --git a/src/cmph_types.h b/src/cmph_types.h index be976ee..941059b 100644 --- a/src/cmph_types.h +++ b/src/cmph_types.h @@ -9,7 +9,7 @@ typedef float cmph_float32; typedef enum { CMPH_HASH_DJB2, CMPH_HASH_FNV, CMPH_HASH_JENKINS, CMPH_HASH_SDBM, CMPH_HASH_COUNT } CMPH_HASH; extern const char *cmph_hash_names[]; -typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_FCH, CMPH_COUNT } CMPH_ALGO; /* included -- Fabiano */ extern const char *cmph_names[]; #endif diff --git a/src/fch.c b/src/fch.c index 0477d27..b4321b9 100644 --- a/src/fch.c +++ b/src/fch.c @@ -12,7 +12,7 @@ #include #include #define INDEX 0 /* alignment index within a bucket */ -//#define DEBUG +#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); diff --git a/src/main.c b/src/main.c index 07765d9..11459dc 100644 --- a/src/main.c +++ b/src/main.c @@ -61,7 +61,7 @@ int main(int argc, char **argv) cmph_uint32 nhashes = 0; cmph_uint32 i; CMPH_ALGO mph_algo = CMPH_CHM; - float c = 2.09; + float c = 0; cmph_config_t *config = NULL; cmph_t *mphf = NULL; char * tmp_dir = NULL; From c9edcadd8ffa4cb502a3a68d5dd655c7e3a3aa22 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 4 Aug 2006 17:55:13 +0000 Subject: [PATCH 333/739] FCH algorithm is working... --- src/cmph.c | 2 +- src/fch.c | 62 +++++++++++++++++++++++++++-------------------- src/fch_buckets.c | 4 +-- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/cmph.c b/src/cmph.c index edd3a43..03d00ed 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -374,7 +374,7 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.1; + if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index b4321b9..aa9984b 100644 --- a/src/fch.c +++ b/src/fch.c @@ -4,22 +4,20 @@ #include "hash.h" #include "bitbool.h" #include "fch_buckets.h" -//#include -#include #include #include #include #include #include #define INDEX 0 /* alignment index within a bucket */ -#define DEBUG +//#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); static void permut(cmph_uint32 * vector, cmph_uint32 n); static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); @@ -72,22 +70,19 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, static void calc_parameters(fch_config_data_t *fch) { fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.6*fch->m); + fch->p1 = ceil(0.55*fch->m); fch->p2 = ceil(0.3*fch->b); } static fch_buckets_t * mapping(cmph_config_t *mph) { -// struct timeval seed; cmph_uint32 i = 0; fch_buckets_t *buckets = NULL; fch_config_data_t *fch = (fch_config_data_t *)mph->data; -// gettimeofday(&seed,NULL); -// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); - srand((cmph_uint32)time(NULL)); if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); calc_parameters (fch); + //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); mph->key_source->rewind(mph->key_source->data); @@ -113,7 +108,7 @@ static cmph_uint32 * ordering(fch_buckets_t * buckets) } /* Check whether function h2 causes collisions among the keys of each bucket */ -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes) { //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); @@ -121,12 +116,13 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t cmph_uint32 i = 0, index = 0, j =0; for (i = 0; i < nbuckets; i++) { - cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + cmph_uint32 nkeys = fch_buckets_get_size(buckets, sorted_indexes[i]); memset(hashtable, 0, fch->m); + //DEBUGP("bucket %u -- nkeys: %u\n", i, nkeys); for (j = 0; j < nkeys; j++) { - char * key = fch_buckets_get_key(buckets, i, j); - cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); index = hash(fch->h2, key, keylen) % fch->m; if(hashtable[index]) { // collision detected free(hashtable); @@ -142,7 +138,6 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t static void permut(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, j, b; - srand((cmph_uint32)time(NULL)); for (i = 0; i < n; i++) { j = rand() % n; b = vector[i]; @@ -163,6 +158,8 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph if (fch->g) free (fch->g); fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + for(i = 0; i < fch->m; i++) { random_table[i] = i; @@ -172,27 +169,36 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph { map_table[random_table[i]] = i; } - - //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); - do { - srand((cmph_uint32)time(NULL)); if (fch->h2) hash_state_destroy(fch->h2); fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); - restart = check_for_collisions_h2(fch, buckets); + restart = check_for_collisions_h2(fch, buckets, sorted_indexes); filled_count = 0; - if (!restart) searching_iterations++; - else iteration_to_generate_h2++; + if (!restart) + { + searching_iterations++; iteration_to_generate_h2 = 0; + //DEBUGP("searching_iterations: %u\n", searching_iterations); + } + else { + iteration_to_generate_h2++; + //DEBUGP("iteration_to_generate_h2: %u\n", iteration_to_generate_h2); + } for(i = 0; (i < nbuckets) && !restart; i++) { - restart = 1; // true + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + if (bucketsize == 0) + { + restart = 0; // false + break; + } + else restart = 1; // true for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); - cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; counter = 0; restart = 0; // false fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + //DEBUGP("g[%u]: %u\n", sorted_indexes[i], fch->g[sorted_indexes[i]]); j = INDEX; do { cmph_uint32 index = 0; @@ -200,6 +206,7 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); h2 = hash(fch->h2, key, keylen) % fch->m; index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + //DEBUGP("key:%s keylen:%u index: %u h2:%u bucketsize:%u\n", key, keylen, index, h2, bucketsize); if (map_table[index] >= filled_count) { cmph_uint32 y = map_table[index]; cmph_uint32 ry = random_table[y]; @@ -219,8 +226,9 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph j = (j + 1) % bucketsize; } while(j % bucketsize != INDEX); } + //getchar(); } - } while(restart && (searching_iterations < 100000)); + } while(restart && (searching_iterations < 10)); free(map_table); free(random_table); return restart; @@ -258,11 +266,14 @@ cmph_t *fch_new(cmph_config_t *mph, float c) } if (sorted_indexes) free (sorted_indexes); sorted_indexes = ordering(buckets); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0; if (mph->verbosity) { fprintf(stderr, "Starting searching step.\n"); } restart_mapping = searching(fch, buckets, sorted_indexes); + iterations--; } while(restart_mapping && iterations > 0); if (buckets) fch_buckets_destroy(buckets); @@ -316,7 +327,6 @@ int fch_dump(cmph_t *mphf, FILE *fd) fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); #ifdef DEBUG cmph_uint32 i; diff --git a/src/fch_buckets.c b/src/fch_buckets.c index 471ce78..f10fdff 100644 --- a/src/fch_buckets.c +++ b/src/fch_buckets.c @@ -162,12 +162,12 @@ cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) { - return buckets->nbuckets; + return buckets->max_size; } cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) { - return buckets->max_size; + return buckets->nbuckets; } cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) From 99f0705fed5742fbbc24d618bede9c8c436e2fe8 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 4 Aug 2006 17:55:13 +0000 Subject: [PATCH 334/739] FCH algorithm is working... --- src/cmph.c | 2 +- src/fch.c | 62 +++++++++++++++++++++++++++-------------------- src/fch_buckets.c | 4 +-- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/cmph.c b/src/cmph.c index edd3a43..03d00ed 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -374,7 +374,7 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.1; + if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index b4321b9..aa9984b 100644 --- a/src/fch.c +++ b/src/fch.c @@ -4,22 +4,20 @@ #include "hash.h" #include "bitbool.h" #include "fch_buckets.h" -//#include -#include #include #include #include #include #include #define INDEX 0 /* alignment index within a bucket */ -#define DEBUG +//#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); static void permut(cmph_uint32 * vector, cmph_uint32 n); static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); @@ -72,22 +70,19 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, static void calc_parameters(fch_config_data_t *fch) { fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.6*fch->m); + fch->p1 = ceil(0.55*fch->m); fch->p2 = ceil(0.3*fch->b); } static fch_buckets_t * mapping(cmph_config_t *mph) { -// struct timeval seed; cmph_uint32 i = 0; fch_buckets_t *buckets = NULL; fch_config_data_t *fch = (fch_config_data_t *)mph->data; -// gettimeofday(&seed,NULL); -// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); - srand((cmph_uint32)time(NULL)); if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); calc_parameters (fch); + //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); mph->key_source->rewind(mph->key_source->data); @@ -113,7 +108,7 @@ static cmph_uint32 * ordering(fch_buckets_t * buckets) } /* Check whether function h2 causes collisions among the keys of each bucket */ -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes) { //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); @@ -121,12 +116,13 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t cmph_uint32 i = 0, index = 0, j =0; for (i = 0; i < nbuckets; i++) { - cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + cmph_uint32 nkeys = fch_buckets_get_size(buckets, sorted_indexes[i]); memset(hashtable, 0, fch->m); + //DEBUGP("bucket %u -- nkeys: %u\n", i, nkeys); for (j = 0; j < nkeys; j++) { - char * key = fch_buckets_get_key(buckets, i, j); - cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); index = hash(fch->h2, key, keylen) % fch->m; if(hashtable[index]) { // collision detected free(hashtable); @@ -142,7 +138,6 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t static void permut(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, j, b; - srand((cmph_uint32)time(NULL)); for (i = 0; i < n; i++) { j = rand() % n; b = vector[i]; @@ -163,6 +158,8 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph if (fch->g) free (fch->g); fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + for(i = 0; i < fch->m; i++) { random_table[i] = i; @@ -172,27 +169,36 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph { map_table[random_table[i]] = i; } - - //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); - do { - srand((cmph_uint32)time(NULL)); if (fch->h2) hash_state_destroy(fch->h2); fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); - restart = check_for_collisions_h2(fch, buckets); + restart = check_for_collisions_h2(fch, buckets, sorted_indexes); filled_count = 0; - if (!restart) searching_iterations++; - else iteration_to_generate_h2++; + if (!restart) + { + searching_iterations++; iteration_to_generate_h2 = 0; + //DEBUGP("searching_iterations: %u\n", searching_iterations); + } + else { + iteration_to_generate_h2++; + //DEBUGP("iteration_to_generate_h2: %u\n", iteration_to_generate_h2); + } for(i = 0; (i < nbuckets) && !restart; i++) { - restart = 1; // true + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + if (bucketsize == 0) + { + restart = 0; // false + break; + } + else restart = 1; // true for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); - cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; counter = 0; restart = 0; // false fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + //DEBUGP("g[%u]: %u\n", sorted_indexes[i], fch->g[sorted_indexes[i]]); j = INDEX; do { cmph_uint32 index = 0; @@ -200,6 +206,7 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); h2 = hash(fch->h2, key, keylen) % fch->m; index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + //DEBUGP("key:%s keylen:%u index: %u h2:%u bucketsize:%u\n", key, keylen, index, h2, bucketsize); if (map_table[index] >= filled_count) { cmph_uint32 y = map_table[index]; cmph_uint32 ry = random_table[y]; @@ -219,8 +226,9 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph j = (j + 1) % bucketsize; } while(j % bucketsize != INDEX); } + //getchar(); } - } while(restart && (searching_iterations < 100000)); + } while(restart && (searching_iterations < 10)); free(map_table); free(random_table); return restart; @@ -258,11 +266,14 @@ cmph_t *fch_new(cmph_config_t *mph, float c) } if (sorted_indexes) free (sorted_indexes); sorted_indexes = ordering(buckets); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0; if (mph->verbosity) { fprintf(stderr, "Starting searching step.\n"); } restart_mapping = searching(fch, buckets, sorted_indexes); + iterations--; } while(restart_mapping && iterations > 0); if (buckets) fch_buckets_destroy(buckets); @@ -316,7 +327,6 @@ int fch_dump(cmph_t *mphf, FILE *fd) fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); #ifdef DEBUG cmph_uint32 i; diff --git a/src/fch_buckets.c b/src/fch_buckets.c index 471ce78..f10fdff 100644 --- a/src/fch_buckets.c +++ b/src/fch_buckets.c @@ -162,12 +162,12 @@ cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) { - return buckets->nbuckets; + return buckets->max_size; } cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) { - return buckets->max_size; + return buckets->nbuckets; } cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) From 7f44ed0d0bef9aef2029a7714a0e48da16607bc3 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 4 Aug 2006 17:55:13 +0000 Subject: [PATCH 335/739] FCH algorithm is working... --- src/cmph.c | 2 +- src/fch.c | 62 +++++++++++++++++++++++++++-------------------- src/fch_buckets.c | 4 +-- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/cmph.c b/src/cmph.c index edd3a43..03d00ed 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -374,7 +374,7 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.1; + if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index b4321b9..aa9984b 100644 --- a/src/fch.c +++ b/src/fch.c @@ -4,22 +4,20 @@ #include "hash.h" #include "bitbool.h" #include "fch_buckets.h" -//#include -#include #include #include #include #include #include #define INDEX 0 /* alignment index within a bucket */ -#define DEBUG +//#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); static void permut(cmph_uint32 * vector, cmph_uint32 n); static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); @@ -72,22 +70,19 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, static void calc_parameters(fch_config_data_t *fch) { fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.6*fch->m); + fch->p1 = ceil(0.55*fch->m); fch->p2 = ceil(0.3*fch->b); } static fch_buckets_t * mapping(cmph_config_t *mph) { -// struct timeval seed; cmph_uint32 i = 0; fch_buckets_t *buckets = NULL; fch_config_data_t *fch = (fch_config_data_t *)mph->data; -// gettimeofday(&seed,NULL); -// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); - srand((cmph_uint32)time(NULL)); if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); calc_parameters (fch); + //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); mph->key_source->rewind(mph->key_source->data); @@ -113,7 +108,7 @@ static cmph_uint32 * ordering(fch_buckets_t * buckets) } /* Check whether function h2 causes collisions among the keys of each bucket */ -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes) { //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); @@ -121,12 +116,13 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t cmph_uint32 i = 0, index = 0, j =0; for (i = 0; i < nbuckets; i++) { - cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + cmph_uint32 nkeys = fch_buckets_get_size(buckets, sorted_indexes[i]); memset(hashtable, 0, fch->m); + //DEBUGP("bucket %u -- nkeys: %u\n", i, nkeys); for (j = 0; j < nkeys; j++) { - char * key = fch_buckets_get_key(buckets, i, j); - cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); index = hash(fch->h2, key, keylen) % fch->m; if(hashtable[index]) { // collision detected free(hashtable); @@ -142,7 +138,6 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t static void permut(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, j, b; - srand((cmph_uint32)time(NULL)); for (i = 0; i < n; i++) { j = rand() % n; b = vector[i]; @@ -163,6 +158,8 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph if (fch->g) free (fch->g); fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + for(i = 0; i < fch->m; i++) { random_table[i] = i; @@ -172,27 +169,36 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph { map_table[random_table[i]] = i; } - - //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); - do { - srand((cmph_uint32)time(NULL)); if (fch->h2) hash_state_destroy(fch->h2); fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); - restart = check_for_collisions_h2(fch, buckets); + restart = check_for_collisions_h2(fch, buckets, sorted_indexes); filled_count = 0; - if (!restart) searching_iterations++; - else iteration_to_generate_h2++; + if (!restart) + { + searching_iterations++; iteration_to_generate_h2 = 0; + //DEBUGP("searching_iterations: %u\n", searching_iterations); + } + else { + iteration_to_generate_h2++; + //DEBUGP("iteration_to_generate_h2: %u\n", iteration_to_generate_h2); + } for(i = 0; (i < nbuckets) && !restart; i++) { - restart = 1; // true + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + if (bucketsize == 0) + { + restart = 0; // false + break; + } + else restart = 1; // true for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); - cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; counter = 0; restart = 0; // false fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + //DEBUGP("g[%u]: %u\n", sorted_indexes[i], fch->g[sorted_indexes[i]]); j = INDEX; do { cmph_uint32 index = 0; @@ -200,6 +206,7 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); h2 = hash(fch->h2, key, keylen) % fch->m; index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + //DEBUGP("key:%s keylen:%u index: %u h2:%u bucketsize:%u\n", key, keylen, index, h2, bucketsize); if (map_table[index] >= filled_count) { cmph_uint32 y = map_table[index]; cmph_uint32 ry = random_table[y]; @@ -219,8 +226,9 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph j = (j + 1) % bucketsize; } while(j % bucketsize != INDEX); } + //getchar(); } - } while(restart && (searching_iterations < 100000)); + } while(restart && (searching_iterations < 10)); free(map_table); free(random_table); return restart; @@ -258,11 +266,14 @@ cmph_t *fch_new(cmph_config_t *mph, float c) } if (sorted_indexes) free (sorted_indexes); sorted_indexes = ordering(buckets); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0; if (mph->verbosity) { fprintf(stderr, "Starting searching step.\n"); } restart_mapping = searching(fch, buckets, sorted_indexes); + iterations--; } while(restart_mapping && iterations > 0); if (buckets) fch_buckets_destroy(buckets); @@ -316,7 +327,6 @@ int fch_dump(cmph_t *mphf, FILE *fd) fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); #ifdef DEBUG cmph_uint32 i; diff --git a/src/fch_buckets.c b/src/fch_buckets.c index 471ce78..f10fdff 100644 --- a/src/fch_buckets.c +++ b/src/fch_buckets.c @@ -162,12 +162,12 @@ cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) { - return buckets->nbuckets; + return buckets->max_size; } cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) { - return buckets->max_size; + return buckets->nbuckets; } cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) From 1f478e47c26e130b4128b196ebbafa88c99fd6c0 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 4 Aug 2006 17:55:13 +0000 Subject: [PATCH 336/739] FCH algorithm is working... --- src/cmph.c | 2 +- src/fch.c | 62 +++++++++++++++++++++++++++-------------------- src/fch_buckets.c | 4 +-- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/cmph.c b/src/cmph.c index edd3a43..03d00ed 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -374,7 +374,7 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.1; + if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index b4321b9..aa9984b 100644 --- a/src/fch.c +++ b/src/fch.c @@ -4,22 +4,20 @@ #include "hash.h" #include "bitbool.h" #include "fch_buckets.h" -//#include -#include #include #include #include #include #include #define INDEX 0 /* alignment index within a bucket */ -#define DEBUG +//#define DEBUG #include "debug.h" static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); static void permut(cmph_uint32 * vector, cmph_uint32 n); static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); @@ -72,22 +70,19 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, static void calc_parameters(fch_config_data_t *fch) { fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.6*fch->m); + fch->p1 = ceil(0.55*fch->m); fch->p2 = ceil(0.3*fch->b); } static fch_buckets_t * mapping(cmph_config_t *mph) { -// struct timeval seed; cmph_uint32 i = 0; fch_buckets_t *buckets = NULL; fch_config_data_t *fch = (fch_config_data_t *)mph->data; -// gettimeofday(&seed,NULL); -// srand((cmph_uint32)((seed.tv_sec + 1001*seed.tv_usec))); - srand((cmph_uint32)time(NULL)); if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); calc_parameters (fch); + //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); mph->key_source->rewind(mph->key_source->data); @@ -113,7 +108,7 @@ static cmph_uint32 * ordering(fch_buckets_t * buckets) } /* Check whether function h2 causes collisions among the keys of each bucket */ -static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets) +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes) { //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); cmph_uint8 * hashtable = (cmph_uint8 *)calloc(fch->m, sizeof(cmph_uint8)); @@ -121,12 +116,13 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t cmph_uint32 i = 0, index = 0, j =0; for (i = 0; i < nbuckets; i++) { - cmph_uint32 nkeys = fch_buckets_get_size(buckets, i); + cmph_uint32 nkeys = fch_buckets_get_size(buckets, sorted_indexes[i]); memset(hashtable, 0, fch->m); + //DEBUGP("bucket %u -- nkeys: %u\n", i, nkeys); for (j = 0; j < nkeys; j++) { - char * key = fch_buckets_get_key(buckets, i, j); - cmph_uint32 keylen = fch_buckets_get_keylength(buckets, i, j); + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); index = hash(fch->h2, key, keylen) % fch->m; if(hashtable[index]) { // collision detected free(hashtable); @@ -142,7 +138,6 @@ static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t static void permut(cmph_uint32 * vector, cmph_uint32 n) { cmph_uint32 i, j, b; - srand((cmph_uint32)time(NULL)); for (i = 0; i < n; i++) { j = rand() % n; b = vector[i]; @@ -163,6 +158,8 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph if (fch->g) free (fch->g); fch->g = (cmph_uint32 *) calloc(fch->b, sizeof(cmph_uint32)); + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + for(i = 0; i < fch->m; i++) { random_table[i] = i; @@ -172,27 +169,36 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph { map_table[random_table[i]] = i; } - - //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); - do { - srand((cmph_uint32)time(NULL)); if (fch->h2) hash_state_destroy(fch->h2); fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); - restart = check_for_collisions_h2(fch, buckets); + restart = check_for_collisions_h2(fch, buckets, sorted_indexes); filled_count = 0; - if (!restart) searching_iterations++; - else iteration_to_generate_h2++; + if (!restart) + { + searching_iterations++; iteration_to_generate_h2 = 0; + //DEBUGP("searching_iterations: %u\n", searching_iterations); + } + else { + iteration_to_generate_h2++; + //DEBUGP("iteration_to_generate_h2: %u\n", iteration_to_generate_h2); + } for(i = 0; (i < nbuckets) && !restart; i++) { - restart = 1; // true + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + if (bucketsize == 0) + { + restart = 0; // false + break; + } + else restart = 1; // true for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); - cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; counter = 0; restart = 0; // false fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + //DEBUGP("g[%u]: %u\n", sorted_indexes[i], fch->g[sorted_indexes[i]]); j = INDEX; do { cmph_uint32 index = 0; @@ -200,6 +206,7 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); h2 = hash(fch->h2, key, keylen) % fch->m; index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + //DEBUGP("key:%s keylen:%u index: %u h2:%u bucketsize:%u\n", key, keylen, index, h2, bucketsize); if (map_table[index] >= filled_count) { cmph_uint32 y = map_table[index]; cmph_uint32 ry = random_table[y]; @@ -219,8 +226,9 @@ static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph j = (j + 1) % bucketsize; } while(j % bucketsize != INDEX); } + //getchar(); } - } while(restart && (searching_iterations < 100000)); + } while(restart && (searching_iterations < 10)); free(map_table); free(random_table); return restart; @@ -258,11 +266,14 @@ cmph_t *fch_new(cmph_config_t *mph, float c) } if (sorted_indexes) free (sorted_indexes); sorted_indexes = ordering(buckets); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0; if (mph->verbosity) { fprintf(stderr, "Starting searching step.\n"); } restart_mapping = searching(fch, buckets, sorted_indexes); + iterations--; } while(restart_mapping && iterations > 0); if (buckets) fch_buckets_destroy(buckets); @@ -316,7 +327,6 @@ int fch_dump(cmph_t *mphf, FILE *fd) fwrite(&(data->b), sizeof(cmph_uint32), 1, fd); fwrite(&(data->p1), sizeof(cmph_float32), 1, fd); fwrite(&(data->p2), sizeof(cmph_float32), 1, fd); - fwrite(data->g, sizeof(cmph_uint32)*(data->b), 1, fd); #ifdef DEBUG cmph_uint32 i; diff --git a/src/fch_buckets.c b/src/fch_buckets.c index 471ce78..f10fdff 100644 --- a/src/fch_buckets.c +++ b/src/fch_buckets.c @@ -162,12 +162,12 @@ cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) { - return buckets->nbuckets; + return buckets->max_size; } cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) { - return buckets->max_size; + return buckets->nbuckets; } cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) From 8adabac1c97e5f8bfd3d055b482cfbdf03bf0f9b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 14:44:24 +0000 Subject: [PATCH 337/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/bmz.c | 1 + src/bmz8.c | 2 +- src/brz.c | 150 +++++++++++++++++++++++++++++++++++++++------- src/brz_structs.h | 2 + src/chm.c | 3 +- src/cmph.c | 5 -- src/fch.c | 27 ++++++--- src/fch.h | 6 ++ src/main.c | 4 +- 9 files changed, 160 insertions(+), 40 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index e4d1c31..7371c0e 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -66,6 +66,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); diff --git a/src/bmz8.c b/src/bmz8.c index f0690dc..032a3bc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -70,7 +70,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); return NULL; } - + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz8->m = mph->key_source->nkeys; bmz8->n = ceil(c * mph->key_source->nkeys); diff --git a/src/brz.c b/src/brz.c index dad31d1..83df9e1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,6 @@ #include "graph.h" +#include "fch.h" +#include "fch_structs.h" #include "bmz8.h" #include "bmz8_structs.h" #include "brz.h" @@ -20,11 +22,13 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->algo = CMPH_BMZ8; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -111,8 +115,17 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 i; cmph_uint32 iterations = 20; - DEBUGP("c: %f\n"); + DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + switch(brz->algo) // validating restrictions over parameter c. + { + case CMPH_BMZ8: + if (c == 0 || c >= 2.0) c = 1; + break; + case CMPH_FCH: + if (c <= 2.0) c = 2.6; + break; + } brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); @@ -179,8 +192,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; + brzf->algo = brz->algo; mphf->data = brzf; - mphf->size = brz->m; + mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -191,7 +205,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_mphf(cmph_config_t *mph) { - cmph_uint32 i, e; + cmph_uint32 i, e, error; brz_config_data_t *brz = (brz_config_data_t *)mph->data; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; @@ -269,7 +283,7 @@ static int brz_gen_mphf(cmph_config_t *mph) memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; - if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) + if ((brz->size[h0] == MAX_BUCKET_SIZE) || (brz->algo == CMPH_BMZ8 && ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0]))) { free(buffer); free(buckets_size); @@ -337,6 +351,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->algo), sizeof(brz->algo), 1, brz->mphf_fd); fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); @@ -362,6 +377,7 @@ static int brz_gen_mphf(cmph_config_t *mph) e = 0; keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; + error = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); @@ -403,18 +419,49 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz8_data_t * bmzf = NULL; char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ8); + cmph_config_set_algo(config, brz->algo); + //cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz8_data_t *)mphf_tmp->data; - bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); - bmzf = NULL; + if (mphf_tmp == NULL) + { + if(mph->verbosity) fprintf(stderr, "ERROR: Can't generate MPHF for bucket %u out of %u\n", cur_bucket + 1, brz->k); + error = 1; + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_io_byte_vector_adapter_destroy(source); + break; + } + if(mph->verbosity) + { + if (cur_bucket % 1000 == 0) + { + fprintf(stderr, "MPHF for bucket %u out of %u was generated.\n", cur_bucket + 1, brz->k); + } + } + switch(brz->algo) + { + case CMPH_FCH: + { + fch_data_t * fchf = NULL; + fchf = (fch_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_fch_mphf(brz, fchf, cur_bucket, &buflenmphf); + } + break; + case CMPH_BMZ8: + { + bmz8_data_t * bmzf = NULL; + bmzf = (bmz8_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_bmz8_mphf(brz, bmzf, cur_bucket, &buflenmphf); + } + break; + default: assert(0); + } fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); free(bufmphf); bufmphf = NULL; @@ -425,11 +472,11 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_vd = 0; } } - buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); + if (error) return 0; return 1; } @@ -449,7 +496,29 @@ static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i = 0; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = fchf->b;//brz->size[index]; + hash_state_dump(fchf->h1, &bufh1, &buflenh1); + hash_state_dump(fchf->h2, &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + for (i = 0; i < n; i++) memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2+i,(fchf->g + i), 1); + free(bufh1); + free(bufh2); + return buf; +} +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; @@ -470,6 +539,8 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } + + int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; @@ -489,9 +560,6 @@ int brz_dump(cmph_t *mphf, FILE *fd) return 1; } - - - void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; @@ -502,31 +570,41 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->algo), sizeof(brz->algo), 1, f); // Reading algo. fread(&(brz->k), sizeof(cmph_uint32), 1, f); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + DEBUGP("Reading c = %f k = %u algo = %u \n", brz->c, brz->k, brz->algo); //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 1 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h1[i] = hash_state_load(buf, buflen); free(buf); //h2 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 2 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); free(buf); - n = ceil(brz->c * brz->size[i]); + switch(brz->algo) + { + case CMPH_FCH: + n = fch_calc_b(brz->c, brz->size[i]); + break; + case CMPH_BMZ8: + n = ceil(brz->c * brz->size[i]); + break; + default: assert(0); + } DEBUGP("g_i has %u bytes\n", n); brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); @@ -542,13 +620,12 @@ void brz_load(FILE *f, cmph_t *mphf) //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } -cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +static cmph_uint32 brz_bmz8_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) { - brz_data_t *brz = mphf->data; cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); @@ -562,6 +639,35 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); return (mphf_bucket + brz->offset[h0]); } + +static cmph_uint32 brz_fch_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) +{ + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; + cmph_uint32 b = fch_calc_b(brz->c, m); + cmph_float32 p1 = fch_calc_p1(m); + cmph_float32 p2 = fch_calc_p2(b); + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % m; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % m; + cmph_uint8 mphf_bucket = 0; + h1 = mixh10h11h12(b, p1, p2, h1); + mphf_bucket = (h2 + brz->g[h0][h1]) % m; + return (mphf_bucket + brz->offset[h0]); +} + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + brz_data_t *brz = mphf->data; + switch(brz->algo) + { + case CMPH_FCH: + return brz_fch_search(brz, key, keylen); + case CMPH_BMZ8: + return brz_bmz8_search(brz, key, keylen); + default: assert(0); + } + return 0; +} void brz_destroy(cmph_t *mphf) { cmph_uint32 i; diff --git a/src/brz_structs.h b/src/brz_structs.h index 537dc12..fa28d3f 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -5,6 +5,7 @@ struct __brz_data_t { + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_uint32 m; // edges (words) count cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. @@ -19,6 +20,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. diff --git a/src/chm.c b/src/chm.c index 24bcbc8..6caedb5 100644 --- a/src/chm.c +++ b/src/chm.c @@ -59,7 +59,8 @@ cmph_t *chm_new(cmph_config_t *mph, float c) cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; + chm->m = mph->key_source->nkeys; + if (c == 0) c = 2.09; chm->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); chm->graph = graph_new(chm->n, chm->m); diff --git a/src/cmph.c b/src/cmph.c index 03d00ed..1d7badd 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -354,27 +354,22 @@ cmph_t *cmph_new(cmph_config_t *mph) { case CMPH_CHM: DEBUGP("Creating chm hash\n"); - if (c == 0) c = 2.09; mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; case CMPH_BMZ8: /* included -- Fabiano */ DEBUGP("Creating bmz8 hash\n"); - if (c == 0) c = 1.15; mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); - if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index aa9984b..ba0357f 100644 --- a/src/fch.c +++ b/src/fch.c @@ -13,8 +13,6 @@ //#define DEBUG #include "debug.h" -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); -static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); @@ -57,7 +55,7 @@ void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) { if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ else { /* h12 o h10 */ @@ -67,11 +65,20 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, return initial_index; } -static void calc_parameters(fch_config_data_t *fch) + +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m) { - fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.55*fch->m); - fch->p2 = ceil(0.3*fch->b); + return (cmph_uint32)ceil((c*m)/(log(m)/log(2) + 1)); +} + +cmph_float32 fch_calc_p1(cmph_uint32 m) +{ + return ceil(0.55*m); +} + +cmph_float32 fch_calc_p2(cmph_uint32 b) +{ + return ceil(0.3*b); } static fch_buckets_t * mapping(cmph_config_t *mph) @@ -81,7 +88,9 @@ static fch_buckets_t * mapping(cmph_config_t *mph) fch_config_data_t *fch = (fch_config_data_t *)mph->data; if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); - calc_parameters (fch); + fch->b = fch_calc_b(fch->c, fch->m); + fch->p1 = fch_calc_p1(fch->m); + fch->p2 = fch_calc_p2(fch->b); //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); @@ -247,6 +256,7 @@ cmph_t *fch_new(cmph_config_t *mph, float c) fch_config_data_t *fch = (fch_config_data_t *)mph->data; fch->m = mph->key_source->nkeys; //DEBUGP("m: %f\n", fch->m); + if (c <= 2) c = 2.6; // validating restrictions over parameter c. fch->c = c; //DEBUGP("c: %f\n", fch->c); fch->h1 = NULL; @@ -389,7 +399,6 @@ cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) fch_data_t *fch = mphf->data; cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - h1 = hash(fch->h1, key, keylen) % fch->m; h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); return (h2 + fch->g[h1]) % fch->m; diff --git a/src/fch.h b/src/fch.h index e56855c..5ce2811 100644 --- a/src/fch.h +++ b/src/fch.h @@ -6,6 +6,12 @@ typedef struct __fch_data_t fch_data_t; typedef struct __fch_config_data_t fch_config_data_t; +/* Parameters calculation */ +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m); +cmph_float32 fch_calc_p1(cmph_uint32 m); +cmph_float32 fch_calc_p2(cmph_uint32 b); +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); + fch_config_data_t *fch_config_new(); void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void fch_config_destroy(cmph_config_t *mph); diff --git a/src/main.c b/src/main.c index 11459dc..ee3c954 100644 --- a/src/main.c +++ b/src/main.c @@ -217,7 +217,6 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); - if (generate) { //Create mphf @@ -230,7 +229,8 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + //if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From 5334c9debc64f7071becfafe5efe1b0c320bcfcf Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 14:44:24 +0000 Subject: [PATCH 338/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/bmz.c | 1 + src/bmz8.c | 2 +- src/brz.c | 150 +++++++++++++++++++++++++++++++++++++++------- src/brz_structs.h | 2 + src/chm.c | 3 +- src/cmph.c | 5 -- src/fch.c | 27 ++++++--- src/fch.h | 6 ++ src/main.c | 4 +- 9 files changed, 160 insertions(+), 40 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index e4d1c31..7371c0e 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -66,6 +66,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); diff --git a/src/bmz8.c b/src/bmz8.c index f0690dc..032a3bc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -70,7 +70,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); return NULL; } - + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz8->m = mph->key_source->nkeys; bmz8->n = ceil(c * mph->key_source->nkeys); diff --git a/src/brz.c b/src/brz.c index dad31d1..83df9e1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,6 @@ #include "graph.h" +#include "fch.h" +#include "fch_structs.h" #include "bmz8.h" #include "bmz8_structs.h" #include "brz.h" @@ -20,11 +22,13 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->algo = CMPH_BMZ8; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -111,8 +115,17 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 i; cmph_uint32 iterations = 20; - DEBUGP("c: %f\n"); + DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + switch(brz->algo) // validating restrictions over parameter c. + { + case CMPH_BMZ8: + if (c == 0 || c >= 2.0) c = 1; + break; + case CMPH_FCH: + if (c <= 2.0) c = 2.6; + break; + } brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); @@ -179,8 +192,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; + brzf->algo = brz->algo; mphf->data = brzf; - mphf->size = brz->m; + mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -191,7 +205,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_mphf(cmph_config_t *mph) { - cmph_uint32 i, e; + cmph_uint32 i, e, error; brz_config_data_t *brz = (brz_config_data_t *)mph->data; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; @@ -269,7 +283,7 @@ static int brz_gen_mphf(cmph_config_t *mph) memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; - if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) + if ((brz->size[h0] == MAX_BUCKET_SIZE) || (brz->algo == CMPH_BMZ8 && ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0]))) { free(buffer); free(buckets_size); @@ -337,6 +351,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->algo), sizeof(brz->algo), 1, brz->mphf_fd); fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); @@ -362,6 +377,7 @@ static int brz_gen_mphf(cmph_config_t *mph) e = 0; keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; + error = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); @@ -403,18 +419,49 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz8_data_t * bmzf = NULL; char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ8); + cmph_config_set_algo(config, brz->algo); + //cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz8_data_t *)mphf_tmp->data; - bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); - bmzf = NULL; + if (mphf_tmp == NULL) + { + if(mph->verbosity) fprintf(stderr, "ERROR: Can't generate MPHF for bucket %u out of %u\n", cur_bucket + 1, brz->k); + error = 1; + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_io_byte_vector_adapter_destroy(source); + break; + } + if(mph->verbosity) + { + if (cur_bucket % 1000 == 0) + { + fprintf(stderr, "MPHF for bucket %u out of %u was generated.\n", cur_bucket + 1, brz->k); + } + } + switch(brz->algo) + { + case CMPH_FCH: + { + fch_data_t * fchf = NULL; + fchf = (fch_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_fch_mphf(brz, fchf, cur_bucket, &buflenmphf); + } + break; + case CMPH_BMZ8: + { + bmz8_data_t * bmzf = NULL; + bmzf = (bmz8_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_bmz8_mphf(brz, bmzf, cur_bucket, &buflenmphf); + } + break; + default: assert(0); + } fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); free(bufmphf); bufmphf = NULL; @@ -425,11 +472,11 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_vd = 0; } } - buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); + if (error) return 0; return 1; } @@ -449,7 +496,29 @@ static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i = 0; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = fchf->b;//brz->size[index]; + hash_state_dump(fchf->h1, &bufh1, &buflenh1); + hash_state_dump(fchf->h2, &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + for (i = 0; i < n; i++) memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2+i,(fchf->g + i), 1); + free(bufh1); + free(bufh2); + return buf; +} +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; @@ -470,6 +539,8 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } + + int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; @@ -489,9 +560,6 @@ int brz_dump(cmph_t *mphf, FILE *fd) return 1; } - - - void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; @@ -502,31 +570,41 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->algo), sizeof(brz->algo), 1, f); // Reading algo. fread(&(brz->k), sizeof(cmph_uint32), 1, f); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + DEBUGP("Reading c = %f k = %u algo = %u \n", brz->c, brz->k, brz->algo); //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 1 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h1[i] = hash_state_load(buf, buflen); free(buf); //h2 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 2 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); free(buf); - n = ceil(brz->c * brz->size[i]); + switch(brz->algo) + { + case CMPH_FCH: + n = fch_calc_b(brz->c, brz->size[i]); + break; + case CMPH_BMZ8: + n = ceil(brz->c * brz->size[i]); + break; + default: assert(0); + } DEBUGP("g_i has %u bytes\n", n); brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); @@ -542,13 +620,12 @@ void brz_load(FILE *f, cmph_t *mphf) //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } -cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +static cmph_uint32 brz_bmz8_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) { - brz_data_t *brz = mphf->data; cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); @@ -562,6 +639,35 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); return (mphf_bucket + brz->offset[h0]); } + +static cmph_uint32 brz_fch_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) +{ + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; + cmph_uint32 b = fch_calc_b(brz->c, m); + cmph_float32 p1 = fch_calc_p1(m); + cmph_float32 p2 = fch_calc_p2(b); + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % m; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % m; + cmph_uint8 mphf_bucket = 0; + h1 = mixh10h11h12(b, p1, p2, h1); + mphf_bucket = (h2 + brz->g[h0][h1]) % m; + return (mphf_bucket + brz->offset[h0]); +} + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + brz_data_t *brz = mphf->data; + switch(brz->algo) + { + case CMPH_FCH: + return brz_fch_search(brz, key, keylen); + case CMPH_BMZ8: + return brz_bmz8_search(brz, key, keylen); + default: assert(0); + } + return 0; +} void brz_destroy(cmph_t *mphf) { cmph_uint32 i; diff --git a/src/brz_structs.h b/src/brz_structs.h index 537dc12..fa28d3f 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -5,6 +5,7 @@ struct __brz_data_t { + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_uint32 m; // edges (words) count cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. @@ -19,6 +20,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. diff --git a/src/chm.c b/src/chm.c index 24bcbc8..6caedb5 100644 --- a/src/chm.c +++ b/src/chm.c @@ -59,7 +59,8 @@ cmph_t *chm_new(cmph_config_t *mph, float c) cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; + chm->m = mph->key_source->nkeys; + if (c == 0) c = 2.09; chm->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); chm->graph = graph_new(chm->n, chm->m); diff --git a/src/cmph.c b/src/cmph.c index 03d00ed..1d7badd 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -354,27 +354,22 @@ cmph_t *cmph_new(cmph_config_t *mph) { case CMPH_CHM: DEBUGP("Creating chm hash\n"); - if (c == 0) c = 2.09; mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; case CMPH_BMZ8: /* included -- Fabiano */ DEBUGP("Creating bmz8 hash\n"); - if (c == 0) c = 1.15; mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); - if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index aa9984b..ba0357f 100644 --- a/src/fch.c +++ b/src/fch.c @@ -13,8 +13,6 @@ //#define DEBUG #include "debug.h" -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); -static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); @@ -57,7 +55,7 @@ void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) { if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ else { /* h12 o h10 */ @@ -67,11 +65,20 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, return initial_index; } -static void calc_parameters(fch_config_data_t *fch) + +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m) { - fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.55*fch->m); - fch->p2 = ceil(0.3*fch->b); + return (cmph_uint32)ceil((c*m)/(log(m)/log(2) + 1)); +} + +cmph_float32 fch_calc_p1(cmph_uint32 m) +{ + return ceil(0.55*m); +} + +cmph_float32 fch_calc_p2(cmph_uint32 b) +{ + return ceil(0.3*b); } static fch_buckets_t * mapping(cmph_config_t *mph) @@ -81,7 +88,9 @@ static fch_buckets_t * mapping(cmph_config_t *mph) fch_config_data_t *fch = (fch_config_data_t *)mph->data; if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); - calc_parameters (fch); + fch->b = fch_calc_b(fch->c, fch->m); + fch->p1 = fch_calc_p1(fch->m); + fch->p2 = fch_calc_p2(fch->b); //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); @@ -247,6 +256,7 @@ cmph_t *fch_new(cmph_config_t *mph, float c) fch_config_data_t *fch = (fch_config_data_t *)mph->data; fch->m = mph->key_source->nkeys; //DEBUGP("m: %f\n", fch->m); + if (c <= 2) c = 2.6; // validating restrictions over parameter c. fch->c = c; //DEBUGP("c: %f\n", fch->c); fch->h1 = NULL; @@ -389,7 +399,6 @@ cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) fch_data_t *fch = mphf->data; cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - h1 = hash(fch->h1, key, keylen) % fch->m; h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); return (h2 + fch->g[h1]) % fch->m; diff --git a/src/fch.h b/src/fch.h index e56855c..5ce2811 100644 --- a/src/fch.h +++ b/src/fch.h @@ -6,6 +6,12 @@ typedef struct __fch_data_t fch_data_t; typedef struct __fch_config_data_t fch_config_data_t; +/* Parameters calculation */ +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m); +cmph_float32 fch_calc_p1(cmph_uint32 m); +cmph_float32 fch_calc_p2(cmph_uint32 b); +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); + fch_config_data_t *fch_config_new(); void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void fch_config_destroy(cmph_config_t *mph); diff --git a/src/main.c b/src/main.c index 11459dc..ee3c954 100644 --- a/src/main.c +++ b/src/main.c @@ -217,7 +217,6 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); - if (generate) { //Create mphf @@ -230,7 +229,8 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + //if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From bfb82810b100f3f7c0418c7e01f5a02ec7d47a16 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 14:44:24 +0000 Subject: [PATCH 339/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/bmz.c | 1 + src/bmz8.c | 2 +- src/brz.c | 150 +++++++++++++++++++++++++++++++++++++++------- src/brz_structs.h | 2 + src/chm.c | 3 +- src/cmph.c | 5 -- src/fch.c | 27 ++++++--- src/fch.h | 6 ++ src/main.c | 4 +- 9 files changed, 160 insertions(+), 40 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index e4d1c31..7371c0e 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -66,6 +66,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); diff --git a/src/bmz8.c b/src/bmz8.c index f0690dc..032a3bc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -70,7 +70,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); return NULL; } - + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz8->m = mph->key_source->nkeys; bmz8->n = ceil(c * mph->key_source->nkeys); diff --git a/src/brz.c b/src/brz.c index dad31d1..83df9e1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,6 @@ #include "graph.h" +#include "fch.h" +#include "fch_structs.h" #include "bmz8.h" #include "bmz8_structs.h" #include "brz.h" @@ -20,11 +22,13 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->algo = CMPH_BMZ8; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -111,8 +115,17 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 i; cmph_uint32 iterations = 20; - DEBUGP("c: %f\n"); + DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + switch(brz->algo) // validating restrictions over parameter c. + { + case CMPH_BMZ8: + if (c == 0 || c >= 2.0) c = 1; + break; + case CMPH_FCH: + if (c <= 2.0) c = 2.6; + break; + } brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); @@ -179,8 +192,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; + brzf->algo = brz->algo; mphf->data = brzf; - mphf->size = brz->m; + mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -191,7 +205,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_mphf(cmph_config_t *mph) { - cmph_uint32 i, e; + cmph_uint32 i, e, error; brz_config_data_t *brz = (brz_config_data_t *)mph->data; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; @@ -269,7 +283,7 @@ static int brz_gen_mphf(cmph_config_t *mph) memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; - if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) + if ((brz->size[h0] == MAX_BUCKET_SIZE) || (brz->algo == CMPH_BMZ8 && ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0]))) { free(buffer); free(buckets_size); @@ -337,6 +351,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->algo), sizeof(brz->algo), 1, brz->mphf_fd); fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); @@ -362,6 +377,7 @@ static int brz_gen_mphf(cmph_config_t *mph) e = 0; keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; + error = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); @@ -403,18 +419,49 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz8_data_t * bmzf = NULL; char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ8); + cmph_config_set_algo(config, brz->algo); + //cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz8_data_t *)mphf_tmp->data; - bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); - bmzf = NULL; + if (mphf_tmp == NULL) + { + if(mph->verbosity) fprintf(stderr, "ERROR: Can't generate MPHF for bucket %u out of %u\n", cur_bucket + 1, brz->k); + error = 1; + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_io_byte_vector_adapter_destroy(source); + break; + } + if(mph->verbosity) + { + if (cur_bucket % 1000 == 0) + { + fprintf(stderr, "MPHF for bucket %u out of %u was generated.\n", cur_bucket + 1, brz->k); + } + } + switch(brz->algo) + { + case CMPH_FCH: + { + fch_data_t * fchf = NULL; + fchf = (fch_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_fch_mphf(brz, fchf, cur_bucket, &buflenmphf); + } + break; + case CMPH_BMZ8: + { + bmz8_data_t * bmzf = NULL; + bmzf = (bmz8_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_bmz8_mphf(brz, bmzf, cur_bucket, &buflenmphf); + } + break; + default: assert(0); + } fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); free(bufmphf); bufmphf = NULL; @@ -425,11 +472,11 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_vd = 0; } } - buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); + if (error) return 0; return 1; } @@ -449,7 +496,29 @@ static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i = 0; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = fchf->b;//brz->size[index]; + hash_state_dump(fchf->h1, &bufh1, &buflenh1); + hash_state_dump(fchf->h2, &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + for (i = 0; i < n; i++) memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2+i,(fchf->g + i), 1); + free(bufh1); + free(bufh2); + return buf; +} +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; @@ -470,6 +539,8 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } + + int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; @@ -489,9 +560,6 @@ int brz_dump(cmph_t *mphf, FILE *fd) return 1; } - - - void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; @@ -502,31 +570,41 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->algo), sizeof(brz->algo), 1, f); // Reading algo. fread(&(brz->k), sizeof(cmph_uint32), 1, f); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + DEBUGP("Reading c = %f k = %u algo = %u \n", brz->c, brz->k, brz->algo); //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 1 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h1[i] = hash_state_load(buf, buflen); free(buf); //h2 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 2 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); free(buf); - n = ceil(brz->c * brz->size[i]); + switch(brz->algo) + { + case CMPH_FCH: + n = fch_calc_b(brz->c, brz->size[i]); + break; + case CMPH_BMZ8: + n = ceil(brz->c * brz->size[i]); + break; + default: assert(0); + } DEBUGP("g_i has %u bytes\n", n); brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); @@ -542,13 +620,12 @@ void brz_load(FILE *f, cmph_t *mphf) //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } -cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +static cmph_uint32 brz_bmz8_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) { - brz_data_t *brz = mphf->data; cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); @@ -562,6 +639,35 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); return (mphf_bucket + brz->offset[h0]); } + +static cmph_uint32 brz_fch_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) +{ + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; + cmph_uint32 b = fch_calc_b(brz->c, m); + cmph_float32 p1 = fch_calc_p1(m); + cmph_float32 p2 = fch_calc_p2(b); + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % m; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % m; + cmph_uint8 mphf_bucket = 0; + h1 = mixh10h11h12(b, p1, p2, h1); + mphf_bucket = (h2 + brz->g[h0][h1]) % m; + return (mphf_bucket + brz->offset[h0]); +} + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + brz_data_t *brz = mphf->data; + switch(brz->algo) + { + case CMPH_FCH: + return brz_fch_search(brz, key, keylen); + case CMPH_BMZ8: + return brz_bmz8_search(brz, key, keylen); + default: assert(0); + } + return 0; +} void brz_destroy(cmph_t *mphf) { cmph_uint32 i; diff --git a/src/brz_structs.h b/src/brz_structs.h index 537dc12..fa28d3f 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -5,6 +5,7 @@ struct __brz_data_t { + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_uint32 m; // edges (words) count cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. @@ -19,6 +20,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. diff --git a/src/chm.c b/src/chm.c index 24bcbc8..6caedb5 100644 --- a/src/chm.c +++ b/src/chm.c @@ -59,7 +59,8 @@ cmph_t *chm_new(cmph_config_t *mph, float c) cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; + chm->m = mph->key_source->nkeys; + if (c == 0) c = 2.09; chm->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); chm->graph = graph_new(chm->n, chm->m); diff --git a/src/cmph.c b/src/cmph.c index 03d00ed..1d7badd 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -354,27 +354,22 @@ cmph_t *cmph_new(cmph_config_t *mph) { case CMPH_CHM: DEBUGP("Creating chm hash\n"); - if (c == 0) c = 2.09; mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; case CMPH_BMZ8: /* included -- Fabiano */ DEBUGP("Creating bmz8 hash\n"); - if (c == 0) c = 1.15; mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); - if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index aa9984b..ba0357f 100644 --- a/src/fch.c +++ b/src/fch.c @@ -13,8 +13,6 @@ //#define DEBUG #include "debug.h" -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); -static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); @@ -57,7 +55,7 @@ void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) { if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ else { /* h12 o h10 */ @@ -67,11 +65,20 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, return initial_index; } -static void calc_parameters(fch_config_data_t *fch) + +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m) { - fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.55*fch->m); - fch->p2 = ceil(0.3*fch->b); + return (cmph_uint32)ceil((c*m)/(log(m)/log(2) + 1)); +} + +cmph_float32 fch_calc_p1(cmph_uint32 m) +{ + return ceil(0.55*m); +} + +cmph_float32 fch_calc_p2(cmph_uint32 b) +{ + return ceil(0.3*b); } static fch_buckets_t * mapping(cmph_config_t *mph) @@ -81,7 +88,9 @@ static fch_buckets_t * mapping(cmph_config_t *mph) fch_config_data_t *fch = (fch_config_data_t *)mph->data; if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); - calc_parameters (fch); + fch->b = fch_calc_b(fch->c, fch->m); + fch->p1 = fch_calc_p1(fch->m); + fch->p2 = fch_calc_p2(fch->b); //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); @@ -247,6 +256,7 @@ cmph_t *fch_new(cmph_config_t *mph, float c) fch_config_data_t *fch = (fch_config_data_t *)mph->data; fch->m = mph->key_source->nkeys; //DEBUGP("m: %f\n", fch->m); + if (c <= 2) c = 2.6; // validating restrictions over parameter c. fch->c = c; //DEBUGP("c: %f\n", fch->c); fch->h1 = NULL; @@ -389,7 +399,6 @@ cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) fch_data_t *fch = mphf->data; cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - h1 = hash(fch->h1, key, keylen) % fch->m; h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); return (h2 + fch->g[h1]) % fch->m; diff --git a/src/fch.h b/src/fch.h index e56855c..5ce2811 100644 --- a/src/fch.h +++ b/src/fch.h @@ -6,6 +6,12 @@ typedef struct __fch_data_t fch_data_t; typedef struct __fch_config_data_t fch_config_data_t; +/* Parameters calculation */ +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m); +cmph_float32 fch_calc_p1(cmph_uint32 m); +cmph_float32 fch_calc_p2(cmph_uint32 b); +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); + fch_config_data_t *fch_config_new(); void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void fch_config_destroy(cmph_config_t *mph); diff --git a/src/main.c b/src/main.c index 11459dc..ee3c954 100644 --- a/src/main.c +++ b/src/main.c @@ -217,7 +217,6 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); - if (generate) { //Create mphf @@ -230,7 +229,8 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + //if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From 98f29044d14ddbaf45c5be18dde96622127e885c Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 14:44:24 +0000 Subject: [PATCH 340/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/bmz.c | 1 + src/bmz8.c | 2 +- src/brz.c | 150 +++++++++++++++++++++++++++++++++++++++------- src/brz_structs.h | 2 + src/chm.c | 3 +- src/cmph.c | 5 -- src/fch.c | 27 ++++++--- src/fch.h | 6 ++ src/main.c | 4 +- 9 files changed, 160 insertions(+), 40 deletions(-) diff --git a/src/bmz.c b/src/bmz.c index e4d1c31..7371c0e 100644 --- a/src/bmz.c +++ b/src/bmz.c @@ -66,6 +66,7 @@ cmph_t *bmz_new(cmph_config_t *mph, float c) cmph_uint8 * visited = NULL; bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz->m = mph->key_source->nkeys; bmz->n = ceil(c * mph->key_source->nkeys); diff --git a/src/bmz8.c b/src/bmz8.c index f0690dc..032a3bc 100644 --- a/src/bmz8.c +++ b/src/bmz8.c @@ -70,7 +70,7 @@ cmph_t *bmz8_new(cmph_config_t *mph, float c) if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); return NULL; } - + if (c == 0) c = 1.15; // validating restrictions over parameter c. DEBUGP("c: %f\n", c); bmz8->m = mph->key_source->nkeys; bmz8->n = ceil(c * mph->key_source->nkeys); diff --git a/src/brz.c b/src/brz.c index dad31d1..83df9e1 100755 --- a/src/brz.c +++ b/src/brz.c @@ -1,4 +1,6 @@ #include "graph.h" +#include "fch.h" +#include "fch_structs.h" #include "bmz8.h" #include "bmz8_structs.h" #include "brz.h" @@ -20,11 +22,13 @@ static int brz_gen_mphf(cmph_config_t *mph); static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys); -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->algo = CMPH_BMZ8; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -111,8 +115,17 @@ cmph_t *brz_new(cmph_config_t *mph, float c) cmph_uint32 i; cmph_uint32 iterations = 20; - DEBUGP("c: %f\n"); + DEBUGP("c: %f\n", c); brz_config_data_t *brz = (brz_config_data_t *)mph->data; + switch(brz->algo) // validating restrictions over parameter c. + { + case CMPH_BMZ8: + if (c == 0 || c >= 2.0) c = 1; + break; + case CMPH_FCH: + if (c <= 2.0) c = 2.6; + break; + } brz->c = c; brz->m = mph->key_source->nkeys; DEBUGP("m: %u\n", brz->m); @@ -179,8 +192,9 @@ cmph_t *brz_new(cmph_config_t *mph, float c) brzf->k = brz->k; brzf->c = brz->c; brzf->m = brz->m; + brzf->algo = brz->algo; mphf->data = brzf; - mphf->size = brz->m; + mphf->size = brz->m; DEBUGP("Successfully generated minimal perfect hash\n"); if (mph->verbosity) { @@ -191,7 +205,7 @@ cmph_t *brz_new(cmph_config_t *mph, float c) static int brz_gen_mphf(cmph_config_t *mph) { - cmph_uint32 i, e; + cmph_uint32 i, e, error; brz_config_data_t *brz = (brz_config_data_t *)mph->data; cmph_uint32 memory_usage = 0; cmph_uint32 nkeys_in_buffer = 0; @@ -269,7 +283,7 @@ static int brz_gen_mphf(cmph_config_t *mph) memory_usage += keylen + sizeof(keylen); h0 = hash(brz->h0, key, keylen) % brz->k; - if ((brz->size[h0] == MAX_BUCKET_SIZE) || ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0])) + if ((brz->size[h0] == MAX_BUCKET_SIZE) || (brz->algo == CMPH_BMZ8 && ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0]))) { free(buffer); free(buckets_size); @@ -337,6 +351,7 @@ static int brz_gen_mphf(cmph_config_t *mph) fwrite(cmph_names[CMPH_BRZ], (cmph_uint32)(strlen(cmph_names[CMPH_BRZ]) + 1), 1, brz->mphf_fd); fwrite(&(brz->m), sizeof(brz->m), 1, brz->mphf_fd); fwrite(&(brz->c), sizeof(cmph_float32), 1, brz->mphf_fd); + fwrite(&(brz->algo), sizeof(brz->algo), 1, brz->mphf_fd); fwrite(&(brz->k), sizeof(cmph_uint32), 1, brz->mphf_fd); // number of MPHFs fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), 1, brz->mphf_fd); @@ -362,6 +377,7 @@ static int brz_gen_mphf(cmph_config_t *mph) e = 0; keys_vd = (cmph_uint8 **)calloc(MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); nkeys_vd = 0; + error = 0; while(e < brz->m) { i = brz_min_index(buffer_h0, nflushes); @@ -403,18 +419,49 @@ static int brz_gen_mphf(cmph_config_t *mph) cmph_io_adapter_t *source = NULL; cmph_config_t *config = NULL; cmph_t *mphf_tmp = NULL; - bmz8_data_t * bmzf = NULL; char *bufmphf = NULL; cmph_uint32 buflenmphf = 0; // Source of keys source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); config = cmph_config_new(source); - cmph_config_set_algo(config, CMPH_BMZ8); + cmph_config_set_algo(config, brz->algo); + //cmph_config_set_algo(config, CMPH_BMZ8); cmph_config_set_graphsize(config, brz->c); mphf_tmp = cmph_new(config); - bmzf = (bmz8_data_t *)mphf_tmp->data; - bufmphf = brz_copy_partial_mphf(brz, bmzf, cur_bucket, &buflenmphf); - bmzf = NULL; + if (mphf_tmp == NULL) + { + if(mph->verbosity) fprintf(stderr, "ERROR: Can't generate MPHF for bucket %u out of %u\n", cur_bucket + 1, brz->k); + error = 1; + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_io_byte_vector_adapter_destroy(source); + break; + } + if(mph->verbosity) + { + if (cur_bucket % 1000 == 0) + { + fprintf(stderr, "MPHF for bucket %u out of %u was generated.\n", cur_bucket + 1, brz->k); + } + } + switch(brz->algo) + { + case CMPH_FCH: + { + fch_data_t * fchf = NULL; + fchf = (fch_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_fch_mphf(brz, fchf, cur_bucket, &buflenmphf); + } + break; + case CMPH_BMZ8: + { + bmz8_data_t * bmzf = NULL; + bmzf = (bmz8_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_bmz8_mphf(brz, bmzf, cur_bucket, &buflenmphf); + } + break; + default: assert(0); + } fwrite(bufmphf, buflenmphf, 1, brz->mphf_fd); free(bufmphf); bufmphf = NULL; @@ -425,11 +472,11 @@ static int brz_gen_mphf(cmph_config_t *mph) nkeys_vd = 0; } } - buffer_manager_destroy(buff_manager); free(keys_vd); free(buffer_merge); free(buffer_h0); + if (error) return 0; return 1; } @@ -449,7 +496,29 @@ static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint8 nkeys) for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} } -static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i = 0; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = fchf->b;//brz->size[index]; + hash_state_dump(fchf->h1, &bufh1, &buflenh1); + hash_state_dump(fchf->h2, &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2*sizeof(cmph_uint32); + buf = (char *)malloc(*buflen); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, buflenh2); + for (i = 0; i < n; i++) memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2+i,(fchf->g + i), 1); + free(bufh1); + free(bufh2); + return buf; +} +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) { cmph_uint32 buflenh1 = 0; cmph_uint32 buflenh2 = 0; @@ -470,6 +539,8 @@ static char * brz_copy_partial_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, free(bufh2); return buf; } + + int brz_dump(cmph_t *mphf, FILE *fd) { brz_data_t *data = (brz_data_t *)mphf->data; @@ -489,9 +560,6 @@ int brz_dump(cmph_t *mphf, FILE *fd) return 1; } - - - void brz_load(FILE *f, cmph_t *mphf) { char *buf = NULL; @@ -502,31 +570,41 @@ void brz_load(FILE *f, cmph_t *mphf) DEBUGP("Loading brz mphf\n"); mphf->data = brz; fread(&(brz->c), sizeof(cmph_float32), 1, f); + fread(&(brz->algo), sizeof(brz->algo), 1, f); // Reading algo. fread(&(brz->k), sizeof(cmph_uint32), 1, f); brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); fread(brz->size, sizeof(cmph_uint8)*(brz->k), 1, f); brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); brz->g = (cmph_uint8 **) calloc(brz->k, sizeof(cmph_uint8 *)); - DEBUGP("Reading %u h1 and %u h2\n", brz->k, brz->k); + DEBUGP("Reading c = %f k = %u algo = %u \n", brz->c, brz->k, brz->algo); //loading h_i1, h_i2 and g_i. for(i = 0; i < brz->k; i++) { // h1 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 1 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h1[i] = hash_state_load(buf, buflen); free(buf); //h2 fread(&buflen, sizeof(cmph_uint32), 1, f); - DEBUGP("Hash state has %u bytes\n", buflen); + DEBUGP("Hash state 2 has %u bytes\n", buflen); buf = (char *)malloc(buflen); fread(buf, buflen, 1, f); brz->h2[i] = hash_state_load(buf, buflen); free(buf); - n = ceil(brz->c * brz->size[i]); + switch(brz->algo) + { + case CMPH_FCH: + n = fch_calc_b(brz->c, brz->size[i]); + break; + case CMPH_BMZ8: + n = ceil(brz->c * brz->size[i]); + break; + default: assert(0); + } DEBUGP("g_i has %u bytes\n", n); brz->g[i] = (cmph_uint8 *)calloc(n, sizeof(cmph_uint8)); fread(brz->g[i], sizeof(cmph_uint8)*n, 1, f); @@ -542,13 +620,12 @@ void brz_load(FILE *f, cmph_t *mphf) //loading c, m, and the vector offset. fread(&(brz->m), sizeof(cmph_uint32), 1, f); brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); - fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); + fread(brz->offset, sizeof(cmph_uint32)*(brz->k), 1, f); return; } -cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +static cmph_uint32 brz_bmz8_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) { - brz_data_t *brz = mphf->data; cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; cmph_uint32 m = brz->size[h0]; cmph_uint32 n = ceil(brz->c * m); @@ -562,6 +639,35 @@ cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); return (mphf_bucket + brz->offset[h0]); } + +static cmph_uint32 brz_fch_search(brz_data_t *brz, const char *key, cmph_uint32 keylen) +{ + cmph_uint32 h0 = hash(brz->h0, key, keylen) % brz->k; + cmph_uint32 m = brz->size[h0]; + cmph_uint32 b = fch_calc_b(brz->c, m); + cmph_float32 p1 = fch_calc_p1(m); + cmph_float32 p2 = fch_calc_p2(b); + cmph_uint32 h1 = hash(brz->h1[h0], key, keylen) % m; + cmph_uint32 h2 = hash(brz->h2[h0], key, keylen) % m; + cmph_uint8 mphf_bucket = 0; + h1 = mixh10h11h12(b, p1, p2, h1); + mphf_bucket = (h2 + brz->g[h0][h1]) % m; + return (mphf_bucket + brz->offset[h0]); +} + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + brz_data_t *brz = mphf->data; + switch(brz->algo) + { + case CMPH_FCH: + return brz_fch_search(brz, key, keylen); + case CMPH_BMZ8: + return brz_bmz8_search(brz, key, keylen); + default: assert(0); + } + return 0; +} void brz_destroy(cmph_t *mphf) { cmph_uint32 i; diff --git a/src/brz_structs.h b/src/brz_structs.h index 537dc12..fa28d3f 100755 --- a/src/brz_structs.h +++ b/src/brz_structs.h @@ -5,6 +5,7 @@ struct __brz_data_t { + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_uint32 m; // edges (words) count cmph_float32 c; // constant c cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. @@ -19,6 +20,7 @@ struct __brz_data_t struct __brz_config_data_t { CMPH_HASH hashfuncs[3]; + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) cmph_float32 c; // constant c cmph_uint32 m; // edges (words) count cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. diff --git a/src/chm.c b/src/chm.c index 24bcbc8..6caedb5 100644 --- a/src/chm.c +++ b/src/chm.c @@ -59,7 +59,8 @@ cmph_t *chm_new(cmph_config_t *mph, float c) cmph_uint32 iterations = 20; cmph_uint8 *visited = NULL; chm_config_data_t *chm = (chm_config_data_t *)mph->data; - chm->m = mph->key_source->nkeys; + chm->m = mph->key_source->nkeys; + if (c == 0) c = 2.09; chm->n = ceil(c * mph->key_source->nkeys); DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); chm->graph = graph_new(chm->n, chm->m); diff --git a/src/cmph.c b/src/cmph.c index 03d00ed..1d7badd 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -354,27 +354,22 @@ cmph_t *cmph_new(cmph_config_t *mph) { case CMPH_CHM: DEBUGP("Creating chm hash\n"); - if (c == 0) c = 2.09; mphf = chm_new(mph, c); break; case CMPH_BMZ: /* included -- Fabiano */ DEBUGP("Creating bmz hash\n"); - if (c == 0) c = 1.15; mphf = bmz_new(mph, c); break; case CMPH_BMZ8: /* included -- Fabiano */ DEBUGP("Creating bmz8 hash\n"); - if (c == 0) c = 1.15; mphf = bmz8_new(mph, c); break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); - if (c == 0) c = 1.15; mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ DEBUGP("Creating fch hash\n"); - if (c <= 2) c = 2.6; mphf = fch_new(mph, c); break; default: diff --git a/src/fch.c b/src/fch.c index aa9984b..ba0357f 100644 --- a/src/fch.c +++ b/src/fch.c @@ -13,8 +13,6 @@ //#define DEBUG #include "debug.h" -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); -static void calc_parameters(fch_config_data_t *fch); static fch_buckets_t * mapping(cmph_config_t *mph); static cmph_uint32 * ordering(fch_buckets_t * buckets); static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); @@ -57,7 +55,7 @@ void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) } } -static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index) { if (initial_index < p1) initial_index %= (cmph_uint32)p2; /* h11 o h10 */ else { /* h12 o h10 */ @@ -67,11 +65,20 @@ static cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, return initial_index; } -static void calc_parameters(fch_config_data_t *fch) + +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m) { - fch->b = (cmph_uint32)ceil((fch->c*fch->m)/(log(fch->m)/log(2) + 1)); - fch->p1 = ceil(0.55*fch->m); - fch->p2 = ceil(0.3*fch->b); + return (cmph_uint32)ceil((c*m)/(log(m)/log(2) + 1)); +} + +cmph_float32 fch_calc_p1(cmph_uint32 m) +{ + return ceil(0.55*m); +} + +cmph_float32 fch_calc_p2(cmph_uint32 b) +{ + return ceil(0.3*b); } static fch_buckets_t * mapping(cmph_config_t *mph) @@ -81,7 +88,9 @@ static fch_buckets_t * mapping(cmph_config_t *mph) fch_config_data_t *fch = (fch_config_data_t *)mph->data; if (fch->h1) hash_state_destroy(fch->h1); fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); - calc_parameters (fch); + fch->b = fch_calc_b(fch->c, fch->m); + fch->p1 = fch_calc_p1(fch->m); + fch->p2 = fch_calc_p2(fch->b); //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); buckets = fch_buckets_new(fch->b); @@ -247,6 +256,7 @@ cmph_t *fch_new(cmph_config_t *mph, float c) fch_config_data_t *fch = (fch_config_data_t *)mph->data; fch->m = mph->key_source->nkeys; //DEBUGP("m: %f\n", fch->m); + if (c <= 2) c = 2.6; // validating restrictions over parameter c. fch->c = c; //DEBUGP("c: %f\n", fch->c); fch->h1 = NULL; @@ -389,7 +399,6 @@ cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) fch_data_t *fch = mphf->data; cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; - h1 = hash(fch->h1, key, keylen) % fch->m; h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); return (h2 + fch->g[h1]) % fch->m; diff --git a/src/fch.h b/src/fch.h index e56855c..5ce2811 100644 --- a/src/fch.h +++ b/src/fch.h @@ -6,6 +6,12 @@ typedef struct __fch_data_t fch_data_t; typedef struct __fch_config_data_t fch_config_data_t; +/* Parameters calculation */ +cmph_uint32 fch_calc_b(cmph_float32 c, cmph_uint32 m); +cmph_float32 fch_calc_p1(cmph_uint32 m); +cmph_float32 fch_calc_p2(cmph_uint32 b); +cmph_uint32 mixh10h11h12(cmph_uint32 b, cmph_float32 p1, cmph_float32 p2, cmph_uint32 initial_index); + fch_config_data_t *fch_config_new(); void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void fch_config_destroy(cmph_config_t *mph); diff --git a/src/main.c b/src/main.c index 11459dc..ee3c954 100644 --- a/src/main.c +++ b/src/main.c @@ -217,7 +217,6 @@ int main(int argc, char **argv) if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); - if (generate) { //Create mphf @@ -230,7 +229,8 @@ int main(int argc, char **argv) cmph_config_set_mphf_fd(config, mphf_fd); cmph_config_set_memory_availability(config, memory_availability); cmph_config_set_b(config, b); - if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + //if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; if (c != 0) cmph_config_set_graphsize(config, c); mphf = cmph_new(config); cmph_config_destroy(config); From 9144ecc809d54915d819a910aee2215ecad4849b Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 16:37:49 +0000 Subject: [PATCH 341/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/brz.c | 11 ++++++++++- src/brz.h | 1 + src/cmph.c | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/brz.c b/src/brz.c index 83df9e1..1ccec1e 100755 --- a/src/brz.c +++ b/src/brz.c @@ -28,7 +28,7 @@ brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); - brz->algo = CMPH_BMZ8; + brz->algo = CMPH_FCH; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -108,6 +108,15 @@ void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) brz->b = b; } +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + if (algo == CMPH_BMZ8 || algo == CMPH_FCH) // supported algorithms + { + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->algo = algo; + } +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; diff --git a/src/brz.h b/src/brz.h index 88b9487..1f128dd 100644 --- a/src/brz.h +++ b/src/brz.h @@ -11,6 +11,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 1d7badd..6d753d4 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -366,6 +366,8 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); + if (c >= 2.0) brz_config_set_algo(mph, CMPH_FCH); + else brz_config_set_algo(mph, CMPH_BMZ8); mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ From 690dc3ee82a4a171fcfc3c62de3e7ec2efa35cd9 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 16:37:49 +0000 Subject: [PATCH 342/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/brz.c | 11 ++++++++++- src/brz.h | 1 + src/cmph.c | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/brz.c b/src/brz.c index 83df9e1..1ccec1e 100755 --- a/src/brz.c +++ b/src/brz.c @@ -28,7 +28,7 @@ brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); - brz->algo = CMPH_BMZ8; + brz->algo = CMPH_FCH; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -108,6 +108,15 @@ void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) brz->b = b; } +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + if (algo == CMPH_BMZ8 || algo == CMPH_FCH) // supported algorithms + { + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->algo = algo; + } +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; diff --git a/src/brz.h b/src/brz.h index 88b9487..1f128dd 100644 --- a/src/brz.h +++ b/src/brz.h @@ -11,6 +11,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 1d7badd..6d753d4 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -366,6 +366,8 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); + if (c >= 2.0) brz_config_set_algo(mph, CMPH_FCH); + else brz_config_set_algo(mph, CMPH_BMZ8); mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ From c09dbb5accc970d581245c7f36e4ba1c8699cdce Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 16:37:49 +0000 Subject: [PATCH 343/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/brz.c | 11 ++++++++++- src/brz.h | 1 + src/cmph.c | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/brz.c b/src/brz.c index 83df9e1..1ccec1e 100755 --- a/src/brz.c +++ b/src/brz.c @@ -28,7 +28,7 @@ brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); - brz->algo = CMPH_BMZ8; + brz->algo = CMPH_FCH; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -108,6 +108,15 @@ void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) brz->b = b; } +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + if (algo == CMPH_BMZ8 || algo == CMPH_FCH) // supported algorithms + { + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->algo = algo; + } +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; diff --git a/src/brz.h b/src/brz.h index 88b9487..1f128dd 100644 --- a/src/brz.h +++ b/src/brz.h @@ -11,6 +11,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 1d7badd..6d753d4 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -366,6 +366,8 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); + if (c >= 2.0) brz_config_set_algo(mph, CMPH_FCH); + else brz_config_set_algo(mph, CMPH_BMZ8); mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ From e62ba1982df0e1502630098399fa3af9e95c7660 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Mon, 7 Aug 2006 16:37:49 +0000 Subject: [PATCH 344/739] BRZ is working with FCH or BMZ8. BMZ8 is faster but the MPHFs for each bucket are larger --- src/brz.c | 11 ++++++++++- src/brz.h | 1 + src/cmph.c | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/brz.c b/src/brz.c index 83df9e1..1ccec1e 100755 --- a/src/brz.c +++ b/src/brz.c @@ -28,7 +28,7 @@ brz_config_data_t *brz_config_new() { brz_config_data_t *brz = NULL; brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); - brz->algo = CMPH_BMZ8; + brz->algo = CMPH_FCH; brz->b = 128; brz->hashfuncs[0] = CMPH_HASH_JENKINS; brz->hashfuncs[1] = CMPH_HASH_JENKINS; @@ -108,6 +108,15 @@ void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b) brz->b = b; } +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + if (algo == CMPH_BMZ8 || algo == CMPH_FCH) // supported algorithms + { + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->algo = algo; + } +} + cmph_t *brz_new(cmph_config_t *mph, float c) { cmph_t *mphf = NULL; diff --git a/src/brz.h b/src/brz.h index 88b9487..1f128dd 100644 --- a/src/brz.h +++ b/src/brz.h @@ -11,6 +11,7 @@ void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); void brz_config_set_b(cmph_config_t *mph, cmph_uint8 b); +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); void brz_config_destroy(cmph_config_t *mph); cmph_t *brz_new(cmph_config_t *mph, float c); diff --git a/src/cmph.c b/src/cmph.c index 1d7badd..6d753d4 100644 --- a/src/cmph.c +++ b/src/cmph.c @@ -366,6 +366,8 @@ cmph_t *cmph_new(cmph_config_t *mph) break; case CMPH_BRZ: /* included -- Fabiano */ DEBUGP("Creating brz hash\n"); + if (c >= 2.0) brz_config_set_algo(mph, CMPH_FCH); + else brz_config_set_algo(mph, CMPH_BMZ8); mphf = brz_new(mph, c); break; case CMPH_FCH: /* included -- Fabiano */ From b0546b1fcc992af1aef39c63eb11a318e9237d2d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 16:04:55 +0000 Subject: [PATCH 345/739] *** empty log message *** --- vldb/ingles/algorithms.tex | 596 ------- vldb/ingles/applications.tex | 2 - vldb/ingles/conclusions.tex | 5 - vldb/ingles/experimentalresults.tex | 178 --- vldb/ingles/figs/brz.fig | 135 -- vldb/ingles/figs/brz.ps | 324 ---- vldb/ingles/figs/grafordering.fig | 206 --- vldb/ingles/figs/grafordering2.fig | 219 --- vldb/ingles/figs/grafordering3.fig | 130 -- vldb/ingles/figs/grafsearching.fig | 168 -- vldb/ingles/figs/grafsearching2.fig | 180 --- vldb/ingles/figs/grafsearchingncv.fig | 124 -- .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/ingles/introduction.tex | 86 - vldb/ingles/makefile | 17 - vldb/ingles/references.bib | 687 -------- vldb/ingles/relatedwork.tex | 67 - vldb/ingles/svglov2.clo | 77 - vldb/ingles/svjour2.cls | 1419 ----------------- vldb/ingles/vldb.tex | 150 -- vldb/pt/algorithms.tex | 19 - vldb/pt/applications.tex | 2 - vldb/pt/conclusions.tex | 3 - vldb/pt/experimentalresults.tex | 1 - vldb/pt/figs/brz.fig | 153 -- vldb/pt/figs/brz.ps | 324 ---- vldb/pt/figs/grafordering.fig | 206 --- vldb/pt/figs/grafordering2.fig | 219 --- vldb/pt/figs/grafordering3.fig | 130 -- vldb/pt/figs/grafsearching.fig | 168 -- vldb/pt/figs/grafsearching2.fig | 180 --- vldb/pt/figs/grafsearchingncv.fig | 124 -- vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/pt/introduction.tex | 55 - vldb/pt/makefile | 17 - vldb/pt/references.bib | 700 -------- vldb/pt/relatedwork.tex | 73 - vldb/pt/svglov2.clo | 77 - vldb/pt/svjour2.cls | 1419 ----------------- vldb/pt/vldb.tex | 150 -- 42 files changed, 10118 deletions(-) delete mode 100755 vldb/ingles/algorithms.tex delete mode 100644 vldb/ingles/applications.tex delete mode 100755 vldb/ingles/conclusions.tex delete mode 100755 vldb/ingles/experimentalresults.tex delete mode 100644 vldb/ingles/figs/brz.fig delete mode 100644 vldb/ingles/figs/brz.ps delete mode 100755 vldb/ingles/figs/grafordering.fig delete mode 100755 vldb/ingles/figs/grafordering2.fig delete mode 100755 vldb/ingles/figs/grafordering3.fig delete mode 100755 vldb/ingles/figs/grafsearching.fig delete mode 100755 vldb/ingles/figs/grafsearching2.fig delete mode 100755 vldb/ingles/figs/grafsearchingncv.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/ingles/introduction.tex delete mode 100755 vldb/ingles/makefile delete mode 100755 vldb/ingles/references.bib delete mode 100755 vldb/ingles/relatedwork.tex delete mode 100644 vldb/ingles/svglov2.clo delete mode 100644 vldb/ingles/svjour2.cls delete mode 100644 vldb/ingles/vldb.tex delete mode 100755 vldb/pt/algorithms.tex delete mode 100644 vldb/pt/applications.tex delete mode 100755 vldb/pt/conclusions.tex delete mode 100755 vldb/pt/experimentalresults.tex delete mode 100644 vldb/pt/figs/brz.fig delete mode 100644 vldb/pt/figs/brz.ps delete mode 100755 vldb/pt/figs/grafordering.fig delete mode 100755 vldb/pt/figs/grafordering2.fig delete mode 100755 vldb/pt/figs/grafordering3.fig delete mode 100755 vldb/pt/figs/grafsearching.fig delete mode 100755 vldb/pt/figs/grafsearching2.fig delete mode 100755 vldb/pt/figs/grafsearchingncv.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/pt/introduction.tex delete mode 100755 vldb/pt/makefile delete mode 100755 vldb/pt/references.bib delete mode 100755 vldb/pt/relatedwork.tex delete mode 100644 vldb/pt/svglov2.clo delete mode 100644 vldb/pt/svjour2.cls delete mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex deleted file mode 100755 index 226fbe5..0000000 --- a/vldb/ingles/algorithms.tex +++ /dev/null @@ -1,596 +0,0 @@ -\section{The Algorithms} -\label{sec:thealgorithm} -We are going to present a novel algorithm that extends our previous work -presented in~\cite{bkz05}. -First we describe our previous work and in the following the new algorithm. -To the best of our knowledge this work is the first one that becomes possible -the construction of minimal perfect hash functions for sets in the order of -billion of keys efficiently. -And better, the generated functions are very compact and can be represented -using approximately nine bits per key. - -\subsection{A Main Memory Based Algorithm} - -\subsection{An External Memory Based Algorithm} -The idea of behind the new algorithm is the traditional divide-to-conquer approach. -The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: -\begin{enumerate} -\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to -a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will -contain more than 256 keys. -This choice is crucial to make the new algorithm works and we give details about it hereinafter. -\item The keys in each bucket are separetaly spread into a hash table. -\end{enumerate} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -The main novelties are in the way the keys are segmented using external memory and spread using -minimal perfect hash functions for each bucket. The next two sections describe each step in details. -\subsubsection{Segmentation} -\subsubsection{Spreading} -% Let us show how the minimal perfect hash function~$h$ -% will be constructed. -% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, -% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where -% $n=|S|$. -% We build a random graph~$G=G(h_1,h_2)$ on~$V$, -% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. -% There is an edge in~$G$ for each key in the set of keys~$S$. -% -% In what follows, we shall be interested in the \textit{2-core} of -% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal -% degree at least~$2$ -% (see, e.g., \cite{b01,jlr00}). -% Because of its importance in our context, we call the 2-core the -% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. -% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. -% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. -% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} -% vertices in~$G$. -% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical -% vertices that have at least one non-critical vertex as a neighbour. -% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. -% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the -% {\em non-critical} subgraph of~$G$. -% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' -% of~$G$. -% We have $G=G_\crit\cup G_\ncrit$. -% -% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices -% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such -% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a -% minimal perfect hash function for~$S$. -% We will see later on that this labelling~$g$ can be found in linear time -% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. -% The procedure GenerateMPHF ($S$, $g$) receives as input the set of -% keys~$S$ and produces the labelling~$g$. -% The method uses a mapping, ordering and searching approach. -% We now describe each step. -% -% \enlargethispage{\baselineskip} -% \enlargethispage{\baselineskip} -% \vspace{-11pt} -% \begin{figure}[htb] -% \begin{center} -% \begin{lstlisting}[ -% ] -% procedure @GenerateMPHF@ (@$S$@, @$g$@) -% Mapping (@$S$@, @$G$@); -% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); -% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); -% \end{lstlisting} -% \end{center} -% \vspace{-12pt} -% \caption{Main steps of the algorithm for constructing a minimal -% perfect hash function} -% \vspace{-26pt} -% \label{prog:mainsteps} -% \end{figure} -% -% \subsection{Mapping Step} -% \label{sec:mapping} -% -% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and -% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary -% functions~$h_1$, $h_2:U\to[0,t-1]$. -% -% \def\tabela{\hbox{table}} -% % -% The functions~$h_1$ and~$h_2$ are constructed as follows. -% We impose some upper bound~$L$ on the lengths of the keys in~$S$. -% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table -% of random integers~$\tabela_j$. -% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let -% \begin{displaymath} \nonumber -% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. -% \end{displaymath} -% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set -% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be -% simple, i.e., -% $G$~should have neither loops nor multiple edges. -% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. -% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod -% t$ in this case. -% If we still find a loop after this, -% we generate another pair $(h_1,h_2)$. -% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. -% -% \vspace{-10pt} -% \subsubsection{Analysis of the Mapping Step. } -% -% We start by discussing some facts on random graphs. -% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform -% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs -% on~$V$ with~$n$ edges are equiprobable. -% The study of~$\cG(t,n)$ goes back to the classical -% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, -% see~\cite{b01,jlr00}). -% Let $d=2n/t$ be the average degree of $G$. -% It is well known that, if~$d>1$, or, equivalently, -% if~$c<2$ (recall that we have $t=cn$), -% then, almost every~$G$ -% contains\footnote{As is usual in the theory of random graphs, we use -% the terms `almost every' and `almost surely' to mean `with probability -% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of -% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ -% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall -% $c=1.15$). -% As the expected number of iterations is $O(1)$, the mapping step takes -% $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Ordering Step} -% \label{sec:ordering} -% -% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as -% input the graph~$G$ and partitions~$G$ into the two subgraphs -% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. -% For that, the procedure iteratively remove all vertices of degree 1 until done. -% -% \enlargethispage{\baselineskip} -% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices -% and 8 edges, where the degree of a vertex is shown besides each vertex. -% Applying the ordering step in this graph, the $5$-vertex graph showed in -% Figure~\ref{fig:grafordering}(b) is obtained. -% All vertices with degree 0 are non-critical vertices and the others are -% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices -% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and -% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). -% -% \vspace{-5pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} -% \end{center} -% \vspace{-10pt} -% \caption{Ordering step for a graph with 9 vertices and 8 edges} -% \vspace{-30pt} -% \label{fig:grafordering} -% \end{figure*} -% -% -% \subsubsection{Analysis of the Ordering Step. } -% -% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). -% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Searching Step} -% \label{sec:searching} -% -% In the searching step, the key part is -% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that -% the function $h:E(G)\to\ZZ$ defined by -% \begin{eqnarray} -% \label{eq:phf} -% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) -% \end{eqnarray} -% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). -% We are interested in a labelling $g:V\to\ZZ$ of -% the vertices of the graph~$G=G(h_1,h_2)$ with -% the property that if~$x$ and~$y$ are keys in~$S$, then -% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate -% to each edge the sum of the labels on its endpoints, then these values -% should be all distinct. -% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) -% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection -% between~$S$ and~$[0,n-1]$. -% -% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives -% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable -% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the -% array~$g$. -% This step is first performed for the vertices in the -% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is -% performed for the vertices in $G_\ncrit$ (the non-critical subgraph -% of~$G$ that contains the ``acyclic part'' of $G$). -% The reason the assignment of the $g$~values is first -% performed on the vertices in~$G_\crit$ is to resolve reassignments -% as early as possible (such reassignments are consequences of the cycles -% in~$G_\crit$ and are depicted hereinafter). -% -% \vspace{-8pt} -% \subsubsection{Assignment of Values to Critical Vertices. } -% \label{sec:assignmentcv} -% -% The labels~$g(v)$ ($v\in V(G_\crit)$) -% are assigned in increasing order following a greedy -% strategy where the critical vertices~$v$ are considered one at a time, -% according to a breadth-first search on~$G_\crit$. -% If a candidate value~$x$ for~$g(v)$ is forbidden -% because setting~$g(v)=x$ would create two edges with the same sum, -% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. -% -% \enlargethispage{\baselineskip} -% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. -% Initially $A_E = \emptyset$. -% Let $x$ be a candidate value for $g(v)$. -% Initially $x = 0$. -% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in $G_\crit$ -% is presented in Figure~\ref{fig:searching}. -% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made -% and $x$ is set to $x + 1$. -% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is -% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. -% -% \vspace{-12pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} -% \end{center} -% \vspace{-13pt} -% \caption{Example of the assignment of values to critical vertices} -% \vspace{-15pt} -% \label{fig:searching} -% \end{figure*} -% -% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, -% the unassigned vertex $0$ is reached. -% At this point, we collect in -% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned -% an $x$ value, and $Y = \{8\}$. -% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. -% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented -% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. -% Next, vertex $3$ is reached, $g(3)$ is set to $2$, -% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. -% Next, vertex $4$ is reached and $Y=\{3, 8\}$. -% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then -% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. -% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. -% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in -% Figure~\ref{fig:searching}(c). -% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, -% as depicted in Figure~\ref{fig:searching}(d). -% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. -% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then -% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. -% This finishes the algorithm. -% -% \vspace{-15pt} -% \subsubsection{Assignment of Values to Non-Critical Vertices. } -% \label{sec:assignmentncv} -% -% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are -% associated with edges in $G_\ncrit$, making this step simple to solve -% by a standard depth first search algorithm. -% Therefore, in the assignment of values to vertices in $G_\ncrit$ we -% benefit from the unused addresses in the gaps left by the assignment of values -% to vertices in $G_\crit$. -% For that, we start the depth-first search from the vertices in $V_\scrit$ -% because the $g$ values for these critical vertices have already been assigned -% and cannot be changed. -% -% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in -% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. -% Figure~\ref{fig:searchingncv}(a) presents the initial state of the -% algorithm. -% The critical vertex~$8$ is the only one that has non-critical -% neighbours. -% In the example presented in Figure~\ref{fig:searching}, the addresses -% $\{0, 4\}$ were not used. -% So, taking the first unused address $0$ and the vertex $1$, which is -% reached from the vertex $8$, $g(1)$ is set to -% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). -% The only vertex that is reached from vertex $1$ is vertex $2$, so -% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, -% as shown in Figure~\ref{fig:searchingncv}(c). -% This process is repeated until the UnAssignedAddresses list becomes empty. -% -% \vspace{-8pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} -% \end{center} -% \vspace{-12pt} -% \caption{Example of the assignment of values to non-critical vertices} -% \vspace{-30pt} -% \label{fig:searchingncv} -% \end{figure*} -% -% \subsubsection{Analysis of the Searching Step. } -% -% We shall demonstrate that -% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we -% generate a minimal perfect hash function), and -% (ii) the perfect assignment problem (determination of~$g$) -% can be solved in expected time $O(n)$ if the number of edges -% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% \enlargethispage{\baselineskip} -% We focus on the analysis of the assignment of values to critical vertices -% because the assignment of values to non-critical vertices -% can be solved in linear time by a depth first search algorithm. -% -% We now define certain complexity measures. -% Let $I(v)$ be the number of times a candidate value $x$ for -% $g(v)$ is incremented. -% Let $N_t$ be the total number of times that candidate values -% $x$ are incremented. -% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in -% V(G_\crit)$. -% -% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is -% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant -% component is provably very small for~$c=1.15$; -% see~\cite{b01,jlr00,pw04}.} The fact that -% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) -% then implies the following. -% -% \begin{theorem} \label{th:nbedg} -% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ -% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed -% \end{theorem} -% -% \def\maxx{{\rm max}} -% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e -% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. -% -% \begin{theorem} \label{th:Agrt} -% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. -% \end{theorem} -% \vspace{-15pt} -% -% \enlargethispage{\baselineskip} -% \begin{proof}(Sketch) -% The assignment of $g$ values to critical vertices starts from 0, -% and each edge~$e$ receives the label $h(e)$ -% as given by Eq.~(\ref{eq:phf}). -% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. -% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the -% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two -% distinct vertices get distinct~$g$ values. Hence, -% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) -% \le2|V(G_\crit)|-3+2N_t$, as required.\qed -% \end{proof} -% -% \vspace{-15pt} -% \subsubsection{Maximal Value Assigned to an Edge. } -% -% In this section we present the following conjecture. -% \begin{conjecture} \label{conj:gretestaddr} -% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and -% $|V(G)| = 1.15n$, -% it is always possible to generate a minimal perfect hash function -% because the maximal value $A_\maxx$ assigned to an edge -% $e \in E(G_\crit)$ is at most $n - 1$. -% \end{conjecture} -% -% Let us assume for the moment that $N_{t} \le N_\bedges$. -% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, -% we have -% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges -% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. -% As by hypothesis $|E(G_\crit)|\leq n/2$, we have -% $A_\maxx \le n - 1$, as required. -% -% \textit{In the mathematical analysis of our algorithm, what is left -% open is a single problem: -% prove that $N_{t} \le N_\bedges$.}\footnote{% -% Bollob\'as and Pikhurko~\cite{bp04} have investigated -% a very close vertex labelling problem for random graphs. -% However, their interest was on denser random graphs, and it seems that -% different methods will have to be used to attack the sparser case that -% we are interested in here.} -% -% We now show experimental evidence that $N_{t} \le N_\bedges$. -% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), -% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are -% $0.401 n$ and $0.501n$, respectively. -% From Theorem~\ref{th:nbedg}, -% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. -% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained -% during 10,000 executions of the algorithm for different sizes of $S$. -% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and -% tends to $0.059n$ for $n\ge1{,}000{,}000$. -% -% \vspace{-5pt} -% \begin{table}[!htb] -% {\footnotesize%\small -% \begin{center} -% \begin{tabular}{|c|c|} -% \hline -% $n$ & Maximal value of $N_t$\\ -% \hline -% %$1{,}000$ & $0.091 n$ \\ -% $10{,}000$ & $0.067 n$ \\ -% $100{,}000$ & $0.061 n$ \\ -% $1{,}000{,}000$ & $0.059 n$ \\ -% $2{,}000{,}000$ & $0.059 n$ \\ -% %$\vdots$ & $\vdots$ \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{The maximal value of $N_t$ for different number of URLs} -% \vspace{-40pt} -% \label{tab:collisions1} -% \end{table} -% -% \subsubsection{Time Complexity. } -% We now show that the time complexity of determining~$g(v)$ -% for all critical vertices~$x\in V(G_\crit)$ is -% $O(|V(G_\crit)|)=O(n)$. -% For each unassigned vertex $v$, the adjacency list of $v$, which we -% call Adj($v$), must be traversed -% to collect the set $Y$ of adjacent vertices that have already been assigned a -% value. -% Then, for each vertex in $Y$, we check if the current candidate value $x$ is -% forbidden because setting $g(v)=x$ would create two edges with the same -% endpoint sum. -% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is -% associated with -% the address that corresponds to the sum of its endpoints. -% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, -% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity -% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. -% Then, putting all these together, we see that the time complexity of this -% procedure is -% \begin{eqnarray} -% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + -% (I(v) \times|Y|) + |Y|\big]\nonumber\\ -% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| -% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber -% \end{eqnarray} -% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have -% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. -% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, -% that -% $ -% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 -% =O(|E(G_\crit)|)$. -% We conclude that -% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. -% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, -% the time required to determine~$g$ on the critical vertices is $O(n)$. -% \enlargethispage{\baselineskip} -% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex deleted file mode 100644 index cd6e72b..0000000 --- a/vldb/ingles/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Applications} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex deleted file mode 100755 index a71789c..0000000 --- a/vldb/ingles/conclusions.tex +++ /dev/null @@ -1,5 +0,0 @@ -\section{Conclusion} - -% We have presented a practical method for constructing minimal perfect -% hash functions for static sets that is efficient and may be tuned -% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex deleted file mode 100755 index 3193625..0000000 --- a/vldb/ingles/experimentalresults.tex +++ /dev/null @@ -1,178 +0,0 @@ -\section{Experimental Results} - -% We now present some experimental results. -% The same experiments were run with our algorithm and -% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as -% the CHM algorithm. -% The two algorithms were implemented in the C language and -% are available at \texttt{http://cmph.sf.net}. -% Our data consists -% of a collection of 100 million -% universe resource locations (URLs) collected from the Web. -% The average length of a URL in the collection is 63 bytes. -% All experiments were carried out on -% a computer running the Linux operating system, version 2.6.7, -% with a 2.4 gigahertz processor and -% 4 gigabytes of main memory. -% -% Table~\ref{tab:characteristics} presents the main characteristics -% of the two algorithms. -% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, -% the number of keys in the input set~$S$. -% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ -% for our algorithm and the CHM algorithm, respectively. -% This measure is related to the amount of space to store the array $g$. -% This improves the space required to store a function in our algorithm to -% $55\%$ of the space required by the CHM algorithm. -% The number of critical edges -% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, -% respectively. -% Our algorithm generates random graphs that contain cycles with high -% probability and the -% CHM algorithm -% generates -% acyclic random graphs. -% Finally, the CHM algorithm generates order preserving functions -% while our algorithm does not preserve order. -% -% \vspace{-10pt} -% \begin{table}[htb] -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|c|c|c|c|c|c|} -% \hline -% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ -% \hline -% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ -% \hline -% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{Main characteristics of the algorithms} -% \vspace{-25pt} -% \label{tab:characteristics} -% \end{table} -% -% Table~\ref{tab:timeresults} presents time measurements. -% All times are in seconds. -% The table entries are averages over 50 trials. -% The column labelled $N_i$ gives -% the number of iterations to generate the random graph $G$ -% in the mapping step of the algorithms. -% The next columns give the running times -% for the mapping plus ordering steps together and the searching -% step for each algorithm. -% The last column gives the percentage gain of our algorithm -% over the CHM algorithm. -% -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|c|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ -% \hline -% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] -% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] -% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] -% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] -% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] -% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] -% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our algorithm and the CHM algorithm} -% \vspace{-25pt} -% \label{tab:timeresults} -% }\end{table*} -% -% \enlargethispage{\baselineskip} -% The mapping step of the new algorithm is faster because -% the expected number of iterations in the mapping step to generate -% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. -% The graph $G$ generated by our algorithm -% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. -% These two facts make our algorithm faster in the mapping step. -% The ordering step of our algorithm is approximately equal to -% the time to check if $G$ is acyclic for the CHM algorithm. -% The searching step of the CHM algorithm is faster, but the total -% time of our algorithm is, on average, approximately 58\% faster -% than the CHM algorithm. -% -% The experimental results fully backs the theoretical results. -% It is important to notice the times for the searching step: -% for both algorithms they are not the dominant times, -% and the experimental results clearly show -% a linear behavior for the searching step. -% -% We now present a heuristic that reduces the space requirement -% to any given value between $1.15n$ words and $0.93n$ words. -% The heuristic reuses, when possible, the set -% of $x$ values that caused reassignments, just before trying $x+1$ -% (see Section~\ref{sec:searching}). -% The lower limit $c=0.93$ was obtained experimentally. -% We generate $10{,}000$ random graphs for -% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). -% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never -% succeeded. -% Decreasing the value of $c$ leads to an increase in the number of -% iterations to generate $G$. -% For example, for $c=1$ and $c=0.93$, the analytical expected number -% of iterations are $2.72$ and $3.17$, respectively -% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 -% for $c=0.93$). -% Table~\ref{tab:timeresults2} presents the total times to construct a -% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds -% for $c=1.15$ (see Table~\ref{tab:timeresults}) to -% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. -% -% \vspace{-5pt} -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} \\%[0.3mm] -% \hline%\\[-2mm] -% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our tuned algorithm with $c=1.00$ and $c=0.93$} -% \vspace{-25pt} -% \label{tab:timeresults2} -% } -% \end{table*} -% -% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and -% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their -% source code. In their implementation the set of keys is a set of random integers. -% We modified our implementation to generate our~$h$ from a set of random -% integers in order to make a fair comparison. For a set of $10^6$ random integers, -% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for -% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. -% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than -% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different -% sizes. -% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store -% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and -% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. -% The time to generate the functions is inversely proportional to the value of $k$. -% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig deleted file mode 100644 index 4f11d1e..0000000 --- a/vldb/ingles/figs/brz.fig +++ /dev/null @@ -1,135 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 --6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 --6 --6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/ingles/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/ingles/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/ingles/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/ingles/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/ingles/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/ingles/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/ingles/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex deleted file mode 100755 index 2c08256..0000000 --- a/vldb/ingles/introduction.tex +++ /dev/null @@ -1,86 +0,0 @@ -\section{Introduction} -\label{sec:introduction} - -Suppose~$U$ is a universe of \textit{keys}. -Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ -to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. -Given a key~$x\in S$, the hash function~$h$ computes an integer in -$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. -Hashing methods for {\em non-static sets} of keys can be used to construct -data structures storing $S$ and supporting membership queries -``$x \in S$?'' in expected time $O(1)$. -However, they involve a certain amount of wasted space owing to unused -locations in the table and waisted time to resolve collisions when -two keys are hashed to the same table location. - -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. - -% For two-column wide figures use -\begin{figure*} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure*} - -Minimal perfect hash functions are widely used for memory efficient -storage -and fast retrieval of items from static sets, such as words in natural -languages, reserved words in programming languages or interactive systems, -universal resource locations (URLs) in Web search engines, or item sets in -data mining techniques. - -The aim of this paper is to describe a new way of constructing minimal perfect -hash functions. Our algorithm shares several features with the one due to -Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also -based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one -correspondence with the key set~$S$ for which we wish to generate the hash -function. -The two main differences between our algorithm and theirs -are as follows: -(\textit{i})~we generate random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ -contains cycles with high probability, -while they generate \textit{acyclic} random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, -with a greater number of vertices: $|V|\ge2.09n$; -(\textit{ii})~they generate order preserving minimal perfect hash functions -while our algorithm does not preserve order (a perfect hash function $h$ is -\textit{order preserving} if the keys in~$S$ are arranged in some given order -and~$h$ preserves this order in the hash table). Thus, our algorithm improves -the space requirement at the expense of generating functions that are not -order preserving. - -Our algorithm is efficient and may be tuned to yield a function~$h$ -with a very economical description. -As the algorithm in~\cite{chm92}, our algorithm produces~$h$ -in~$O(n)$ expected time for a set of~$n$ keys. -The description of~$h$ requires~$1.15n$ computer words, -and evaluating~$h(x)$ -requires two accesses to an array of~$1.15n$ integers. -We further derive a heuristic that improves the space requirement -from~$1.15n$ words down to~$0.93n$ words. -Our scheme is very practical: to generate a minimal perfect hash function for -a collection of 100~million universe resource locations (URLs), each 63 bytes -long on average, our algorithm running on a commodity PC takes 811 seconds on -average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/ingles/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib deleted file mode 100755 index 02f50aa..0000000 --- a/vldb/ingles/references.bib +++ /dev/null @@ -1,687 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex deleted file mode 100755 index e32c52e..0000000 --- a/vldb/ingles/relatedwork.tex +++ /dev/null @@ -1,67 +0,0 @@ -\section{Related Work} -Czech, Havas and Majewski~\cite{chm97} provide a -comprehensive survey of the most important theoretical results -on perfect hashing. -In the following, we review some of those results. - -Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to -construct space efficient perfect hash functions that can be evaluated in -constant time with table sizes that are linear in the number of keys: -$m=O(n)$. In their model of computation, an element of the universe~$U$ fits -into one machine word, and arithmetic operations and memory accesses have unit -cost. Randomized algorithms in the FKS model can construct a perfect hash -function in expected time~$O(n)$: -this is the case of our algorithm and the works in~\cite{chm92,p99}. - -Many methods for generating minimal perfect hash functions use a -{\em mapping}, {\em ordering} and {\em searching} -(MOS) approach, -a description coined by Fox, Chen and Heath~\cite{fch92}. -In the MOS approach, the construction of a minimal perfect hash function -is accomplished in three steps. -First, the mapping step transforms the key set from the original universe -to a new universe. -Second, the ordering step places the keys in a sequential order that -determines the order in which hash values are assigned to keys. -Third, the searching step attempts to assign hash values to the keys. -Our algorithm and the algorithm presented in~\cite{chm92} use the -MOS approach. - -Pagh~\cite{p99} proposed a family of randomized algorithms for -constructing minimal perfect hash functions. -The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, -where $f$ and $g$ are universal hash functions and $d$ is a set of -displacement values to resolve collisions that are caused by the function $f$. -Pagh identified a set of conditions concerning $f$ and $g$ and showed -that if these conditions are satisfied, then a minimal perfect hash -function can be computed in expected time $O(n)$ and stored in -$(2+\epsilon)n$ computer words. -Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, -reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer -words required to store the function, but in their approach~$f$ and~$g$ must -be chosen from a class -of hash functions that meet additional requirements. -Differently from the works in~\cite{p99,dh01}, our algorithm uses two -universal hash functions $h_1$ and $h_2$ randomly selected from a class -of universal hash functions that do not need to meet any additional -requirements. - -The work in~\cite{chm92} presents an efficient and practical algorithm -for generating order preserving minimal perfect hash functions. -Their method involves the generation of acyclic random graphs -$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. -They showed that an order preserving minimal perfect hash function -can be found in optimal time if~$G$ is acyclic. -To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are -computed for each key $x \in S$. -Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, -\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. -In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects -$h_1$ and $h_2$ from a family of universal hash functions -until the corresponding graph is acyclic. -Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, -then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. -For $c=2.09$, this probability is -$p \simeq 0.342$, and -the expected number of iterations to obtain an acyclic graph -is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/ingles/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/ingles/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/ingles/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex deleted file mode 100755 index 0ae2e7b..0000000 --- a/vldb/pt/algorithms.tex +++ /dev/null @@ -1,19 +0,0 @@ -\section{Os Algoritmos} -\label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos \cite{bkz05} -\subsection{Um Algoritmo Baseado em Mem\'oria Principal} - -\subsection{Um Algoritmo Baseado em Mem\'oria Externa} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -\subsubsection{Segmenta\c{c}\~ao} -\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex deleted file mode 100644 index 785ccc0..0000000 --- a/vldb/pt/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Aplica\c{c}\~oes} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex deleted file mode 100755 index 08f3cd4..0000000 --- a/vldb/pt/conclusions.tex +++ /dev/null @@ -1,3 +0,0 @@ -\section{Conclus\~oes} - - diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex deleted file mode 100755 index 5152c0e..0000000 --- a/vldb/pt/experimentalresults.tex +++ /dev/null @@ -1 +0,0 @@ -\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig deleted file mode 100644 index e08aae4..0000000 --- a/vldb/pt/figs/brz.fig +++ /dev/null @@ -1,153 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 2025 3015 3555 3690 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 - 2790 3690 2025 3285 -4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 --6 -6 1890 3735 3780 4365 -6 2430 3735 2700 4365 -6 2430 3915 2700 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1890 4365 3780 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 --6 -6 1260 5310 4230 5580 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 2925 4230 2925 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3510 4590 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3600 4410 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3690 4410 3780 4410 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 - 2790 5220 2025 4815 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3780 4410 3780 4590 -4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/pt/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/pt/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/pt/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/pt/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/pt/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/pt/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/pt/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex deleted file mode 100755 index 077d092..0000000 --- a/vldb/pt/introduction.tex +++ /dev/null @@ -1,55 +0,0 @@ -\section{Introdu\c{c}\~ao} -\label{sec:introduction} -Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da -Ci\^encia da Computa\c{c}\~ao. -Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, -para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. -Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em -$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. -Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento -m\'aximo $L$. Portanto $u = 2^L$. - -M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para -construir estruturas de dados para armazenar $S$ e suportar consultas do tipo -``$k \in S$?'' em tempo esperado $O(1)$. -No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido -a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas -chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. - - -Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao -para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes -s\~ao chamadas de \textit{perfeitas}. -Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma -\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, -isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ -e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. -A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. -Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, -ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). -A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma -fun\c{c}\~ao hash perfeita m\'{\i}nima. -FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. - -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure} - -A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: -\begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma FHPM $h$. -\item Quantidade de mem\'oria exigida para encontrar $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. -\item Escalabilidade dos algoritmos com o crescimento de $S$. -\end{enumerate} - -Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/makefile b/vldb/pt/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/pt/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib deleted file mode 100755 index 7a1a9fb..0000000 --- a/vldb/pt/references.bib +++ /dev/null @@ -1,700 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@article{gss01, - author = {N. Galli and B. Seybold and K. Simon}, - title = {Tetris-Hashing or optimal table compression}, - journal = {Discrete Applied Mathematics}, - volume = {110}, - number = {1}, - pages = {41--58}, - month = {june}, - publisher = {Elsevier Science}, - year = {2001} -} - - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex deleted file mode 100755 index b250e4b..0000000 --- a/vldb/pt/relatedwork.tex +++ /dev/null @@ -1,73 +0,0 @@ -\section{Trabalhos Relacionados} -As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade -cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e -apresentado um survey completo da \'area at\'e 1997. -Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que -est\~ao diretamente relacionados aos algoritmos aqui propostos e -fazemos um survey dos algoritmos propostos desde ent\~ao. - -Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir -FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em -tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: -$m=O(n)$. -No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma -palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo -$O(1)$. -Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo -experada de $O(n)$: -Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. - -Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir -FHPs e FHPMs deterministicamente. -As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. -A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e -$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. -A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade -de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} -que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo -$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as -fun\c{c}\~oes com complexidade linear. -Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode -limitar a utiliza\c{c}\~ao na pr\'atica. - -Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir -FHPMs. -A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, -onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de -valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. -Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou -que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada -em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador -(ou $O((2+\epsilon)n \log n)$ bits.) -Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, -reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) -o n\'umero de palavras de -computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ -devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos -adicionais. - -Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico -que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} -e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das -fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde -$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. - -Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do -conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes -hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um -n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. -Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade -\'otima para descrever FHPMs. - -Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam -fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe -de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. -Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas -com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da -complexidade \'otima. -Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao -os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na -ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/pt/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/pt/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/pt/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} From aa4b59e7c187c112c1d8d7fdc3c4fe53d8bc99b1 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 16:04:55 +0000 Subject: [PATCH 346/739] *** empty log message *** --- vldb/ingles/algorithms.tex | 596 ------- vldb/ingles/applications.tex | 2 - vldb/ingles/conclusions.tex | 5 - vldb/ingles/experimentalresults.tex | 178 --- vldb/ingles/figs/brz.fig | 135 -- vldb/ingles/figs/brz.ps | 324 ---- vldb/ingles/figs/grafordering.fig | 206 --- vldb/ingles/figs/grafordering2.fig | 219 --- vldb/ingles/figs/grafordering3.fig | 130 -- vldb/ingles/figs/grafsearching.fig | 168 -- vldb/ingles/figs/grafsearching2.fig | 180 --- vldb/ingles/figs/grafsearchingncv.fig | 124 -- .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/ingles/introduction.tex | 86 - vldb/ingles/makefile | 17 - vldb/ingles/references.bib | 687 -------- vldb/ingles/relatedwork.tex | 67 - vldb/ingles/svglov2.clo | 77 - vldb/ingles/svjour2.cls | 1419 ----------------- vldb/ingles/vldb.tex | 150 -- vldb/pt/algorithms.tex | 19 - vldb/pt/applications.tex | 2 - vldb/pt/conclusions.tex | 3 - vldb/pt/experimentalresults.tex | 1 - vldb/pt/figs/brz.fig | 153 -- vldb/pt/figs/brz.ps | 324 ---- vldb/pt/figs/grafordering.fig | 206 --- vldb/pt/figs/grafordering2.fig | 219 --- vldb/pt/figs/grafordering3.fig | 130 -- vldb/pt/figs/grafsearching.fig | 168 -- vldb/pt/figs/grafsearching2.fig | 180 --- vldb/pt/figs/grafsearchingncv.fig | 124 -- vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/pt/introduction.tex | 55 - vldb/pt/makefile | 17 - vldb/pt/references.bib | 700 -------- vldb/pt/relatedwork.tex | 73 - vldb/pt/svglov2.clo | 77 - vldb/pt/svjour2.cls | 1419 ----------------- vldb/pt/vldb.tex | 150 -- 42 files changed, 10118 deletions(-) delete mode 100755 vldb/ingles/algorithms.tex delete mode 100644 vldb/ingles/applications.tex delete mode 100755 vldb/ingles/conclusions.tex delete mode 100755 vldb/ingles/experimentalresults.tex delete mode 100644 vldb/ingles/figs/brz.fig delete mode 100644 vldb/ingles/figs/brz.ps delete mode 100755 vldb/ingles/figs/grafordering.fig delete mode 100755 vldb/ingles/figs/grafordering2.fig delete mode 100755 vldb/ingles/figs/grafordering3.fig delete mode 100755 vldb/ingles/figs/grafsearching.fig delete mode 100755 vldb/ingles/figs/grafsearching2.fig delete mode 100755 vldb/ingles/figs/grafsearchingncv.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/ingles/introduction.tex delete mode 100755 vldb/ingles/makefile delete mode 100755 vldb/ingles/references.bib delete mode 100755 vldb/ingles/relatedwork.tex delete mode 100644 vldb/ingles/svglov2.clo delete mode 100644 vldb/ingles/svjour2.cls delete mode 100644 vldb/ingles/vldb.tex delete mode 100755 vldb/pt/algorithms.tex delete mode 100644 vldb/pt/applications.tex delete mode 100755 vldb/pt/conclusions.tex delete mode 100755 vldb/pt/experimentalresults.tex delete mode 100644 vldb/pt/figs/brz.fig delete mode 100644 vldb/pt/figs/brz.ps delete mode 100755 vldb/pt/figs/grafordering.fig delete mode 100755 vldb/pt/figs/grafordering2.fig delete mode 100755 vldb/pt/figs/grafordering3.fig delete mode 100755 vldb/pt/figs/grafsearching.fig delete mode 100755 vldb/pt/figs/grafsearching2.fig delete mode 100755 vldb/pt/figs/grafsearchingncv.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/pt/introduction.tex delete mode 100755 vldb/pt/makefile delete mode 100755 vldb/pt/references.bib delete mode 100755 vldb/pt/relatedwork.tex delete mode 100644 vldb/pt/svglov2.clo delete mode 100644 vldb/pt/svjour2.cls delete mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex deleted file mode 100755 index 226fbe5..0000000 --- a/vldb/ingles/algorithms.tex +++ /dev/null @@ -1,596 +0,0 @@ -\section{The Algorithms} -\label{sec:thealgorithm} -We are going to present a novel algorithm that extends our previous work -presented in~\cite{bkz05}. -First we describe our previous work and in the following the new algorithm. -To the best of our knowledge this work is the first one that becomes possible -the construction of minimal perfect hash functions for sets in the order of -billion of keys efficiently. -And better, the generated functions are very compact and can be represented -using approximately nine bits per key. - -\subsection{A Main Memory Based Algorithm} - -\subsection{An External Memory Based Algorithm} -The idea of behind the new algorithm is the traditional divide-to-conquer approach. -The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: -\begin{enumerate} -\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to -a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will -contain more than 256 keys. -This choice is crucial to make the new algorithm works and we give details about it hereinafter. -\item The keys in each bucket are separetaly spread into a hash table. -\end{enumerate} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -The main novelties are in the way the keys are segmented using external memory and spread using -minimal perfect hash functions for each bucket. The next two sections describe each step in details. -\subsubsection{Segmentation} -\subsubsection{Spreading} -% Let us show how the minimal perfect hash function~$h$ -% will be constructed. -% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, -% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where -% $n=|S|$. -% We build a random graph~$G=G(h_1,h_2)$ on~$V$, -% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. -% There is an edge in~$G$ for each key in the set of keys~$S$. -% -% In what follows, we shall be interested in the \textit{2-core} of -% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal -% degree at least~$2$ -% (see, e.g., \cite{b01,jlr00}). -% Because of its importance in our context, we call the 2-core the -% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. -% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. -% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. -% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} -% vertices in~$G$. -% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical -% vertices that have at least one non-critical vertex as a neighbour. -% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. -% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the -% {\em non-critical} subgraph of~$G$. -% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' -% of~$G$. -% We have $G=G_\crit\cup G_\ncrit$. -% -% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices -% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such -% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a -% minimal perfect hash function for~$S$. -% We will see later on that this labelling~$g$ can be found in linear time -% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. -% The procedure GenerateMPHF ($S$, $g$) receives as input the set of -% keys~$S$ and produces the labelling~$g$. -% The method uses a mapping, ordering and searching approach. -% We now describe each step. -% -% \enlargethispage{\baselineskip} -% \enlargethispage{\baselineskip} -% \vspace{-11pt} -% \begin{figure}[htb] -% \begin{center} -% \begin{lstlisting}[ -% ] -% procedure @GenerateMPHF@ (@$S$@, @$g$@) -% Mapping (@$S$@, @$G$@); -% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); -% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); -% \end{lstlisting} -% \end{center} -% \vspace{-12pt} -% \caption{Main steps of the algorithm for constructing a minimal -% perfect hash function} -% \vspace{-26pt} -% \label{prog:mainsteps} -% \end{figure} -% -% \subsection{Mapping Step} -% \label{sec:mapping} -% -% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and -% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary -% functions~$h_1$, $h_2:U\to[0,t-1]$. -% -% \def\tabela{\hbox{table}} -% % -% The functions~$h_1$ and~$h_2$ are constructed as follows. -% We impose some upper bound~$L$ on the lengths of the keys in~$S$. -% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table -% of random integers~$\tabela_j$. -% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let -% \begin{displaymath} \nonumber -% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. -% \end{displaymath} -% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set -% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be -% simple, i.e., -% $G$~should have neither loops nor multiple edges. -% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. -% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod -% t$ in this case. -% If we still find a loop after this, -% we generate another pair $(h_1,h_2)$. -% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. -% -% \vspace{-10pt} -% \subsubsection{Analysis of the Mapping Step. } -% -% We start by discussing some facts on random graphs. -% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform -% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs -% on~$V$ with~$n$ edges are equiprobable. -% The study of~$\cG(t,n)$ goes back to the classical -% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, -% see~\cite{b01,jlr00}). -% Let $d=2n/t$ be the average degree of $G$. -% It is well known that, if~$d>1$, or, equivalently, -% if~$c<2$ (recall that we have $t=cn$), -% then, almost every~$G$ -% contains\footnote{As is usual in the theory of random graphs, we use -% the terms `almost every' and `almost surely' to mean `with probability -% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of -% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ -% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall -% $c=1.15$). -% As the expected number of iterations is $O(1)$, the mapping step takes -% $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Ordering Step} -% \label{sec:ordering} -% -% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as -% input the graph~$G$ and partitions~$G$ into the two subgraphs -% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. -% For that, the procedure iteratively remove all vertices of degree 1 until done. -% -% \enlargethispage{\baselineskip} -% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices -% and 8 edges, where the degree of a vertex is shown besides each vertex. -% Applying the ordering step in this graph, the $5$-vertex graph showed in -% Figure~\ref{fig:grafordering}(b) is obtained. -% All vertices with degree 0 are non-critical vertices and the others are -% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices -% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and -% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). -% -% \vspace{-5pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} -% \end{center} -% \vspace{-10pt} -% \caption{Ordering step for a graph with 9 vertices and 8 edges} -% \vspace{-30pt} -% \label{fig:grafordering} -% \end{figure*} -% -% -% \subsubsection{Analysis of the Ordering Step. } -% -% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). -% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Searching Step} -% \label{sec:searching} -% -% In the searching step, the key part is -% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that -% the function $h:E(G)\to\ZZ$ defined by -% \begin{eqnarray} -% \label{eq:phf} -% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) -% \end{eqnarray} -% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). -% We are interested in a labelling $g:V\to\ZZ$ of -% the vertices of the graph~$G=G(h_1,h_2)$ with -% the property that if~$x$ and~$y$ are keys in~$S$, then -% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate -% to each edge the sum of the labels on its endpoints, then these values -% should be all distinct. -% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) -% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection -% between~$S$ and~$[0,n-1]$. -% -% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives -% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable -% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the -% array~$g$. -% This step is first performed for the vertices in the -% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is -% performed for the vertices in $G_\ncrit$ (the non-critical subgraph -% of~$G$ that contains the ``acyclic part'' of $G$). -% The reason the assignment of the $g$~values is first -% performed on the vertices in~$G_\crit$ is to resolve reassignments -% as early as possible (such reassignments are consequences of the cycles -% in~$G_\crit$ and are depicted hereinafter). -% -% \vspace{-8pt} -% \subsubsection{Assignment of Values to Critical Vertices. } -% \label{sec:assignmentcv} -% -% The labels~$g(v)$ ($v\in V(G_\crit)$) -% are assigned in increasing order following a greedy -% strategy where the critical vertices~$v$ are considered one at a time, -% according to a breadth-first search on~$G_\crit$. -% If a candidate value~$x$ for~$g(v)$ is forbidden -% because setting~$g(v)=x$ would create two edges with the same sum, -% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. -% -% \enlargethispage{\baselineskip} -% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. -% Initially $A_E = \emptyset$. -% Let $x$ be a candidate value for $g(v)$. -% Initially $x = 0$. -% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in $G_\crit$ -% is presented in Figure~\ref{fig:searching}. -% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made -% and $x$ is set to $x + 1$. -% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is -% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. -% -% \vspace{-12pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} -% \end{center} -% \vspace{-13pt} -% \caption{Example of the assignment of values to critical vertices} -% \vspace{-15pt} -% \label{fig:searching} -% \end{figure*} -% -% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, -% the unassigned vertex $0$ is reached. -% At this point, we collect in -% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned -% an $x$ value, and $Y = \{8\}$. -% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. -% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented -% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. -% Next, vertex $3$ is reached, $g(3)$ is set to $2$, -% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. -% Next, vertex $4$ is reached and $Y=\{3, 8\}$. -% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then -% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. -% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. -% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in -% Figure~\ref{fig:searching}(c). -% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, -% as depicted in Figure~\ref{fig:searching}(d). -% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. -% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then -% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. -% This finishes the algorithm. -% -% \vspace{-15pt} -% \subsubsection{Assignment of Values to Non-Critical Vertices. } -% \label{sec:assignmentncv} -% -% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are -% associated with edges in $G_\ncrit$, making this step simple to solve -% by a standard depth first search algorithm. -% Therefore, in the assignment of values to vertices in $G_\ncrit$ we -% benefit from the unused addresses in the gaps left by the assignment of values -% to vertices in $G_\crit$. -% For that, we start the depth-first search from the vertices in $V_\scrit$ -% because the $g$ values for these critical vertices have already been assigned -% and cannot be changed. -% -% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in -% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. -% Figure~\ref{fig:searchingncv}(a) presents the initial state of the -% algorithm. -% The critical vertex~$8$ is the only one that has non-critical -% neighbours. -% In the example presented in Figure~\ref{fig:searching}, the addresses -% $\{0, 4\}$ were not used. -% So, taking the first unused address $0$ and the vertex $1$, which is -% reached from the vertex $8$, $g(1)$ is set to -% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). -% The only vertex that is reached from vertex $1$ is vertex $2$, so -% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, -% as shown in Figure~\ref{fig:searchingncv}(c). -% This process is repeated until the UnAssignedAddresses list becomes empty. -% -% \vspace{-8pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} -% \end{center} -% \vspace{-12pt} -% \caption{Example of the assignment of values to non-critical vertices} -% \vspace{-30pt} -% \label{fig:searchingncv} -% \end{figure*} -% -% \subsubsection{Analysis of the Searching Step. } -% -% We shall demonstrate that -% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we -% generate a minimal perfect hash function), and -% (ii) the perfect assignment problem (determination of~$g$) -% can be solved in expected time $O(n)$ if the number of edges -% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% \enlargethispage{\baselineskip} -% We focus on the analysis of the assignment of values to critical vertices -% because the assignment of values to non-critical vertices -% can be solved in linear time by a depth first search algorithm. -% -% We now define certain complexity measures. -% Let $I(v)$ be the number of times a candidate value $x$ for -% $g(v)$ is incremented. -% Let $N_t$ be the total number of times that candidate values -% $x$ are incremented. -% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in -% V(G_\crit)$. -% -% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is -% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant -% component is provably very small for~$c=1.15$; -% see~\cite{b01,jlr00,pw04}.} The fact that -% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) -% then implies the following. -% -% \begin{theorem} \label{th:nbedg} -% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ -% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed -% \end{theorem} -% -% \def\maxx{{\rm max}} -% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e -% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. -% -% \begin{theorem} \label{th:Agrt} -% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. -% \end{theorem} -% \vspace{-15pt} -% -% \enlargethispage{\baselineskip} -% \begin{proof}(Sketch) -% The assignment of $g$ values to critical vertices starts from 0, -% and each edge~$e$ receives the label $h(e)$ -% as given by Eq.~(\ref{eq:phf}). -% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. -% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the -% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two -% distinct vertices get distinct~$g$ values. Hence, -% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) -% \le2|V(G_\crit)|-3+2N_t$, as required.\qed -% \end{proof} -% -% \vspace{-15pt} -% \subsubsection{Maximal Value Assigned to an Edge. } -% -% In this section we present the following conjecture. -% \begin{conjecture} \label{conj:gretestaddr} -% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and -% $|V(G)| = 1.15n$, -% it is always possible to generate a minimal perfect hash function -% because the maximal value $A_\maxx$ assigned to an edge -% $e \in E(G_\crit)$ is at most $n - 1$. -% \end{conjecture} -% -% Let us assume for the moment that $N_{t} \le N_\bedges$. -% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, -% we have -% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges -% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. -% As by hypothesis $|E(G_\crit)|\leq n/2$, we have -% $A_\maxx \le n - 1$, as required. -% -% \textit{In the mathematical analysis of our algorithm, what is left -% open is a single problem: -% prove that $N_{t} \le N_\bedges$.}\footnote{% -% Bollob\'as and Pikhurko~\cite{bp04} have investigated -% a very close vertex labelling problem for random graphs. -% However, their interest was on denser random graphs, and it seems that -% different methods will have to be used to attack the sparser case that -% we are interested in here.} -% -% We now show experimental evidence that $N_{t} \le N_\bedges$. -% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), -% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are -% $0.401 n$ and $0.501n$, respectively. -% From Theorem~\ref{th:nbedg}, -% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. -% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained -% during 10,000 executions of the algorithm for different sizes of $S$. -% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and -% tends to $0.059n$ for $n\ge1{,}000{,}000$. -% -% \vspace{-5pt} -% \begin{table}[!htb] -% {\footnotesize%\small -% \begin{center} -% \begin{tabular}{|c|c|} -% \hline -% $n$ & Maximal value of $N_t$\\ -% \hline -% %$1{,}000$ & $0.091 n$ \\ -% $10{,}000$ & $0.067 n$ \\ -% $100{,}000$ & $0.061 n$ \\ -% $1{,}000{,}000$ & $0.059 n$ \\ -% $2{,}000{,}000$ & $0.059 n$ \\ -% %$\vdots$ & $\vdots$ \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{The maximal value of $N_t$ for different number of URLs} -% \vspace{-40pt} -% \label{tab:collisions1} -% \end{table} -% -% \subsubsection{Time Complexity. } -% We now show that the time complexity of determining~$g(v)$ -% for all critical vertices~$x\in V(G_\crit)$ is -% $O(|V(G_\crit)|)=O(n)$. -% For each unassigned vertex $v$, the adjacency list of $v$, which we -% call Adj($v$), must be traversed -% to collect the set $Y$ of adjacent vertices that have already been assigned a -% value. -% Then, for each vertex in $Y$, we check if the current candidate value $x$ is -% forbidden because setting $g(v)=x$ would create two edges with the same -% endpoint sum. -% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is -% associated with -% the address that corresponds to the sum of its endpoints. -% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, -% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity -% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. -% Then, putting all these together, we see that the time complexity of this -% procedure is -% \begin{eqnarray} -% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + -% (I(v) \times|Y|) + |Y|\big]\nonumber\\ -% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| -% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber -% \end{eqnarray} -% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have -% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. -% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, -% that -% $ -% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 -% =O(|E(G_\crit)|)$. -% We conclude that -% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. -% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, -% the time required to determine~$g$ on the critical vertices is $O(n)$. -% \enlargethispage{\baselineskip} -% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex deleted file mode 100644 index cd6e72b..0000000 --- a/vldb/ingles/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Applications} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex deleted file mode 100755 index a71789c..0000000 --- a/vldb/ingles/conclusions.tex +++ /dev/null @@ -1,5 +0,0 @@ -\section{Conclusion} - -% We have presented a practical method for constructing minimal perfect -% hash functions for static sets that is efficient and may be tuned -% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex deleted file mode 100755 index 3193625..0000000 --- a/vldb/ingles/experimentalresults.tex +++ /dev/null @@ -1,178 +0,0 @@ -\section{Experimental Results} - -% We now present some experimental results. -% The same experiments were run with our algorithm and -% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as -% the CHM algorithm. -% The two algorithms were implemented in the C language and -% are available at \texttt{http://cmph.sf.net}. -% Our data consists -% of a collection of 100 million -% universe resource locations (URLs) collected from the Web. -% The average length of a URL in the collection is 63 bytes. -% All experiments were carried out on -% a computer running the Linux operating system, version 2.6.7, -% with a 2.4 gigahertz processor and -% 4 gigabytes of main memory. -% -% Table~\ref{tab:characteristics} presents the main characteristics -% of the two algorithms. -% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, -% the number of keys in the input set~$S$. -% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ -% for our algorithm and the CHM algorithm, respectively. -% This measure is related to the amount of space to store the array $g$. -% This improves the space required to store a function in our algorithm to -% $55\%$ of the space required by the CHM algorithm. -% The number of critical edges -% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, -% respectively. -% Our algorithm generates random graphs that contain cycles with high -% probability and the -% CHM algorithm -% generates -% acyclic random graphs. -% Finally, the CHM algorithm generates order preserving functions -% while our algorithm does not preserve order. -% -% \vspace{-10pt} -% \begin{table}[htb] -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|c|c|c|c|c|c|} -% \hline -% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ -% \hline -% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ -% \hline -% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{Main characteristics of the algorithms} -% \vspace{-25pt} -% \label{tab:characteristics} -% \end{table} -% -% Table~\ref{tab:timeresults} presents time measurements. -% All times are in seconds. -% The table entries are averages over 50 trials. -% The column labelled $N_i$ gives -% the number of iterations to generate the random graph $G$ -% in the mapping step of the algorithms. -% The next columns give the running times -% for the mapping plus ordering steps together and the searching -% step for each algorithm. -% The last column gives the percentage gain of our algorithm -% over the CHM algorithm. -% -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|c|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ -% \hline -% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] -% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] -% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] -% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] -% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] -% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] -% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our algorithm and the CHM algorithm} -% \vspace{-25pt} -% \label{tab:timeresults} -% }\end{table*} -% -% \enlargethispage{\baselineskip} -% The mapping step of the new algorithm is faster because -% the expected number of iterations in the mapping step to generate -% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. -% The graph $G$ generated by our algorithm -% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. -% These two facts make our algorithm faster in the mapping step. -% The ordering step of our algorithm is approximately equal to -% the time to check if $G$ is acyclic for the CHM algorithm. -% The searching step of the CHM algorithm is faster, but the total -% time of our algorithm is, on average, approximately 58\% faster -% than the CHM algorithm. -% -% The experimental results fully backs the theoretical results. -% It is important to notice the times for the searching step: -% for both algorithms they are not the dominant times, -% and the experimental results clearly show -% a linear behavior for the searching step. -% -% We now present a heuristic that reduces the space requirement -% to any given value between $1.15n$ words and $0.93n$ words. -% The heuristic reuses, when possible, the set -% of $x$ values that caused reassignments, just before trying $x+1$ -% (see Section~\ref{sec:searching}). -% The lower limit $c=0.93$ was obtained experimentally. -% We generate $10{,}000$ random graphs for -% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). -% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never -% succeeded. -% Decreasing the value of $c$ leads to an increase in the number of -% iterations to generate $G$. -% For example, for $c=1$ and $c=0.93$, the analytical expected number -% of iterations are $2.72$ and $3.17$, respectively -% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 -% for $c=0.93$). -% Table~\ref{tab:timeresults2} presents the total times to construct a -% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds -% for $c=1.15$ (see Table~\ref{tab:timeresults}) to -% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. -% -% \vspace{-5pt} -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} \\%[0.3mm] -% \hline%\\[-2mm] -% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our tuned algorithm with $c=1.00$ and $c=0.93$} -% \vspace{-25pt} -% \label{tab:timeresults2} -% } -% \end{table*} -% -% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and -% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their -% source code. In their implementation the set of keys is a set of random integers. -% We modified our implementation to generate our~$h$ from a set of random -% integers in order to make a fair comparison. For a set of $10^6$ random integers, -% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for -% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. -% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than -% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different -% sizes. -% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store -% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and -% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. -% The time to generate the functions is inversely proportional to the value of $k$. -% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig deleted file mode 100644 index 4f11d1e..0000000 --- a/vldb/ingles/figs/brz.fig +++ /dev/null @@ -1,135 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 --6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 --6 --6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/ingles/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/ingles/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/ingles/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/ingles/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/ingles/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/ingles/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/ingles/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex deleted file mode 100755 index 2c08256..0000000 --- a/vldb/ingles/introduction.tex +++ /dev/null @@ -1,86 +0,0 @@ -\section{Introduction} -\label{sec:introduction} - -Suppose~$U$ is a universe of \textit{keys}. -Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ -to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. -Given a key~$x\in S$, the hash function~$h$ computes an integer in -$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. -Hashing methods for {\em non-static sets} of keys can be used to construct -data structures storing $S$ and supporting membership queries -``$x \in S$?'' in expected time $O(1)$. -However, they involve a certain amount of wasted space owing to unused -locations in the table and waisted time to resolve collisions when -two keys are hashed to the same table location. - -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. - -% For two-column wide figures use -\begin{figure*} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure*} - -Minimal perfect hash functions are widely used for memory efficient -storage -and fast retrieval of items from static sets, such as words in natural -languages, reserved words in programming languages or interactive systems, -universal resource locations (URLs) in Web search engines, or item sets in -data mining techniques. - -The aim of this paper is to describe a new way of constructing minimal perfect -hash functions. Our algorithm shares several features with the one due to -Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also -based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one -correspondence with the key set~$S$ for which we wish to generate the hash -function. -The two main differences between our algorithm and theirs -are as follows: -(\textit{i})~we generate random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ -contains cycles with high probability, -while they generate \textit{acyclic} random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, -with a greater number of vertices: $|V|\ge2.09n$; -(\textit{ii})~they generate order preserving minimal perfect hash functions -while our algorithm does not preserve order (a perfect hash function $h$ is -\textit{order preserving} if the keys in~$S$ are arranged in some given order -and~$h$ preserves this order in the hash table). Thus, our algorithm improves -the space requirement at the expense of generating functions that are not -order preserving. - -Our algorithm is efficient and may be tuned to yield a function~$h$ -with a very economical description. -As the algorithm in~\cite{chm92}, our algorithm produces~$h$ -in~$O(n)$ expected time for a set of~$n$ keys. -The description of~$h$ requires~$1.15n$ computer words, -and evaluating~$h(x)$ -requires two accesses to an array of~$1.15n$ integers. -We further derive a heuristic that improves the space requirement -from~$1.15n$ words down to~$0.93n$ words. -Our scheme is very practical: to generate a minimal perfect hash function for -a collection of 100~million universe resource locations (URLs), each 63 bytes -long on average, our algorithm running on a commodity PC takes 811 seconds on -average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/ingles/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib deleted file mode 100755 index 02f50aa..0000000 --- a/vldb/ingles/references.bib +++ /dev/null @@ -1,687 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex deleted file mode 100755 index e32c52e..0000000 --- a/vldb/ingles/relatedwork.tex +++ /dev/null @@ -1,67 +0,0 @@ -\section{Related Work} -Czech, Havas and Majewski~\cite{chm97} provide a -comprehensive survey of the most important theoretical results -on perfect hashing. -In the following, we review some of those results. - -Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to -construct space efficient perfect hash functions that can be evaluated in -constant time with table sizes that are linear in the number of keys: -$m=O(n)$. In their model of computation, an element of the universe~$U$ fits -into one machine word, and arithmetic operations and memory accesses have unit -cost. Randomized algorithms in the FKS model can construct a perfect hash -function in expected time~$O(n)$: -this is the case of our algorithm and the works in~\cite{chm92,p99}. - -Many methods for generating minimal perfect hash functions use a -{\em mapping}, {\em ordering} and {\em searching} -(MOS) approach, -a description coined by Fox, Chen and Heath~\cite{fch92}. -In the MOS approach, the construction of a minimal perfect hash function -is accomplished in three steps. -First, the mapping step transforms the key set from the original universe -to a new universe. -Second, the ordering step places the keys in a sequential order that -determines the order in which hash values are assigned to keys. -Third, the searching step attempts to assign hash values to the keys. -Our algorithm and the algorithm presented in~\cite{chm92} use the -MOS approach. - -Pagh~\cite{p99} proposed a family of randomized algorithms for -constructing minimal perfect hash functions. -The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, -where $f$ and $g$ are universal hash functions and $d$ is a set of -displacement values to resolve collisions that are caused by the function $f$. -Pagh identified a set of conditions concerning $f$ and $g$ and showed -that if these conditions are satisfied, then a minimal perfect hash -function can be computed in expected time $O(n)$ and stored in -$(2+\epsilon)n$ computer words. -Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, -reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer -words required to store the function, but in their approach~$f$ and~$g$ must -be chosen from a class -of hash functions that meet additional requirements. -Differently from the works in~\cite{p99,dh01}, our algorithm uses two -universal hash functions $h_1$ and $h_2$ randomly selected from a class -of universal hash functions that do not need to meet any additional -requirements. - -The work in~\cite{chm92} presents an efficient and practical algorithm -for generating order preserving minimal perfect hash functions. -Their method involves the generation of acyclic random graphs -$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. -They showed that an order preserving minimal perfect hash function -can be found in optimal time if~$G$ is acyclic. -To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are -computed for each key $x \in S$. -Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, -\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. -In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects -$h_1$ and $h_2$ from a family of universal hash functions -until the corresponding graph is acyclic. -Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, -then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. -For $c=2.09$, this probability is -$p \simeq 0.342$, and -the expected number of iterations to obtain an acyclic graph -is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/ingles/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/ingles/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/ingles/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex deleted file mode 100755 index 0ae2e7b..0000000 --- a/vldb/pt/algorithms.tex +++ /dev/null @@ -1,19 +0,0 @@ -\section{Os Algoritmos} -\label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos \cite{bkz05} -\subsection{Um Algoritmo Baseado em Mem\'oria Principal} - -\subsection{Um Algoritmo Baseado em Mem\'oria Externa} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -\subsubsection{Segmenta\c{c}\~ao} -\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex deleted file mode 100644 index 785ccc0..0000000 --- a/vldb/pt/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Aplica\c{c}\~oes} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex deleted file mode 100755 index 08f3cd4..0000000 --- a/vldb/pt/conclusions.tex +++ /dev/null @@ -1,3 +0,0 @@ -\section{Conclus\~oes} - - diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex deleted file mode 100755 index 5152c0e..0000000 --- a/vldb/pt/experimentalresults.tex +++ /dev/null @@ -1 +0,0 @@ -\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig deleted file mode 100644 index e08aae4..0000000 --- a/vldb/pt/figs/brz.fig +++ /dev/null @@ -1,153 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 2025 3015 3555 3690 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 - 2790 3690 2025 3285 -4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 --6 -6 1890 3735 3780 4365 -6 2430 3735 2700 4365 -6 2430 3915 2700 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1890 4365 3780 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 --6 -6 1260 5310 4230 5580 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 2925 4230 2925 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3510 4590 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3600 4410 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3690 4410 3780 4410 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 - 2790 5220 2025 4815 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3780 4410 3780 4590 -4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/pt/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/pt/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/pt/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/pt/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/pt/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/pt/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/pt/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex deleted file mode 100755 index 077d092..0000000 --- a/vldb/pt/introduction.tex +++ /dev/null @@ -1,55 +0,0 @@ -\section{Introdu\c{c}\~ao} -\label{sec:introduction} -Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da -Ci\^encia da Computa\c{c}\~ao. -Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, -para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. -Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em -$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. -Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento -m\'aximo $L$. Portanto $u = 2^L$. - -M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para -construir estruturas de dados para armazenar $S$ e suportar consultas do tipo -``$k \in S$?'' em tempo esperado $O(1)$. -No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido -a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas -chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. - - -Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao -para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes -s\~ao chamadas de \textit{perfeitas}. -Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma -\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, -isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ -e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. -A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. -Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, -ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). -A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma -fun\c{c}\~ao hash perfeita m\'{\i}nima. -FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. - -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure} - -A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: -\begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma FHPM $h$. -\item Quantidade de mem\'oria exigida para encontrar $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. -\item Escalabilidade dos algoritmos com o crescimento de $S$. -\end{enumerate} - -Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/makefile b/vldb/pt/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/pt/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib deleted file mode 100755 index 7a1a9fb..0000000 --- a/vldb/pt/references.bib +++ /dev/null @@ -1,700 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@article{gss01, - author = {N. Galli and B. Seybold and K. Simon}, - title = {Tetris-Hashing or optimal table compression}, - journal = {Discrete Applied Mathematics}, - volume = {110}, - number = {1}, - pages = {41--58}, - month = {june}, - publisher = {Elsevier Science}, - year = {2001} -} - - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex deleted file mode 100755 index b250e4b..0000000 --- a/vldb/pt/relatedwork.tex +++ /dev/null @@ -1,73 +0,0 @@ -\section{Trabalhos Relacionados} -As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade -cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e -apresentado um survey completo da \'area at\'e 1997. -Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que -est\~ao diretamente relacionados aos algoritmos aqui propostos e -fazemos um survey dos algoritmos propostos desde ent\~ao. - -Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir -FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em -tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: -$m=O(n)$. -No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma -palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo -$O(1)$. -Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo -experada de $O(n)$: -Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. - -Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir -FHPs e FHPMs deterministicamente. -As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. -A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e -$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. -A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade -de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} -que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo -$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as -fun\c{c}\~oes com complexidade linear. -Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode -limitar a utiliza\c{c}\~ao na pr\'atica. - -Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir -FHPMs. -A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, -onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de -valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. -Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou -que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada -em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador -(ou $O((2+\epsilon)n \log n)$ bits.) -Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, -reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) -o n\'umero de palavras de -computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ -devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos -adicionais. - -Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico -que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} -e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das -fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde -$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. - -Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do -conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes -hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um -n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. -Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade -\'otima para descrever FHPMs. - -Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam -fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe -de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. -Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas -com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da -complexidade \'otima. -Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao -os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na -ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/pt/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/pt/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/pt/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} From 00c049787a9221aa8717f10e967a0c29a9fe6ec5 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 16:04:55 +0000 Subject: [PATCH 347/739] *** empty log message *** --- vldb/ingles/algorithms.tex | 596 ------- vldb/ingles/applications.tex | 2 - vldb/ingles/conclusions.tex | 5 - vldb/ingles/experimentalresults.tex | 178 --- vldb/ingles/figs/brz.fig | 135 -- vldb/ingles/figs/brz.ps | 324 ---- vldb/ingles/figs/grafordering.fig | 206 --- vldb/ingles/figs/grafordering2.fig | 219 --- vldb/ingles/figs/grafordering3.fig | 130 -- vldb/ingles/figs/grafsearching.fig | 168 -- vldb/ingles/figs/grafsearching2.fig | 180 --- vldb/ingles/figs/grafsearchingncv.fig | 124 -- .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/ingles/introduction.tex | 86 - vldb/ingles/makefile | 17 - vldb/ingles/references.bib | 687 -------- vldb/ingles/relatedwork.tex | 67 - vldb/ingles/svglov2.clo | 77 - vldb/ingles/svjour2.cls | 1419 ----------------- vldb/ingles/vldb.tex | 150 -- vldb/pt/algorithms.tex | 19 - vldb/pt/applications.tex | 2 - vldb/pt/conclusions.tex | 3 - vldb/pt/experimentalresults.tex | 1 - vldb/pt/figs/brz.fig | 153 -- vldb/pt/figs/brz.ps | 324 ---- vldb/pt/figs/grafordering.fig | 206 --- vldb/pt/figs/grafordering2.fig | 219 --- vldb/pt/figs/grafordering3.fig | 130 -- vldb/pt/figs/grafsearching.fig | 168 -- vldb/pt/figs/grafsearching2.fig | 180 --- vldb/pt/figs/grafsearchingncv.fig | 124 -- vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/pt/introduction.tex | 55 - vldb/pt/makefile | 17 - vldb/pt/references.bib | 700 -------- vldb/pt/relatedwork.tex | 73 - vldb/pt/svglov2.clo | 77 - vldb/pt/svjour2.cls | 1419 ----------------- vldb/pt/vldb.tex | 150 -- 42 files changed, 10118 deletions(-) delete mode 100755 vldb/ingles/algorithms.tex delete mode 100644 vldb/ingles/applications.tex delete mode 100755 vldb/ingles/conclusions.tex delete mode 100755 vldb/ingles/experimentalresults.tex delete mode 100644 vldb/ingles/figs/brz.fig delete mode 100644 vldb/ingles/figs/brz.ps delete mode 100755 vldb/ingles/figs/grafordering.fig delete mode 100755 vldb/ingles/figs/grafordering2.fig delete mode 100755 vldb/ingles/figs/grafordering3.fig delete mode 100755 vldb/ingles/figs/grafsearching.fig delete mode 100755 vldb/ingles/figs/grafsearching2.fig delete mode 100755 vldb/ingles/figs/grafsearchingncv.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/ingles/introduction.tex delete mode 100755 vldb/ingles/makefile delete mode 100755 vldb/ingles/references.bib delete mode 100755 vldb/ingles/relatedwork.tex delete mode 100644 vldb/ingles/svglov2.clo delete mode 100644 vldb/ingles/svjour2.cls delete mode 100644 vldb/ingles/vldb.tex delete mode 100755 vldb/pt/algorithms.tex delete mode 100644 vldb/pt/applications.tex delete mode 100755 vldb/pt/conclusions.tex delete mode 100755 vldb/pt/experimentalresults.tex delete mode 100644 vldb/pt/figs/brz.fig delete mode 100644 vldb/pt/figs/brz.ps delete mode 100755 vldb/pt/figs/grafordering.fig delete mode 100755 vldb/pt/figs/grafordering2.fig delete mode 100755 vldb/pt/figs/grafordering3.fig delete mode 100755 vldb/pt/figs/grafsearching.fig delete mode 100755 vldb/pt/figs/grafsearching2.fig delete mode 100755 vldb/pt/figs/grafsearchingncv.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/pt/introduction.tex delete mode 100755 vldb/pt/makefile delete mode 100755 vldb/pt/references.bib delete mode 100755 vldb/pt/relatedwork.tex delete mode 100644 vldb/pt/svglov2.clo delete mode 100644 vldb/pt/svjour2.cls delete mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex deleted file mode 100755 index 226fbe5..0000000 --- a/vldb/ingles/algorithms.tex +++ /dev/null @@ -1,596 +0,0 @@ -\section{The Algorithms} -\label{sec:thealgorithm} -We are going to present a novel algorithm that extends our previous work -presented in~\cite{bkz05}. -First we describe our previous work and in the following the new algorithm. -To the best of our knowledge this work is the first one that becomes possible -the construction of minimal perfect hash functions for sets in the order of -billion of keys efficiently. -And better, the generated functions are very compact and can be represented -using approximately nine bits per key. - -\subsection{A Main Memory Based Algorithm} - -\subsection{An External Memory Based Algorithm} -The idea of behind the new algorithm is the traditional divide-to-conquer approach. -The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: -\begin{enumerate} -\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to -a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will -contain more than 256 keys. -This choice is crucial to make the new algorithm works and we give details about it hereinafter. -\item The keys in each bucket are separetaly spread into a hash table. -\end{enumerate} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -The main novelties are in the way the keys are segmented using external memory and spread using -minimal perfect hash functions for each bucket. The next two sections describe each step in details. -\subsubsection{Segmentation} -\subsubsection{Spreading} -% Let us show how the minimal perfect hash function~$h$ -% will be constructed. -% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, -% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where -% $n=|S|$. -% We build a random graph~$G=G(h_1,h_2)$ on~$V$, -% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. -% There is an edge in~$G$ for each key in the set of keys~$S$. -% -% In what follows, we shall be interested in the \textit{2-core} of -% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal -% degree at least~$2$ -% (see, e.g., \cite{b01,jlr00}). -% Because of its importance in our context, we call the 2-core the -% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. -% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. -% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. -% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} -% vertices in~$G$. -% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical -% vertices that have at least one non-critical vertex as a neighbour. -% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. -% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the -% {\em non-critical} subgraph of~$G$. -% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' -% of~$G$. -% We have $G=G_\crit\cup G_\ncrit$. -% -% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices -% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such -% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a -% minimal perfect hash function for~$S$. -% We will see later on that this labelling~$g$ can be found in linear time -% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. -% The procedure GenerateMPHF ($S$, $g$) receives as input the set of -% keys~$S$ and produces the labelling~$g$. -% The method uses a mapping, ordering and searching approach. -% We now describe each step. -% -% \enlargethispage{\baselineskip} -% \enlargethispage{\baselineskip} -% \vspace{-11pt} -% \begin{figure}[htb] -% \begin{center} -% \begin{lstlisting}[ -% ] -% procedure @GenerateMPHF@ (@$S$@, @$g$@) -% Mapping (@$S$@, @$G$@); -% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); -% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); -% \end{lstlisting} -% \end{center} -% \vspace{-12pt} -% \caption{Main steps of the algorithm for constructing a minimal -% perfect hash function} -% \vspace{-26pt} -% \label{prog:mainsteps} -% \end{figure} -% -% \subsection{Mapping Step} -% \label{sec:mapping} -% -% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and -% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary -% functions~$h_1$, $h_2:U\to[0,t-1]$. -% -% \def\tabela{\hbox{table}} -% % -% The functions~$h_1$ and~$h_2$ are constructed as follows. -% We impose some upper bound~$L$ on the lengths of the keys in~$S$. -% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table -% of random integers~$\tabela_j$. -% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let -% \begin{displaymath} \nonumber -% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. -% \end{displaymath} -% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set -% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be -% simple, i.e., -% $G$~should have neither loops nor multiple edges. -% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. -% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod -% t$ in this case. -% If we still find a loop after this, -% we generate another pair $(h_1,h_2)$. -% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. -% -% \vspace{-10pt} -% \subsubsection{Analysis of the Mapping Step. } -% -% We start by discussing some facts on random graphs. -% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform -% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs -% on~$V$ with~$n$ edges are equiprobable. -% The study of~$\cG(t,n)$ goes back to the classical -% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, -% see~\cite{b01,jlr00}). -% Let $d=2n/t$ be the average degree of $G$. -% It is well known that, if~$d>1$, or, equivalently, -% if~$c<2$ (recall that we have $t=cn$), -% then, almost every~$G$ -% contains\footnote{As is usual in the theory of random graphs, we use -% the terms `almost every' and `almost surely' to mean `with probability -% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of -% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ -% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall -% $c=1.15$). -% As the expected number of iterations is $O(1)$, the mapping step takes -% $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Ordering Step} -% \label{sec:ordering} -% -% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as -% input the graph~$G$ and partitions~$G$ into the two subgraphs -% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. -% For that, the procedure iteratively remove all vertices of degree 1 until done. -% -% \enlargethispage{\baselineskip} -% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices -% and 8 edges, where the degree of a vertex is shown besides each vertex. -% Applying the ordering step in this graph, the $5$-vertex graph showed in -% Figure~\ref{fig:grafordering}(b) is obtained. -% All vertices with degree 0 are non-critical vertices and the others are -% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices -% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and -% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). -% -% \vspace{-5pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} -% \end{center} -% \vspace{-10pt} -% \caption{Ordering step for a graph with 9 vertices and 8 edges} -% \vspace{-30pt} -% \label{fig:grafordering} -% \end{figure*} -% -% -% \subsubsection{Analysis of the Ordering Step. } -% -% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). -% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Searching Step} -% \label{sec:searching} -% -% In the searching step, the key part is -% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that -% the function $h:E(G)\to\ZZ$ defined by -% \begin{eqnarray} -% \label{eq:phf} -% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) -% \end{eqnarray} -% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). -% We are interested in a labelling $g:V\to\ZZ$ of -% the vertices of the graph~$G=G(h_1,h_2)$ with -% the property that if~$x$ and~$y$ are keys in~$S$, then -% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate -% to each edge the sum of the labels on its endpoints, then these values -% should be all distinct. -% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) -% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection -% between~$S$ and~$[0,n-1]$. -% -% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives -% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable -% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the -% array~$g$. -% This step is first performed for the vertices in the -% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is -% performed for the vertices in $G_\ncrit$ (the non-critical subgraph -% of~$G$ that contains the ``acyclic part'' of $G$). -% The reason the assignment of the $g$~values is first -% performed on the vertices in~$G_\crit$ is to resolve reassignments -% as early as possible (such reassignments are consequences of the cycles -% in~$G_\crit$ and are depicted hereinafter). -% -% \vspace{-8pt} -% \subsubsection{Assignment of Values to Critical Vertices. } -% \label{sec:assignmentcv} -% -% The labels~$g(v)$ ($v\in V(G_\crit)$) -% are assigned in increasing order following a greedy -% strategy where the critical vertices~$v$ are considered one at a time, -% according to a breadth-first search on~$G_\crit$. -% If a candidate value~$x$ for~$g(v)$ is forbidden -% because setting~$g(v)=x$ would create two edges with the same sum, -% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. -% -% \enlargethispage{\baselineskip} -% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. -% Initially $A_E = \emptyset$. -% Let $x$ be a candidate value for $g(v)$. -% Initially $x = 0$. -% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in $G_\crit$ -% is presented in Figure~\ref{fig:searching}. -% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made -% and $x$ is set to $x + 1$. -% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is -% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. -% -% \vspace{-12pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} -% \end{center} -% \vspace{-13pt} -% \caption{Example of the assignment of values to critical vertices} -% \vspace{-15pt} -% \label{fig:searching} -% \end{figure*} -% -% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, -% the unassigned vertex $0$ is reached. -% At this point, we collect in -% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned -% an $x$ value, and $Y = \{8\}$. -% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. -% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented -% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. -% Next, vertex $3$ is reached, $g(3)$ is set to $2$, -% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. -% Next, vertex $4$ is reached and $Y=\{3, 8\}$. -% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then -% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. -% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. -% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in -% Figure~\ref{fig:searching}(c). -% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, -% as depicted in Figure~\ref{fig:searching}(d). -% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. -% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then -% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. -% This finishes the algorithm. -% -% \vspace{-15pt} -% \subsubsection{Assignment of Values to Non-Critical Vertices. } -% \label{sec:assignmentncv} -% -% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are -% associated with edges in $G_\ncrit$, making this step simple to solve -% by a standard depth first search algorithm. -% Therefore, in the assignment of values to vertices in $G_\ncrit$ we -% benefit from the unused addresses in the gaps left by the assignment of values -% to vertices in $G_\crit$. -% For that, we start the depth-first search from the vertices in $V_\scrit$ -% because the $g$ values for these critical vertices have already been assigned -% and cannot be changed. -% -% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in -% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. -% Figure~\ref{fig:searchingncv}(a) presents the initial state of the -% algorithm. -% The critical vertex~$8$ is the only one that has non-critical -% neighbours. -% In the example presented in Figure~\ref{fig:searching}, the addresses -% $\{0, 4\}$ were not used. -% So, taking the first unused address $0$ and the vertex $1$, which is -% reached from the vertex $8$, $g(1)$ is set to -% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). -% The only vertex that is reached from vertex $1$ is vertex $2$, so -% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, -% as shown in Figure~\ref{fig:searchingncv}(c). -% This process is repeated until the UnAssignedAddresses list becomes empty. -% -% \vspace{-8pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} -% \end{center} -% \vspace{-12pt} -% \caption{Example of the assignment of values to non-critical vertices} -% \vspace{-30pt} -% \label{fig:searchingncv} -% \end{figure*} -% -% \subsubsection{Analysis of the Searching Step. } -% -% We shall demonstrate that -% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we -% generate a minimal perfect hash function), and -% (ii) the perfect assignment problem (determination of~$g$) -% can be solved in expected time $O(n)$ if the number of edges -% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% \enlargethispage{\baselineskip} -% We focus on the analysis of the assignment of values to critical vertices -% because the assignment of values to non-critical vertices -% can be solved in linear time by a depth first search algorithm. -% -% We now define certain complexity measures. -% Let $I(v)$ be the number of times a candidate value $x$ for -% $g(v)$ is incremented. -% Let $N_t$ be the total number of times that candidate values -% $x$ are incremented. -% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in -% V(G_\crit)$. -% -% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is -% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant -% component is provably very small for~$c=1.15$; -% see~\cite{b01,jlr00,pw04}.} The fact that -% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) -% then implies the following. -% -% \begin{theorem} \label{th:nbedg} -% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ -% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed -% \end{theorem} -% -% \def\maxx{{\rm max}} -% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e -% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. -% -% \begin{theorem} \label{th:Agrt} -% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. -% \end{theorem} -% \vspace{-15pt} -% -% \enlargethispage{\baselineskip} -% \begin{proof}(Sketch) -% The assignment of $g$ values to critical vertices starts from 0, -% and each edge~$e$ receives the label $h(e)$ -% as given by Eq.~(\ref{eq:phf}). -% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. -% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the -% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two -% distinct vertices get distinct~$g$ values. Hence, -% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) -% \le2|V(G_\crit)|-3+2N_t$, as required.\qed -% \end{proof} -% -% \vspace{-15pt} -% \subsubsection{Maximal Value Assigned to an Edge. } -% -% In this section we present the following conjecture. -% \begin{conjecture} \label{conj:gretestaddr} -% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and -% $|V(G)| = 1.15n$, -% it is always possible to generate a minimal perfect hash function -% because the maximal value $A_\maxx$ assigned to an edge -% $e \in E(G_\crit)$ is at most $n - 1$. -% \end{conjecture} -% -% Let us assume for the moment that $N_{t} \le N_\bedges$. -% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, -% we have -% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges -% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. -% As by hypothesis $|E(G_\crit)|\leq n/2$, we have -% $A_\maxx \le n - 1$, as required. -% -% \textit{In the mathematical analysis of our algorithm, what is left -% open is a single problem: -% prove that $N_{t} \le N_\bedges$.}\footnote{% -% Bollob\'as and Pikhurko~\cite{bp04} have investigated -% a very close vertex labelling problem for random graphs. -% However, their interest was on denser random graphs, and it seems that -% different methods will have to be used to attack the sparser case that -% we are interested in here.} -% -% We now show experimental evidence that $N_{t} \le N_\bedges$. -% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), -% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are -% $0.401 n$ and $0.501n$, respectively. -% From Theorem~\ref{th:nbedg}, -% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. -% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained -% during 10,000 executions of the algorithm for different sizes of $S$. -% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and -% tends to $0.059n$ for $n\ge1{,}000{,}000$. -% -% \vspace{-5pt} -% \begin{table}[!htb] -% {\footnotesize%\small -% \begin{center} -% \begin{tabular}{|c|c|} -% \hline -% $n$ & Maximal value of $N_t$\\ -% \hline -% %$1{,}000$ & $0.091 n$ \\ -% $10{,}000$ & $0.067 n$ \\ -% $100{,}000$ & $0.061 n$ \\ -% $1{,}000{,}000$ & $0.059 n$ \\ -% $2{,}000{,}000$ & $0.059 n$ \\ -% %$\vdots$ & $\vdots$ \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{The maximal value of $N_t$ for different number of URLs} -% \vspace{-40pt} -% \label{tab:collisions1} -% \end{table} -% -% \subsubsection{Time Complexity. } -% We now show that the time complexity of determining~$g(v)$ -% for all critical vertices~$x\in V(G_\crit)$ is -% $O(|V(G_\crit)|)=O(n)$. -% For each unassigned vertex $v$, the adjacency list of $v$, which we -% call Adj($v$), must be traversed -% to collect the set $Y$ of adjacent vertices that have already been assigned a -% value. -% Then, for each vertex in $Y$, we check if the current candidate value $x$ is -% forbidden because setting $g(v)=x$ would create two edges with the same -% endpoint sum. -% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is -% associated with -% the address that corresponds to the sum of its endpoints. -% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, -% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity -% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. -% Then, putting all these together, we see that the time complexity of this -% procedure is -% \begin{eqnarray} -% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + -% (I(v) \times|Y|) + |Y|\big]\nonumber\\ -% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| -% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber -% \end{eqnarray} -% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have -% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. -% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, -% that -% $ -% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 -% =O(|E(G_\crit)|)$. -% We conclude that -% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. -% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, -% the time required to determine~$g$ on the critical vertices is $O(n)$. -% \enlargethispage{\baselineskip} -% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex deleted file mode 100644 index cd6e72b..0000000 --- a/vldb/ingles/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Applications} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex deleted file mode 100755 index a71789c..0000000 --- a/vldb/ingles/conclusions.tex +++ /dev/null @@ -1,5 +0,0 @@ -\section{Conclusion} - -% We have presented a practical method for constructing minimal perfect -% hash functions for static sets that is efficient and may be tuned -% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex deleted file mode 100755 index 3193625..0000000 --- a/vldb/ingles/experimentalresults.tex +++ /dev/null @@ -1,178 +0,0 @@ -\section{Experimental Results} - -% We now present some experimental results. -% The same experiments were run with our algorithm and -% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as -% the CHM algorithm. -% The two algorithms were implemented in the C language and -% are available at \texttt{http://cmph.sf.net}. -% Our data consists -% of a collection of 100 million -% universe resource locations (URLs) collected from the Web. -% The average length of a URL in the collection is 63 bytes. -% All experiments were carried out on -% a computer running the Linux operating system, version 2.6.7, -% with a 2.4 gigahertz processor and -% 4 gigabytes of main memory. -% -% Table~\ref{tab:characteristics} presents the main characteristics -% of the two algorithms. -% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, -% the number of keys in the input set~$S$. -% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ -% for our algorithm and the CHM algorithm, respectively. -% This measure is related to the amount of space to store the array $g$. -% This improves the space required to store a function in our algorithm to -% $55\%$ of the space required by the CHM algorithm. -% The number of critical edges -% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, -% respectively. -% Our algorithm generates random graphs that contain cycles with high -% probability and the -% CHM algorithm -% generates -% acyclic random graphs. -% Finally, the CHM algorithm generates order preserving functions -% while our algorithm does not preserve order. -% -% \vspace{-10pt} -% \begin{table}[htb] -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|c|c|c|c|c|c|} -% \hline -% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ -% \hline -% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ -% \hline -% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{Main characteristics of the algorithms} -% \vspace{-25pt} -% \label{tab:characteristics} -% \end{table} -% -% Table~\ref{tab:timeresults} presents time measurements. -% All times are in seconds. -% The table entries are averages over 50 trials. -% The column labelled $N_i$ gives -% the number of iterations to generate the random graph $G$ -% in the mapping step of the algorithms. -% The next columns give the running times -% for the mapping plus ordering steps together and the searching -% step for each algorithm. -% The last column gives the percentage gain of our algorithm -% over the CHM algorithm. -% -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|c|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ -% \hline -% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] -% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] -% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] -% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] -% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] -% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] -% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our algorithm and the CHM algorithm} -% \vspace{-25pt} -% \label{tab:timeresults} -% }\end{table*} -% -% \enlargethispage{\baselineskip} -% The mapping step of the new algorithm is faster because -% the expected number of iterations in the mapping step to generate -% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. -% The graph $G$ generated by our algorithm -% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. -% These two facts make our algorithm faster in the mapping step. -% The ordering step of our algorithm is approximately equal to -% the time to check if $G$ is acyclic for the CHM algorithm. -% The searching step of the CHM algorithm is faster, but the total -% time of our algorithm is, on average, approximately 58\% faster -% than the CHM algorithm. -% -% The experimental results fully backs the theoretical results. -% It is important to notice the times for the searching step: -% for both algorithms they are not the dominant times, -% and the experimental results clearly show -% a linear behavior for the searching step. -% -% We now present a heuristic that reduces the space requirement -% to any given value between $1.15n$ words and $0.93n$ words. -% The heuristic reuses, when possible, the set -% of $x$ values that caused reassignments, just before trying $x+1$ -% (see Section~\ref{sec:searching}). -% The lower limit $c=0.93$ was obtained experimentally. -% We generate $10{,}000$ random graphs for -% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). -% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never -% succeeded. -% Decreasing the value of $c$ leads to an increase in the number of -% iterations to generate $G$. -% For example, for $c=1$ and $c=0.93$, the analytical expected number -% of iterations are $2.72$ and $3.17$, respectively -% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 -% for $c=0.93$). -% Table~\ref{tab:timeresults2} presents the total times to construct a -% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds -% for $c=1.15$ (see Table~\ref{tab:timeresults}) to -% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. -% -% \vspace{-5pt} -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} \\%[0.3mm] -% \hline%\\[-2mm] -% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our tuned algorithm with $c=1.00$ and $c=0.93$} -% \vspace{-25pt} -% \label{tab:timeresults2} -% } -% \end{table*} -% -% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and -% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their -% source code. In their implementation the set of keys is a set of random integers. -% We modified our implementation to generate our~$h$ from a set of random -% integers in order to make a fair comparison. For a set of $10^6$ random integers, -% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for -% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. -% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than -% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different -% sizes. -% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store -% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and -% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. -% The time to generate the functions is inversely proportional to the value of $k$. -% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig deleted file mode 100644 index 4f11d1e..0000000 --- a/vldb/ingles/figs/brz.fig +++ /dev/null @@ -1,135 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 --6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 --6 --6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/ingles/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/ingles/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/ingles/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/ingles/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/ingles/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/ingles/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/ingles/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex deleted file mode 100755 index 2c08256..0000000 --- a/vldb/ingles/introduction.tex +++ /dev/null @@ -1,86 +0,0 @@ -\section{Introduction} -\label{sec:introduction} - -Suppose~$U$ is a universe of \textit{keys}. -Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ -to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. -Given a key~$x\in S$, the hash function~$h$ computes an integer in -$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. -Hashing methods for {\em non-static sets} of keys can be used to construct -data structures storing $S$ and supporting membership queries -``$x \in S$?'' in expected time $O(1)$. -However, they involve a certain amount of wasted space owing to unused -locations in the table and waisted time to resolve collisions when -two keys are hashed to the same table location. - -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. - -% For two-column wide figures use -\begin{figure*} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure*} - -Minimal perfect hash functions are widely used for memory efficient -storage -and fast retrieval of items from static sets, such as words in natural -languages, reserved words in programming languages or interactive systems, -universal resource locations (URLs) in Web search engines, or item sets in -data mining techniques. - -The aim of this paper is to describe a new way of constructing minimal perfect -hash functions. Our algorithm shares several features with the one due to -Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also -based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one -correspondence with the key set~$S$ for which we wish to generate the hash -function. -The two main differences between our algorithm and theirs -are as follows: -(\textit{i})~we generate random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ -contains cycles with high probability, -while they generate \textit{acyclic} random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, -with a greater number of vertices: $|V|\ge2.09n$; -(\textit{ii})~they generate order preserving minimal perfect hash functions -while our algorithm does not preserve order (a perfect hash function $h$ is -\textit{order preserving} if the keys in~$S$ are arranged in some given order -and~$h$ preserves this order in the hash table). Thus, our algorithm improves -the space requirement at the expense of generating functions that are not -order preserving. - -Our algorithm is efficient and may be tuned to yield a function~$h$ -with a very economical description. -As the algorithm in~\cite{chm92}, our algorithm produces~$h$ -in~$O(n)$ expected time for a set of~$n$ keys. -The description of~$h$ requires~$1.15n$ computer words, -and evaluating~$h(x)$ -requires two accesses to an array of~$1.15n$ integers. -We further derive a heuristic that improves the space requirement -from~$1.15n$ words down to~$0.93n$ words. -Our scheme is very practical: to generate a minimal perfect hash function for -a collection of 100~million universe resource locations (URLs), each 63 bytes -long on average, our algorithm running on a commodity PC takes 811 seconds on -average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/ingles/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib deleted file mode 100755 index 02f50aa..0000000 --- a/vldb/ingles/references.bib +++ /dev/null @@ -1,687 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex deleted file mode 100755 index e32c52e..0000000 --- a/vldb/ingles/relatedwork.tex +++ /dev/null @@ -1,67 +0,0 @@ -\section{Related Work} -Czech, Havas and Majewski~\cite{chm97} provide a -comprehensive survey of the most important theoretical results -on perfect hashing. -In the following, we review some of those results. - -Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to -construct space efficient perfect hash functions that can be evaluated in -constant time with table sizes that are linear in the number of keys: -$m=O(n)$. In their model of computation, an element of the universe~$U$ fits -into one machine word, and arithmetic operations and memory accesses have unit -cost. Randomized algorithms in the FKS model can construct a perfect hash -function in expected time~$O(n)$: -this is the case of our algorithm and the works in~\cite{chm92,p99}. - -Many methods for generating minimal perfect hash functions use a -{\em mapping}, {\em ordering} and {\em searching} -(MOS) approach, -a description coined by Fox, Chen and Heath~\cite{fch92}. -In the MOS approach, the construction of a minimal perfect hash function -is accomplished in three steps. -First, the mapping step transforms the key set from the original universe -to a new universe. -Second, the ordering step places the keys in a sequential order that -determines the order in which hash values are assigned to keys. -Third, the searching step attempts to assign hash values to the keys. -Our algorithm and the algorithm presented in~\cite{chm92} use the -MOS approach. - -Pagh~\cite{p99} proposed a family of randomized algorithms for -constructing minimal perfect hash functions. -The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, -where $f$ and $g$ are universal hash functions and $d$ is a set of -displacement values to resolve collisions that are caused by the function $f$. -Pagh identified a set of conditions concerning $f$ and $g$ and showed -that if these conditions are satisfied, then a minimal perfect hash -function can be computed in expected time $O(n)$ and stored in -$(2+\epsilon)n$ computer words. -Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, -reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer -words required to store the function, but in their approach~$f$ and~$g$ must -be chosen from a class -of hash functions that meet additional requirements. -Differently from the works in~\cite{p99,dh01}, our algorithm uses two -universal hash functions $h_1$ and $h_2$ randomly selected from a class -of universal hash functions that do not need to meet any additional -requirements. - -The work in~\cite{chm92} presents an efficient and practical algorithm -for generating order preserving minimal perfect hash functions. -Their method involves the generation of acyclic random graphs -$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. -They showed that an order preserving minimal perfect hash function -can be found in optimal time if~$G$ is acyclic. -To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are -computed for each key $x \in S$. -Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, -\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. -In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects -$h_1$ and $h_2$ from a family of universal hash functions -until the corresponding graph is acyclic. -Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, -then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. -For $c=2.09$, this probability is -$p \simeq 0.342$, and -the expected number of iterations to obtain an acyclic graph -is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/ingles/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/ingles/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/ingles/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex deleted file mode 100755 index 0ae2e7b..0000000 --- a/vldb/pt/algorithms.tex +++ /dev/null @@ -1,19 +0,0 @@ -\section{Os Algoritmos} -\label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos \cite{bkz05} -\subsection{Um Algoritmo Baseado em Mem\'oria Principal} - -\subsection{Um Algoritmo Baseado em Mem\'oria Externa} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -\subsubsection{Segmenta\c{c}\~ao} -\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex deleted file mode 100644 index 785ccc0..0000000 --- a/vldb/pt/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Aplica\c{c}\~oes} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex deleted file mode 100755 index 08f3cd4..0000000 --- a/vldb/pt/conclusions.tex +++ /dev/null @@ -1,3 +0,0 @@ -\section{Conclus\~oes} - - diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex deleted file mode 100755 index 5152c0e..0000000 --- a/vldb/pt/experimentalresults.tex +++ /dev/null @@ -1 +0,0 @@ -\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig deleted file mode 100644 index e08aae4..0000000 --- a/vldb/pt/figs/brz.fig +++ /dev/null @@ -1,153 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 2025 3015 3555 3690 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 - 2790 3690 2025 3285 -4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 --6 -6 1890 3735 3780 4365 -6 2430 3735 2700 4365 -6 2430 3915 2700 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1890 4365 3780 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 --6 -6 1260 5310 4230 5580 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 2925 4230 2925 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3510 4590 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3600 4410 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3690 4410 3780 4410 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 - 2790 5220 2025 4815 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3780 4410 3780 4590 -4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/pt/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/pt/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/pt/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/pt/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/pt/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/pt/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/pt/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex deleted file mode 100755 index 077d092..0000000 --- a/vldb/pt/introduction.tex +++ /dev/null @@ -1,55 +0,0 @@ -\section{Introdu\c{c}\~ao} -\label{sec:introduction} -Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da -Ci\^encia da Computa\c{c}\~ao. -Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, -para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. -Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em -$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. -Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento -m\'aximo $L$. Portanto $u = 2^L$. - -M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para -construir estruturas de dados para armazenar $S$ e suportar consultas do tipo -``$k \in S$?'' em tempo esperado $O(1)$. -No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido -a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas -chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. - - -Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao -para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes -s\~ao chamadas de \textit{perfeitas}. -Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma -\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, -isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ -e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. -A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. -Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, -ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). -A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma -fun\c{c}\~ao hash perfeita m\'{\i}nima. -FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. - -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure} - -A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: -\begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma FHPM $h$. -\item Quantidade de mem\'oria exigida para encontrar $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. -\item Escalabilidade dos algoritmos com o crescimento de $S$. -\end{enumerate} - -Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/makefile b/vldb/pt/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/pt/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib deleted file mode 100755 index 7a1a9fb..0000000 --- a/vldb/pt/references.bib +++ /dev/null @@ -1,700 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@article{gss01, - author = {N. Galli and B. Seybold and K. Simon}, - title = {Tetris-Hashing or optimal table compression}, - journal = {Discrete Applied Mathematics}, - volume = {110}, - number = {1}, - pages = {41--58}, - month = {june}, - publisher = {Elsevier Science}, - year = {2001} -} - - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex deleted file mode 100755 index b250e4b..0000000 --- a/vldb/pt/relatedwork.tex +++ /dev/null @@ -1,73 +0,0 @@ -\section{Trabalhos Relacionados} -As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade -cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e -apresentado um survey completo da \'area at\'e 1997. -Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que -est\~ao diretamente relacionados aos algoritmos aqui propostos e -fazemos um survey dos algoritmos propostos desde ent\~ao. - -Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir -FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em -tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: -$m=O(n)$. -No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma -palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo -$O(1)$. -Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo -experada de $O(n)$: -Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. - -Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir -FHPs e FHPMs deterministicamente. -As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. -A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e -$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. -A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade -de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} -que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo -$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as -fun\c{c}\~oes com complexidade linear. -Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode -limitar a utiliza\c{c}\~ao na pr\'atica. - -Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir -FHPMs. -A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, -onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de -valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. -Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou -que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada -em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador -(ou $O((2+\epsilon)n \log n)$ bits.) -Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, -reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) -o n\'umero de palavras de -computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ -devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos -adicionais. - -Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico -que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} -e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das -fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde -$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. - -Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do -conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes -hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um -n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. -Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade -\'otima para descrever FHPMs. - -Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam -fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe -de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. -Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas -com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da -complexidade \'otima. -Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao -os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na -ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/pt/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/pt/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/pt/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} From ad8a0a51f41be28efb560365d610efa11e7473ba Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 16:04:55 +0000 Subject: [PATCH 348/739] *** empty log message *** --- vldb/ingles/algorithms.tex | 596 ------- vldb/ingles/applications.tex | 2 - vldb/ingles/conclusions.tex | 5 - vldb/ingles/experimentalresults.tex | 178 --- vldb/ingles/figs/brz.fig | 135 -- vldb/ingles/figs/brz.ps | 324 ---- vldb/ingles/figs/grafordering.fig | 206 --- vldb/ingles/figs/grafordering2.fig | 219 --- vldb/ingles/figs/grafordering3.fig | 130 -- vldb/ingles/figs/grafsearching.fig | 168 -- vldb/ingles/figs/grafsearching2.fig | 180 --- vldb/ingles/figs/grafsearchingncv.fig | 124 -- .../ingles/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/ingles/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/ingles/introduction.tex | 86 - vldb/ingles/makefile | 17 - vldb/ingles/references.bib | 687 -------- vldb/ingles/relatedwork.tex | 67 - vldb/ingles/svglov2.clo | 77 - vldb/ingles/svjour2.cls | 1419 ----------------- vldb/ingles/vldb.tex | 150 -- vldb/pt/algorithms.tex | 19 - vldb/pt/applications.tex | 2 - vldb/pt/conclusions.tex | 3 - vldb/pt/experimentalresults.tex | 1 - vldb/pt/figs/brz.fig | 153 -- vldb/pt/figs/brz.ps | 324 ---- vldb/pt/figs/grafordering.fig | 206 --- vldb/pt/figs/grafordering2.fig | 219 --- vldb/pt/figs/grafordering3.fig | 130 -- vldb/pt/figs/grafsearching.fig | 168 -- vldb/pt/figs/grafsearching2.fig | 180 --- vldb/pt/figs/grafsearchingncv.fig | 124 -- vldb/pt/figs/minimalperfecthash-ph-mph.fig | 176 -- vldb/pt/figs/minimalperfecthash-ph-mph.ps | 488 ------ vldb/pt/introduction.tex | 55 - vldb/pt/makefile | 17 - vldb/pt/references.bib | 700 -------- vldb/pt/relatedwork.tex | 73 - vldb/pt/svglov2.clo | 77 - vldb/pt/svjour2.cls | 1419 ----------------- vldb/pt/vldb.tex | 150 -- 42 files changed, 10118 deletions(-) delete mode 100755 vldb/ingles/algorithms.tex delete mode 100644 vldb/ingles/applications.tex delete mode 100755 vldb/ingles/conclusions.tex delete mode 100755 vldb/ingles/experimentalresults.tex delete mode 100644 vldb/ingles/figs/brz.fig delete mode 100644 vldb/ingles/figs/brz.ps delete mode 100755 vldb/ingles/figs/grafordering.fig delete mode 100755 vldb/ingles/figs/grafordering2.fig delete mode 100755 vldb/ingles/figs/grafordering3.fig delete mode 100755 vldb/ingles/figs/grafsearching.fig delete mode 100755 vldb/ingles/figs/grafsearching2.fig delete mode 100755 vldb/ingles/figs/grafsearchingncv.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/ingles/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/ingles/introduction.tex delete mode 100755 vldb/ingles/makefile delete mode 100755 vldb/ingles/references.bib delete mode 100755 vldb/ingles/relatedwork.tex delete mode 100644 vldb/ingles/svglov2.clo delete mode 100644 vldb/ingles/svjour2.cls delete mode 100644 vldb/ingles/vldb.tex delete mode 100755 vldb/pt/algorithms.tex delete mode 100644 vldb/pt/applications.tex delete mode 100755 vldb/pt/conclusions.tex delete mode 100755 vldb/pt/experimentalresults.tex delete mode 100644 vldb/pt/figs/brz.fig delete mode 100644 vldb/pt/figs/brz.ps delete mode 100755 vldb/pt/figs/grafordering.fig delete mode 100755 vldb/pt/figs/grafordering2.fig delete mode 100755 vldb/pt/figs/grafordering3.fig delete mode 100755 vldb/pt/figs/grafsearching.fig delete mode 100755 vldb/pt/figs/grafsearching2.fig delete mode 100755 vldb/pt/figs/grafsearchingncv.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.fig delete mode 100755 vldb/pt/figs/minimalperfecthash-ph-mph.ps delete mode 100755 vldb/pt/introduction.tex delete mode 100755 vldb/pt/makefile delete mode 100755 vldb/pt/references.bib delete mode 100755 vldb/pt/relatedwork.tex delete mode 100644 vldb/pt/svglov2.clo delete mode 100644 vldb/pt/svjour2.cls delete mode 100644 vldb/pt/vldb.tex diff --git a/vldb/ingles/algorithms.tex b/vldb/ingles/algorithms.tex deleted file mode 100755 index 226fbe5..0000000 --- a/vldb/ingles/algorithms.tex +++ /dev/null @@ -1,596 +0,0 @@ -\section{The Algorithms} -\label{sec:thealgorithm} -We are going to present a novel algorithm that extends our previous work -presented in~\cite{bkz05}. -First we describe our previous work and in the following the new algorithm. -To the best of our knowledge this work is the first one that becomes possible -the construction of minimal perfect hash functions for sets in the order of -billion of keys efficiently. -And better, the generated functions are very compact and can be represented -using approximately nine bits per key. - -\subsection{A Main Memory Based Algorithm} - -\subsection{An External Memory Based Algorithm} -The idea of behind the new algorithm is the traditional divide-to-conquer approach. -The new algorithm consists of two steps that are presented in Fig.~\ref{fig:new-algo-main-steps}: -\begin{enumerate} -\item Using an universal hashing function~\cite{ss89} $h_1: S \to B$ the keys from $S$ are segmented to -a bucket set B, where $|B| = b$. We choice parameter $b$ in such way that any bucket will -contain more than 256 keys. -This choice is crucial to make the new algorithm works and we give details about it hereinafter. -\item The keys in each bucket are separetaly spread into a hash table. -\end{enumerate} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -The main novelties are in the way the keys are segmented using external memory and spread using -minimal perfect hash functions for each bucket. The next two sections describe each step in details. -\subsubsection{Segmentation} -\subsubsection{Spreading} -% Let us show how the minimal perfect hash function~$h$ -% will be constructed. -% We make use of three auxiliary random functions~$h_1$, $h_2$ and~$h_3:U\to V$, -% where~$V=[0,t-1]$ for some suitably chosen integer~$t=cn$, where -% $n=|S|$. -% We build a random graph~$G=G(h_1,h_2)$ on~$V$, -% whose edge set is~$\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. -% There is an edge in~$G$ for each key in the set of keys~$S$. -% -% In what follows, we shall be interested in the \textit{2-core} of -% the random graph~$G$, that is, the maximal subgraph of~$G$ with minimal -% degree at least~$2$ -% (see, e.g., \cite{b01,jlr00}). -% Because of its importance in our context, we call the 2-core the -% \textit{critical} subgraph of~$G$ and denote it by~$G_\crit$. -% The vertices and edges in~$G_\crit$ are said to be \textit{critical}. -% We let~$V_\crit=V(G_\crit)$ and~$E_\crit=E(G_\crit)$. -% Moreover, we let~$V_\ncrit=V-V_\crit$ be the set of {\em non-critical} -% vertices in~$G$. -% We also let~$V_\scrit\subseteq V_\crit$ be the set of all critical -% vertices that have at least one non-critical vertex as a neighbour. -% Let $E_\ncrit=E(G)-E_\crit$ be the set of {\em non-critical} edges in~$G$. -% Finally, we let~$G_\ncrit=(V_\ncrit\cup V_\scrit,E_\ncrit)$ be the -% {\em non-critical} subgraph of~$G$. -% The non-critical subgraph $G_\ncrit$ corresponds to the ``acyclic part'' -% of~$G$. -% We have $G=G_\crit\cup G_\ncrit$. -% -% We then construct a suitable labelling $g:V\to\ZZ$ of the vertices -% of~$G$: we choose~$g(v)$ for each~$v\in V(G)$ in such -% a way that~$h(x)=g(h_1(x))+g(h_2(x))$ ($x\in S$) is a -% minimal perfect hash function for~$S$. -% We will see later on that this labelling~$g$ can be found in linear time -% if the number of edges in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% Figure~\ref{prog:mainsteps} presents a pseudo code for the algorithm. -% The procedure GenerateMPHF ($S$, $g$) receives as input the set of -% keys~$S$ and produces the labelling~$g$. -% The method uses a mapping, ordering and searching approach. -% We now describe each step. -% -% \enlargethispage{\baselineskip} -% \enlargethispage{\baselineskip} -% \vspace{-11pt} -% \begin{figure}[htb] -% \begin{center} -% \begin{lstlisting}[ -% ] -% procedure @GenerateMPHF@ (@$S$@, @$g$@) -% Mapping (@$S$@, @$G$@); -% Ordering (@$G$@, @$G_\crit$@, @$G_\ncrit$@); -% Searching (@$G$@, @$G_\crit$@, @$G_\ncrit$@, @$g$@); -% \end{lstlisting} -% \end{center} -% \vspace{-12pt} -% \caption{Main steps of the algorithm for constructing a minimal -% perfect hash function} -% \vspace{-26pt} -% \label{prog:mainsteps} -% \end{figure} -% -% \subsection{Mapping Step} -% \label{sec:mapping} -% -% The procedure Mapping ($S$, $G$) receives as input the set of keys~$S$ and -% generates the random graph $G=G(h_1,h_2)$, by generating two auxiliary -% functions~$h_1$, $h_2:U\to[0,t-1]$. -% -% \def\tabela{\hbox{table}} -% % -% The functions~$h_1$ and~$h_2$ are constructed as follows. -% We impose some upper bound~$L$ on the lengths of the keys in~$S$. -% To define~$h_j$ ($j=1$,$2$), we generate an~$L\times\Sigma$ table -% of random integers~$\tabela_j$. -% For a key~$x\in S$ of length~$|x|\leq L$ and~$j\in\{1,2\}$, we let -% \begin{displaymath} \nonumber -% h_j(x) = \Big (\textstyle\sum_{i=1}^{|x|} \tabela_j[i, x[i]] \Big) \bmod t. -% \end{displaymath} -% The random graph~$G=G(h_1,h_2)$ has vertex set~$V=[0,t-1]$ and edge set -% $\big\{\{h_1(x),h_2(x)\}:x\in S\big\}$. We need~$G$ to be -% simple, i.e., -% $G$~should have neither loops nor multiple edges. -% A loop occurs when $h_1(x) = h_2(x)$ for some~$x\in S$. -% We solve this in an ad hoc manner: we simply let~$h_2(x)=(2h_1(x)+1)\bmod -% t$ in this case. -% If we still find a loop after this, -% we generate another pair $(h_1,h_2)$. -% When a multiple edge occurs we abort and generate a new pair~$(h_1,h_2)$. -% -% \vspace{-10pt} -% \subsubsection{Analysis of the Mapping Step. } -% -% We start by discussing some facts on random graphs. -% Let~$G=(V,E)$ with $|V|=t$ and $|E|=n$ be a random graph in the uniform -% model~$\cG(t,n)$, the model in which all the~${{t\choose2}\choose n}$ graphs -% on~$V$ with~$n$ edges are equiprobable. -% The study of~$\cG(t,n)$ goes back to the classical -% work of Erd\H os and R\'enyi~\cite{er59,er60,er61} (for a modern treatment, -% see~\cite{b01,jlr00}). -% Let $d=2n/t$ be the average degree of $G$. -% It is well known that, if~$d>1$, or, equivalently, -% if~$c<2$ (recall that we have $t=cn$), -% then, almost every~$G$ -% contains\footnote{As is usual in the theory of random graphs, we use -% the terms `almost every' and `almost surely' to mean `with probability -% tending to~$1$ as~$t\to\infty$'.} a ``giant'' component of -% order~$(1+o(1))bt$, where~$b=1-T/d$, and~$00$ -% as~$n\to\infty$, the expected number of iterations is~$e^{1/c^2}=2.13$ (recall -% $c=1.15$). -% As the expected number of iterations is $O(1)$, the mapping step takes -% $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Ordering Step} -% \label{sec:ordering} -% -% The procedure Ordering ($G$, $G_\crit$, $G_\ncrit$) receives as -% input the graph~$G$ and partitions~$G$ into the two subgraphs -% $G_\crit$ and $G_\ncrit$, so that~$G=G_\crit\cup G_\ncrit$. -% For that, the procedure iteratively remove all vertices of degree 1 until done. -% -% \enlargethispage{\baselineskip} -% Figure~\ref{fig:grafordering}(a) presents a sample graph with 9 vertices -% and 8 edges, where the degree of a vertex is shown besides each vertex. -% Applying the ordering step in this graph, the $5$-vertex graph showed in -% Figure~\ref{fig:grafordering}(b) is obtained. -% All vertices with degree 0 are non-critical vertices and the others are -% critical vertices. In order to determine the vertices in $V_\scrit$ we collect all vertices -% $v \in V(G_\crit)$ with at least one vertex $u$ that is in Adj$(v)$ and -% in $V(G_\ncrit)$, as the vertex 8 in Figure~\ref{fig:grafordering}(b). -% -% \vspace{-5pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafordering.ps}} -% \end{center} -% \vspace{-10pt} -% \caption{Ordering step for a graph with 9 vertices and 8 edges} -% \vspace{-30pt} -% \label{fig:grafordering} -% \end{figure*} -% -% -% \subsubsection{Analysis of the Ordering Step. } -% -% The time complexity of the ordering step is $O(|V(G)|)$ (see \cite{chm97}). -% As $|V(G)| = t = cn$, the ordering step takes $O(n)$ time. -% -% \vspace{-5pt} -% \subsection{Searching Step} -% \label{sec:searching} -% -% In the searching step, the key part is -% the {\em perfect assignment problem}: find $g:V(G)\to\ZZ$ such that -% the function $h:E(G)\to\ZZ$ defined by -% \begin{eqnarray} -% \label{eq:phf} -% h(e) = g(a)+g(b) \qquad(e=\{a,b\}) -% \end{eqnarray} -% is a bijection from~$E(G)$ to~$[0,n-1]$ (recall~$n=|S|=|E(G)|$). -% We are interested in a labelling $g:V\to\ZZ$ of -% the vertices of the graph~$G=G(h_1,h_2)$ with -% the property that if~$x$ and~$y$ are keys in~$S$, then -% $g(h_1(x))+g(h_2(x))\neq g(h_1(y))+g(h_2(y))$; that is, if we associate -% to each edge the sum of the labels on its endpoints, then these values -% should be all distinct. -% Moreover, we require that all the sums $g(h_1(x))+g(h_2(x))$ ($x\in S$) -% fall between~$0$ and~$|E(G)|-1=n-1$, so that we have a bijection -% between~$S$ and~$[0,n-1]$. -% -% The procedure Searching ($G$, $G_\crit$, $G_\ncrit$, $g$) receives -% as input~$G$, $G_\crit$, $G_\ncrit$ and finds a suitable -% $\log_2 |V(G)| + 1$ bit value for each vertex $v \in V(G)$, stored in the -% array~$g$. -% This step is first performed for the vertices in the -% critical subgraph~$G_\crit$ of $G$ (the 2-core of~$G$) and then it is -% performed for the vertices in $G_\ncrit$ (the non-critical subgraph -% of~$G$ that contains the ``acyclic part'' of $G$). -% The reason the assignment of the $g$~values is first -% performed on the vertices in~$G_\crit$ is to resolve reassignments -% as early as possible (such reassignments are consequences of the cycles -% in~$G_\crit$ and are depicted hereinafter). -% -% \vspace{-8pt} -% \subsubsection{Assignment of Values to Critical Vertices. } -% \label{sec:assignmentcv} -% -% The labels~$g(v)$ ($v\in V(G_\crit)$) -% are assigned in increasing order following a greedy -% strategy where the critical vertices~$v$ are considered one at a time, -% according to a breadth-first search on~$G_\crit$. -% If a candidate value~$x$ for~$g(v)$ is forbidden -% because setting~$g(v)=x$ would create two edges with the same sum, -% we try~$x+1$ for~$g(v)$. This fact is referred to as a {\em reassignment}. -% -% \enlargethispage{\baselineskip} -% Let $A_E$ be the set of addresses assigned to edges in $E(G_\crit)$. -% Initially $A_E = \emptyset$. -% Let $x$ be a candidate value for $g(v)$. -% Initially $x = 0$. -% Considering the subgraph $G_\crit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in $G_\crit$ -% is presented in Figure~\ref{fig:searching}. -% Initially, a vertex $v$ is chosen, the assignment $g(v)=x$ is made -% and $x$ is set to $x + 1$. -% For example, suppose that vertex $8$ in Figure~\ref{fig:searching}(a) is -% chosen, the assignment $g(8)=0$ is made and $x$ is set to $1$. -% -% \vspace{-12pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearching.ps}} -% \end{center} -% \vspace{-13pt} -% \caption{Example of the assignment of values to critical vertices} -% \vspace{-15pt} -% \label{fig:searching} -% \end{figure*} -% -% In Figure~\ref{fig:searching}(b), following the adjacency list of vertex $8$, -% the unassigned vertex $0$ is reached. -% At this point, we collect in -% the temporary variable $Y$ all adjacencies of vertex $0$ that have been assigned -% an $x$ value, and $Y = \{8\}$. -% Next, for all $u \in Y$, we check if $g(u)+x \not \in A_E$. -% Since $g(8) + 1 = 1 \not \in A_E$, then $g(0)$ is set to $1$, $x$ is incremented -% by 1 (now $x=2$) and $A_E = A_E \cup \{1\}=\{1\}$. -% Next, vertex $3$ is reached, $g(3)$ is set to $2$, -% $x$ is set to $3$ and $A_E = A_E \cup \{2\}=\{1,2\}$. -% Next, vertex $4$ is reached and $Y=\{3, 8\}$. -% Since $g(3) + 3 = 5 \not \in A_E$ and $g(8) + 3 = 3 \not \in A_E$, then -% $g(4)$ is set to $3$, $x$ is set to $4$ and $A_E = A_E \cup \{3,5\} = \{1,2,3,5\}$. -% Finally, vertex $7$ is reached and $Y=\{0, 8\}$. -% Since $g(0) + 4 = 5 \in A_E$, $x$ is incremented by 1 and set to 5, as depicted in -% Figure~\ref{fig:searching}(c). -% Since $g(8) + 5 = 5 \in A_E$, $x$ is again incremented by 1 and set to 6, -% as depicted in Figure~\ref{fig:searching}(d). -% These two reassignments are indicated by the arrows in Figure~\ref{fig:searching}. -% Since $g(0) + 6 = 7 \not \in A_E$ and $g(8) + 6 = 6 \not \in A_E$, then -% $g(7)$ is set to $6$ and $A_E = A_E \cup \{6,7\} = \{1,2,3,5,6,7\}$. -% This finishes the algorithm. -% -% \vspace{-15pt} -% \subsubsection{Assignment of Values to Non-Critical Vertices. } -% \label{sec:assignmentncv} -% -% As $G_\ncrit$ is acyclic, we can impose the order in which addresses are -% associated with edges in $G_\ncrit$, making this step simple to solve -% by a standard depth first search algorithm. -% Therefore, in the assignment of values to vertices in $G_\ncrit$ we -% benefit from the unused addresses in the gaps left by the assignment of values -% to vertices in $G_\crit$. -% For that, we start the depth-first search from the vertices in $V_\scrit$ -% because the $g$ values for these critical vertices have already been assigned -% and cannot be changed. -% -% Considering the subgraph $G_\ncrit$ in Figure~\ref{fig:grafordering}(b), -% a step by step example of the assignment of values to vertices in -% $G_\ncrit$ is presented in Figure~\ref{fig:searchingncv}. -% Figure~\ref{fig:searchingncv}(a) presents the initial state of the -% algorithm. -% The critical vertex~$8$ is the only one that has non-critical -% neighbours. -% In the example presented in Figure~\ref{fig:searching}, the addresses -% $\{0, 4\}$ were not used. -% So, taking the first unused address $0$ and the vertex $1$, which is -% reached from the vertex $8$, $g(1)$ is set to -% $0 - g(8) = 0$, as shown in Figure~\ref{fig:searchingncv}(b). -% The only vertex that is reached from vertex $1$ is vertex $2$, so -% taking the unused address $4$ we set $g(2)$ to $4 - g(1) = 4$, -% as shown in Figure~\ref{fig:searchingncv}(c). -% This process is repeated until the UnAssignedAddresses list becomes empty. -% -% \vspace{-8pt} -% \begin{figure*}[!htb] -% \begin{center} -% \scalebox{0.85}{\psfig{file=figs/grafsearchingncv.ps}} -% \end{center} -% \vspace{-12pt} -% \caption{Example of the assignment of values to non-critical vertices} -% \vspace{-30pt} -% \label{fig:searchingncv} -% \end{figure*} -% -% \subsubsection{Analysis of the Searching Step. } -% -% We shall demonstrate that -% (i) the maximum value assigned to an edge is at most $n-1$ (that is, we -% generate a minimal perfect hash function), and -% (ii) the perfect assignment problem (determination of~$g$) -% can be solved in expected time $O(n)$ if the number of edges -% in $G_\crit$ is at most $\frac{1}{2}|E(G)|$. -% -% \enlargethispage{\baselineskip} -% We focus on the analysis of the assignment of values to critical vertices -% because the assignment of values to non-critical vertices -% can be solved in linear time by a depth first search algorithm. -% -% We now define certain complexity measures. -% Let $I(v)$ be the number of times a candidate value $x$ for -% $g(v)$ is incremented. -% Let $N_t$ be the total number of times that candidate values -% $x$ are incremented. -% Thus, we have~$N_t=\sum I(v)$, where the sum is over all~$v\in -% V(G_\crit)$. -% -% For simplicity, we shall suppose that $G_\crit$, the 2-core of $G$, is -% connected.\footnote{The number of vertices in~$G_\crit$ outside the giant -% component is provably very small for~$c=1.15$; -% see~\cite{b01,jlr00,pw04}.} The fact that -% every edge is either a tree edge or a back edge (see, e.g., \cite{clrs01}) -% then implies the following. -% -% \begin{theorem} \label{th:nbedg} -% The number of back edges $N_\bedges$ of $G = G_\crit \cup G_\ncrit$ -% is given by $N_\bedges = |E(G_\crit)| - |V(G_\crit)| + 1$.\qed -% \end{theorem} -% -% \def\maxx{{\rm max}} -% Our next result concerns the maximal value $A_\maxx$ assigned to an edge $e -% \in E(G_\crit)$ after the assignment of $g$ values to critical vertices. -% -% \begin{theorem} \label{th:Agrt} -% We have $A_\maxx\le 2|V(G_\crit)| - 3 + 2N_{t}$. -% \end{theorem} -% \vspace{-15pt} -% -% \enlargethispage{\baselineskip} -% \begin{proof}(Sketch) -% The assignment of $g$ values to critical vertices starts from 0, -% and each edge~$e$ receives the label $h(e)$ -% as given by Eq.~(\ref{eq:phf}). -% The $g$ value for each vertex $v$ in $V(G_\crit)$ is assigned only once. -% A little thought shows that~$\max_v g(v)\leq |V(G_\crit)|-1+N_t$, where the -% maximum is taken over all vertices~$v$ in~$V(G_\crit)$. Moreover, two -% distinct vertices get distinct~$g$ values. Hence, -% $A_\maxx\le(|V(G_\crit)|-1+N_t)+(|V(G_\crit)|-2+N_t) -% \le2|V(G_\crit)|-3+2N_t$, as required.\qed -% \end{proof} -% -% \vspace{-15pt} -% \subsubsection{Maximal Value Assigned to an Edge. } -% -% In this section we present the following conjecture. -% \begin{conjecture} \label{conj:gretestaddr} -% For a random graph $G$ with $|E(G_\crit)|\leq n/2$ and -% $|V(G)| = 1.15n$, -% it is always possible to generate a minimal perfect hash function -% because the maximal value $A_\maxx$ assigned to an edge -% $e \in E(G_\crit)$ is at most $n - 1$. -% \end{conjecture} -% -% Let us assume for the moment that $N_{t} \le N_\bedges$. -% Then, from Theorems~\ref{th:nbedg} and~\ref{th:Agrt}, -% we have -% $A_\maxx\le2|V(G_\crit)|-3+2N_t\leq2|V(G_\crit)|-3+2N_\bedges -% \leq2|V(G_\crit)|-3+2(|E(G_\crit)|-|V(G_\crit)|+1)\le2|E(G_\crit)|-1$. -% As by hypothesis $|E(G_\crit)|\leq n/2$, we have -% $A_\maxx \le n - 1$, as required. -% -% \textit{In the mathematical analysis of our algorithm, what is left -% open is a single problem: -% prove that $N_{t} \le N_\bedges$.}\footnote{% -% Bollob\'as and Pikhurko~\cite{bp04} have investigated -% a very close vertex labelling problem for random graphs. -% However, their interest was on denser random graphs, and it seems that -% different methods will have to be used to attack the sparser case that -% we are interested in here.} -% -% We now show experimental evidence that $N_{t} \le N_\bedges$. -% Considering Eqs~(\ref{eq:nvertices2core}) and~(\ref{eq:nedges2core}), -% the expected values for $|V(G_\crit)|$ and $|E(G_\crit)|$ for $c=1.15$ are -% $0.401 n$ and $0.501n$, respectively. -% From Theorem~\ref{th:nbedg}, -% $N_\bedges = 0.501n - 0.401n + 1 = 0.1n + 1$. -% Table~\ref{tab:collisions1} presents the maximal value of $N_t$ obtained -% during 10,000 executions of the algorithm for different sizes of $S$. -% The maximal value of $N_t$ was always smaller than $N_\bedges = 0.1 n + 1$ and -% tends to $0.059n$ for $n\ge1{,}000{,}000$. -% -% \vspace{-5pt} -% \begin{table}[!htb] -% {\footnotesize%\small -% \begin{center} -% \begin{tabular}{|c|c|} -% \hline -% $n$ & Maximal value of $N_t$\\ -% \hline -% %$1{,}000$ & $0.091 n$ \\ -% $10{,}000$ & $0.067 n$ \\ -% $100{,}000$ & $0.061 n$ \\ -% $1{,}000{,}000$ & $0.059 n$ \\ -% $2{,}000{,}000$ & $0.059 n$ \\ -% %$\vdots$ & $\vdots$ \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{The maximal value of $N_t$ for different number of URLs} -% \vspace{-40pt} -% \label{tab:collisions1} -% \end{table} -% -% \subsubsection{Time Complexity. } -% We now show that the time complexity of determining~$g(v)$ -% for all critical vertices~$x\in V(G_\crit)$ is -% $O(|V(G_\crit)|)=O(n)$. -% For each unassigned vertex $v$, the adjacency list of $v$, which we -% call Adj($v$), must be traversed -% to collect the set $Y$ of adjacent vertices that have already been assigned a -% value. -% Then, for each vertex in $Y$, we check if the current candidate value $x$ is -% forbidden because setting $g(v)=x$ would create two edges with the same -% endpoint sum. -% Finally, the edge linking $v$ and $u$, for all $u \in Y$, is -% associated with -% the address that corresponds to the sum of its endpoints. -% Let $d_\crit=2|E(G_\crit)|/|V(G_\crit)|$ be the average degree of $G_\crit$, -% note that~$|Y|\leq|{\mathrm Adj}(v)|$, and suppose for simplicity -% that~$|{\mathrm Adj}(v)|=O(d_\crit)$. -% Then, putting all these together, we see that the time complexity of this -% procedure is -% \begin{eqnarray} -% &C(|V(G_\crit)|) = \sum_{v\in V(G_\crit)} \big[\:|{\mathrm Adj}(v)| + -% (I(v) \times|Y|) + |Y|\big]\nonumber\\ -% &\qquad\qquad\qquad\leq\sum_{v\in V(G_\crit)}(2+I(v))|{\mathrm Adj}(v)| -% =4|E(G_\crit)|+O(N_t d_\crit).\nonumber -% \end{eqnarray} -% As $d_\crit=2\times0.501n/0.401n\simeq2.499$ (a constant) we have -% $O(|E(G_\crit)|)=O(|V(G_\crit)|)$. -% Supposing that $N_{t}\le N_\bedges$, we have, from Theorem~\ref{th:nbedg}, -% that -% $ -% N_{t}\le|E(G_\crit)|-|V(G_\crit)|+1 -% =O(|E(G_\crit)|)$. -% We conclude that -% $C(|V(G_\crit)|)=O(|E(G_\crit)|) = O(|V(G_\crit)|)$. -% As $|V(G_\crit)| \le |V(G)|$ and $|V(G)| = cn$, -% the time required to determine~$g$ on the critical vertices is $O(n)$. -% \enlargethispage{\baselineskip} -% \vspace{-8pt} diff --git a/vldb/ingles/applications.tex b/vldb/ingles/applications.tex deleted file mode 100644 index cd6e72b..0000000 --- a/vldb/ingles/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Applications} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/ingles/conclusions.tex b/vldb/ingles/conclusions.tex deleted file mode 100755 index a71789c..0000000 --- a/vldb/ingles/conclusions.tex +++ /dev/null @@ -1,5 +0,0 @@ -\section{Conclusion} - -% We have presented a practical method for constructing minimal perfect -% hash functions for static sets that is efficient and may be tuned -% to yield a function with a very economical description. diff --git a/vldb/ingles/experimentalresults.tex b/vldb/ingles/experimentalresults.tex deleted file mode 100755 index 3193625..0000000 --- a/vldb/ingles/experimentalresults.tex +++ /dev/null @@ -1,178 +0,0 @@ -\section{Experimental Results} - -% We now present some experimental results. -% The same experiments were run with our algorithm and -% the algorithm due to Czech, Havas and Majewski~\cite{chm92}, referred to as -% the CHM algorithm. -% The two algorithms were implemented in the C language and -% are available at \texttt{http://cmph.sf.net}. -% Our data consists -% of a collection of 100 million -% universe resource locations (URLs) collected from the Web. -% The average length of a URL in the collection is 63 bytes. -% All experiments were carried out on -% a computer running the Linux operating system, version 2.6.7, -% with a 2.4 gigahertz processor and -% 4 gigabytes of main memory. -% -% Table~\ref{tab:characteristics} presents the main characteristics -% of the two algorithms. -% The number of edges in the graph $G=(V,E)$ is~$|S|=n$, -% the number of keys in the input set~$S$. -% The number of vertices of $G$ is equal to $1.15n$ and $2.09n$ -% for our algorithm and the CHM algorithm, respectively. -% This measure is related to the amount of space to store the array $g$. -% This improves the space required to store a function in our algorithm to -% $55\%$ of the space required by the CHM algorithm. -% The number of critical edges -% is $\frac{1}{2}|E(G)|$ and 0 for our algorithm and the CHM algorithm, -% respectively. -% Our algorithm generates random graphs that contain cycles with high -% probability and the -% CHM algorithm -% generates -% acyclic random graphs. -% Finally, the CHM algorithm generates order preserving functions -% while our algorithm does not preserve order. -% -% \vspace{-10pt} -% \begin{table}[htb] -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|c|c|c|c|c|c|} -% \hline -% & $c$ & $|E(G)|$ & $|V(G)|=|g|$ & $|E(G_\crit)|$ & $G$ & Order preserving \\ -% \hline -% Our algorithm & 1.15 & $n$ & $cn$ & $0.5|E(G)|$ & cyclic & no \\ -% \hline -% CHM algorithm & 2.09 & $n$ & $cn$ & 0 & acyclic & yes \\ -% \hline -% \end{tabular} -% \end{center} -% } -% \caption{Main characteristics of the algorithms} -% \vspace{-25pt} -% \label{tab:characteristics} -% \end{table} -% -% Table~\ref{tab:timeresults} presents time measurements. -% All times are in seconds. -% The table entries are averages over 50 trials. -% The column labelled $N_i$ gives -% the number of iterations to generate the random graph $G$ -% in the mapping step of the algorithms. -% The next columns give the running times -% for the mapping plus ordering steps together and the searching -% step for each algorithm. -% The last column gives the percentage gain of our algorithm -% over the CHM algorithm. -% -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|c|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{CHM algorithm}}& \raisebox{-0.2em}{Gain}\\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} & \raisebox{0.2em}{(\%)}\\ -% \hline -% %1,562,500 & 2.28 & 8.54 & 2.37 & 10.91 & 2.70 & 14.56 & 1.57 & 16.13 & 48 \\ %[1mm] -% %3,125,000 & 2.16 & 15.92 & 4.88 & 20.80 & 2.85 & 30.36 & 3.20 & 33.56 & 61 \\ %[1mm] -% 6,250,000 & 2.20 & 33.09 & 10.48 & 43.57 & 2.90 & 62.26 & 6.76 & 69.02 & 58 \\ %[1mm] -% 12,500,000 & 2.00 & 63.26 & 23.04 & 86.30 & 2.60 & 117.99 & 14.94 & 132.92 & 54 \\ %[1mm] -% 25,000,000 & 2.00 & 130.79 & 51.55 & 182.34 & 2.80 & 262.05 & 33.68 & 295.73 & 62 \\ %[1mm] -% %50,000,000 & 2.07 & 273.75 & 114.12 & 387.87 & 2.90 & 577.59 & 73.97 & 651.56 & 68 \\ %[1mm] -% 100,000,000 & 2.07 & 567.47 & 243.13 & 810.60 & 2.80 & 1,131.06 & 157.23 & 1,288.29 & 59 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our algorithm and the CHM algorithm} -% \vspace{-25pt} -% \label{tab:timeresults} -% }\end{table*} -% -% \enlargethispage{\baselineskip} -% The mapping step of the new algorithm is faster because -% the expected number of iterations in the mapping step to generate -% $G$ are 2.13 and 2.92 for our algorithm and the CHM algorithm, respectively. -% The graph $G$ generated by our algorithm -% has $1.15n$ vertices, against $2.09n$ for the CHM algorithm. -% These two facts make our algorithm faster in the mapping step. -% The ordering step of our algorithm is approximately equal to -% the time to check if $G$ is acyclic for the CHM algorithm. -% The searching step of the CHM algorithm is faster, but the total -% time of our algorithm is, on average, approximately 58\% faster -% than the CHM algorithm. -% -% The experimental results fully backs the theoretical results. -% It is important to notice the times for the searching step: -% for both algorithms they are not the dominant times, -% and the experimental results clearly show -% a linear behavior for the searching step. -% -% We now present a heuristic that reduces the space requirement -% to any given value between $1.15n$ words and $0.93n$ words. -% The heuristic reuses, when possible, the set -% of $x$ values that caused reassignments, just before trying $x+1$ -% (see Section~\ref{sec:searching}). -% The lower limit $c=0.93$ was obtained experimentally. -% We generate $10{,}000$ random graphs for -% each size $n$ ($n=10^5$, $5 \times 10^5$, $10^6$, $2\times 10^6$). -% With $c=0.93$ we were always able to generate~$h$, but with $c=0.92$ we never -% succeeded. -% Decreasing the value of $c$ leads to an increase in the number of -% iterations to generate $G$. -% For example, for $c=1$ and $c=0.93$, the analytical expected number -% of iterations are $2.72$ and $3.17$, respectively -% (for $n=12{,}500{,}000$, the number of iterations are 2.78 for $c=1$ and 3.04 -% for $c=0.93$). -% Table~\ref{tab:timeresults2} presents the total times to construct a -% function for $n=12{,}500{,}000$, with an increase from $86.31$ seconds -% for $c=1.15$ (see Table~\ref{tab:timeresults}) to -% $101.74$ seconds for $c=1$ and to $102.19$ seconds for $c=0.93$. -% -% \vspace{-5pt} -% \begin{table*} -% {\footnotesize -% \begin{center} -% \begin{tabular}{|c|cccc|cccc|} -% \hline -% \raisebox{-0.7em}{$n$} & \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=1.00$}} & -% \multicolumn{4}{c|}{\raisebox{-1mm}{Our algorithm $c=0.93$}} \\ -% \cline{2-5} \cline{6-9} -% & \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} & -% \raisebox{-1mm}{Search} &\raisebox{-1mm}{Total} & -% \raisebox{-1mm}{$N_i$} &\raisebox{-1mm}{Map+Ord} &\raisebox{-1mm}{Search} & -% \raisebox{-1mm}{Total} \\%[0.3mm] -% \hline%\\[-2mm] -% 12,500,000 & 2.78 & 76.68 & 25.06 & 101.74 & 3.04 & 76.39 & 25.80 & 102.19 \\ %[1mm] -% \hline -% \end{tabular} -% \end{center} -% \caption{Time measurements -% for our tuned algorithm with $c=1.00$ and $c=0.93$} -% \vspace{-25pt} -% \label{tab:timeresults2} -% } -% \end{table*} -% -% We compared our algorithm with the ones proposed by Pagh~\cite{p99} and -% Dietzfelbinger and Hagerup~\cite{dh01}, respectively. The authors sent to us their -% source code. In their implementation the set of keys is a set of random integers. -% We modified our implementation to generate our~$h$ from a set of random -% integers in order to make a fair comparison. For a set of $10^6$ random integers, -% the times to generate a minimal perfect hash function were $2.7 s$, $4 s$ and $4.5 s$ for -% our algorithm, Pagh's algorithm and Dietzfelbinger and Hagerup's algorithm, respectively. -% Thus, our algorithm was 48\% faster than Pagh's algorithm and 67\% faster than -% Dietzfelbinger and Hagerup's algorithm, on average. This gain was maintained for sets with different -% sizes. -% Our algorithm needs $kn$ ($k \in [0.93, 1.15]$) words to store -% the resulting function, while Pagh's algorithm needs $kn$ ($k > 2$) words and -% Dietzfelbinger and Hagerup's algorithm needs $kn$ ($k \in [1.13, 1.15]$) words. -% The time to generate the functions is inversely proportional to the value of $k$. -% \enlargethispage{\baselineskip} diff --git a/vldb/ingles/figs/brz.fig b/vldb/ingles/figs/brz.fig deleted file mode 100644 index 4f11d1e..0000000 --- a/vldb/ingles/figs/brz.fig +++ /dev/null @@ -1,135 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 3285 3600 3555 4230 -6 3285 3780 3555 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4140 3555 4140 3555 4230 3285 4230 3285 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 4050 3555 4050 3555 4140 3285 4140 3285 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3960 3555 3960 3555 4050 3285 4050 3285 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3870 3555 3870 3555 3960 3285 3960 3285 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3780 3555 3780 3555 3870 3285 3870 3285 3780 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3690 3555 3690 3555 3780 3285 3780 3285 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3600 3555 3600 3555 3690 3285 3690 3285 3600 --6 -6 1800 4500 3330 5175 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 1800 4770 2070 4770 2070 4500 3060 4500 3060 4770 3330 4770 - 2565 5175 1800 4770 -4 0 0 50 -1 0 10 0.0000 4 150 600 2265 4867 Spreading\001 --6 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -6 2250 3060 2880 3600 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2250 3330 2430 3330 2430 3060 2700 3060 2700 3330 2880 3330 - 2565 3600 2250 3330 --6 --6 -4 0 0 50 -1 0 10 0.0000 4 105 75 2521 3382 h\001 --6 -4 0 0 50 -1 0 6 0.0000 4 60 45 2589 3419 1\001 --6 -6 1395 2655 3825 2970 -2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3825 2970 3825 2655 1395 2655 1395 2970 3825 2970 -4 0 0 50 -1 0 10 0.0000 4 135 795 2212 2850 Set of Keys S\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1395 4230 3825 4230 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4140 1665 4140 1665 4230 1395 4230 1395 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 4050 1665 4050 1665 4140 1395 4140 1395 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4140 1935 4140 1935 4230 1665 4230 1665 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 4050 1935 4050 1935 4140 1665 4140 1665 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3960 1935 3960 1935 4050 1665 4050 1665 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3870 1935 3870 1935 3960 1665 3960 1665 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3780 1935 3780 1935 3870 1665 3870 1665 3780 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4140 2475 4140 2475 4230 2205 4230 2205 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 4050 2475 4050 2475 4140 2205 4140 2205 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3960 2475 3960 2475 4050 2205 4050 2205 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2205 3870 2475 3870 2475 3960 2205 3960 2205 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1665 3690 1935 3690 1935 3780 1665 3780 1665 3690 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4140 3015 4140 3015 4230 2745 4230 2745 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4140 3285 4140 3285 4230 3015 4230 3015 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2475 4140 2745 4140 2745 4230 2475 4230 2475 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 4050 3015 4050 3015 4140 2745 4140 2745 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1395 3960 1665 3960 1665 4050 1395 4050 1395 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4140 3825 4140 3825 4230 3555 4230 3555 4140 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3555 4050 3825 4050 3825 4140 3555 4140 3555 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 4050 3285 4050 3285 4140 3015 4140 3015 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3960 3015 3960 3015 4050 2745 4050 2745 3960 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3870 3015 3870 3015 3960 2745 3960 2745 3870 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2745 3780 3015 3780 3015 3870 2745 3870 2745 3780 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3510 3555 3510 3555 3600 3285 3600 3285 3510 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3285 3420 3555 3420 3555 3510 3285 3510 3285 3420 -4 0 0 50 -1 0 10 0.0000 4 105 75 1485 4410 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 3600 4410 b-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 720 4050 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 105 90 900 4230 B\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 450 5400 Hash Table\001 diff --git a/vldb/ingles/figs/brz.ps b/vldb/ingles/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/ingles/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/figs/grafordering.fig b/vldb/ingles/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/ingles/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/ingles/figs/grafordering2.fig b/vldb/ingles/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/ingles/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/ingles/figs/grafordering3.fig b/vldb/ingles/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/ingles/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/ingles/figs/grafsearching.fig b/vldb/ingles/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/ingles/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/ingles/figs/grafsearching2.fig b/vldb/ingles/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/ingles/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/ingles/figs/grafsearchingncv.fig b/vldb/ingles/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/ingles/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig b/vldb/ingles/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps b/vldb/ingles/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/ingles/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/ingles/introduction.tex b/vldb/ingles/introduction.tex deleted file mode 100755 index 2c08256..0000000 --- a/vldb/ingles/introduction.tex +++ /dev/null @@ -1,86 +0,0 @@ -\section{Introduction} -\label{sec:introduction} - -Suppose~$U$ is a universe of \textit{keys}. -Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ -to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Let~$S\subseteq U$ be a set of~$n$ keys from~$U$. -Given a key~$x\in S$, the hash function~$h$ computes an integer in -$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. -Hashing methods for {\em non-static sets} of keys can be used to construct -data structures storing $S$ and supporting membership queries -``$x \in S$?'' in expected time $O(1)$. -However, they involve a certain amount of wasted space owing to unused -locations in the table and waisted time to resolve collisions when -two keys are hashed to the same table location. - -For {\em static sets} of keys it is possible to compute a function -to find any key in a table in one probe; such hash functions are called -\textit{perfect}. -Given a set of keys~$S$, we shall say that a hash function~$h:U\to M$ is a -\textit{perfect hash function} for~$S$ if~$h$ is an injection on~$S$, -that is, there are no \textit{collisions} among the keys in~$S$: if~$x$ -and~$y$ are in~$S$ and~$x\neq y$, then~$h(x)\neq h(y)$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash -function. -Since no collisions occur, each key can be retrieved from the table -with a single probe. -If~$m=n$, that is, the table has the same size as~$S$, -then~$h$ is a \textit{minimal perfect hash function} for~$S$. -Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates -a~minimal perfect hash function. -Minimal perfect hash functions totally avoid the problem of wasted -space and time. - -% For two-column wide figures use -\begin{figure*} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure*} - -Minimal perfect hash functions are widely used for memory efficient -storage -and fast retrieval of items from static sets, such as words in natural -languages, reserved words in programming languages or interactive systems, -universal resource locations (URLs) in Web search engines, or item sets in -data mining techniques. - -The aim of this paper is to describe a new way of constructing minimal perfect -hash functions. Our algorithm shares several features with the one due to -Czech, Havas and Majewski~\cite{chm92}. In particular, our algorithm is also -based on the generation of random graphs~$G=(V,E)$, where~$E$ is in one-to-one -correspondence with the key set~$S$ for which we wish to generate the hash -function. -The two main differences between our algorithm and theirs -are as follows: -(\textit{i})~we generate random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, where~$c=1.15$, and hence~$G$ -contains cycles with high probability, -while they generate \textit{acyclic} random graphs -$G = (V, E)$ with $|V|=cn$ and $|E|=|S|=n$, -with a greater number of vertices: $|V|\ge2.09n$; -(\textit{ii})~they generate order preserving minimal perfect hash functions -while our algorithm does not preserve order (a perfect hash function $h$ is -\textit{order preserving} if the keys in~$S$ are arranged in some given order -and~$h$ preserves this order in the hash table). Thus, our algorithm improves -the space requirement at the expense of generating functions that are not -order preserving. - -Our algorithm is efficient and may be tuned to yield a function~$h$ -with a very economical description. -As the algorithm in~\cite{chm92}, our algorithm produces~$h$ -in~$O(n)$ expected time for a set of~$n$ keys. -The description of~$h$ requires~$1.15n$ computer words, -and evaluating~$h(x)$ -requires two accesses to an array of~$1.15n$ integers. -We further derive a heuristic that improves the space requirement -from~$1.15n$ words down to~$0.93n$ words. -Our scheme is very practical: to generate a minimal perfect hash function for -a collection of 100~million universe resource locations (URLs), each 63 bytes -long on average, our algorithm running on a commodity PC takes 811 seconds on -average. diff --git a/vldb/ingles/makefile b/vldb/ingles/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/ingles/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/ingles/references.bib b/vldb/ingles/references.bib deleted file mode 100755 index 02f50aa..0000000 --- a/vldb/ingles/references.bib +++ /dev/null @@ -1,687 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/ingles/relatedwork.tex b/vldb/ingles/relatedwork.tex deleted file mode 100755 index e32c52e..0000000 --- a/vldb/ingles/relatedwork.tex +++ /dev/null @@ -1,67 +0,0 @@ -\section{Related Work} -Czech, Havas and Majewski~\cite{chm97} provide a -comprehensive survey of the most important theoretical results -on perfect hashing. -In the following, we review some of those results. - -Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to -construct space efficient perfect hash functions that can be evaluated in -constant time with table sizes that are linear in the number of keys: -$m=O(n)$. In their model of computation, an element of the universe~$U$ fits -into one machine word, and arithmetic operations and memory accesses have unit -cost. Randomized algorithms in the FKS model can construct a perfect hash -function in expected time~$O(n)$: -this is the case of our algorithm and the works in~\cite{chm92,p99}. - -Many methods for generating minimal perfect hash functions use a -{\em mapping}, {\em ordering} and {\em searching} -(MOS) approach, -a description coined by Fox, Chen and Heath~\cite{fch92}. -In the MOS approach, the construction of a minimal perfect hash function -is accomplished in three steps. -First, the mapping step transforms the key set from the original universe -to a new universe. -Second, the ordering step places the keys in a sequential order that -determines the order in which hash values are assigned to keys. -Third, the searching step attempts to assign hash values to the keys. -Our algorithm and the algorithm presented in~\cite{chm92} use the -MOS approach. - -Pagh~\cite{p99} proposed a family of randomized algorithms for -constructing minimal perfect hash functions. -The form of the resulting function is $h(x) = (f(x) + d_{g(x)}) \bmod n$, -where $f$ and $g$ are universal hash functions and $d$ is a set of -displacement values to resolve collisions that are caused by the function $f$. -Pagh identified a set of conditions concerning $f$ and $g$ and showed -that if these conditions are satisfied, then a minimal perfect hash -function can be computed in expected time $O(n)$ and stored in -$(2+\epsilon)n$ computer words. -Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, -reducing from $(2+\epsilon)n$ to $(1+\epsilon)n$ the number of computer -words required to store the function, but in their approach~$f$ and~$g$ must -be chosen from a class -of hash functions that meet additional requirements. -Differently from the works in~\cite{p99,dh01}, our algorithm uses two -universal hash functions $h_1$ and $h_2$ randomly selected from a class -of universal hash functions that do not need to meet any additional -requirements. - -The work in~\cite{chm92} presents an efficient and practical algorithm -for generating order preserving minimal perfect hash functions. -Their method involves the generation of acyclic random graphs -$G = (V, E)$ with~$|V|=cn$ and $|E|=n$, with $c \ge 2.09$. -They showed that an order preserving minimal perfect hash function -can be found in optimal time if~$G$ is acyclic. -To generate an acyclic graph, two vertices $h_1(x)$ and $h_2(x)$ are -computed for each key $x \in S$. -Thus, each set~$S$ has a corresponding graph~$G=(V,E)$, where $V=\{0,1, -\ldots,t\}$ and $E=\big\{\{h_1(x),h_2(x)\}:x \in S\big\}$. -In order to guarantee the acyclicity of~$G$, the algorithm repeatedly selects -$h_1$ and $h_2$ from a family of universal hash functions -until the corresponding graph is acyclic. -Havas et al.~\cite{hmwc93} proved that if $|V(G)|=cn$ and $c>2$, -then the probability that~$G$ is acyclic is $p=e^{1/c}\sqrt{(c-2)/c}$. -For $c=2.09$, this probability is -$p \simeq 0.342$, and -the expected number of iterations to obtain an acyclic graph -is~$1/p \simeq 2.92$. \ No newline at end of file diff --git a/vldb/ingles/svglov2.clo b/vldb/ingles/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/ingles/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/ingles/svjour2.cls b/vldb/ingles/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/ingles/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/ingles/vldb.tex b/vldb/ingles/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/ingles/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} diff --git a/vldb/pt/algorithms.tex b/vldb/pt/algorithms.tex deleted file mode 100755 index 0ae2e7b..0000000 --- a/vldb/pt/algorithms.tex +++ /dev/null @@ -1,19 +0,0 @@ -\section{Os Algoritmos} -\label{sec:thealgorithm} -Nesta se\c{c}\~ao apresentamos \cite{bkz05} -\subsection{Um Algoritmo Baseado em Mem\'oria Principal} - -\subsection{Um Algoritmo Baseado em Mem\'oria Externa} -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics{figs/brz.ps} -% figure caption is below the figure -\caption{Main steps of the new algorithm.} -\label{fig:new-algo-main-steps} -\end{figure} - -\subsubsection{Segmenta\c{c}\~ao} -\subsubsection{Espalhamento} diff --git a/vldb/pt/applications.tex b/vldb/pt/applications.tex deleted file mode 100644 index 785ccc0..0000000 --- a/vldb/pt/applications.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Aplica\c{c}\~oes} -\label{sec:applications} \ No newline at end of file diff --git a/vldb/pt/conclusions.tex b/vldb/pt/conclusions.tex deleted file mode 100755 index 08f3cd4..0000000 --- a/vldb/pt/conclusions.tex +++ /dev/null @@ -1,3 +0,0 @@ -\section{Conclus\~oes} - - diff --git a/vldb/pt/experimentalresults.tex b/vldb/pt/experimentalresults.tex deleted file mode 100755 index 5152c0e..0000000 --- a/vldb/pt/experimentalresults.tex +++ /dev/null @@ -1 +0,0 @@ -\section{Resultados Experimentais} diff --git a/vldb/pt/figs/brz.fig b/vldb/pt/figs/brz.fig deleted file mode 100644 index e08aae4..0000000 --- a/vldb/pt/figs/brz.fig +++ /dev/null @@ -1,153 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 2025 3015 3555 3690 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 3285 2295 3285 2295 3015 3285 3015 3285 3285 3555 3285 - 2790 3690 2025 3285 -4 0 0 50 -1 0 10 0.0000 4 135 765 2385 3330 Partitioning\001 --6 -6 1890 3735 3780 4365 -6 2430 3735 2700 4365 -6 2430 3915 2700 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4275 2700 4275 2700 4365 2430 4365 2430 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4185 2700 4185 2700 4275 2430 4275 2430 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4095 2700 4095 2700 4185 2430 4185 2430 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 4005 2700 4005 2700 4095 2430 4095 2430 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3915 2700 3915 2700 4005 2430 4005 2430 3915 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3825 2700 3825 2700 3915 2430 3915 2430 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2430 3735 2700 3735 2700 3825 2430 3825 2430 3735 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4275 2160 4275 2160 4365 1890 4365 1890 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4185 2160 4185 2160 4275 1890 4275 1890 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4275 2430 4275 2430 4365 2160 4365 2160 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4185 2430 4185 2430 4275 2160 4275 2160 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4095 2430 4095 2430 4185 2160 4185 2160 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 4005 2430 4005 2430 4095 2160 4095 2160 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3915 2430 3915 2430 4005 2160 4005 2160 3915 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4275 2970 4275 2970 4365 2700 4365 2700 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4185 2970 4185 2970 4275 2700 4275 2700 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4095 2970 4095 2970 4185 2700 4185 2700 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2700 4005 2970 4005 2970 4095 2700 4095 2700 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3825 2430 3825 2430 3915 2160 3915 2160 3825 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4275 3510 4275 3510 4365 3240 4365 3240 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4275 3780 4275 3780 4365 3510 4365 3510 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4275 3240 4275 3240 4365 2970 4365 2970 4275 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4185 3510 4185 3510 4275 3240 4275 3240 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1890 4095 2160 4095 2160 4185 1890 4185 1890 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3510 4185 3780 4185 3780 4275 3510 4275 3510 4185 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4095 3510 4095 3510 4185 3240 4185 3240 4095 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 4005 3510 4005 3510 4095 3240 4095 3240 4005 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3240 3915 3510 3915 3510 4005 3240 4005 3240 3915 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1890 4365 3780 4365 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2970 4185 3240 4185 3240 4275 2970 4275 2970 4185 --6 -6 1260 5310 4230 5580 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 5400 4230 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 5310 1800 5310 1800 5400 1530 5400 1530 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 5310 2340 5310 2340 5400 2070 5400 2070 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 5310 2610 5310 2610 5400 2340 5400 2340 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 5310 2880 5310 2880 5400 2610 5400 2610 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 5310 3150 5310 3150 5400 2880 5400 2880 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 5310 3690 5310 3690 5400 3420 5400 3420 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 5310 3960 5310 3960 5400 3690 5400 3690 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 5310 4230 5310 4230 5400 3960 5400 3960 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 2070 5310 2070 5400 1800 5400 1800 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 5310 3420 5310 3420 5400 3150 5400 3150 5310 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 5310 1530 5310 1530 5400 1260 5400 1260 5310 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 5580 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 5580 0\001 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1260 2925 4230 2925 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1530 2835 1800 2835 1800 2925 1530 2925 1530 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2070 2835 2340 2835 2340 2925 2070 2925 2070 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2340 2835 2610 2835 2610 2925 2340 2925 2340 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2610 2835 2880 2835 2880 2925 2610 2925 2610 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2880 2835 3150 2835 3150 2925 2880 2925 2880 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3420 2835 3690 2835 3690 2925 3420 2925 3420 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3690 2835 3960 2835 3960 2925 3690 2925 3690 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3960 2835 4230 2835 4230 2925 3960 2925 3960 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2835 2070 2835 2070 2925 1800 2925 1800 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3150 2835 3420 2835 3420 2925 3150 2925 3150 2835 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1260 2835 1530 2835 1530 2925 1260 2925 1260 2835 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3510 4590 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 4410 3600 4410 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3690 4410 3780 4410 -2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8 - 2025 4815 2295 4815 2295 4545 3285 4545 3285 4815 3555 4815 - 2790 5220 2025 4815 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3780 4410 3780 4590 -4 0 0 50 -1 0 10 0.0000 4 135 585 2475 4860 Searching\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1980 4545 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 690 4410 5400 Hash Table\001 -4 0 0 50 -1 0 10 0.0000 4 105 480 4410 4230 Buckets\001 -4 0 0 50 -1 0 10 0.0000 4 135 555 4410 2925 Key set S\001 -4 0 0 50 -1 0 10 0.0000 4 105 75 1350 2745 0\001 -4 0 0 50 -1 0 10 0.0000 4 105 210 4005 2745 n-1\001 -4 0 0 50 -1 0 10 0.0000 4 105 420 3555 4545 n/b - 1\001 diff --git a/vldb/pt/figs/brz.ps b/vldb/pt/figs/brz.ps deleted file mode 100644 index ca75ee1..0000000 --- a/vldb/pt/figs/brz.ps +++ /dev/null @@ -1,324 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: brz.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 26 12:23:23 2005 -%%For: fbotelho@cronos (Fabiano Cupertino,,,) -%%BoundingBox: 0 0 240 186 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 186 moveto 0 0 lineto 240 0 lineto 240 186 lineto closepath clip newpath --27.4 352.4 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -0 slj -0 slc -7.500 slw -n 3285 4140 m 3555 4140 l 3555 4230 l 3285 4230 l - cp gs col0 s gr -% Polyline -n 3285 4050 m 3555 4050 l 3555 4140 l 3285 4140 l - cp gs col0 s gr -% Polyline -n 3285 3960 m 3555 3960 l 3555 4050 l 3285 4050 l - cp gs col0 s gr -% Polyline -n 3285 3870 m 3555 3870 l 3555 3960 l 3285 3960 l - cp gs col0 s gr -% Polyline -n 3285 3780 m 3555 3780 l 3555 3870 l 3285 3870 l - cp gs col0 s gr -% Polyline -n 3285 3690 m 3555 3690 l 3555 3780 l 3285 3780 l - cp gs col0 s gr -% Polyline -n 3285 3600 m 3555 3600 l 3555 3690 l 3285 3690 l - cp gs col0 s gr -% Polyline -n 1800 4770 m 2070 4770 l 2070 4500 l 3060 4500 l 3060 4770 l 3330 4770 l - 2565 5175 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2265 4867 m -gs 1 -1 sc (Spreading) col0 sh gr -% Polyline -n 2250 3330 m 2430 3330 l 2430 3060 l 2700 3060 l 2700 3330 l 2880 3330 l - 2565 3600 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2521 3382 m -gs 1 -1 sc (h) col0 sh gr -/Times-Roman-iso ff 95.25 scf sf -2589 3419 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1500 2655 m 1395 2655 1395 2865 105 arcto 4 {pop} repeat - 1395 2970 3720 2970 105 arcto 4 {pop} repeat - 3825 2970 3825 2760 105 arcto 4 {pop} repeat - 3825 2655 1500 2655 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -2212 2850 m -gs 1 -1 sc (Set of Keys S) col0 sh gr -% Polyline -n 1395 4230 m - 3825 4230 l gs col0 s gr -% Polyline -n 1395 4140 m 1665 4140 l 1665 4230 l 1395 4230 l - cp gs col0 s gr -% Polyline -n 1395 4050 m 1665 4050 l 1665 4140 l 1395 4140 l - cp gs col0 s gr -% Polyline -n 1665 4140 m 1935 4140 l 1935 4230 l 1665 4230 l - cp gs col0 s gr -% Polyline -n 1665 4050 m 1935 4050 l 1935 4140 l 1665 4140 l - cp gs col0 s gr -% Polyline -n 1665 3960 m 1935 3960 l 1935 4050 l 1665 4050 l - cp gs col0 s gr -% Polyline -n 1665 3870 m 1935 3870 l 1935 3960 l 1665 3960 l - cp gs col0 s gr -% Polyline -n 1665 3780 m 1935 3780 l 1935 3870 l 1665 3870 l - cp gs col0 s gr -% Polyline -n 2205 4140 m 2475 4140 l 2475 4230 l 2205 4230 l - cp gs col0 s gr -% Polyline -n 2205 4050 m 2475 4050 l 2475 4140 l 2205 4140 l - cp gs col0 s gr -% Polyline -n 2205 3960 m 2475 3960 l 2475 4050 l 2205 4050 l - cp gs col0 s gr -% Polyline -n 2205 3870 m 2475 3870 l 2475 3960 l 2205 3960 l - cp gs col0 s gr -% Polyline -n 1665 3690 m 1935 3690 l 1935 3780 l 1665 3780 l - cp gs col0 s gr -% Polyline -n 2745 4140 m 3015 4140 l 3015 4230 l 2745 4230 l - cp gs col0 s gr -% Polyline -n 3015 4140 m 3285 4140 l 3285 4230 l 3015 4230 l - cp gs col0 s gr -% Polyline -n 2475 4140 m 2745 4140 l 2745 4230 l 2475 4230 l - cp gs col0 s gr -% Polyline -n 2745 4050 m 3015 4050 l 3015 4140 l 2745 4140 l - cp gs col0 s gr -% Polyline -n 1395 3960 m 1665 3960 l 1665 4050 l 1395 4050 l - cp gs col0 s gr -% Polyline -n 3555 4140 m 3825 4140 l 3825 4230 l 3555 4230 l - cp gs col0 s gr -% Polyline -n 3555 4050 m 3825 4050 l 3825 4140 l 3555 4140 l - cp gs col0 s gr -% Polyline -n 3015 4050 m 3285 4050 l 3285 4140 l 3015 4140 l - cp gs col0 s gr -% Polyline -n 2745 3960 m 3015 3960 l 3015 4050 l 2745 4050 l - cp gs col0 s gr -% Polyline -n 2745 3870 m 3015 3870 l 3015 3960 l 2745 3960 l - cp gs col0 s gr -% Polyline -n 2745 3780 m 3015 3780 l 3015 3870 l 2745 3870 l - cp gs col0 s gr -% Polyline -n 1260 5400 m - 4230 5400 l gs col0 s gr -% Polyline -n 1530 5310 m 1800 5310 l 1800 5400 l 1530 5400 l - cp gs col0 s gr -% Polyline -n 2070 5310 m 2340 5310 l 2340 5400 l 2070 5400 l - cp gs col0 s gr -% Polyline -n 2340 5310 m 2610 5310 l 2610 5400 l 2340 5400 l - cp gs col0 s gr -% Polyline -n 2610 5310 m 2880 5310 l 2880 5400 l 2610 5400 l - cp gs col0 s gr -% Polyline -n 2880 5310 m 3150 5310 l 3150 5400 l 2880 5400 l - cp gs col0 s gr -% Polyline -n 3420 5310 m 3690 5310 l 3690 5400 l 3420 5400 l - cp gs col0 s gr -% Polyline -n 3690 5310 m 3960 5310 l 3960 5400 l 3690 5400 l - cp gs col0 s gr -% Polyline -n 3960 5310 m 4230 5310 l 4230 5400 l 3960 5400 l - cp gs col0 s gr -% Polyline -n 1800 5310 m 2070 5310 l 2070 5400 l 1800 5400 l - cp gs col0 s gr -% Polyline -n 3150 5310 m 3420 5310 l 3420 5400 l 3150 5400 l - cp gs col0 s gr -% Polyline -n 1260 5310 m 1530 5310 l 1530 5400 l 1260 5400 l - cp gs col0 s gr -% Polyline -n 3285 3510 m 3555 3510 l 3555 3600 l 3285 3600 l - cp gs col0 s gr -% Polyline -n 3285 3420 m 3555 3420 l 3555 3510 l 3285 3510 l - cp gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf -1485 4410 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -3600 4410 m -gs 1 -1 sc (b-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -720 4050 m -gs 1 -1 sc (Buckets) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -900 4230 m -gs 1 -1 sc (B) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -4005 5580 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -1350 5580 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -450 5400 m -gs 1 -1 sc (Hash Table) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/figs/grafordering.fig b/vldb/pt/figs/grafordering.fig deleted file mode 100755 index 6217edc..0000000 --- a/vldb/pt/figs/grafordering.fig +++ /dev/null @@ -1,206 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 2340 2970 4095 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3892.500 2047.500 2835 3825 3105 3960 3375 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2677.500 3802.500 3330 3555 3375 3825 3330 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3523.500 4635.900 3375 4095 3060 4320 2970 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3802.500 4567.500 3465 4050 3690 3960 3915 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3686.786 4181.786 3915 4005 3960 4275 3780 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3127.500 3802.500 3285 3555 2970 3555 2835 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3127.500 4432.500 3375 4140 3510 4410 3420 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3220.500 4507.500 2970 4590 3195 4770 3420 4680 -6 3825 3870 4050 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3937 3982 94 92 3937 3982 3980 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 3900 4035 2\001 --6 -6 3330 4545 3555 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3442 4657 94 92 3442 4657 3485 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 3405 4710 4\001 --6 -6 2880 4455 3105 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2992 4567 94 92 2992 4567 3035 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 2955 4620 5\001 --6 -6 2745 3690 2970 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 2857 3802 94 92 2857 3802 2900 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 2820 3855 7\001 --6 -6 3195 3420 3420 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3307 3532 94 92 3307 3532 3350 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 3270 3585 0\001 --6 -6 3285 3960 3510 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 3397 4072 94 92 3397 4072 3440 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 3360 4125 8\001 --6 -6 2655 4050 2880 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 2767 4162 94 92 2767 4162 2810 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 2730 4215 6\001 --6 -6 3600 3510 3825 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3712 3622 94 92 3712 3622 3755 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 3675 3675 1\001 --6 -6 3690 4320 3915 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 3802 4432 94 92 3802 4432 3845 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 3765 4485 3\001 --6 -6 3285 2970 3465 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 3285 2970 3465 2970 3465 3150 3285 3150 3285 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 3337 3112 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 3645 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2430 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2655 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3330 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 2520 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3735 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3870 3825 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3510 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 3240 3375 d:2\001 -4 0 0 45 -1 0 9 0.0000 4 135 105 3060 3105 Q\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 3105 b)\001 --6 -6 450 2970 2115 4905 -6 450 3240 2115 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1912.500 2047.500 855 3825 1125 3960 1395 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 697.500 3802.500 1350 3555 1395 3825 1350 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1543.500 4635.900 1395 4095 1080 4320 990 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1822.500 4567.500 1485 4050 1710 3960 1935 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1706.786 4181.786 1935 4005 1980 4275 1800 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1147.500 3802.500 1305 3555 990 3555 855 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1147.500 4432.500 1395 4140 1530 4410 1440 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 1240.500 4507.500 990 4590 1215 4770 1440 4680 -6 1845 3870 2070 4095 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1957 3982 94 92 1957 3982 2000 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 1920 4035 2\001 --6 -6 1710 4320 1935 4545 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1822 4432 94 92 1822 4432 1865 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 1785 4485 3\001 --6 -6 1350 4545 1575 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1462 4657 94 92 1462 4657 1505 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 1425 4710 4\001 --6 -6 900 4455 1125 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1012 4567 94 92 1012 4567 1055 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 975 4620 5\001 --6 -6 765 3690 990 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 877 3802 94 92 877 3802 920 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 840 3855 7\001 --6 -6 1215 3420 1440 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1327 3532 94 92 1327 3532 1370 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 1290 3585 0\001 --6 -6 1305 3960 1530 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 1417 4072 94 92 1417 4072 1460 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 1380 4125 8\001 --6 -6 675 4050 900 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 787 4162 94 92 787 4162 830 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 750 4215 6\001 --6 -6 1620 3510 1845 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 1732 3622 94 92 1732 3622 1775 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 1695 3675 1\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 1665 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 450 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 675 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1350 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 540 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1755 4680 d:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1890 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1530 4185 d:5\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 1260 3375 d:2\001 --6 -6 1080 2970 1485 3150 -6 1305 2970 1485 3150 -2 2 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 5 - 1305 2970 1485 2970 1485 3150 1305 3150 1305 2970 -4 0 0 45 -1 0 9 0.0000 4 105 75 1357 3112 3\001 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 1080 3105 Q\001 --6 --6 -6 4320 2970 6075 4905 -6 4410 3015 6075 4905 -6 5085 3015 5360 3156 -6 5225 3015 5360 3150 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5312 3080 44 52 5312 3080 5334 3125 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5330 3020 5293 3141 --6 -4 0 0 45 -1 0 9 0.0000 4 135 105 5085 3126 Q\001 --6 -6 4410 3240 6075 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5872.500 2047.500 4815 3825 5085 3960 5355 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4657.500 3802.500 5310 3555 5355 3825 5310 4050 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5503.500 4635.900 5355 4095 5040 4320 4950 4545 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5782.500 4567.500 5445 4050 5670 3960 5895 3960 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5666.786 4181.786 5895 4005 5940 4275 5760 4455 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5107.500 3802.500 5265 3555 4950 3555 4815 3825 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 4432.500 5355 4140 5490 4410 5400 4680 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5200.500 4507.500 4950 4590 5175 4770 5400 4680 -6 5310 4545 5535 4770 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5422 4657 94 92 5422 4657 5465 4742 -4 0 0 45 -1 0 9 0.0000 4 105 75 5385 4710 4\001 --6 -6 4860 4455 5085 4680 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4972 4567 94 92 4972 4567 5015 4652 -4 0 0 45 -1 0 9 0.0000 4 105 75 4935 4620 5\001 --6 -6 4725 3690 4950 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4837 3802 94 92 4837 3802 4880 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 4800 3855 7\001 --6 -6 5175 3420 5400 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5287 3532 94 92 5287 3532 5330 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 5250 3585 0\001 --6 -6 5265 3960 5490 4185 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5377 4072 94 92 5377 4072 5420 4157 -4 0 0 45 -1 0 9 0.0000 4 105 75 5340 4125 8\001 --6 -6 4635 4050 4860 4275 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 4747 4162 94 92 4747 4162 4790 4247 -4 0 0 45 -1 0 9 0.0000 4 105 75 4710 4215 6\001 --6 -6 5580 3510 5805 3735 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5692 3622 94 92 5692 3622 5735 3707 -4 0 0 45 -1 0 9 0.0000 4 105 75 5655 3675 1\001 --6 -6 5670 4320 5895 4545 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5782 4432 94 92 5782 4432 5825 4517 -4 0 0 45 -1 0 9 0.0000 4 105 75 5745 4485 3\001 --6 -6 5805 3870 6030 4095 -1 1 0 1 0 7 45 -1 20 0.000 1 0.0000 5917 3982 94 92 5917 3982 5960 4067 -4 0 0 45 -1 0 9 0.0000 4 105 75 5880 4035 2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 105 195 5625 3465 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4410 4230 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4635 4635 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5310 4905 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 4500 3825 d:2\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5715 4680 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5850 3825 d:0\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5490 4185 d:4\001 -4 0 0 50 -1 0 9 0.0000 4 105 195 5220 3375 d:2\001 --6 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 c)\001 --6 -4 0 0 50 -1 0 11 0.0000 4 180 165 360 3105 a)\001 diff --git a/vldb/pt/figs/grafordering2.fig b/vldb/pt/figs/grafordering2.fig deleted file mode 100755 index e3eb20f..0000000 --- a/vldb/pt/figs/grafordering2.fig +++ /dev/null @@ -1,219 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -6 270 5220 1980 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 1050 5977 8\001 --6 -6 1665 5310 1980 5490 -6 1800 5310 1980 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 5310 1980 5310 1980 5490 1800 5490 1800 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 1860 5437 2\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 1665 5445 Q\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -4 0 0 50 -1 0 8 0.0000 4 75 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 270 5355 a)\001 --6 -6 4410 5220 6120 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 4995 5400 5220 5355 5445 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 5962.500 5760 5715 5805 5940 5760 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5220.000 5940.000 5445 6480 5220 6525 4995 6480 -6 4590 5625 4770 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 5715 90 90 4680 5715 4770 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 5752 6\001 --6 -6 4905 5310 5085 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 5400 90 90 4995 5400 5085 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 5437 7\001 --6 -6 5355 5310 5535 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 5400 90 90 5445 5400 5535 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 5437 0\001 --6 -6 5355 6390 5535 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5445 6480 90 90 5445 6480 5535 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5415 6517 3\001 --6 -6 4905 6390 5085 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4995 6480 90 90 4995 6480 5085 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4965 6517 4\001 --6 -6 4590 6075 4770 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 6165 90 90 4680 6165 4770 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 6202 5\001 --6 -6 5130 5850 5310 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 5940 90 90 5220 5940 5310 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 5977 8\001 --6 -6 5670 6075 5850 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 6165 90 90 5760 6165 5850 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 6202 2\001 --6 -6 5670 5625 5850 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 5715 90 90 5760 5715 5850 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 5752 1\001 --6 -6 5965 5332 6100 5467 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 6052 5397 44 52 6052 5397 6074 5442 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 6070 5337 6033 5458 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 5445 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 5220 5940 4995 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5445 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 4995 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 5940 5760 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 5943 5761 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 4770 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4950 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5535 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5895 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 5580 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4725 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 4410 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4410 5355 c)\001 -4 0 0 50 -1 0 8 0.0000 4 105 90 5850 5445 Q\001 --6 -6 2340 5220 4050 6615 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 3120 5977 8\001 --6 -6 3735 5310 4050 5490 -6 3870 5310 4050 5490 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3870 5310 4050 5310 4050 5490 3870 5490 3870 5310 -4 0 0 50 -1 0 8 0.0000 4 75 60 3930 5437 1\001 --6 -4 0 0 50 -1 0 8 0.0000 4 105 90 3735 5445 Q\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 5752 1\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 75 60 3660 6202 2\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 75 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2880 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 5670 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2340 5355 b)\001 --6 diff --git a/vldb/pt/figs/grafordering3.fig b/vldb/pt/figs/grafordering3.fig deleted file mode 100755 index e4e46df..0000000 --- a/vldb/pt/figs/grafordering3.fig +++ /dev/null @@ -1,130 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d6d3d6 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 855 5400 1080 5355 1305 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 967.500 5962.500 1620 5715 1665 5940 1620 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1080.000 5940.000 1305 6480 1080 6525 855 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 2925 5400 3150 5355 3375 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3037.500 5962.500 3690 5715 3735 5940 3690 6210 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3150.000 5940.000 3375 6480 3150 6525 2925 6480 -6 450 5625 630 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 5715 90 90 540 5715 630 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 5752 6\001 --6 -6 765 5310 945 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 5400 90 90 855 5400 945 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 5437 7\001 --6 -6 1215 5310 1395 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 5400 90 90 1305 5400 1395 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 5437 0\001 --6 -6 1530 5625 1710 5805 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 5715 90 90 1620 5715 1710 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 5752 1\001 --6 -6 1530 6075 1710 6255 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1620 6165 90 90 1620 6165 1710 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 1590 6202 2\001 --6 -6 1215 6390 1395 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1305 6480 90 90 1305 6480 1395 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 1275 6517 3\001 --6 -6 765 6390 945 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 855 6480 90 90 855 6480 945 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 825 6517 4\001 --6 -6 450 6075 630 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 540 6165 90 90 540 6165 630 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 510 6202 5\001 --6 -6 990 5850 1170 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1080 5940 90 90 1080 5940 1170 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 1050 5977 8\001 --6 -6 2520 5625 2700 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 5715 90 90 2610 5715 2700 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 5752 6\001 --6 -6 2835 5310 3015 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 5400 90 90 2925 5400 3015 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 5437 7\001 --6 -6 3285 5310 3465 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 5400 90 90 3375 5400 3465 5400 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 5437 0\001 --6 -6 3285 6390 3465 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3375 6480 90 90 3375 6480 3465 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 3345 6517 3\001 --6 -6 2835 6390 3015 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 2925 6480 90 90 2925 6480 3015 6480 -4 0 0 45 -1 0 8 0.0000 4 90 60 2895 6517 4\001 --6 -6 2520 6075 2700 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2610 6165 90 90 2610 6165 2700 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 2580 6202 5\001 --6 -6 3060 5850 3240 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3150 5940 90 90 3150 5940 3240 5940 -4 0 0 45 -1 0 8 0.0000 4 90 60 3120 5977 8\001 --6 -6 3600 6075 3780 6255 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 6165 90 90 3690 6165 3780 6165 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 6202 2\001 --6 -6 3600 5625 3780 5805 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3690 5715 90 90 3690 5715 3780 5715 -4 0 0 45 -1 0 8 0.0000 4 90 60 3660 5752 1\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 1305 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 1080 5940 855 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1305 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 855 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1080 5940 1620 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 3375 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 3150 5940 2925 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3375 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 2925 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5940 3690 5715 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3151 5943 3691 5718 -4 0 0 50 -1 0 8 0.0000 4 90 150 630 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 810 5985 d:5\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1395 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 5670 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1755 6255 d:1\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 1440 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 585 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 270 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 135 270 5355 a)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2700 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2880 5985 d:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3465 5310 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 5670 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3825 6255 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3510 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2655 6615 d:2\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 5715 d:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2340 6255 d:0\001 -4 0 0 50 -1 0 11 0.0000 4 150 150 2340 5355 b)\001 diff --git a/vldb/pt/figs/grafsearching.fig b/vldb/pt/figs/grafsearching.fig deleted file mode 100755 index 5fe082e..0000000 --- a/vldb/pt/figs/grafsearching.fig +++ /dev/null @@ -1,168 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5692.500 1777.500 4635 3555 4905 3690 5175 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4477.500 3532.500 5130 3285 5175 3555 5130 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5323.500 4365.900 5175 3825 4860 4050 4770 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 4927.500 3532.500 5085 3285 4770 3285 4635 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4927.500 4162.500 5175 3870 5310 4140 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 5020.500 4237.500 4770 4320 4995 4500 5220 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 10012.500 1777.500 8955 3555 9225 3690 9495 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 8797.500 3532.500 9450 3285 9495 3555 9450 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9643.500 4365.900 9495 3825 9180 4050 9090 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9247.500 3532.500 9405 3285 9090 3285 8955 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9247.500 4162.500 9495 3870 9630 4140 9540 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 9340.500 4237.500 9090 4320 9315 4500 9540 4410 -6 5130 4275 5355 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5242 4387 94 92 5242 4387 5285 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 5205 4440 4\001 --6 -6 4680 4185 4905 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4792 4297 94 92 4792 4297 4835 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 4755 4350 5\001 --6 -6 4545 3420 4770 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 4657 3532 94 92 4657 3532 4700 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 4620 3585 7\001 --6 -6 5085 3690 5310 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5197 3802 94 92 5197 3802 5240 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 5160 3855 8\001 --6 -6 4995 3150 5220 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 5107 3262 94 92 5107 3262 5150 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 5070 3315 0\001 --6 -6 7200 2970 8460 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8572.500 1777.500 7515 3555 7785 3690 8055 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7357.500 3532.500 8010 3285 8055 3555 8010 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 8203.500 4365.900 8055 3825 7740 4050 7650 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7807.500 3532.500 7965 3285 7650 3285 7515 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7807.500 4162.500 8055 3870 8190 4140 8100 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7900.500 4237.500 7650 4320 7875 4500 8100 4410 -6 7560 4185 7785 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7672 4297 94 92 7672 4297 7715 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 7635 4350 5\001 --6 -6 7425 3420 7650 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7537 3532 94 92 7537 3532 7580 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 7500 3585 7\001 --6 -6 7875 3150 8100 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 7987 3262 94 92 7987 3262 8030 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 7950 3315 0\001 --6 -6 7965 3690 8190 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8077 3802 94 92 8077 3802 8120 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 8040 3855 8\001 --6 -6 8010 4275 8235 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8122 4387 94 92 8122 4387 8165 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 8085 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7553 4891 7733 4666 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7560 3825 7785 3645 -4 0 0 50 -1 0 9 0.0000 4 135 195 7335 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7200 3555 g:5\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 7920 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7560 3240 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7785 3645 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8100 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 8235 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7740 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 7650 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8235 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8010 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7200 3105 c)\001 --6 -6 9000 4185 9225 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9112 4297 94 92 9112 4297 9155 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 9075 4350 5\001 --6 -6 8865 3420 9090 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 8977 3532 94 92 8977 3532 9020 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 8940 3585 7\001 --6 -6 9315 3150 9540 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9427 3262 94 92 9427 3262 9470 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 9390 3315 0\001 --6 -6 9405 3690 9630 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9517 3802 94 92 9517 3802 9560 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 9480 3855 8\001 --6 -6 9450 4275 9675 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 9562 4387 94 92 9562 4387 9605 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 9525 4440 4\001 --6 -6 5760 2835 7020 4905 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 7132.500 1777.500 6075 3555 6345 3690 6615 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5917.500 3532.500 6570 3285 6615 3555 6570 3780 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6763.500 4365.900 6615 3825 6300 4050 6210 4275 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6367.500 3532.500 6525 3285 6210 3285 6075 3555 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6367.500 4162.500 6615 3870 6750 4140 6660 4410 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6460.500 4237.500 6210 4320 6435 4500 6660 4410 -6 6120 4185 6345 4410 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6232 4297 94 92 6232 4297 6275 4382 -4 0 0 45 -1 0 9 0.0000 4 105 75 6195 4350 5\001 --6 -6 5985 3420 6210 3645 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6097 3532 94 92 6097 3532 6140 3617 -4 0 0 45 -1 0 9 0.0000 4 105 75 6060 3585 7\001 --6 -6 6435 3150 6660 3375 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6547 3262 94 92 6547 3262 6590 3347 -4 0 0 45 -1 0 9 0.0000 4 105 75 6510 3315 0\001 --6 -6 6525 3690 6750 3915 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6637 3802 94 92 6637 3802 6680 3887 -4 0 0 45 -1 0 9 0.0000 4 105 75 6600 3855 8\001 --6 -6 6570 4275 6795 4500 -1 1 0 1 0 33 45 -1 20 0.000 1 0.0000 6682 4387 94 92 6682 4387 6725 4472 -4 0 0 45 -1 0 9 0.0000 4 105 75 6645 4440 4\001 --6 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6030 2835 6120 3105 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6113 4891 6293 4666 -4 0 0 50 -1 0 11 0.0000 4 180 165 5760 3105 b)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5895 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 5760 3555 g:4\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6480 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6120 3240 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6345 3645 4\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6660 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6795 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6300 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 6210 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6795 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 6570 4635 g:2\001 --6 -4 0 0 50 -1 0 9 0.0000 4 135 195 5355 3825 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 3105 a)\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8775 4365 g:3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 8640 3555 g:6\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9360 3105 g:1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9000 3240 7\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9225 3645 6\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9540 3555 1\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9675 4185 2\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9180 4635 5\001 -4 0 0 50 -1 0 9 0.0000 4 105 75 9090 4005 3\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9675 3825 g:0\001 -4 0 0 50 -1 0 9 0.0000 4 135 195 9450 4635 g:2\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8640 3105 d)\001 diff --git a/vldb/pt/figs/grafsearching2.fig b/vldb/pt/figs/grafsearching2.fig deleted file mode 100755 index 6e6a78d..0000000 --- a/vldb/pt/figs/grafsearching2.fig +++ /dev/null @@ -1,180 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 5985 5400 6210 5355 6435 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6210.000 5940.000 6435 6480 6210 6525 5985 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7515 5400 7740 5355 7965 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7740.000 5940.000 7965 6480 7740 6525 7515 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9045 5400 9270 5355 9495 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 9270.000 5940.000 9495 6480 9270 6525 9045 6480 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 4635 5400 4860 5355 5085 5400 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4860.000 5940.000 5085 6480 4860 6525 4635 6480 -6 5895 5310 6075 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 5400 90 90 5985 5400 6075 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 5437 7\001 --6 -6 6345 5310 6525 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 5400 90 90 6435 5400 6525 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 5437 0\001 --6 -6 6345 6390 6525 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6435 6480 90 90 6435 6480 6525 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 6405 6517 3\001 --6 -6 5895 6390 6075 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5985 6480 90 90 5985 6480 6075 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5955 6517 4\001 --6 -6 6120 5850 6300 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 6210 5940 90 90 6210 5940 6300 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 6180 5977 8\001 --6 -6 7425 5310 7605 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 5400 90 90 7515 5400 7605 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 5437 7\001 --6 -6 7875 5310 8055 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 5400 90 90 7965 5400 8055 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 5437 0\001 --6 -6 7875 6390 8055 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7965 6480 90 90 7965 6480 8055 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7935 6517 3\001 --6 -6 7425 6390 7605 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7515 6480 90 90 7515 6480 7605 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 7485 6517 4\001 --6 -6 7650 5850 7830 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 7740 5940 90 90 7740 5940 7830 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 7710 5977 8\001 --6 -6 8955 5310 9135 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 5400 90 90 9045 5400 9135 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 5437 7\001 --6 -6 9405 5310 9585 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 5400 90 90 9495 5400 9585 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 5437 0\001 --6 -6 9405 6390 9585 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9495 6480 90 90 9495 6480 9585 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9465 6517 3\001 --6 -6 8955 6390 9135 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9045 6480 90 90 9045 6480 9135 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 9015 6517 4\001 --6 -6 9180 5850 9360 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 9270 5940 90 90 9270 5940 9360 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 9240 5977 8\001 --6 -6 4545 5310 4725 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 5400 90 90 4635 5400 4725 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 5437 7\001 --6 -6 4995 5310 5175 5490 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 5400 90 90 5085 5400 5175 5400 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 5437 0\001 --6 -6 4995 6390 5175 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5085 6480 90 90 5085 6480 5175 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 5055 6517 3\001 --6 -6 4545 6390 4725 6570 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4635 6480 90 90 4635 6480 4725 6480 -4 0 0 45 -1 0 8 0.0000 4 75 60 4605 6517 4\001 --6 -6 4770 5850 4950 6030 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 4860 5940 90 90 4860 5940 4950 5940 -4 0 0 45 -1 0 8 0.0000 4 75 60 4830 5977 8\001 --6 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 6435 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 6210 5940 5985 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 6435 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6210 5940 5985 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 0 1 2 - 1 1 1.00 60.00 120.00 - 6255 5220 6615 5040 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 5760 6840 6120 6660 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7965 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 7740 5940 7515 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7965 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7740 5940 7515 6480 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7290 6840 7650 6660 -2 1 0 1 0 7 45 -1 20 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 7110 5895 7470 5715 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9495 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 9270 5940 9045 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9495 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9270 5940 9045 6480 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 5085 5400 -2 1 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 2 - 4860 5940 4635 5400 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 5085 6480 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 4860 5940 4635 6480 -4 0 0 45 -1 0 8 0.0000 4 90 150 6345 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6570 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 5310 g:4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 5310 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 5715 4\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 5985 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6390 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 6165 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 6525 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 5715 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 5490 5445 b)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7875 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8100 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 5310 g:5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 5310 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 5715 5\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7515 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7920 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 7695 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8055 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 7245 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 7020 5445 c)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9405 5985 g:0\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9630 5310 g:1\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 5310 g:6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 5310 7\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 5715 6\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9045 6255 3\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 6255 2\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9450 5715 1\001 -4 0 0 45 -1 0 8 0.0000 4 75 60 9225 6660 5\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 9585 6660 g:2\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 8775 6660 g:3\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 8550 5445 d)\001 -4 0 0 45 -1 0 8 0.0000 4 90 150 4995 5985 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 5445 a)\001 diff --git a/vldb/pt/figs/grafsearchingncv.fig b/vldb/pt/figs/grafsearchingncv.fig deleted file mode 100755 index 12ca8f7..0000000 --- a/vldb/pt/figs/grafsearchingncv.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 33 #d3d3d3 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 1102.500 1462.500 1755 1215 1800 1440 1755 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2992.500 1462.500 3645 1215 3690 1440 3645 1710 -5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5107.500 1462.500 5760 1215 5805 1440 5760 1710 -6 585 1125 765 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1215 90 90 675 1215 765 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1252 6\001 --6 -6 585 1575 765 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 675 1665 90 90 675 1665 765 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 645 1702 5\001 --6 -6 1125 1350 1305 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 1215 1440 90 90 1215 1440 1305 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 1185 1477 8\001 --6 -6 1665 1575 1845 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1665 90 90 1755 1665 1845 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1702 2\001 --6 -6 1665 1125 1845 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 1755 1215 90 90 1755 1215 1845 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 1725 1252 1\001 --6 -6 1035 1890 1395 2070 -6 1035 1890 1215 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1035 1890 1215 1890 1215 2070 1035 2070 1035 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1095 2017 0\001 --6 -6 1215 1890 1395 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1215 1890 1395 1890 1395 2070 1215 2070 1215 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 1275 2017 4\001 --6 --6 -6 2475 1125 2655 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1215 90 90 2565 1215 2655 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1252 6\001 --6 -6 2475 1575 2655 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2565 1665 90 90 2565 1665 2655 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 2535 1702 5\001 --6 -6 3015 1350 3195 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 3105 1440 90 90 3105 1440 3195 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 3075 1477 8\001 --6 -6 3555 1575 3735 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1665 90 90 3645 1665 3735 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1702 2\001 --6 -6 3555 1125 3735 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 3645 1215 90 90 3645 1215 3735 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 3615 1252 1\001 --6 -6 3015 1890 3195 2070 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3015 1890 3195 1890 3195 2070 3015 2070 3015 1890 -4 0 0 50 -1 0 8 0.0000 4 75 60 3075 2017 4\001 --6 -6 4590 1125 4770 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1215 90 90 4680 1215 4770 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1252 6\001 --6 -6 4590 1575 4770 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 4680 1665 90 90 4680 1665 4770 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 4650 1702 5\001 --6 -6 5130 1350 5310 1530 -1 3 0 1 0 33 45 -1 20 0.000 1 0.0000 5220 1440 90 90 5220 1440 5310 1440 -4 0 0 45 -1 0 8 0.0000 4 75 60 5190 1477 8\001 --6 -6 5670 1575 5850 1755 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1665 90 90 5760 1665 5850 1665 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1702 2\001 --6 -6 5670 1125 5850 1305 -1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 5760 1215 90 90 5760 1215 5850 1215 -4 0 0 45 -1 0 8 0.0000 4 75 60 5730 1252 1\001 --6 -6 5130 1935 5265 2070 -1 1 0 1 0 33 45 -1 40 0.000 1 0.0000 5217 2000 44 52 5217 2000 5239 2045 -2 1 0 1 0 33 45 -1 40 0.000 0 0 7 0 0 2 - 5235 1940 5198 2061 --6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1215 1440 1755 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 1216 1443 1756 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3105 1440 3645 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3106 1443 3646 1218 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5220 1440 5760 1215 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5221 1443 5761 1218 -4 0 0 50 -1 0 8 0.0000 4 90 150 945 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 630 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 2835 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 3285 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 2520 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4950 1485 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5400 1305 0\001 -4 0 0 50 -1 0 8 0.0000 4 105 1110 4635 2250 UnAssignedAddresses\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1890 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1890 g:4\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 5670 1080 g:0\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 4590 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 4320 1125 c)\001 -4 0 0 50 -1 0 8 0.0000 4 90 150 3555 1080 g:0\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 2205 1125 b)\001 -4 0 0 50 -1 0 11 0.0000 4 180 165 315 1125 a)\001 -4 0 0 50 -1 0 8 0.0000 4 75 60 5850 1485 4\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.fig b/vldb/pt/figs/minimalperfecthash-ph-mph.fig deleted file mode 100755 index 938ff8d..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.fig +++ /dev/null @@ -1,176 +0,0 @@ -#FIG 3.2 Produced by xfig version 3.2.5-alpha5 -Landscape -Center -Metric -A4 -100.00 -Single --2 -1200 2 -0 32 #bebebe -6 -2700 3060 -540 3240 -6 -2700 3060 -540 3240 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3060 -2430 3060 -2430 3240 -2700 3240 -2700 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 3060 -2160 3060 -2160 3240 -2430 3240 -2430 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3060 -1890 3060 -1890 3240 -2160 3240 -2160 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3060 -1620 3060 -1620 3240 -1890 3240 -1890 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 3060 -1350 3060 -1350 3240 -1620 3240 -1620 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3060 -1080 3060 -1080 3240 -1350 3240 -1350 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3060 -810 3060 -810 3240 -1080 3240 -1080 3060 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3060 -540 3060 -540 3240 -810 3240 -810 3060 --6 --6 -6 -2610 2835 -540 2970 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 2970 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 2970 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 2970 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 2970 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 2970 1\001 --6 -6 -3600 4230 270 5490 -6 -2700 4455 -540 5265 -6 -2700 4455 -540 4635 -6 -2700 4455 -540 4635 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 4455 -2430 4455 -2430 4635 -2700 4635 -2700 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 4455 -2160 4455 -2160 4635 -2430 4635 -2430 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 4455 -1890 4455 -1890 4635 -2160 4635 -2160 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 4455 -1620 4455 -1620 4635 -1890 4635 -1890 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 4455 -1350 4455 -1350 4635 -1620 4635 -1620 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 4455 -1080 4455 -1080 4635 -1350 4635 -1350 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 4455 -810 4455 -810 4635 -1080 4635 -1080 4455 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 4455 -540 4455 -540 4635 -810 4635 -810 4455 --6 --6 -6 -2700 5085 -540 5265 -6 -2700 5085 -540 5265 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 5085 -2430 5085 -2430 5265 -2700 5265 -2700 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2430 5085 -2160 5085 -2160 5265 -2430 5265 -2430 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 5085 -1890 5085 -1890 5265 -2160 5265 -2160 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 5085 -1620 5085 -1620 5265 -1890 5265 -1890 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1620 5085 -1350 5085 -1350 5265 -1620 5265 -1620 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 5085 -1080 5085 -1080 5265 -1350 5265 -1350 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 5085 -810 5085 -810 5265 -1080 5265 -1080 5085 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 5085 -540 5085 -540 5265 -810 5265 -810 5085 --6 --6 --6 -6 -2610 4230 -540 4365 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4365 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 4365 n-1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4365 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 4365 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 4365 1\001 --6 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 4635 -1980 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 4635 -2565 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1980 4635 -2295 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 4635 -900 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 4635 -1755 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 4635 -1485 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 4635 -1215 5085 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 4635 -675 5085 -4 0 0 45 -1 0 10 0.0000 4 105 690 -450 5220 Hash Table\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 4590 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 5490 0\001 -4 0 0 45 -1 0 10 0.0000 4 105 210 -765 5490 n-1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2070 5490 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2340 5490 1\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 5445 ...\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 4860 (b)\001 --6 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1890 3690 -1620 3690 -1620 3870 -1890 3870 -1890 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1350 3690 -1080 3690 -1080 3870 -1350 3870 -1350 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -1080 3690 -810 3690 -810 3870 -1080 3870 -1080 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -810 3690 -540 3690 -540 3870 -810 3870 -810 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -3240 3690 -2970 3690 -2970 3870 -3240 3870 -3240 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -270 3690 0 3690 0 3870 -270 3870 -270 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2970 3690 -2700 3690 -2700 3870 -2970 3870 -2970 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2700 3690 -2430 3690 -2430 3870 -2700 3870 -2700 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -2430 3690 -2160 3690 -2160 3870 -2430 3870 -2430 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -1620 3690 -1350 3690 -1350 3870 -1620 3870 -1620 3690 -2 2 0 1 0 32 45 -1 20 0.000 0 0 7 0 0 5 - -540 3690 -270 3690 -270 3870 -540 3870 -540 3690 -2 2 0 1 0 7 45 -1 20 0.000 0 0 -1 0 0 5 - -2160 3690 -1890 3690 -1890 3870 -2160 3870 -2160 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2565 3240 -2025 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2295 3240 -2565 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -2025 3240 -3150 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1755 3240 -1215 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1485 3240 -1755 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -1215 3240 -90 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -675 3240 -945 3690 -2 1 0 1 0 0 45 -1 -1 0.000 0 0 -1 1 0 2 - 2 1 1.00 60.00 60.00 - -945 3240 -675 3690 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2610 4095 2\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -2880 4095 1\001 -4 0 0 45 -1 0 10 0.0000 4 105 75 -3150 4095 0\001 -4 0 0 45 -1 0 18 0.0000 4 30 180 -1575 4050 ...\001 -4 0 0 45 -1 0 10 0.0000 4 105 255 -270 4095 m-1\001 -4 0 0 45 -1 0 10 0.0000 4 135 465 -450 3195 Key Set\001 -4 0 0 45 -1 0 10 0.0000 4 105 690 90 3825 Hash Table\001 -4 0 0 45 -1 0 11 0.0000 4 180 240 -3600 3465 (a)\001 diff --git a/vldb/pt/figs/minimalperfecthash-ph-mph.ps b/vldb/pt/figs/minimalperfecthash-ph-mph.ps deleted file mode 100755 index 5c7498b..0000000 --- a/vldb/pt/figs/minimalperfecthash-ph-mph.ps +++ /dev/null @@ -1,488 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF diff --git a/vldb/pt/introduction.tex b/vldb/pt/introduction.tex deleted file mode 100755 index 077d092..0000000 --- a/vldb/pt/introduction.tex +++ /dev/null @@ -1,55 +0,0 @@ -\section{Introdu\c{c}\~ao} -\label{sec:introduction} -Fun\c{c}\~oes hash s\~ao amplamente utilizadas em v\'arias \'areas da -Ci\^encia da Computa\c{c}\~ao. -Uma \textit{fun\c{c}\~ao hash} $h: U \to M$ mapeia chaves de um universo $U$, $|U|=u$, -para um dado intervalo de inteiros $M=[0,m-1]=\{0,1,\dots,m-1\}$. -Seja~$S\subseteq U$ um subconjunto de $n$ chaves do universo $U$. -Dado uma chave~$k\in S$, uma fun\c{c}\~ao hash $h$ computa um inteiro em -$M$ para armazenamento ou recupera\c{c}\~ao de $k$ em uma \textit{tabela hash}. -Neste artigo consideramos que as chaves s\~ao strings de bits de comprimento -m\'aximo $L$. Portanto $u = 2^L$. - -M\'etodos de hashing para {\em conjuntos n\~ao est\'aticos} de chaves podem ser usados para -construir estruturas de dados para armazenar $S$ e suportar consultas do tipo -``$k \in S$?'' em tempo esperado $O(1)$. -No entanto, eles envolvem um certo desperd\'{\i}cio de espa\c{c}o e tempo devido -a localiza\c{c}\~oes inutilizadas na tabela e tempo para resolver colis\~oes quando duas -chaves s\~ao mapeadas para a mesma localiza\c{c}\~ao na tabela. - - -Para {\em conjuntos est\'aticos} de chaves \'e poss\'{\i}vel computar uma fun\c{c}\~ao -para encontrar qualquer chave na tabela em uma \'unica tentativa; tais fun\c{c}\~oes -s\~ao chamadas de \textit{perfeitas}. -Dado um conjunto de chaves $S$, dizemos que uma fun\c{c}\~ao hash $h:U\to M$ \'e uma -\textit{fun\c{c}\~ao hash perfeita} (FHP) para $S$ se $h$ \'e injetora para $S$, -isto \'e, n\~ao h\'a {\em colis\~oes} entre as chaves em $S$: se $x$ -e $y$ est\~ao em $S$ e $x\neq y$, ent\~ao $h(x)\neq h(y)$. -A Figura~\ref{fig:minimalperfecthash-ph-mph}(a) ilustra uma fun\c{c}\~ao hash perfeita. -Se $m=n$, isto \'e, a tabela \'e do mesmo tamanho de $S$, -ent\~ao $h$ \'e uma \textit{fun\c{c}\~ao hash perfeita m\'{\i}nima} (FHPM). -A Figura~\ref{fig:minimalperfecthash-ph-mph}(b) ilustra uma -fun\c{c}\~ao hash perfeita m\'{\i}nima. -FHPMs podem evitar totalmente o problema de desperd\'{\i}cio de espa\c{c}o e tempo. - -% For two-column wide figures use -\begin{figure} -% Use the relevant command to insert your figure file. -% For example, with the graphicx package use -\centering - \includegraphics[width=0.45\textwidth, height=0.3\textheight]{figs/minimalperfecthash-ph-mph.ps} -% figure caption is below the figure -\caption{(a) Perfect hash function\quad (b) Minimal perfect hash function} -\label{fig:minimalperfecthash-ph-mph} -\end{figure} - -A aplicabilidade pr\'atica das FHPMs e consequentemente dos algoritmos utilizados para ger\'a-las est\'a diretamente relacionada com as seguintes m\'etricas: -\begin{enumerate} -\item Quantidade de tempo gasto para encontrar uma FHPM $h$. -\item Quantidade de mem\'oria exigida para encontrar $h$. -\item Quantidade de tempo necess\'ario para avaliar ou computar $h$ para uma dada chave. -\item Quantidade de mem\'oria exigida para armazenar a descri\c{c}\~ao da fun\c{c}\~ao $h$. -\item Escalabilidade dos algoritmos com o crescimento de $S$. -\end{enumerate} - -Neste artigo apresentamos ... \ No newline at end of file diff --git a/vldb/pt/makefile b/vldb/pt/makefile deleted file mode 100755 index c1a738f..0000000 --- a/vldb/pt/makefile +++ /dev/null @@ -1,17 +0,0 @@ -all: - latex vldb.tex - bibtex vldb - latex vldb.tex - latex vldb.tex - dvips vldb.dvi -o vldb.ps - ps2pdf vldb.ps - chmod -R g+rwx * - -perm: - chmod -R g+rwx * - -run: clean all - gv vldb.ps & -clean: - rm *.aux *.bbl *.blg *.log - diff --git a/vldb/pt/references.bib b/vldb/pt/references.bib deleted file mode 100755 index 7a1a9fb..0000000 --- a/vldb/pt/references.bib +++ /dev/null @@ -1,700 +0,0 @@ -@inproceedings{p99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@article{p00, - author = {R. Pagh}, - title = {Faster deterministic dictionaries}, - journal = {Symposium on Discrete Algorithms (ACM SODA)}, - OPTvolume = {43}, - OPTnumber = {5}, - pages = {487--493}, - year = {2000} -} - -@article{gss01, - author = {N. Galli and B. Seybold and K. Simon}, - title = {Tetris-Hashing or optimal table compression}, - journal = {Discrete Applied Mathematics}, - volume = {110}, - number = {1}, - pages = {41--58}, - month = {june}, - publisher = {Elsevier Science}, - year = {2001} -} - - -@InProceedings{ss89, - author = {P. Schmidt and A. Siegel}, - title = {On aspects of universality and performance for closed hashing}, - booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, - month = {May}, - year = {1989}, - pages = {355--366} -} - -@article{asw00, - author = {M. Atici and D. R. Stinson and R. Wei.}, - title = {A new practical algorithm for the construction of a perfect hash function}, - journal = {Journal Combin. Math. Combin. Comput.}, - volume = {35}, - pages = {127--145}, - year = {2000} -} - -@article{swz00, - author = {D. R. Stinson and R. Wei and L. Zhu}, - title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, - journal = {Journal Combin. Designs.}, - volume = {8}, - pages = {189--200}, - year = {2000} -} - -@inproceedings{ht01, - author = {T. Hagerup and T. Tholey}, - title = {Efficient minimal perfect hashing in nearly minimal space}, - booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, - year = 2001, - pages = {317--326}, - key = {author} -} - -@inproceedings{dh01, - author = {M. Dietzfelbinger and T. Hagerup}, - title = {Simple minimal perfect hashing in less space}, - booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, - year = 2001, - pages = {109--120}, - key = {author} -} - - -@MastersThesis{mar00, - author = {M. S. Neubert}, - title = {Algoritmos Distribu�os para a Constru�o de Arquivos invertidos}, - school = {Departamento de Ci�cia da Computa�o, Universidade Federal de Minas Gerais}, - year = 2000, - month = {Mar�}, - key = {author} -} - - -@Book{clrs01, - author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, - title = {Introduction to Algorithms}, - publisher = {MIT Press}, - year = {2001}, - edition = {second}, -} - - -@Book{k73, - author = {D. E. Knuth}, - title = {The Art of Computer Programming: Sorting and Searching}, - publisher = {Addison-Wesley}, - volume = {3}, - year = {1973}, - edition = {second}, -} - -@inproceedings{rp99, - author = {R. Pagh}, - title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, - booktitle = {Workshop on Algorithms and Data Structures}, - pages = {49-54}, - year = 1999, - url = {citeseer.nj.nec.com/pagh99hash.html}, - key = {author} -} - -@inproceedings{hmwc93, - author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, - title = {Graphs, Hypergraphs and Hashing}, - booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, - publisher = {Springer Lecture Notes in Computer Science vol. 790}, - pages = {153-165}, - year = 1993, - key = {author} -} - -@inproceedings{bkz05, - author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, - title = {A Practical Minimal Perfect Hashing Method}, - booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, - publisher = {Springer Lecture Notes in Computer Science vol. 3503}, - pages = {488-500}, - Moth = May, - year = 2005, - key = {author} -} - -@Article{chm97, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {Fundamental Study Perfect Hashing}, - journal = {Theoretical Computer Science}, - volume = {182}, - year = {1997}, - pages = {1-143}, - key = {author} -} - -@article{chm92, - author = {Z.J. Czech and G. Havas and B.S. Majewski}, - title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, - journal = {Information Processing Letters}, - volume = {43}, - number = {5}, - pages = {257-264}, - year = {1992}, - url = {citeseer.nj.nec.com/czech92optimal.html}, - key = {author} -} - -@Article{mwhc96, - author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, - title = {A family of perfect hashing methods}, - journal = {The Computer Journal}, - year = {1996}, - volume = {39}, - number = {6}, - pages = {547-554}, - key = {author} -} - -@InProceedings{bv04, -author = {P. Boldi and S. Vigna}, -title = {The WebGraph Framework I: Compression Techniques}, -booktitle = {13th International World Wide Web Conference}, -pages = {595--602}, -year = {2004} -} - - -@Book{z04, - author = {N. Ziviani}, - title = {Projeto de Algoritmos com implementa�es em Pascal e C}, - publisher = {Pioneira Thompson}, - year = 2004, - edition = {segunda edi�o} -} - - -@Book{p85, - author = {E. M. Palmer}, - title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, - publisher = {John Wiley \& Sons}, - year = {1985}, - address = {New York} -} - -@Book{imb99, - author = {I.H. Witten and A. Moffat and T.C. Bell}, - title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, - publisher = {Morgan Kaufmann Publishers}, - year = 1999, - edition = {second edition} -} -@Book{wfe68, - author = {W. Feller}, - title = { An Introduction to Probability Theory and Its Applications}, - publisher = {Wiley}, - year = 1968, - volume = 1, - optedition = {second edition} -} - - -@Article{fhcd92, - author = {E.A. Fox and L. S. Heath and Q.Chen and A.M. Daoud}, - title = {Practical Minimal Perfect Hash Functions For Large Databases}, - journal = {Communications of the ACM}, - year = {1992}, - volume = {35}, - number = {1}, - pages = {105--121} -} - - -@inproceedings{fch92, - author = {E.A. Fox and Q.F. Chen and L.S. Heath}, - title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, - booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference - on Research and Development in Information Retrieval}, - year = {1992}, - pages = {266-273}, -} - -@article{c80, - author = {R.J. Cichelli}, - title = {Minimal perfect hash functions made simple}, - journal = {Communications of the ACM}, - volume = {23}, - number = {1}, - year = {1980}, - issn = {0001-0782}, - pages = {17--19}, - doi = {http://doi.acm.org/10.1145/358808.358813}, - publisher = {ACM Press}, - } - - -@TechReport{fhc89, - author = {E.A. Fox and L.S. Heath and Q.F. Chen}, - title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, - institution = {Virginia Polytechnic Institute and State University}, - year = {1989}, - OPTkey = {}, - OPTtype = {}, - OPTnumber = {}, - address = {Blacksburg, VA}, - month = {April}, - OPTnote = {}, - OPTannote = {} -} - -@inproceedings{fcdh90, - author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, - title = {Order preserving minimal perfect hash functions and information retrieval}, - booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, - year = {1990}, - isbn = {0-89791-408-2}, - pages = {279--311}, - location = {Brussels, Belgium}, - doi = {http://doi.acm.org/10.1145/96749.98233}, - publisher = {ACM Press}, - } - -@Article{fkp89, - author = {P. Flajolet and D. E. Knuth and B. Pittel}, - title = {The first cycles in an evolving graph}, - journal = {Discrete Math}, - year = {1989}, - volume = {75}, - pages = {167-215}, -} - -@Article{s77, - author = {R. Sprugnoli}, - title = {Perfect Hashing Functions: A Single Probe Retrieving - Method For Static Sets}, - journal = {Communications of the ACM}, - year = {1977}, - volume = {20}, - number = {11}, - pages = {841--850}, - month = {November}, -} - -@Article{j81, - author = {G. Jaeschke}, - title = {Reciprocal Hashing: A method For Generating Minimal Perfect - Hashing Functions}, - journal = {Communications of the ACM}, - year = {1981}, - volume = {24}, - number = {12}, - month = {December}, - pages = {829--833} -} - -@Article{c84, - author = {C. C. Chang}, - title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, - journal = {Communications of the ACM}, - year = {1984}, - volume = {27}, - number = {4}, - month = {December}, - pages = {384--387} -} - -@Article{c86, - author = {C. C. Chang}, - title = {Letter-Oriented Reciprocal Hashing Scheme}, - journal = {Inform. Sci.}, - year = {1986}, - volume = {27}, - pages = {243--255} -} - -@Article{cl86, - author = {C. C. Chang and R. C. T. Lee}, - title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, - journal = {Computer Journal}, - year = {1986}, - volume = {29}, - number = {3}, - month = {June}, - pages = {277--281} -} - - -@Article{cc88, - author = {C. C. Chang and C. H. Chang}, - title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, - journal = {Inform. Process. Lett.}, - year = {1988}, - volume = {27}, - number = {2}, - month = {February}, - pages = {79--83} -} - -@Article{w90, - author = {V. G. Winters}, - title = {Minimal Perfect Hashing in Polynomial Time}, - journal = {BIT}, - year = {1990}, - volume = {30}, - number = {2}, - pages = {235--244} -} - -@Article{fcdh91, - author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, - title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, - journal = {ACM Trans. Inform. Systems}, - year = {1991}, - volume = {9}, - number = {3}, - month = {July}, - pages = {281--308} -} - -@Article{fks84, - author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, - title = {Storing a sparse table with {O(1)} worst case access time}, - journal = {J. ACM}, - year = {1984}, - volume = {31}, - number = {3}, - month = {July}, - pages = {538--544} -} - -@Article{dhjs83, - author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, - title = {The study of a new perfect hash scheme}, - journal = {IEEE Trans. Software Eng.}, - year = {1983}, - volume = {9}, - number = {3}, - month = {May}, - pages = {305--313} -} - -@Article{bt94, - author = {M. D. Brain and A. L. Tharp}, - title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, - journal = {IEEE Trans. on Knowledge and Data Eng.}, - year = {1994}, - volume = {6}, - number = {2}, - month = {April}, - pages = {239--247} -} - -@Article{bt90, - author = {M. D. Brain and A. L. Tharp}, - title = {Perfect hashing using sparse matrix packing}, - journal = {Inform. Systems}, - year = {1990}, - volume = {15}, - number = {3}, - OPTmonth = {April}, - pages = {281--290} -} - -@Article{ckw93, - author = {C. C. Chang and H. C.Kowng and T. C. Wu}, - title = {A refinement of a compression-oriented addressing scheme}, - journal = {BIT}, - year = {1993}, - volume = {33}, - number = {4}, - OPTmonth = {April}, - pages = {530--535} -} - -@Article{cw91, - author = {C. C. Chang and T. C. Wu}, - title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, - journal = {Software -- Practice Experience}, - year = {1991}, - volume = {21}, - number = {1}, - month = {january}, - pages = {35--49} -} - -@Article{ty79, - author = {R. E. Tarjan and A. C. C. Yao}, - title = {Storing a sparse table}, - journal = {Comm. ACM}, - year = {1979}, - volume = {22}, - number = {11}, - month = {November}, - pages = {606--611} -} - -@Article{yd85, - author = {W. P. Yang and M. W. Du}, - title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, - journal = {BIT}, - year = {1985}, - volume = {25}, - number = {1}, - pages = {148--164} -} - -@Article{s85, - author = {T. J. Sager}, - title = {A polynomial time generator for minimal perfect hash functions}, - journal = {Commun. ACM}, - year = {1985}, - volume = {28}, - number = {5}, - month = {May}, - pages = {523--532} -} - -@Article{cm93, - author = {Z. J. Czech and B. S. Majewski}, - title = {A linear time algorithm for finding minimal perfect hash functions}, - journal = {The computer Journal}, - year = {1993}, - volume = {36}, - number = {6}, - pages = {579--587} -} - -@Article{gbs94, - author = {R. Gupta and S. Bhaskar and S. Smolka}, - title = {On randomization in sequential and distributed algorithms}, - journal = {ACM Comput. Surveys}, - year = {1994}, - volume = {26}, - number = {1}, - month = {March}, - pages = {7--86} -} - -@InProceedings{sb84, - author = {C. Slot and P. V. E. Boas}, - title = {On tape versus core; an application of space efficient perfect hash functions to the - invariance of space}, - booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, - address = {Washington}, - month = {May}, - year = {1984}, - pages = {391--400}, -} - -@InProceedings{wi90, - author = {V. G. Winters}, - title = {Minimal perfect hashing for large sets of data}, - booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, - address = {Canada}, - month = {May}, - year = {1990}, - pages = {275--284}, -} - -@InProceedings{lr85, - author = {P. Larson and M. V. Ramakrishna}, - title = {External perfect hashing}, - booktitle = {Proc. ACM SIGMOD Conf.}, - address = {Austin TX}, - month = {June}, - year = {1985}, - pages = {190--199}, -} - -@Book{m84, - author = {K. Mehlhorn}, - editor = {W. Brauer and G. Rozenberg and A. Salomaa}, - title = {Data Structures and Algorithms 1: Sorting and Searching}, - publisher = {Springer-Verlag}, - year = {1984}, -} - -@PhdThesis{c92, - author = {Q. F. Chen}, - title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, - school = {Virginia Tech Dept. of Computer Science}, - year = {1992}, - month = {March} -} - -@article {er59, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On random graphs {I}}, - JOURNAL = {Pub. Math. Debrecen}, - VOLUME = {6}, - YEAR = {1959}, - PAGES = {290--297}, - MRCLASS = {05.00}, - MRNUMBER = {MR0120167 (22 \#10924)}, -MRREVIEWER = {A. Dvoretzky}, -} - - -@article {erdos61, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Bull. Inst. Internat. Statist.}, - VOLUME = 38, - YEAR = 1961, - PAGES = {343--347}, - MRCLASS = {05.40 (55.10)}, - MRNUMBER = {MR0148055 (26 \#5564)}, -} - -@article {er60, - AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, - TITLE = {On the evolution of random graphs}, - JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, - VOLUME = {5}, - YEAR = {1960}, - PAGES = {17--61}, - MRCLASS = {05.40}, - MRNUMBER = {MR0125031 (23 \#A2338)}, -MRREVIEWER = {J. Riordan}, -} - -@Article{er60:_Old, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the evolution of random graphs}, - journal = {Publications of the Mathematical Institute of the Hungarian - Academy of Sciences}, - year = {1960}, - volume = {56}, - pages = {17-61} -} - -@Article{er61, - author = {P. Erd{\H{o}}s and A. R\'enyi}, - title = {On the strength of connectedness of a random graph}, - journal = {Acta Mathematica Scientia Hungary}, - year = {1961}, - volume = {12}, - pages = {261-267} -} - - -@Article{bp04, - author = {B. Bollob\'as and O. Pikhurko}, - title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, - journal = {European Journal of Combinatorics}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - -@Article{pw04, - author = {B. Pittel and N. C. Wormald}, - title = {Counting connected graphs inside-out}, - journal = {Journal of Combinatorial Theory}, - OPTkey = {}, - OPTvolume = {}, - OPTnumber = {}, - OPTpages = {}, - OPTmonth = {}, - note = {To Appear}, - OPTannote = {} -} - - -@Article{mr95, - author = {M. Molloy and B. Reed}, - title = {A critical point for random graphs with a given degree sequence}, - journal = {Random Structures and Algorithms}, - year = {1995}, - volume = {6}, - pages = {161-179} -} - -@TechReport{bmz04, - author = {F. C. Botelho and D. Menoti and N. Ziviani}, - title = {A New algorithm for constructing minimal perfect hash functions}, - institution = {Federal Univ. of Minas Gerais}, - year = {2004}, - OPTkey = {}, - OPTtype = {}, - number = {TR004}, - OPTaddress = {}, - OPTmonth = {}, - note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, - OPTannote = {} -} - -@Article{mr98, - author = {M. Molloy and B. Reed}, - title = {The size of the giant component of a random graph with a given degree sequence}, - journal = {Combinatorics, Probability and Computing}, - year = {1998}, - volume = {7}, - pages = {295-305} -} - -@misc{h98, - author = {D. Hawking}, - title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, - url = {citeseer.ist.psu.edu/4991.html}, - year = {1998}} - -@book {jlr00, - AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, - TITLE = {Random graphs}, - PUBLISHER = {Wiley-Inter.}, - YEAR = 2000, - PAGES = {xii+333}, - ISBN = {0-471-17541-2}, - MRCLASS = {05C80 (60C05 82B41)}, - MRNUMBER = {2001k:05180}, -MRREVIEWER = {Mark R. Jerrum}, -} - -@incollection {jlr90, - AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, - Andrzej}, - TITLE = {An exponential bound for the probability of nonexistence of a - specified subgraph in a random graph}, - BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, - PAGES = {73--87}, - PUBLISHER = {Wiley}, - ADDRESS = {Chichester}, - YEAR = 1990, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {91m:05168}, -MRREVIEWER = {J. Spencer}, -} - -@book {b01, - AUTHOR = {Bollob{\'a}s, B.}, - TITLE = {Random graphs}, - SERIES = {Cambridge Studies in Advanced Mathematics}, - VOLUME = 73, - EDITION = {Second}, - PUBLISHER = {Cambridge University Press}, - ADDRESS = {Cambridge}, - YEAR = 2001, - PAGES = {xviii+498}, - ISBN = {0-521-80920-7; 0-521-79722-5}, - MRCLASS = {05C80 (60C05)}, - MRNUMBER = {MR1864966 (2002j:05132)}, -} - diff --git a/vldb/pt/relatedwork.tex b/vldb/pt/relatedwork.tex deleted file mode 100755 index b250e4b..0000000 --- a/vldb/pt/relatedwork.tex +++ /dev/null @@ -1,73 +0,0 @@ -\section{Trabalhos Relacionados} -As FHPs e FHPMs receberam muita aten\c{c}\~ao da comunidade -cient\'{\i}fica nas d\'ecadas de 80 e 90. Em~\cite{chm97} \'e -apresentado um survey completo da \'area at\'e 1997. -Nesta se\c{c}\~ao revisitamos os trabalhos cobertos pelo survey que -est\~ao diretamente relacionados aos algoritmos aqui propostos e -fazemos um survey dos algoritmos propostos desde ent\~ao. - -Fredman, Koml\'os e Szemer\'edi~\cite{FKS84} mostraram que \'e poss\'{\i}vel construir -FHPs que podem ser descritas eficientemente em termos de espa\c{c}o e avaliadas em -tempo constante utilizando tamanhos de tabelas que s\~ao lineares no n\'umero de chaves: -$m=O(n)$. -No modelo de computa\c{c}\~ao deles, um elemento do universo~$U$ \'e colocado em uma -palavra de m\'aquina, e opera\c{c}\~oes aritm\'eticas e acesso \`a mem\'oria tem custo -$O(1)$. -Algoritmos rand\^omicos no modelo FKS podem construir FHPs com complexidade de tempo -experada de $O(n)$: -Este \'e o caso dos nossos algoritmos e dos trabalhos em~\cite{chm92,p99}. - -Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir -FHPs e FHPMs deterministicamente. -As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. -A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e -$O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. -A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. -Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade -de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever -FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} -que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo -$\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as -fun\c{c}\~oes com complexidade linear. -Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode -limitar a utiliza\c{c}\~ao na pr\'atica. - -Pagh~\cite{p99} prop\^os uma fam\'{\i}lia de algoritmos rand\^omicos para construir -FHPMs. -A forma da fun\c{c}\~ao resultante \'e $h(k) = (f(k) + d_{g(k)}) \bmod n$, -onde $f$ e $g$ s\~ao fun\c{c}\~oes hash universal \cite{ss89} e $d$ \'e um conjunto de -valores de deslocamento para resolver as colis\~oes que s\~ao causadas pela fun\c{c}\~ao $f$. -Pagh identificou um conjunto de condi\c{c}\~oes referentes a $f$ e $g$, e mostrou -que se tais condi\c{c}\~oes fossem satisfeitas, ent\~ao, uma FHPM pode ser computada -em tempo esperado $O(n)$ e armazenada em $(2+\epsilon)n$ palavras de computador -(ou $O((2+\epsilon)n \log n)$ bits.) -Dietzfelbinger e Hagerup~\cite{dh01} melhoraram ~\cite{p99}, -reduzindo de $(2+\epsilon)n$ para $(1+\epsilon)n$ (ou $O((1+\epsilon)n \log n)$ bits) -o n\'umero de palavras de -computador exigidas para armazenar a fun\c{c}\~ao, mas na abordagem deles $f$ e $g$ -devem ser escolhidas de uma classe de fun\c{c}\~oes hash que atendam a requisitos -adicionais. - -Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico -que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} -e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das -fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde -$h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. - -Os algoritmos propostos em~\cite{p99,dh01,gss01} n\~ao s\~ao escal\'aveis com o crescimento do -conjunto de chaves $S$. Isto \'e devido as restri\c{c}\~oes impostas sobre as fun\c{c}\~oes -hash universal utilizadas no c\'alculo das FHPMs. Normalmente \'e exigido um -n\'umero primo maior do que o tamanho do universo $u$ que, em geral, \'e muito maior -do que $n=|S|$ ou opera\c{c}\~oes envolvendo $n^2$ aparecem no c\'alculo da FHPM. -Al\'em disso, todas as fun\c{c}\~oes est\~ao distantes a um fator de $\log n$ da complexidade -\'otima para descrever FHPMs. - -Diferentemente dos trabalhos em~\cite{p99,dh01,gss01}, nossos algoritmos usam -fun\c{c}\~oes hash universal que s\~ao selecionadas randomicamente de uma classe -de fun\c{c}\~oes que n\~ao necessitam atender restri\c{c}\~oes adicionais. -Al\'em disso, as FHPMs s\~ao geradas em tempo esperado $O(n)$, s\~ao avaliadas -com custo $O(1)$ e s\~ao descritas em $O(n)$ bits que est\'a muito pr\'oximo da -complexidade \'otima. -Pelo melhor do nosso conhecimento, os algoritmos propostos neste artigo s\~ao -os primeiros da literatura capazes de gerar FHPMs para conjuntos de chaves na -ordem de bilh\~oes de chaves utilizando um simples PC com 1GB de mem\'oria principal. \ No newline at end of file diff --git a/vldb/pt/svglov2.clo b/vldb/pt/svglov2.clo deleted file mode 100644 index d98306e..0000000 --- a/vldb/pt/svglov2.clo +++ /dev/null @@ -1,77 +0,0 @@ -% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals -% -% This is an enhancement for the LaTeX -% SVJour2 document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\ProvidesFile{svglov2.clo} - [2004/10/25 v2.1 - style option for standardised journals] -\typeout{SVJour Class option: svglov2.clo for standardised journals} -\def\validfor{svjour2} -\ExecuteOptions{final,10pt,runningheads} -% No size changing allowed, hence a copy of size10.clo is included -\renewcommand\normalsize{% - \@setfontsize\normalsize{10.2pt}{4mm}% - \abovedisplayskip=3 mm plus6pt minus 4pt - \belowdisplayskip=3 mm plus6pt minus 4pt - \abovedisplayshortskip=0.0 mm plus6pt - \belowdisplayshortskip=2 mm plus4pt minus 4pt - \let\@listi\@listI} -\normalsize -\newcommand\small{% - \@setfontsize\small{8.7pt}{3.25mm}% - \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ - \abovedisplayshortskip \z@ \@plus2\p@ - \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ - \def\@listi{\leftmargin\leftmargini - \parsep 0\p@ \@plus1\p@ \@minus\p@ - \topsep 4\p@ \@plus2\p@ \@minus4\p@ - \itemsep0\p@}% - \belowdisplayskip \abovedisplayskip -} -\let\footnotesize\small -\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} -\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} -\newcommand\large{\@setfontsize\large\@xiipt{14pt}} -\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} -\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} -\newcommand\huge{\@setfontsize\huge\@xxpt{25}} -\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} -% -%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} -\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} -\AtEndOfClass{\advance\headsep by5pt} -\if@twocolumn -\setlength{\textwidth}{17.6cm} -\setlength{\textheight}{230mm} -\AtEndOfClass{\setlength\columnsep{4mm}} -\else -\setlength{\textwidth}{11.7cm} -\setlength{\textheight}{517.5dd} % 19.46cm -\fi -% -\AtBeginDocument{% -\@ifundefined{@journalname} - {\typeout{Unknown journal: specify \string\journalname\string{% -\string} in preambel^^J}}{}} -% -\endinput -%% -%% End of file `svglov2.clo'. diff --git a/vldb/pt/svjour2.cls b/vldb/pt/svjour2.cls deleted file mode 100644 index 56d9216..0000000 --- a/vldb/pt/svjour2.cls +++ /dev/null @@ -1,1419 +0,0 @@ -% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e -% -% LaTeX document class for Springer journals -% -%% -%% -%% \CharacterTable -%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{svjour2}[2005/08/29 v2.8 -^^JLaTeX document class for Springer journals] -\newcommand\@ptsize{} -\newif\if@restonecol -\newif\if@titlepage -\@titlepagefalse -\DeclareOption{a4paper} - {\setlength\paperheight {297mm}% - \setlength\paperwidth {210mm}} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5pt}} -\DeclareOption{final}{\setlength\overfullrule{0pt}} -\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} -\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} -\newif\if@avier\@avierfalse -\DeclareOption{onecollarge}{\@aviertrue} -\let\if@mathematic\iftrue -\let\if@numbook\iffalse -\DeclareOption{numbook}{\let\if@envcntsect\iftrue - \AtEndOfPackage{% - \renewcommand\thefigure{\thesection.\@arabic\c@figure}% - \renewcommand\thetable{\thesection.\@arabic\c@table}% - \renewcommand\theequation{\thesection.\@arabic\c@equation}% - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{equation}{section}% - }% -} -\DeclareOption{openbib}{% - \AtEndOfPackage{% - \renewcommand\@openbib@code{% - \advance\leftmargin\bibindent - \itemindent -\bibindent - \listparindent \itemindent - \parsep \z@ - }% - \renewcommand\newblock{\par}}% -} -\DeclareOption{natbib}{% -\AtEndOfClass{\RequirePackage{natbib}% -% Changing some parameters of NATBIB -\setlength{\bibhang}{\parindent}% -%\setlength{\bibsep}{0mm}% -\let\bibfont=\small -\def\@biblabel#1{#1.}% -\newcommand{\etal}{et al.}% -\bibpunct{(}{)}{;}{a}{}{,}}} -% -\let\if@runhead\iffalse -\DeclareOption{runningheads}{\let\if@runhead\iftrue} -\let\if@smartrunh\iffalse -\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} -\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} -\let\if@envcntreset\iffalse -\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} -\let\if@envcntsame\iffalse -\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} -\let\if@envcntsect\iffalse -\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} -\let\if@referee\iffalse -\DeclareOption{referee}{\let\if@referee\iftrue} -\def\makereferee{\def\baselinestretch{2}} -\let\if@instindent\iffalse -\DeclareOption{instindent}{\let\if@instindent\iftrue} -\let\if@smartand\iffalse -\DeclareOption{smartand}{\let\if@smartand\iftrue} -\let\if@spthms\iftrue -\DeclareOption{nospthms}{\let\if@spthms\iffalse} -% -% language and babel dependencies -\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% -\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} -\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% -\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} -\let\switcht@@therlang\relax -\let\svlanginfo\relax -% -\AtBeginDocument{\@ifpackageloaded{babel}{% -\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% -\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% -\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% -\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% -\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% -}{\switcht@@therlang}% -} -% -\def\ClassInfoNoLine#1#2{% - \ClassInfo{#1}{#2\@gobble}% -} -\let\journalopt\@empty -\DeclareOption*{% -\InputIfFileExists{sv\CurrentOption.clo}{% -\global\let\journalopt\CurrentOption}{% -\ClassWarning{Springer-SVJour2}{Specified option or subpackage -"\CurrentOption" not found -}\OptionNotUsed}} -\ExecuteOptions{a4paper,twoside,10pt,instindent} -\ProcessOptions -% -\ifx\journalopt\@empty\relax -\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) -\MessageBreak not found in option list of \string\documentclass -\MessageBreak - autoactivating "global" style}{} -\input{svglov2.clo} -\else -\@ifundefined{validfor}{% -\ClassError{Springer-SVJour2}{Possible option clash for sub-package -\MessageBreak "sv\journalopt.clo" - option file not valid -\MessageBreak for this class}{Perhaps you used an option of the old -Springer class SVJour!} -}{} -\fi -% -\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi -% -\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi -\@gtempa\makeatother} -\newcommand{\columncase}{\makeatletter\twocoltest} -% -\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} -\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} -\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} -\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} -\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} -\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} -\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} -\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} -\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} -\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} -\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} -% -\setlength\parindent{15\p@} -\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} -\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} -\setlength\headheight{12\p@} -\setlength\headsep {16.74dd} -\setlength\topskip {10\p@} -\setlength\footskip{30\p@} -\setlength\maxdepth{.5\topskip} -% -\@settopoint\textwidth -\setlength\marginparsep {10\p@} -\setlength\marginparpush{5\p@} -\setlength\topmargin{-10pt} -\if@twocolumn - \setlength\oddsidemargin {-30\p@} - \setlength\evensidemargin{-30\p@} -\else - \setlength\oddsidemargin {\z@} - \setlength\evensidemargin{\z@} -\fi -\setlength\marginparwidth {48\p@} -\setlength\footnotesep{8\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} -\setlength\@fptop{0\p@} -\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@fpbot{0\p@ \@plus 1fil} -\setlength\@dblfptop{0\p@} -\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} -\setlength\@dblfpbot{0\p@ \@plus 1fil} -\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} -\def\@listi{\leftmargin\leftmargini - \parsep \z@ - \topsep 6\p@ \@plus2\p@ \@minus4\p@ - \itemsep\parsep} -\let\@listI\@listi -\@listi -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \z@ - \parsep \topsep - \itemsep \parsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} -% -\setlength\lineskip{1\p@} -\setlength\normallineskip{1\p@} -\renewcommand\baselinestretch{} -\setlength\parskip{0\p@ \@plus \p@} -\@lowpenalty 51 -\@medpenalty 151 -\@highpenalty 301 -\setcounter{topnumber}{4} -\renewcommand\topfraction{.9} -\setcounter{bottomnumber}{2} -\renewcommand\bottomfraction{.7} -\setcounter{totalnumber}{6} -\renewcommand\textfraction{.1} -\renewcommand\floatpagefraction{.85} -\setcounter{dbltopnumber}{3} -\renewcommand\dbltopfraction{.85} -\renewcommand\dblfloatpagefraction{.85} -\def\ps@headings{% - \let\@oddfoot\@empty\let\@evenfoot\@empty - \def\@evenhead{\small\csname runheadhook\endcsname - \rlap{\thepage}\hfil\leftmark\unskip}% - \def\@oddhead{\small\csname runheadhook\endcsname - \ignorespaces\rightmark\hfil\llap{\thepage}}% - \let\@mkboth\@gobbletwo - \let\sectionmark\@gobble - \let\subsectionmark\@gobble - } -% make indentations changeable -\def\setitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmargini\labelwidth - \advance\leftmargini\labelsep - \def\@listi{\leftmargin\leftmargini - \labelwidth\leftmargini\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\medskipamount - \itemsep=\parskip \advance\itemsep by -\parsep}} -\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% - \leftmarginii\labelwidth - \advance\leftmarginii\labelsep -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth by -\labelsep - \parsep=\parskip - \topsep=\z@ - \itemsep=\parskip \advance\itemsep by -\parsep}} -% labels of description -\def\descriptionlabel#1{\hspace\labelsep #1\hfil} -% adjusted environment "description" -% if an optional parameter (at the first two levels of lists) -% is present, its width is considered to be the widest mark -% throughout the current list. -\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ - \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} -\let\enddescription\endlist -% -\def\describelabel#1{#1\hfil} -\def\@describe[#1]{\relax\ifnum\@listdepth=0 -\setitemindent{#1}\else\ifnum\@listdepth=1 -\setitemitemindent{#1}\fi\fi -\list{--}{\let\makelabel\describelabel}} -% -\newdimen\logodepth -\logodepth=1.2cm -\newdimen\headerboxheight -\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip -\advance\headerboxheight by-14.5mm -\newdimen\betweenumberspace % dimension for space between -\betweenumberspace=3.33pt % number and text of titles. -\newdimen\aftertext % dimension for space after -\aftertext=5pt % text of title. -\newdimen\headlineindent % dimension for space between -\headlineindent=1.166cm % number and text of headings. -\if@mathematic - \def\runinend{} % \enspace} - \def\floatcounterend{\enspace} - \def\sectcounterend{} -\else - \def\runinend{.} - \def\floatcounterend{.\ } - \def\sectcounterend{.} -\fi -\def\email#1{\emailname: #1} -\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\keywordname\enspace\ignorespaces#1\par}} -% -\def\subclassname{{\bfseries Mathematics Subject Classification -(2000)}\enspace} -\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\subclassname\ignorespaces#1\par}} -% -\def\PACSname{\textbf{PACS}\enspace} -\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\PACSname\ignorespaces#1\par}} -% -\def\CRclassname{{\bfseries CR Subject Classification}\enspace} -\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm -\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ -}\noindent\CRclassname\ignorespaces#1\par}} -% -\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} -\def\ESM#1{\par\addvspace\medskipamount -\noindent\ESMname\ignorespaces#1\par} -% -\newcounter{inst} -\newcounter{auth} -\def\authdepth{2} -\newdimen\instindent -\newbox\authrun -\newtoks\authorrunning -\newbox\titrun -\newtoks\titlerunning -\def\authorfont{\bfseries} - -\def\combirunning#1{\gdef\@combi{#1}} -\def\@combi{} -\newbox\combirun -% -\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil -\lastevenhead}} -\newcounter{lastpage} -\def\islastpageeven{\@ifundefined{lastpagenumber} -{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} -\ifnum\value{lastpage}>0 - \ifodd\value{lastpage}% - \else - \if@smartrunh - \thispagestyle{last}% - \fi - \fi -\fi} -\def\getlastpagenumber{\clearpage -\addtocounter{page}{-1}% - \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% - \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% - \addtocounter{page}{1}} - -\def\journalname#1{\gdef\@journalname{#1}} - -\def\dedication#1{\gdef\@dedic{#1}} -\def\@dedic{} - -\let\@date\undefined -\def\notused{~} - -\def\institute#1{\gdef\@institute{#1}} - -\def\offprints#1{\begingroup -\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks -\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests -to\/}: \ignorespaces#1}}\endgroup\ignorespaces} - -%\def\mail#1{\gdef\@mail{#1}} -%\def\@mail{} - -\def\@thanks{} - -\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% - \or \dagger\or \ddagger\or - \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger - \or \ddagger\ddagger \else\@ctrerr\fi\relax} -% -%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} -% -\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks - \protect\footnotetext[0]{\kern-\bibindent##1}}}} -% -\def\subtitle#1{\gdef\@subtitle{#1}} -\def\@subtitle{} - -\def\headnote#1{\gdef\@headnote{#1}} -\def\@headnote{} - -\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} -\def\paper@type{} - -\def\ch@ckobl#1#2{\@ifundefined{@#1} - {\typeout{SVJour2 warning: Missing -\expandafter\string\csname#1\endcsname}% - \csname #1\endcsname{#2}} - {}} -% -\def\ProcessRunnHead{% - \def\\{\unskip\ \ignorespaces}% - \def\thanks##1{\unskip{}}% - \instindent=\textwidth - \advance\instindent by-\headlineindent - \if!\the\titlerunning!\else - \edef\@title{\the\titlerunning}% - \fi - \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title - \unskip}% - \ifdim\wd\titrun>\instindent - \typeout{^^JSVJour2 Warning: Title too long for running head.}% - \typeout{Please supply a shorter form with \string\titlerunning - \space prior to \string\maketitle}% - \global\setbox\titrun=\hbox{\small\rmfamily - Title Suppressed Due to Excessive Length}% - \fi - \xdef\@title{\copy\titrun}% -% - \if!\the\authorrunning! - \else - \setcounter{auth}{1}% - \edef\@author{\the\authorrunning}% - \fi - \ifnum\value{inst}>\authdepth - \def\stripauthor##1\and##2\endauthor{% - \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% - \expandafter\stripauthor\@author\and\endauthor - \else - \gdef\and{\unskip, \ignorespaces}% - {\def\and{\noexpand\protect\noexpand\and}% - \protected@xdef\@author{\@author}} - \fi - \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces - \@author\unskip}% - \ifdim\wd\authrun>\instindent - \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. - ^^JPlease supply a shorter form with \string\authorrunning - \space prior to \string\maketitle}% - \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version - with: {\tt\string\authorrunning\space and - \string\titlerunning\space prior to \string\maketitle}}% - \fi - \xdef\@author{\copy\authrun}% - \markboth{\@author}{\@title}% -} -% -\let\orithanks=\thanks -\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be -used inside of \string\title, \string\author,\MessageBreak -and \string\date\space prior to \string\maketitle}} -% -\def\maketitle{\par\let\thanks=\orithanks -\ch@ckobl{journalname}{Noname} -\ch@ckobl{date}{the date of receipt and acceptance should be inserted -later} -\ch@ckobl{title}{A title should be given} -\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} -\ch@ckobl{institute}{Address(es) of author(s) should be given} -\begingroup -% - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \def\@makefnmark{$^{\@thefnmark}$}% - \renewcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt - width0pt depth8pt} -% - \def\lastand{\ifnum\value{inst}=2\relax - \unskip{} \andname\ - \else - \unskip, \andname\ - \fi}% - \def\and{\stepcounter{auth}\relax - \if@smartand - \ifnum\value{auth}=\value{inst}% - \lastand - \else - \unskip, - \fi - \else - \unskip, - \fi}% - \thispagestyle{empty} - \ifnum \col@number=\@ne - \@maketitle - \else - \twocolumn[\@maketitle]% - \fi -% - \global\@topnum\z@ - \if!\@thanks!\else - \@thanks -\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% - \fi - {\def\thanks##1{\unskip{}}% - \def\iand{\\[5pt]\let\and=\nand}% - \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% - \let\and=\nand - \def\at{\\\let\and=\iand}% - \footnotetext[0]{\kern-\bibindent - \ignorespaces\@institute}\vspace{5dd}}% -%\if!\@mail!\else -% \footnotetext[0]{\kern-\bibindent\mailname\ -% \ignorespaces\@mail}% -%\fi -% - \if@runhead - \ProcessRunnHead - \fi -% - \endgroup - \setcounter{footnote}{0} - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty - \global\let\@author\@empty - \global\let\@date\@empty - \global\let\@title\@empty - \global\let\@subtitle\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax} - -\def\makeheadbox{{% -\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox -to\hsize{\vrule\kern3pt\vbox{\kern3pt -\hbox{\bfseries\@journalname\ manuscript No.} -\hbox{(will be inserted by the editor)} -\kern3pt}\hfil\kern3pt\vrule}\hrule}% -\hss}}} -% -\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance -\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima -\@width\z@} -\newdimen\rubricwidth -% -\def\@maketitle{\newpage -\normalfont -\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi -\nointerlineskip -\makeheadbox\vss}\nointerlineskip -\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth -\vskip-12.5pt -\if@twocolumn\else % one column journal - \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section - \vskip-\topskip -\fi -\hrule\@height0.35mm\noindent -\advance\fboxsep by.25mm -\global\advance\rubricwidth by0pt -\rubric -\vss}\vskip19.5pt -% -\if@twocolumn\else - \gdef\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth %rubricwidth - \kern2.6\p@} -\fi -% - \setbox\authrun=\vbox\bgroup - \hrule\@height 9mm\@width0\p@ - \pretolerance=10000 - \rightskip=0pt plus 4cm - \nothanksmarks -% \if!\@headnote!\else -% \noindent -% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm -% \fi - {\authorfont - \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% - \hfuzz=2\textwidth\def\thanks##1{}\@author}% - \setcounter{footnote}{0}% - \global\value{inst}=\value{auth}% - \setcounter{auth}{1}% - \if@twocolumn - \rightskip43mm plus 4cm minus 3mm - \else % one column journal - \rightskip=\linewidth - \advance\rightskip by-\rubricwidth - \advance\rightskip by0pt plus 4cm minus 3mm - \fi -% -\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% - \noindent\ignorespaces\@author\vskip7.23pt} - {\LARGE\bfseries - \noindent\ignorespaces - \@title \par}\vskip 11.24pt\relax - \if!\@subtitle!\else - {\large\bfseries - \pretolerance=10000 - \rightskip=0pt plus 3cm - \vskip-5pt - \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt - \fi - \small - \if!\@dedic!\else - \par - \normalsize\it - \addvspace\baselineskip - \noindent\@dedic - \fi - \egroup % end of header box - \@tempdima=\headerboxheight - \advance\@tempdima by-\ht\authrun - \unvbox\authrun - \ifdim\@tempdima>0pt - \vrule width0pt height\@tempdima\par - \fi - \noindent{\small\@date\vskip 6.2mm} - \global\@minipagetrue - \global\everypar{\global\@minipagefalse\global\everypar{}}% -%\vskip22.47pt -} -% -\if@mathematic - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} - {\mbox{\boldmath$\textstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} - {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} -\else - \def\vec#1{\ensuremath{\mathchoice - {\mbox{\boldmath$\displaystyle#1$}} - {\mbox{\boldmath$\textstyle#1$}} - {\mbox{\boldmath$\scriptstyle#1$}} - {\mbox{\boldmath$\scriptscriptstyle#1$}}}} -\fi -% -\def\tens#1{\ensuremath{\mathsf{#1}}} -% -\setcounter{secnumdepth}{3} -\newcounter {section} -\newcounter {subsection}[section] -\newcounter {subsubsection}[subsection] -\newcounter {paragraph}[subsubsection] -\newcounter {subparagraph}[paragraph] -\renewcommand\thesection {\@arabic\c@section} -\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} -\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} -\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} -\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} -% -\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% - \hangindent \z@\noindent\box\@tempboxa} -% -\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend -\hskip\betweenumberspace} -% -\newif\if@sectrule -\if@twocolumn\else\let\@sectruletrue=\relax\fi -\if@avier\let\@sectruletrue=\relax\fi -\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip -\hrule\nobreak\parskip=5pt\relax\fi} -% -\let\makesectruleori=\makesectrule -\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} -\def\nosectrule{\let\makesectrule=\restoresectrule} -% -\def\@startsection#1#2#3#4#5#6{% - \if@noskipsec \leavevmode \fi - \par - \@tempskipa #4\relax - \@afterindenttrue - \ifdim \@tempskipa <\z@ - \@tempskipa -\@tempskipa \@afterindentfalse - \fi - \if@nobreak - \everypar{}% - \else - \addpenalty\@secpenalty\addvspace\@tempskipa - \fi - \ifnum#2=1\relax\@sectruletrue\fi - \@ifstar - {\@ssect{#3}{#4}{#5}{#6}}% - {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} -% -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{\makesectrule - \@hangfrom{\hskip #3\relax\@svsec}% - \raggedright - \hyphenpenalty \@M% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname\sectcounterend}% - \fi - #7}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8\/\hskip\aftertext}% - \csname #1mark\endcsname{#7}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - #7}}% - \fi - \@xsect{#5}} -% -\def\@ssect#1#2#3#4#5{% - \@tempskipa #3\relax - \ifdim \@tempskipa>\z@ - \begingroup - #4{\makesectrule - \@hangfrom{\hskip #1}% - \interlinepenalty \@M #5\@@par}% - \endgroup - \else - \def\@svsechd{#4{\hskip #1\relax #5}}% - \fi - \@xsect{#3}} - -% -% measures and setting of sections -% -\def\section{\@startsection{section}{1}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\bfseries\boldmath}} -\def\subsection{\@startsection{subsection}{2}{\z@}% - {-21dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\upshape}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-13dd plus-8pt minus-4pt}{10.5dd} - {\normalsize\itshape}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}% - {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} - -\setlength\leftmargini {\parindent} -\leftmargin \leftmargini -\setlength\leftmarginii {\parindent} -\setlength\leftmarginiii {1.87em} -\setlength\leftmarginiv {1.7em} -\setlength\leftmarginv {.5em} -\setlength\leftmarginvi {.5em} -\setlength \labelsep {.5em} -\setlength \labelwidth{\leftmargini} -\addtolength\labelwidth{-\labelsep} -\@beginparpenalty -\@lowpenalty -\@endparpenalty -\@lowpenalty -\@itempenalty -\@lowpenalty -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\normalfont\bfseries --} -\newcommand\labelitemii{\normalfont\bfseries --} -\newcommand\labelitemiii{$\m@th\bullet$} -\newcommand\labelitemiv{$\m@th\cdot$} - -\if@spthms -% definition of the "\spnewtheorem" command. -% -% Usage: -% -% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} -% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} -% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} -% -% New is "cap_font" and "body_font". It stands for -% fontdefinition of the caption and the text itself. -% -% "\spnewtheorem*" gives a theorem without number. -% -% A defined spnewthoerem environment is used as described -% by Lamport. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\@thmcountersep{} -\def\@thmcounterend{} -\newcommand\nocaption{\noexpand\@gobble} -\newdimen\spthmsep \spthmsep=5pt - -\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} - -% definition of \spnewtheorem with number - -\def\@spnthm#1#2{% - \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} -\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} - -\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}\@addtoreset{#1}{#3}% - \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand - \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\@definecounter{#1}% - \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@spothm#1[#2]#3#4#5{% - \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% - {\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{the#1}{\@nameuse{the#2}}% - \expandafter\xdef\csname #1name\endcsname{#3}% - \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% - \global\@namedef{end#1}{\@endtheorem}}}} - -\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\labelsep=\spthmsep\refstepcounter{#1}% -\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} - -\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% - \ignorespaces} - -\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname - the#1\endcsname}{#5}{#3}{#4}\ignorespaces} - -\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} -\normalthmheadings - -\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont - \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} -\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} - -% definition of \spnewtheorem* without number - -\def\@sthm#1#2{\@Ynthm{#1}{#2}} - -\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname - {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% - \expandafter\xdef\csname #1name\endcsname{#2}% - \global\@namedef{end#1}{\@endtheorem}}} - -\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ -\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} - -\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} - -\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} - {#4}{#2}{#3}\ignorespaces} - -\def\@Begintheorem#1#2#3{#3\trivlist - \item[\hskip\labelsep{#2#1\@thmcounterend}]} - -\def\@Opargbegintheorem#1#2#3#4{#4\trivlist - \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} - -% initialize theorem environment - -\if@envcntsect - \def\@thmcountersep{.} - \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} -\else - \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} - \if@envcntreset - \@addtoreset{theorem}{section} - \else - \@addtoreset{theorem}{chapter} - \fi -\fi - -%definition of divers theorem environments -\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} -\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} -\if@envcntsame % all environments like "Theorem" - using its counter - \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} -\else % all environments with their own counter - \if@envcntsect % show section counter - \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} - \else % not numbered with section - \if@envcntreset - \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} - \@addtoreset{#1}{section}} - \else - \let\spn@wtheorem=\@spynthm - \fi - \fi -\fi -% -\let\spdefaulttheorem=\spn@wtheorem -% -\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} -\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} -\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} -\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} -\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} -\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} -\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} -\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} -\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} -\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} -\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} -\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} -\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} -\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} -% -\newenvironment{theopargself} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} -\newenvironment{theopargself*} - {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist - \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} - \def\@Opargbegintheorem##1##2##3##4{##4\trivlist - \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} -% -\fi - -\def\@takefromreset#1#2{% - \def\@tempa{#1}% - \let\@tempd\@elt - \def\@elt##1{% - \def\@tempb{##1}% - \ifx\@tempa\@tempb\else - \@addtoreset{##1}{#2}% - \fi}% - \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname - \expandafter\def\csname cl@#2\endcsname{}% - \@tempc - \let\@elt\@tempd} - -\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} -\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} -\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil -\penalty50\hskip1em\null\nobreak\hfil\squareforqed -\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} - -% Define `abstract' environment -\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax -\trivlist\item[\hskip\labelsep -{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} -\if@twocolumn - \if@avier - \def\endabstract{\endtrivlist\addvspace{5mm}\strich} - \def\strich{\hrule\vskip1ptplus12pt} - \else - \def\endabstract{\endtrivlist\addvspace{3mm}} - \fi -\else -\fi -% -\newenvironment{verse} - {\let\\\@centercr - \list{}{\itemsep \z@ - \itemindent -1.5em% - \listparindent\itemindent - \rightmargin \leftmargin - \advance\leftmargin 1.5em}% - \item\relax} - {\endlist} -\newenvironment{quotation} - {\list{}{\listparindent 1.5em% - \itemindent \listparindent - \rightmargin \leftmargin - \parsep \z@ \@plus\p@}% - \item\relax} - {\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin}% - \item\relax} - {\endlist} -\newcommand\appendix{\par\small - \setcounter{section}{0}% - \setcounter{subsection}{0}% - \renewcommand\thesection{\@Alph\c@section}} -\setlength\arraycolsep{1.5\p@} -\setlength\tabcolsep{6\p@} -\setlength\arrayrulewidth{.4\p@} -\setlength\doublerulesep{2\p@} -\setlength\tabbingsep{\labelsep} -\skip\@mpfootins = \skip\footins -\setlength\fboxsep{3\p@} -\setlength\fboxrule{.4\p@} -\renewcommand\theequation{\@arabic\c@equation} -\newcounter{figure} -\renewcommand\thefigure{\@arabic\c@figure} -\def\fps@figure{tbp} -\def\ftype@figure{1} -\def\ext@figure{lof} -\def\fnum@figure{\figurename~\thefigure} -\newenvironment{figure} - {\@float{figure}} - {\end@float} -\newenvironment{figure*} - {\@dblfloat{figure}} - {\end@dblfloat} -\newcounter{table} -\renewcommand\thetable{\@arabic\c@table} -\def\fps@table{tbp} -\def\ftype@table{2} -\def\ext@table{lot} -\def\fnum@table{\tablename~\thetable} -\newenvironment{table} - {\@float{table}} - {\end@float} -\newenvironment{table*} - {\@dblfloat{table}} - {\end@dblfloat} -% -\def \@floatboxreset {% - \reset@font - \small - \@setnobreak - \@setminipage -} -% -\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} -% -\newlength\abovecaptionskip -\newlength\belowcaptionskip -\setlength\abovecaptionskip{10\p@} -\setlength\belowcaptionskip{0\p@} -\newcommand\leftlegendglue{} - -\def\fig@type{figure} - -\newdimen\figcapgap\figcapgap=3pt -\newdimen\tabcapgap\tabcapgap=5.5pt - -\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} - -\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -\def\capstrut{\vrule\@width\z@\@height\topskip} - -\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} - -\long\def\@makecaption#1#2{% - \captionstyle - \ifx\@captype\fig@type - \vskip\figcapgap - \fi - \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% - \capstrut #2}% - \ifdim \wd\@tempboxa >\hsize - {\floatlegendstyle #1\floatcounterend}\capstrut #2\par - \else - \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% - \fi - \ifx\@captype\fig@type\else - \vskip\tabcapgap - \fi} - -\newdimen\figgap\figgap=1cc -\long\def\@makesidecaption#1#2{% - \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle - #1\floatcounterend}#2}} -\def\sidecaption#1\caption{% -\setbox\@tempboxa=\hbox{#1\unskip}% -\if@twocolumn - \ifdim\hsize<\textwidth\else - \ifdim\wd\@tempboxa<\columnwidth - \typeout{Double column float fits into single column - - ^^Jyou'd better switch the environment. }% - \fi - \fi -\fi -\@tempdimb=\hsize -\advance\@tempdimb by-\figgap -\advance\@tempdimb by-\wd\@tempboxa -\ifdim\@tempdimb<3cm - \typeout{\string\sidecaption: No sufficient room for the legend; - using normal \string\caption. }% - \unhbox\@tempboxa - \let\@capcommand=\@caption -\else - \let\@capcommand=\@sidecaption - \leavevmode - \unhbox\@tempboxa - \hfill -\fi -\refstepcounter\@captype -\@dblarg{\@capcommand\@captype}} - -\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname - ext@#1\endcsname}{#1}{\protect\numberline{\csname - the#1\endcsname}{\ignorespaces #2}}\begingroup - \@parboxrestore - \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par - \endgroup} - -% Define `acknowledgement' environment -\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily -\trivlist\if!\ackname!\item[]\else -\item[\hskip\labelsep -{\bfseries\ackname}]\fi} -\def\endacknowledgement{\endtrivlist\addvspace{6pt}} -\newenvironment{acknowledgements}{\begin{acknowledgement}} -{\end{acknowledgement}} -% Define `noteadd' environment -\def\noteadd{\par\addvspace{17pt}\small\rmfamily -\trivlist\item[\hskip\labelsep -{\itshape\noteaddname}]} -\def\endnoteadd{\endtrivlist\addvspace{6pt}} - -\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} -\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} -\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} -\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} -\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} -\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} -\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} -\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} -\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} -\newcommand\@pnumwidth{1.55em} -\newcommand\@tocrmarg{2.55em} -\newcommand\@dotsep{4.5} -\setcounter{tocdepth}{1} -\newcommand\tableofcontents{% - \section*{\contentsname}% - \@starttoc{toc}% - \addtocontents{toc}{\begingroup\protect\small}% - \AtEndDocument{\addtocontents{toc}{\endgroup}}% - } -\newcommand*\l@part[2]{% - \ifnum \c@tocdepth >-2\relax - \addpenalty\@secpenalty - \addvspace{2.25em \@plus\p@}% - \begingroup - \setlength\@tempdima{3em}% - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - {\leavevmode - \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par - \nobreak - \if@compatibility - \global\@nobreaktrue - \everypar{\global\@nobreakfalse\everypar{}}% - \fi - \endgroup - \fi} -\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} -\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} -\newcommand\listoffigures{% - \section*{\listfigurename - \@mkboth{\listfigurename}% - {\listfigurename}}% - \@starttoc{lof}% - } -\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} -\newcommand\listoftables{% - \section*{\listtablename - \@mkboth{\listtablename}{\listtablename}}% - \@starttoc{lot}% - } -\let\l@table\l@figure -\newdimen\bibindent -\setlength\bibindent{\parindent} -\def\@biblabel#1{#1.} -\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw - {\let\protect\noexpand - \immediate - \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} -\newenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\refname}{\refname}}\small - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy\clubpenalty4000\widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} -% -\newcount\@tempcntc -\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi - \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do - {\@ifundefined - {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries - ?}\@warning - {Citation `\@citeb' on page \thepage \space undefined}}% - {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% - \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne - \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% - \else - \advance\@tempcntb\@ne - \ifnum\@tempcntb=\@tempcntc - \else\advance\@tempcntb\m@ne\@citeo - \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} -\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else - \@citea\def\@citea{,\hskip0.1em\ignorespaces}% - \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else - {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi - \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} -% -\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} -\let\@openbib@code\@empty -\newenvironment{theindex} - {\if@twocolumn - \@restonecolfalse - \else - \@restonecoltrue - \fi - \columnseprule \z@ - \columnsep 35\p@ - \twocolumn[\section*{\indexname}]% - \@mkboth{\indexname}{\indexname}% - \thispagestyle{plain}\parindent\z@ - \parskip\z@ \@plus .3\p@\relax - \let\item\@idxitem} - {\if@restonecol\onecolumn\else\clearpage\fi} -\newcommand\@idxitem{\par\hangindent 40\p@} -\newcommand\subitem{\@idxitem \hspace*{20\p@}} -\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} -\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} - -\if@twocolumn - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width\columnwidth - \kern2.6\p@} -\else - \renewcommand\footnoterule{% - \kern-3\p@ - \hrule\@width.382\columnwidth - \kern2.6\p@} -\fi -\newcommand\@makefntext[1]{% - \noindent - \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} -% -\def\trans@english{\switcht@albion} -\def\trans@french{\switcht@francais} -\def\trans@german{\switcht@deutsch} -\newenvironment{translation}[1]{\if!#1!\else -\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% -\fi}{} -% languages -% English section -\def\switcht@albion{%\typeout{English spoken.}% - \def\abstractname{Abstract}% - \def\ackname{Acknowledgements}% - \def\andname{and}% - \def\lastandname{, and}% - \def\appendixname{Appendix}% - \def\chaptername{Chapter}% - \def\claimname{Claim}% - \def\conjecturename{Conjecture}% - \def\contentsname{Contents}% - \def\corollaryname{Corollary}% - \def\definitionname{Definition}% - \def\emailname{E-mail}% - \def\examplename{Example}% - \def\exercisename{Exercise}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Keywords}}% - \def\indexname{Index}% - \def\lemmaname{Lemma}% - \def\contriblistname{List of Contributors}% - \def\listfigurename{List of Figures}% - \def\listtablename{List of Tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note added in proof}% - \def\notename{Note}% - \def\partname{Part}% - \def\problemname{Problem}% - \def\proofname{Proof}% - \def\propertyname{Property}% - \def\questionname{Question}% - \def\refname{References}% - \def\remarkname{Remark}% - \def\seename{see}% - \def\solutionname{Solution}% - \def\tablename{Table}% - \def\theoremname{Theorem}% -}\switcht@albion % make English default -% -% French section -\def\switcht@francais{\svlanginfo -%\typeout{On parle francais.}% - \def\abstractname{R\'esum\'e\runinend}% - \def\ackname{Remerciements\runinend}% - \def\andname{et}% - \def\lastandname{ et}% - \def\appendixname{Appendice}% - \def\chaptername{Chapitre}% - \def\claimname{Pr\'etention}% - \def\conjecturename{Hypoth\`ese}% - \def\contentsname{Table des mati\`eres}% - \def\corollaryname{Corollaire}% - \def\definitionname{D\'efinition}% - \def\emailname{E-mail}% - \def\examplename{Exemple}% - \def\exercisename{Exercice}% - \def\figurename{Fig.}% - \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% - \def\indexname{Index}% - \def\lemmaname{Lemme}% - \def\contriblistname{Liste des contributeurs}% - \def\listfigurename{Liste des figures}% - \def\listtablename{Liste des tables}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% - \def\notename{Remarque}% - \def\partname{Partie}% - \def\problemname{Probl\`eme}% - \def\proofname{Preuve}% - \def\propertyname{Caract\'eristique}% -%\def\propositionname{Proposition}% - \def\questionname{Question}% - \def\refname{Bibliographie}% - \def\remarkname{Remarque}% - \def\seename{voyez}% - \def\solutionname{Solution}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tableau}% - \def\theoremname{Th\'eor\`eme}% -} -% -% German section -\def\switcht@deutsch{\svlanginfo -%\typeout{Man spricht deutsch.}% - \def\abstractname{Zusammenfassung\runinend}% - \def\ackname{Danksagung\runinend}% - \def\andname{und}% - \def\lastandname{ und}% - \def\appendixname{Anhang}% - \def\chaptername{Kapitel}% - \def\claimname{Behauptung}% - \def\conjecturename{Hypothese}% - \def\contentsname{Inhaltsverzeichnis}% - \def\corollaryname{Korollar}% -%\def\definitionname{Definition}% - \def\emailname{E-Mail}% - \def\examplename{Beispiel}% - \def\exercisename{\"Ubung}% - \def\figurename{Abb.}% - \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% - \def\indexname{Index}% -%\def\lemmaname{Lemma}% - \def\contriblistname{Mitarbeiter}% - \def\listfigurename{Abbildungsverzeichnis}% - \def\listtablename{Tabellenverzeichnis}% - \def\mailname{{\itshape Correspondence to\/}:}% - \def\noteaddname{Nachtrag}% - \def\notename{Anmerkung}% - \def\partname{Teil}% -%\def\problemname{Problem}% - \def\proofname{Beweis}% - \def\propertyname{Eigenschaft}% -%\def\propositionname{Proposition}% - \def\questionname{Frage}% - \def\refname{Literatur}% - \def\remarkname{Anmerkung}% - \def\seename{siehe}% - \def\solutionname{L\"osung}% -%\def\subclassname{{\it Subject Classifications\/}:}% - \def\tablename{Tabelle}% -%\def\theoremname{Theorem}% -} -\newcommand\today{} -\edef\today{\ifcase\month\or - January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} -\setlength\columnsep{1.5cc} -\setlength\columnseprule{0\p@} -% -\frenchspacing -\clubpenalty=10000 -\widowpenalty=10000 -\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil -\global\let\@textbottom\relax}} -\pagestyle{headings} -\pagenumbering{arabic} -\if@twocolumn - \twocolumn -\fi -\if@avier - \onecolumn - \setlength{\textwidth}{156mm} - \setlength{\textheight}{226mm} -\fi -\if@referee - \makereferee -\fi -\flushbottom -\endinput -%% -%% End of file `svjour2.cls'. diff --git a/vldb/pt/vldb.tex b/vldb/pt/vldb.tex deleted file mode 100644 index 807080a..0000000 --- a/vldb/pt/vldb.tex +++ /dev/null @@ -1,150 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% -% -% This is a template file for the LaTeX package SVJour2 for the -% Springer journal "The VLDB Journal". -% -% Springer Heidelberg 2004/12/03 -% -% Copy it to a new file with a new name and use it as the basis -% for your article. Delete % as needed. -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% First comes an example EPS file -- just ignore it and -% proceed on the \documentclass line -% your LaTeX will extract the file if required -%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 19 19 221 221 -%%CreationDate: Mon Sep 29 1997 -%%Creator: programmed by hand (JK) -%%EndComments -%gsave -%newpath -% 20 20 moveto -% 20 220 lineto -% 220 220 lineto -% 220 20 lineto -%closepath -%2 setlinewidth -%gsave -% .4 setgray fill -%grestore -%stroke -%grestore -%\end{filecontents*} -% -\documentclass[twocolumn,fleqn,runningheads]{svjour2} -% -\smartqed % flush right qed marks, e.g. at end of proof -% -\usepackage{graphicx} -\usepackage{listings} -% -% \usepackage{mathptmx} % use Times fonts if available on your TeX system -% -% insert here the call for the packages your document requires -%\usepackage{latexsym} -% etc. -% -% please place your own definitions here and don't use \def but -% \newcommand{}{} -% - -\lstset{ - language=Pascal, - basicstyle=\fontsize{9}{9}\selectfont, - captionpos=t, - aboveskip=1mm, - belowskip=1mm, - abovecaptionskip=1mm, - belowcaptionskip=1mm, -% numbers = left, - mathescape=true, - escapechar=@, - extendedchars=true, - showstringspaces=false, - columns=fixed, - basewidth=0.515em, - frame=single, - framesep=2mm, - xleftmargin=2mm, - xrightmargin=2mm, - framerule=0.5pt -} - -\def\cG{{\mathcal G}} -\def\crit{{\rm crit}} -\def\ncrit{{\rm ncrit}} -\def\scrit{{\rm scrit}} -\def\bedges{{\rm bedges}} -\def\ZZ{{\mathbb Z}} - -\journalname{The VLDB Journal} -% -\begin{document} - -\title{Minimal Perfect Hash Functions: New Algorithms and Applications\thanks{ -This work was supported in part by -GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, -CAPES/PROF Scholarship (Fabiano C. Botelho), -FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 -(Yoshiharu Kohayakawa), -and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} -} -%\subtitle{Do you have a subtitle?\\ If so, write it here} - -%\titlerunning{Short form of title} % if too long for running head - -\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} -%\authorrunning{Short form of author list} % if too long for running head -\institute{ -F. C. Botelho \and -N. Ziviani \at -Dept. of Computer Science, -Federal Univ. of Minas Gerais, -Belo Horizonte, Brazil\\ -\email{\{fbotelho,nivio\}@dcc.ufmg.br} -\and -D. C. Reis \at -Google, Brazil \\ -\email{davi.reis@gmail.com} -\and -Y. Kohayakawa -Dept. of Computer Science, -Univ. of S\~ao Paulo, -S\~ao Paulo, Brazil\\ -\email{yoshi@ime.usp.br} -} - -\date{Received: date / Accepted: date} -% The correct dates will be entered by the editor - - -\maketitle - -\begin{abstract} -Insert your abstract here. Include up to five keywords. -\keywords{First keyword \and Second keyword \and More} -\end{abstract} - -% main text -\input{introduction} -\input{relatedwork} -\input{algorithms} -\input{experimentalresults} -\input{applications} -\input{conclusions} - - -%\begin{acknowledgements} -%If you'd like to thank anyone, place your comments here -%and remove the percent signs. -%\end{acknowledgements} - -% BibTeX users please use -%\bibliographystyle{spmpsci} -%\bibliography{} % name your BibTeX data base -\bibliographystyle{plain} -\bibliography{references} -\end{document} From fe4600148e866bfea8d6d9860ed7f78cf555bf8d Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 17:32:31 +0000 Subject: [PATCH 349/739] paper for vldb07 added --- vldb07/acknowledgments.tex | 7 + vldb07/analyticalresults.tex | 174 +++ vldb07/appendix.tex | 6 + vldb07/conclusions.tex | 42 + vldb07/costhashingbuckets.tex | 177 +++ vldb07/determiningb.tex | 146 +++ vldb07/diskaccess.tex | 113 ++ vldb07/experimentalresults.tex | 15 + vldb07/figs/bmz_temporegressao.png | Bin 0 -> 5769 bytes vldb07/figs/brz-partitioning.fig | 107 ++ vldb07/figs/brz-partitioningfabiano.fig | 126 ++ vldb07/figs/brz.fig | 183 +++ vldb07/figs/brz_temporegressao.png | Bin 0 -> 5671 bytes vldb07/figs/brzfabiano.fig | 153 +++ vldb07/figs/minimalperfecthash-ph-mph.png | Bin 0 -> 3916 bytes vldb07/introduction.tex | 109 ++ vldb07/makefile | 17 + vldb07/partitioningthekeys.tex | 141 ++ vldb07/performancenewalgorithm.tex | 113 ++ vldb07/references.bib | 814 ++++++++++++ vldb07/relatedwork.tex | 112 ++ vldb07/searching.tex | 155 +++ vldb07/svglov2.clo | 77 ++ vldb07/svjour2.cls | 1419 +++++++++++++++++++++ vldb07/terminology.tex | 18 + vldb07/thealgorithm.tex | 78 ++ vldb07/thedataandsetup.tex | 21 + vldb07/vldb.tex | 194 +++ 28 files changed, 4517 insertions(+) create mode 100755 vldb07/acknowledgments.tex create mode 100755 vldb07/analyticalresults.tex create mode 100644 vldb07/appendix.tex create mode 100755 vldb07/conclusions.tex create mode 100755 vldb07/costhashingbuckets.tex create mode 100755 vldb07/determiningb.tex create mode 100755 vldb07/diskaccess.tex create mode 100755 vldb07/experimentalresults.tex create mode 100644 vldb07/figs/bmz_temporegressao.png create mode 100644 vldb07/figs/brz-partitioning.fig create mode 100755 vldb07/figs/brz-partitioningfabiano.fig create mode 100755 vldb07/figs/brz.fig create mode 100644 vldb07/figs/brz_temporegressao.png create mode 100755 vldb07/figs/brzfabiano.fig create mode 100644 vldb07/figs/minimalperfecthash-ph-mph.png create mode 100755 vldb07/introduction.tex create mode 100755 vldb07/makefile create mode 100755 vldb07/partitioningthekeys.tex create mode 100755 vldb07/performancenewalgorithm.tex create mode 100755 vldb07/references.bib create mode 100755 vldb07/relatedwork.tex create mode 100755 vldb07/searching.tex create mode 100644 vldb07/svglov2.clo create mode 100644 vldb07/svjour2.cls create mode 100755 vldb07/terminology.tex create mode 100755 vldb07/thealgorithm.tex create mode 100755 vldb07/thedataandsetup.tex create mode 100644 vldb07/vldb.tex diff --git a/vldb07/acknowledgments.tex b/vldb07/acknowledgments.tex new file mode 100755 index 0000000..d903ceb --- /dev/null +++ b/vldb07/acknowledgments.tex @@ -0,0 +1,7 @@ +\section{Acknowledgments} +This section is optional; it is a location for you +to acknowledge grants, funding, editing assistance and +what have you. In the present case, for example, the +authors would like to thank Gerald Murray of ACM for +his help in codifying this \textit{Author's Guide} +and the \textbf{.cls} and \textbf{.tex} files that it describes. diff --git a/vldb07/analyticalresults.tex b/vldb07/analyticalresults.tex new file mode 100755 index 0000000..06ea049 --- /dev/null +++ b/vldb07/analyticalresults.tex @@ -0,0 +1,174 @@ +%% Nivio: 23/jan/06 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Analytical results} +\label{sec:analytcal-results} + +\vspace{-1mm} +The purpose of this section is fourfold. +First, we show that our algorithm runs in expected time $O(n)$. +Second, we present the main memory requirements for constructing the MPHF. +Third, we discuss the cost of evaluating the resulting MPHF. +Fourth, we present the space required to store the resulting MPHF. + +\vspace{-2mm} +\subsection{The linear time complexity} +\label{sec:linearcomplexity} + +First, we show that the partitioning step presented in +Figure~\ref{fig:partitioningstep} runs in $O(n)$ time. +Each iteration of the {\bf for} loop in statement~1 +runs in $O(|B_j|)$ time, $1 \leq j \leq N$, where $|B_j|$ is the +number of keys +that fit in block $B_j$ of size $\mu$. This is because statement 1.1 just reads +$|B_j|$ keys from disk, statement 1.2 runs a bucket sort like algorithm +that is well known to be linear in the number of keys it sorts (i.e., $|B_j|$ keys), +and statement 1.3 just dumps $|B_j|$ keys to the disk into File $j$. +Thus, the {\bf for} loop runs in $O(\sum_{j=1}^{N}|B_j|)$ time. +As $\sum_{j=1}^{N}|B_j|=n$, then the partitioning step runs in $O(n)$ time. + +Second, we show that the searching step presented in +Figure~\ref{fig:searchingstep} also runs in $O(n)$ time. +The heap construction in statement 1 runs in $O(N)$ time, for $N \ll n$. +We have assumed that insertions and deletions in the heap cost $O(1)$ because +$N$ is typically much smaller than $n$ (see \cite[Section 6.4]{bkz06t} for details). +Statement 2 runs in $O(\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i])$ time +(remember that $\mathit{size}[i]$ stores the number of keys in bucket $i$). +As $\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i] = n$, if +statements 2.1, 2.2 and 2.3 run in $O(\mathit{size}[i])$ time, then statement 2 +runs in $O(n)$ time. + +%Statement 2.1 runs the algorithm to read a bucket from disk. That algorithm reads $\mathit{size}[i]$ +%keys of bucket $i$ that might be spread into many files or, in the worst case, +%into $|BS_{max}|$ files, where $|BS_{max}|$ is the number of keys in the bucket of maximum size. +%It uses the heap $H$ to drive a multiway merge of the sprayed bucket $i$. +%As we are considering that each read/write on disk costs $O(1)$ and +%each heap operation also costs $O(1)$ (recall $N \ll n$), then statement 2.1 +%costs $O(\mathit{size}[i])$ time. +%We need to take into account that this step could generate a lot of seeks on disk. +%However, the number of seeks can be amortized (see Section~\ref{sec:contr-disk-access}) +%and that is why we have been able of getting a MPHF for a set of 1 billion keys in less +%than 4 hours using a machine with just 500 MB of main memory +%(see Section~\ref{sec:performance}). +Statement 2.1 reads $O(\mathit{size}[i])$ keys of bucket $i$ +and is detailed in Figure~\ref{fig:readingbucket}. +As we are assuming that each read or write on disk costs $O(1)$ and +each heap operation also costs $O(1)$, statement~2.1 +takes $O(\mathit{size}[i])$ time. +However, the keys of bucket $i$ are distributed in at most~$BS_{max}$ files on disk +in the worst case +(recall that $BS_{max}$ is the maximum number of keys found in any bucket). +Therefore, we need to take into account that +the critical step in reading a bucket is in statement~1.3 of Figure~\ref{fig:readingbucket}, +where a seek operation in File $j$ +may be performed by the first read operation. + +In order to amortize the number of seeks performed we use a buffering technique~\cite{k73}. +We create a buffer $j$ of size \textbaht$\: = \mu/N$ for each file $j$, +where $1\leq j \leq N$ +(recall that $\mu$ is the size in bytes of an a priori reserved internal memory area). +Every time a read operation is requested to file $j$ and the data is not found +in the $j$th~buffer, \textbaht~bytes are read from file $j$ to buffer $j$. +Hence, the number of seeks performed in the worst case is given by +$\beta/$\textbaht~(remember that $\beta$ is the size in bytes of $S$). +For that we have made the pessimistic assumption that one seek happens every time +buffer $j$ is filled in. +Thus, the number of seeks performed in the worst case is $64n/$\textbaht, since +each URL is 64 bytes long on average. Therefore, the number of seeks is linear on +$n$ and amortized by \textbaht. + +It is important to emphasize two things. +First, the operating system uses techniques +to diminish the number of seeks and the average seek time. +This makes the amortization factor to be greater than \textbaht~in practice. +Second, almost all main memory is available to be used as +file buffers because just a small vector +of $\lceil n/b\rceil$ one-byte entries must be maintained in main memory, +as we show in Section~\ref{sec:memconstruction}. + + +Statement 2.2 runs our internal memory based algorithm in order to generate a MPHF for each bucket. +That algorithm is linear, as we showed in~\cite{bkz05}. As it is applied to buckets with {\it size}$[i]$ keys, statement~2.2 takes $O(\mathit{size}[i])$ time. + +Statement 2.3 has time complexity $O(\mathit{size}[i])$ because it writes to disk +the description of each generated MPHF and each description is stored in +$c \times \mathit{size}[i] + O(1)$ bytes, where $c\in[0.93,1.15]$. +In conclusion, our algorithm takes $O(n)$ time because both the partitioning and +the searching steps run in $O(n)$ time. + +An experimental validation of the above proof and a performance comparison with +our internal memory based algorithm~\cite{bkz05} were not included here due to +space restrictions but can be found in~\cite{bkz06t} and also in the appendix. + +\vspace{-1mm} +\enlargethispage{2\baselineskip} +\subsection{Space used for constructing a MPHF} +\label{sec:memconstruction} + +The vector {\it size} is kept in main memory +all the time. +The vector {\it size} has $\lceil n/b \rceil$ one-byte entries. +It stores the number of keys in each bucket and +those values are less than or equal to 256. +For example, for a set of 1 billion keys and $b=175$ the vector size needs +$5.45$ megabytes of main memory. + +We need an internal memory area of size $\mu$ bytes to be used in +the partitioning step and in the searching step. +The size $\mu$ is fixed a priori and depends only on the amount +of internal memory available to run the algorithm +(i.e., it does not depend on the size $n$ of the problem). + +% One could argue about the a priori reserved internal memory area and the main memory +% required to run the indirect bucket sort algorithm. +% Those internal memory requirements do not depend on the size of the problem +% (i.e., the number of keys being hashed) and can be fixed a priori. + +The additional space required in the searching step +is constant, once the problem was broken down +into several small problems (at most 256 keys) and +the heap size is supposed to be much smaller than $n$ ($N \ll n$). +For example, for a set of 1 billion keys and an internal area of~$\mu = 250$ megabytes, +the number of files is $N = 248$. + +\vspace{-1mm} +\subsection{Evaluation cost of the MPHF} + +Now we consider the amount of CPU time +required by the resulting MPHF at retrieval time. +The MPHF requires for each key the computation of three +universal hash functions and three memory accesses +(see Eqs.~(\ref{eq:mphf}), (\ref{eq:bucketindex}) and (\ref{eq:mphfi})). +This is not optimal. Pagh~\cite{p99} showed that any MPHF requires +at least the computation of two universal hash functions and one memory +access. + +\subsection{Description size of the MPHF} + +The number of bits required to store the MPHF generated by the algorithm +is computed by Eq.~(\ref{eq:newmphfbits}). +We need to store each $g_i$ vector presented in Eq.~(\ref{eq:mphfi}), where +$0\leq i < \lceil n/b \rceil$. As each bucket has at most 256 keys, each +entry in a $g_i$ vector has 8~bits. In each $g_i$ vector there are +$c \times \mathit{size}[i]$ entries (recall $c\in[0.93, 1.15]$). +When we sum up the number of entries of $\lceil n/b \rceil$ $g_i$ vectors we have +$c\sum_{i=0}^{\lceil n/b \rceil -1} \mathit{size}[i]=cn$ entries. We also need to +store $3 \lceil n/b \rceil$ integer numbers of +$\log_2n$ bits referring respectively to the {\it offset} vector and the two random seeds of +$h_{1i}$ and $h_{2i}$. In addition, we need to store $\lceil n/b \rceil$ 8-bit entries of +the vector {\it size}. Therefore, +\begin{eqnarray}\label{eq:newmphfbits} +\mathrm{Required\: Space} = 8cn + \frac{n}{b}\left( 3\log_2n +8\right) \: +\mathrm{bits}. +\end{eqnarray} + +Considering $c=0.93$ and $b=175$, the number of bits per key to store +the description of the resulting MPHF for a set of 1~billion keys is $8.1$. +If we set $b=128$, then the bits per key ratio increases to $8.3$. +Theoretically, the number of bits required to store the MPHF in +Eq.~(\ref{eq:newmphfbits}) +is $O(n\log n)$ as~$n\to\infty$. However, for sets of size up to $2^{b/3}$ keys +the number of bits per key is lower than 9~bits (note that +$2^{b/3}>2^{58}>10^{17}$ for $b=175$). +%For $b=175$, the number of bits per key will be close to 9 for a set of $2^{58}$ keys. +Thus, in practice the resulting function is stored in $O(n)$ bits. diff --git a/vldb07/appendix.tex b/vldb07/appendix.tex new file mode 100644 index 0000000..288ad8a --- /dev/null +++ b/vldb07/appendix.tex @@ -0,0 +1,6 @@ +\appendix +\input{experimentalresults} +\input{thedataandsetup} +\input{costhashingbuckets} +\input{performancenewalgorithm} +\input{diskaccess} diff --git a/vldb07/conclusions.tex b/vldb07/conclusions.tex new file mode 100755 index 0000000..8d32741 --- /dev/null +++ b/vldb07/conclusions.tex @@ -0,0 +1,42 @@ +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Concluding remarks} +\label{sec:concuding-remarks} + +This paper has presented a novel external memory based algorithm for +constructing MPHFs that works for sets in the order of billions of keys. The +algorithm outputs the resulting function in~$O(n)$ time and, furthermore, it +can be tuned to run only $34\%$ slower (see \cite{bkz06t} for details) than the fastest +algorithm available in the literature for constructing MPHFs~\cite{bkz05}. +In addition, the space +requirement of the resulting MPHF is of up to 9 bits per key for datasets of +up to $2^{58}\simeq10^{17.4}$ keys. + +The algorithm is simple and needs just a +small vector of size approximately 5.45 megabytes in main memory to construct +a MPHF for a collection of 1 billion URLs, each one 64 bytes long on average. +Therefore, almost all main memory is available to be used as disk I/O buffer. +Making use of such a buffering scheme considering an internal memory area of size +$\mu=200$ megabytes, our algorithm can produce a MPHF for a +set of 1 billion URLs in approximately 3.6 hours using a commodity PC of 2.4 gigahertz and +500 megabytes of main memory. +If we increase both the main memory +available to 1 gigabyte and the internal memory area to $\mu=500$ megabytes, +a MPHF for the set of 1 billion URLs is produced in approximately 3 hours. For any +key, the evaluation of the resulting MPHF takes three memory accesses and the +computation of three universal hash functions. + +In order to allow the reproduction of our results and the utilization of both the internal memory +based algorithm and the external memory based algorithm, +the algorithms are available at \texttt{http://cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +They were implemented in the C language. + +In future work, we will exploit the fact that the searching step intrinsically +presents a high degree of parallelism and requires $73\%$ of the +construction time. Therefore, a parallel implementation of our algorithm will +allow the construction and the evaluation of the resulting function in parallel. +Therefore, the description of the resulting MPHFs will be distributed in the paralell +computer allowing the scalability to sets of hundreds of billions of keys. +This is an important contribution, mainly for applications related to the Web, as +mentioned in Section~\ref{sec:intro}. \ No newline at end of file diff --git a/vldb07/costhashingbuckets.tex b/vldb07/costhashingbuckets.tex new file mode 100755 index 0000000..3a624ce --- /dev/null +++ b/vldb07/costhashingbuckets.tex @@ -0,0 +1,177 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Performance of the internal memory based algorithm} +\label{sec:intern-memory-algor} + +%\begin{table*}[htb] +%\begin{center} +%{\scriptsize +%\begin{tabular}{|c|c|c|c|c|c|c|c|} +%\hline +%$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +%\hline +%Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +%SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +%\hline +%\end{tabular} +%\vspace{-3mm} +%} +%\end{center} +%\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +%the standard deviation (SD), and the confidence intervals considering +%a confidence level of $95\%$.} +%\label{tab:medias} +%\end{table*} + +Our three-step internal memory based algorithm presented in~\cite{bkz05} +is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have the form~$\alpha +nZ$ for an input of~$n$ keys, where~$\alpha$ is some machine dependent +constant that further depends on the length of the keys and~$Z$ is a random +variable with geometric distribution with mean~$1/p=e^{1/c^2}$ (see +Section~\ref{sec:mphfbucket}). All results in our experiments were obtained +taking $c=1$; the value of~$c$, with~$c\in[0.93,1.15]$, in fact has little +influence in the runtime, as shown in~\cite{bkz05}. + +The values chosen for $n$ were $1, 2, 4, 8, 16$ and $32$ million. +Although we have a dataset with 1~billion URLs, on a PC with +1~gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires $25n + O(1)$ bytes for constructing +a MPHF (details about the data structures used by the algorithm can +be found in~\texttt{http://cmph.sf.net}. +% for the details about the data structures +%used by the algorithm). + +In order to estimate the number of trials for each value of $n$ we use +a statistical method for determining a suitable sample size (see, e.g., +\cite[Chapter 13]{j91}). +As we obtained different values for each $n$, +we used the maximal value obtained, namely, 300~trials in order to have +a confidence level of $95\%$. + +% \begin{figure*}[ht] +% \noindent +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The previous algorithm] +% {\scalebox{0.5}{\includegraphics{figs/bmz_temporegressao.eps}}} +% \end{minipage} +% \hfill +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The new algorithm] +% {\scalebox{0.5}{\includegraphics{figs/brz_temporegressao.eps}}} +% \end{minipage} +% \caption{Time versus number of keys in $S$. The solid line corresponds to +% a linear regression model.} +% %obtained from the experimental measurements.} +% \label{fig:temporegressao} +% \end{figure*} + +Table~\ref{tab:medias} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in~\cite{bkz05}. + +\vspace{-2mm} +\begin{table*}[htb] +\begin{center} +{\scriptsize +\begin{tabular}{|c|c|c|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +\hline +Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$.} +\label{tab:medias} +\vspace{-4mm} +\end{table*} + +% \enlargethispage{\baselineskip} +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% (a) +% \begin{tabular}{|c|c|c|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +% \hline +% Average time (s)& $6.119 \pm 0.300$ & $12.190 \pm 0.615$ & $25.359 \pm 1.109$ & $51.408 \pm 2.003$ & $117.343 \pm 4.364$ & $262.215 \pm 8.724$\\ +% SD (s) & $2.644$ & $5.414$ & $9.757$ & $17.627$ & $37.333$ & $76.271$ \\ +% \hline +% \end{tabular} +% \\[5mm] (b) +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $6.927 \pm 0.309$ & $13.828 \pm 0.175$ & $31.936 \pm 0.663$ & $69.902 \pm 1.084$ & $140.617 \pm 2.502$ \\ +% SD & $0.431$ & $0.245$ & $0.926$ & $1.515$ & $3.498$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $284.330 \pm 1.135$ & $587.880 \pm 3.945$ & $1223.581 \pm 4.864$ & $5966.402 \pm 9.465$ & $13229.540 \pm 12.670$ \\ +% SD & $1.587$ & $5.514$ & $6.800$ & $13.232$ & $18.577$ \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$.} +% \label{tab:medias} +% \end{table*} + +\enlargethispage{2\baselineskip} +Figure~\ref{fig:bmz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given $n$ has a considerable +fluctuation. However, the fluctuation also grows linearly with $n$. + +\begin{figure}[htb] +\vspace{-2mm} +\begin{center} +\scalebox{0.4}{\includegraphics{figs/bmz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for the internal memory based algorithm. +The solid line corresponds to a linear regression model.} +\label{fig:bmz_temporegressao} +\end{center} +\vspace{-6mm} +\end{figure} + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form~$\alpha nZ$ with~$Z$ a geometric random variable with +mean~$1/p=e$. Thus, the runtime has mean~$\alpha n/p=\alpha en$ and standard +deviation~$\alpha n\sqrt{(1-p)/p^2}=\alpha n\sqrt{e(e-1)}$. +Therefore, the standard deviation also grows +linearly with $n$, as experimentally verified +in Table~\ref{tab:medias} and in Figure~\ref{fig:bmz_temporegressao}. + +%\noindent-------------------------------------------------------------------------\\ +%Comentario para Yoshi: Nao consegui reproduzir bem o que discutimos +%no paragrafo acima, acho que vc conseguira justificar melhor :-). \\ +%-------------------------------------------------------------------------\\ diff --git a/vldb07/determiningb.tex b/vldb07/determiningb.tex new file mode 100755 index 0000000..e9b3cb2 --- /dev/null +++ b/vldb07/determiningb.tex @@ -0,0 +1,146 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\subsection{Determining~$b$} +\label{sec:determining-b} +\begin{table*}[t] +\begin{center} +{\small %\scriptsize +\begin{tabular}{|c|ccc|ccc|} +\hline +\raisebox{-0.7em}{$n$} & \multicolumn{3}{c|}{\raisebox{-1mm}{b=128}} & +\multicolumn{3}{c|}{\raisebox{-1mm}{b=175}}\\ +\cline{2-4} \cline{5-7} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} \\ +\hline +$1.0 \times 10^6$ & 177 & 172.0 & 176 & 232 & 226.6 & 230 \\ +%$2.0 \times 10^6$ & 179 & 174.0 & 178 & 236 & 228.5 & 232 \\ +$4.0 \times 10^6$ & 182 & 177.5 & 179 & 241 & 231.8 & 234 \\ +%$8.0 \times 10^6$ & 186 & 181.6 & 181 & 238 & 234.2 & 236 \\ +$1.6 \times 10^7$ & 184 & 181.6 & 183 & 241 & 236.1 & 238 \\ +%$3.2 \times 10^7$ & 191 & 183.9 & 184 & 240 & 236.6 & 240 \\ +$6.4 \times 10^7$ & 195 & 185.2 & 186 & 244 & 239.0 & 242 \\ +%$1.28 \times 10^8$ & 193 & 187.7 & 187 & 244 & 239.7 & 244 \\ +$5.12 \times 10^8$ & 196 & 191.7 & 190 & 251 & 246.3 & 247 \\ +$1.0 \times 10^9$ & 197 & 191.6 & 192 & 253 & 248.9 & 249 \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Values for $\mathit{BS}_{\mathit{max}}$: worst case and average case obtained in the experiments and using Eq.~(\ref{eq:maxbs}), +considering $b=128$ and $b=175$ for different number $n$ of keys in $S$.} +\label{tab:comparison} +\vspace{-6mm} +\end{table*} + +The partitioning step can be viewed as the well known ``balls into bins'' +problem~\cite{ra98,dfm02} where~$n$ keys (the balls) are placed independently and +uniformly into $\lceil n/b\rceil$ buckets (the bins). The main question related to that problem we are interested +in is: what is the maximum number of keys in any bucket? +In fact, we want to get the maximum value for $b$ that makes the maximum number of keys in any bucket +no greater than 256 with high probability. +This is important, as we wish to use 8 bits per entry in the vector $g_i$ of +each $\mathrm{MPHF}_i$, +where $0 \leq i < \lceil n/b\rceil$. +Let $\mathit{BS}_{\mathit{max}}$ be the maximum number of keys in any bucket. + +Clearly, $\BSmax$ is the maximum +of~$\lceil n/b\rceil$ random variables~$Z_i$, each with binomial +distribution~$\Bi(n,p)$ with parameters~$n$ and~$p=1/\lceil n/b\rceil$. +However, the~$Z_i$ are not independent. Note that~$\Bi(n,p)$ has mean and +variance~$\simeq b$. To give an upper estimate for the probability of the +event~$\BSmax\geq \gamma$, we can estimate the probability that we have~$Z_i\geq \gamma$ +for a fixed~$i$, and then sum these estimates over all~$i$. +Let~$\gamma=b+\sigma\sqrt{b\ln(n/b)}$, where~$\sigma=\sqrt2$. +Approximating~$\Bi(n,p)$ by the normal distribution with mean and +variance~$b$, we obtain the +estimate~$(\sigma\sqrt{2\pi\ln(n/b)})^{-1}\times\exp(-(1/2)\sigma^2\ln(n/b))$ for +the probability that~$Z_i\geq \gamma$ occurs, which, summed over all~$i$, gives +that the probability that~$\BSmax\geq \gamma$ occurs is at +most~$1/(\sigma\sqrt{2\pi\ln(n/b)})$, which tends to~$0$ as~$n\to\infty$. +Thus, we have shown that, with high probability, +\begin{equation} + \label{eq:maxbs} + \BSmax\leq b+\sqrt{2b\ln{n\over b}}. +\end{equation} + +% The traditional approach used to estimate $\mathit{BS}_{\mathit{max}}$ with high probability is +% to consider $\mathit{BS}_{\mathit{max}}$ as a random variable that follows a binomial distribution +% that can be approximated by a poisson distribution. This yields a good approximation +% when the number of balls is lower than or equal to the number of bins~\cite{g81}. In our case, +% the number of balls is greater than the number of buckets. +% % and that is why we have used more recent works to estimate $\mathit{BS}_{\mathit{max}}$. +% As $b > \ln (n/b)$, we can use the result by Raab and Steger~\cite{ra98} to estimate +% $\mathit{BS}_{\mathit{max}}$ with high probability. +% The following equation gives the estimation, where $\sigma=\sqrt{2}$: +% \begin{eqnarray} \label{eq:maxbs} +% \mathit{BS}_{\mathit{max}} = b + O \left( \sqrt{b\ln\frac{n}{b}} \right) = b + \sigma \times \left(\sqrt{b\ln\frac{n}{b}} \right) +% \end{eqnarray} + +% In order to estimate the suitable constant $\sigma$ we did a linear +% regression suppressing the constant term. +% We use the equation $BS_{max} - b = \sigma \times \sqrt{b\ln (n/b)}$ +% in the linear regression considering $y=BS_{max} - b$ and $x=\sqrt{b\ln (n/b)}$. +% In order to obtain data to be used in the linear regression we set +% b=128 and ran the new algorithm ten times +% for n equal to 1, 2, 4, 8, 16, 32, 64, 128, 512, 1000 million keys. +% Taking a confidence level equal to 95\% we got +% $\sigma = 2.11 \pm 0.03$. +% The coefficient of determination was $99.6\%$, which means that the linear +% regression explains $99.6\%$ of the data variation and only $0.4\%$ +% is due to experimental errors. +% Therefore, Eq.~(\ref{eq:maxbs}) with $\sigma = 2.11 \pm 0.03$ and $b=128$ +% makes a very good estimation of the maximum number of keys in any bucket. + +% Repeating the same experiments for $b$ equals to $175$ and +% a confidence level of $95\%$ we got $\sigma = 2.07 \pm 0.03$. +% Again we verified that Eq.~(\ref{eq:maxbs}) with $\sigma = 2.07 \pm 0.03$ and $b=175$ is +% a very good estimation of the maximum number of keys in any bucket once the +% coefficient of determination obtained was $99.7 \%$ and $\sigma$ is in a very narrow range. + +In our algorithm the maximum number of keys in any bucket must be at most 256. +Table~\ref{tab:comparison} presents the values for $\mathit{BS}_{\mathit{max}}$ +obtained experimentally and using Eq.~(\ref{eq:maxbs}). +The table presents the worst case and the average case, +considering $b=128$, $b=175$ and Eq.~(\ref{eq:maxbs}), +for several numbers~$n$ of keys in $S$. +The estimation given by Eq.~(\ref{eq:maxbs}) is very close to the experimental +results. + +Now we estimate the biggest problem our algorithm is able to solve for +a given $b$. +Using Eq.~(\ref{eq:maxbs}) considering $b=128$, $b=175$ and imposing +that~$\mathit{BS}_{\mathit{max}}\leq256$, +the sizes of the biggest key set our algorithm +can deal with are $10^{30}$ keys and $10^{10}$ keys, respectively. +%It is also important to have $b$ as big as possible, once its value is +%related to the space required to store the resultant MPHF, as shown later on. +%Table~\ref{tab:bp} shows the biggest problem the algorithm can solve. +% The values were obtained from Eq.~(\ref{eq:maxbs}), +% considering $b=128$ and~$b=175$ and imposing +% that~$\mathit{BS}_{\mathit{max}}\leq256$. + +% We set $\sigma=2.14$ because it was the greatest value obtained for $\sigma$ +% in the two linear regression we did. +% \vspace{-3mm} +% \begin{table}[htb] +% \begin{center} +% {\small %\scriptsize +% \begin{tabular}{|c|c|} +% \hline +% b & Problem size ($n$) \\ +% \hline +% 128 & $10^{30}$ keys \\ +% 175 & $10^{10}$ keys \\ +% \hline +% \end{tabular} +% \vspace{-1mm} +% } +% \end{center} +% \caption{Using Eq.~(\ref{eq:maxbs}) to estimate the biggest problem our algorithm can solve.} +% %considering $\sigma=\sqrt{2}$.} +% \label{tab:bp} +% \vspace{-14mm} +% \end{table} diff --git a/vldb07/diskaccess.tex b/vldb07/diskaccess.tex new file mode 100755 index 0000000..08e54b9 --- /dev/null +++ b/vldb07/diskaccess.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Controlling disk accesses} +\label{sec:contr-disk-access} + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter $\mu$ +affects the runtime of our algorithm. +For that we fixed $n$ in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used $\mu$ equal to $100, 200, 300, 400, 500$ and $600$ +megabytes. + +\enlargethispage{2\baselineskip} +Table~\ref{tab:diskaccess} presents the number of files $N$, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in Section~\ref{sec:linearcomplexity}, and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table~\ref{tab:diskaccess} we noticed that the time spent in the construction +decreases as the value of $\mu$ increases. However, for $\mu > 400$, the variation +on the time is not as significant as for $\mu \leq 400$. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies +for avoiding seeks and diminishing the average seek time +(see \texttt{http://www.linuxjournal.com/article/6931}). +\begin{table*}[ht] +\vspace{-2mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|c|} +\hline +$\mu$ (MB) & $100$ & $200$ & $300$ & $400$ & $500$ & $600$ \\ +\hline +$N$ (files) & $619$ & $310$ & $207$ & $155$ & $124$ & $104$ \\ +%\hline +\textbaht~(buffer size in KB) & $165$ & $661$ & $1,484$ & $2,643$ & $4,129$ & $5,908$ \\ +%\hline +$\beta$/\textbaht~(\# of seeks in the worst case) & $384,478$ & $95,974$ & $42,749$ & $24,003$ & $15,365$ & $10,738$ \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$15,347$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & \\ +% \hline +Time (hours) & $4.04$ & $3.64$ & $3.34$ & $3.20$ & $3.13$ & $3.09$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +\label{tab:diskaccess} +\vspace{-14mm} +\end{table*} + + + +% \begin{table*}[ht] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|} +% \hline +% $\mu$ (MB) & $100$ & $150$ & $200$ & $250$ & $300$ & $350$ & $400$ & $450$ & $500$ & $550$ & $600$ \\ +% \hline +% $N$ (files) & $619$ & $413$ & $310$ & $248$ & $207$ & $177$ & $155$ & $138$ & $124$ & $113$ & $103$ \\ +% \hline +% \textbaht~(buffer size in KB) & $165$ & $372$ & $661$ & $1,033$ & $1,484$ & $2,025$ & $2,643$ & $3,339$ & & & \\ +% \hline +% \# of seeks (Worst case) & $384,478$ & $170,535$ & $95,974$ & $61,413$ & $42,749$ & $31,328$ & $24,003$ & $19,000$ & & & \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$170,385$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$61,388$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$31,296$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$18,978$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & & & & & & \\ +% \hline +% Time (horas) & $4.04$ & $3.93$ & $3.64$ & $3.46$ & $3.34$ & $3.26$ & $3.20$ & $3.13$ & & & \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +% \label{tab:diskaccess} +% \end{table*} + + + +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $14.124 \pm 0.128$ & $28.301 \pm 0.140$ & $56.807 \pm 0.312$ & $117.286 \pm 0.997$ & $241.086 \pm 0.936$ \\ +% SD & $0.179$ & $0.196$ & $0.437$ & $1.394$ & $1.308$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $492.430 \pm 1.565$ & $1006.307 \pm 1.425$ & $2081.208 \pm 0.740$ & $9253.188 \pm 4.406$ & $19021.480 \pm 13.850$ \\ +% SD & $2.188$ & $1.992$ & $1.035$ & $ 6.160$ & $18.016$ \\ +% \hline + +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$. +% } +% \label{tab:mediasbrz} +% \end{table*} diff --git a/vldb07/experimentalresults.tex b/vldb07/experimentalresults.tex new file mode 100755 index 0000000..58b4091 --- /dev/null +++ b/vldb07/experimentalresults.tex @@ -0,0 +1,15 @@ +%Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\section{Appendix: Experimental results} +\label{sec:experimental-results} +\vspace{-1mm} + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm~\cite{bkz05} +and for our algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of our algorithm. diff --git a/vldb07/figs/bmz_temporegressao.png b/vldb07/figs/bmz_temporegressao.png new file mode 100644 index 0000000000000000000000000000000000000000..e7198c1cea2b9f5d766b7f422b23a2e259209c79 GIT binary patch literal 5769 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 J@QQuN{{U&H=p48g`weTH#H5IX}; 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 ydE%}ySS(et!ZLcRyFa7rolcuCKId +\section{Introduction} +\label{sec:intro} + +\enlargethispage{2\baselineskip} +Suppose~$U$ is a universe of \textit{keys} of size $u$. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$, where $ n \ll u$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +% Hashing methods for {\em non-static sets} of keys can be used to construct +% data structures storing $S$ and supporting membership queries +% ``$x \in S$?'' in expected time $O(1)$. +% However, they involve a certain amount of wasted space owing to unused +% locations in the table and waisted time to resolve collisions when +% two keys are hashed to the same table location. +A perfect hash function maps a {\em static set} $S$ of $n$ keys from $U$ into a set of $m$ integer +numbers without collisions, where $m$ is greater than or equal to $n$. +If $m$ is equal to $n$, the function is called minimal. + +% Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash function and +% Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates a minimal perfect hash function (MPHF). +% +% \begin{figure} +% \centering +% \scalebox{0.7}{\epsfig{file=figs/minimalperfecthash-ph-mph.ps}} +% \caption{(a) Perfect hash function (b) Minimal perfect hash function (MPHF)} +% \label{fig:minimalperfecthash-ph-mph} +% %\vspace{-5mm} +% \end{figure} + +Minimal perfect hash functions are widely used for memory efficient storage and fast +retrieval of items from static sets, such as words in natural languages, +reserved words in programming languages or interactive systems, universal resource +locations (URLs) in web search engines, or item sets in data mining techniques. +Search engines are nowadays indexing tens of billions of pages and algorithms +like PageRank~\cite{Brin1998}, which uses the web link structure to derive a +measure of popularity for Web pages, would benefit from a MPHF for storage and +retrieval of such huge sets of URLs. +For instance, the TodoBr\footnote{TodoBr ({\texttt www.todobr.com.br}) is a trademark of +Akwan Information Technologies, which was acquired by Google Inc. in July 2005.} +search engine used the algorithm proposed hereinafter to +improve and to scale its link analysis system. +The WebGraph research group~\cite{bv04} would +also benefit from a MPHF for sets in the order of billions of URLs to scale +and to improve the storange requirements of their algorithms on Graph compression. + + Another interesting application for MPHFs is its use as an indexing structure + for databases. + The B+ tree is very popular as an indexing structure for dynamic applications + with frequent insertions and deletions of records. + However, for applications with sporadic modifications and a huge number of + queries the B+ tree is not the best option, + because it performs poorly with very large sets of keys + such as those required for the new frontiers of database applications~\cite{s05}. + Therefore, there are applications for MPHFs in + information retrieval systems, database systems, language translation systems, + electronic commerce systems, compilers, operating systems, among others. + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymore~\cite{s05}, the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. +% using stock hardware. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: +\begin{enumerate} +\item The amount of CPU time required by the algorithms for constructing MPHFs. +\item The space requirements of the algorithms for constructing MPHFs. +\item The amount of CPU time required by a MPHF for each retrieval. +\item The space requirements of the description of the resulting MPHFs to be + used at retrieval time. +\end{enumerate} + +\enlargethispage{2\baselineskip} +This paper presents a novel external memory based algorithm for constructing MPHFs that +is very efficient in these four requirements. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of $\lceil n/b \rceil$ +one byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using $b=175$, the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is $1/\ln2 \approx 1.4427$ bits per +key~\cite{m84}. + diff --git a/vldb07/makefile b/vldb07/makefile new file mode 100755 index 0000000..1b95644 --- /dev/null +++ b/vldb07/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log *.ps *.pdf *.dvi + diff --git a/vldb07/partitioningthekeys.tex b/vldb07/partitioningthekeys.tex new file mode 100755 index 0000000..e9a48c4 --- /dev/null +++ b/vldb07/partitioningthekeys.tex @@ -0,0 +1,141 @@ +%% Nivio: 21/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Partitioning step} +\label{sec:partitioning-keys} + +The set $S$ of $n$ keys is partitioned into $\lceil n/b \rceil$ buckets, +where $b$ is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see Section~\ref{sec:determining-b}). +The partitioning step works as follows: + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $\beta$ be the size in bytes of the set $S$ \\ +\> $\blacktriangleright$ Let $\mu$ be the size in bytes of an a priori reserved \\ +\> ~~~ internal memory area \\ +\> $\blacktriangleright$ Let $N = \lceil \beta/\mu \rceil$ be the number of key blocks that will \\ +\> ~~~ be read from disk into an internal memory area \\ +\> $\blacktriangleright$ Let $\mathit{size}$ be a vector that stores the size of each bucket \\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \\ +\> ~~ $1.1$ Read block $B_j$ of keys from disk \\ +\> ~~ $1.2$ Cluster $B_j$ into $\lceil n/b \rceil$ buckets using a bucket sort \\ +\> ~~~~~~~ algorithm and update the entries in the vector {\it size} \\ +\> ~~ $1.3$ Dump $B_j$ to the disk into File $j$\\ +\> $2.$ Compute the {\it offset} vector and dump it to the disk. +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Partitioning step} +\vspace{-3mm} +\label{fig:partitioningstep} +\end{figure} + +Statement 1.1 of the {\bf for} loop presented in Figure~\ref{fig:partitioningstep} +reads sequentially all the keys of block $B_j$ from disk into an internal area +of size $\mu$. + +Statement 1.2 performs an indirect bucket sort of the keys in block $B_j$ +and at the same time updates the entries in the vector {\em size}. +Let us briefly describe how~$B_j$ is partitioned among the~$\lceil n/b\rceil$ +buckets. +We use a local array of $\lceil n/b \rceil$ counters to store a +count of how many keys from $B_j$ belong to each bucket. +%At the same time, the global vector {\it size} is computed based on the local +%counters. +The pointers to the keys in each bucket $i$, $0 \leq i < \lceil n/b \rceil$, +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +\enlargethispage{2\baselineskip} +To find the bucket address of a given key +we use the universal hash function $h_0(k)$~\cite{j97}. +Key~$k$ goes into bucket~$i$, where +%Then, for each integer $h_0(k)$ the respective bucket address is obtained +%as follows: +\begin{eqnarray} \label{eq:bucketindex} +i=h_0(k) \bmod \left \lceil \frac{n}{b} \right \rceil. +\end{eqnarray} + +Figure~\ref{fig:brz-partitioning}(a) shows a \emph{logical} view of the +$\lceil n/b \rceil$ buckets generated in the partitioning step. +%In this case, the keys of each bucket are put together by the pointers to +%each key stored +%in contiguous positions in the array of pointers. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure~\ref{fig:brz-partitioning}(b). +In the example of Figure~\ref{fig:brz-partitioning}(b), the keys in bucket 0 +appear in files 1 and $N$, the keys in bucket 1 appear in files 1, 2 +and $N$, and so on. + +\vspace{-7mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz-partitioning.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(4371,1403)(1,-6977) +\put(333,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(545,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(759,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(1539,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(541,-6676){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Logical View}}}} +\put(3547,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6224){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6269){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6314){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3016,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 1}}}} +\put(3466,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 2}}}} +\put(4096,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File N}}}} +\put(3196,-6946){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Physical View}}}} +\end{picture}% +\caption{Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view} +\label{fig:brz-partitioning} +\vspace{-2mm} +\end{figure} + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the $N$ files in disk +during the searching step. +But, as we show later in Section~\ref{sec:analytcal-results}, the number of seeks +can be kept small using buffering techniques. +Considering that only the vector {\it size}, which has $\lceil n/b \rceil$ +one-byte entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the {\it offset} vector and dump it to the disk. +We use the vector $\mathit{size}$ to compute the +$\mathit{offset}$ displacement vector. +The $\mathit{offset}[i]$ entry contains the number of keys +in the buckets $0, 1, \dots, i-1$. +As {\it size}$[i]$ stores the number of keys +in bucket $i$, where $0 \leq i <\lceil n/b \rceil$, we have +\begin{displaymath} +\mathit{offset}[i] = \sum_{j=0}^{i-1} \mathit{size}[j] \cdot +\end{displaymath} + diff --git a/vldb07/performancenewalgorithm.tex b/vldb07/performancenewalgorithm.tex new file mode 100755 index 0000000..6911282 --- /dev/null +++ b/vldb07/performancenewalgorithm.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\subsection{Performance of the new algorithm} +\label{sec:performance} +%As we have done for the internal memory based algorithm, + +The runtime of our algorithm is also a random variable, but now it follows a +(highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +Section~\ref{sec:linearcomplexity}. Therefore, we ran the algorithm for +several numbers $n$ of keys in $S$. + +The values chosen for $n$ were $1, 2, 4, 8, 16, 32, 64, 128, 512$ and $1000$ +million. +%Just the small vector {\it size} must be kept in main memory, +%as we saw in Section~\ref{sec:memconstruction}. +We limited the main memory in 500 megabytes for the experiments. +The size $\mu$ of the a priori reserved internal memory area +was set to 250 megabytes, the parameter $b$ was set to $175$ and +the building block algorithm parameter $c$ was again set to $1$. +In Section~\ref{sec:contr-disk-access} we show how $\mu$ +affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +%~\cite[Chapter 13]{j91} +to estimate the number of trials to be run for each value of $n$. We got that +just one trial for each $n$ would be enough with a confidence level of $95\%$. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table~\ref{tab:mediasbrz} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in~Section~\ref{sec:linearcomplexity}. Better still, +it is only approximately $60\%$ slower than our internal memory based algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for our algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes (see Section~\ref{sec:contr-disk-access}), +we have brought the time to 3.09 hours. In this case, our algorithm is +just $34\%$ slower in this setup. + +\enlargethispage{2\baselineskip} +\begin{table*}[htb] +\vspace{-1mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +\hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +Average time (s) & $6.9 \pm 0.3$ & $13.8 \pm 0.2$ & $31.9 \pm 0.7$ & $69.9 \pm 1.1$ & $140.6 \pm 2.5$ \\ +SD & $0.4$ & $0.2$ & $0.9$ & $1.5$ & $3.5$ \\ +\hline +\hline +$n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +\hline % Part. 20 \% 20\% 20\% 18\% 18\% +Average time (s) & $284.3 \pm 1.1$ & $587.9 \pm 3.9$ & $1223.6 \pm 4.9$ & $5966.4 \pm 9.5$ & $13229.5 \pm 12.7$ \\ +SD & $1.6$ & $5.5$ & $6.8$ & $13.2$ & $18.6$ \\ +\hline + +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Our algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$. +} +\label{tab:mediasbrz} +\vspace{-5mm} +\end{table*} + +Figure~\ref{fig:brz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given $n$ has almost no +variation. + +\begin{figure}[htb] +\begin{center} +\scalebox{0.4}{\includegraphics{figs/brz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for our algorithm. The solid line corresponds to +a linear regression model.} +\label{fig:brz_temporegressao} +\end{center} +\vspace{-9mm} +\end{figure} + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket~$i$, +$0 \leq i < \lceil n/b \rceil$, is a small set of keys (at most 256 keys) and, +as argued in Section~\ref{sec:intern-memory-algor}, the runtime of the +building block algorithm is a random variable~$X_i$ with high fluctuation. +However, the runtime~$Y$ of the searching step of our algorithm is given +by~$Y=\sum_{0\leq i<\lceil n/b\rceil}X_i$. Under the hypothesis that +the~$X_i$ are independent and bounded, the {\it law of large numbers} (see, +e.g., \cite{j91}) implies that the random variable $Y/\lceil n/b\rceil$ +converges to a constant as~$n\to\infty$. This explains why the runtime of our +algorithm is almost deterministic. + + diff --git a/vldb07/references.bib b/vldb07/references.bib new file mode 100755 index 0000000..d2ea475 --- /dev/null +++ b/vldb07/references.bib @@ -0,0 +1,814 @@ + +@InProceedings{Brin1998, + author = "Sergey Brin and Lawrence Page", + title = "The Anatomy of a Large-Scale Hypertextual Web Search Engine", + booktitle = "Proceedings of the 7th International {World Wide Web} + Conference", + pages = "107--117", + adress = "Brisbane, Australia", + month = "April", + year = 1998, + annote = "Artigo do Google." +} + +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} +@article{g81, + author = {G. H. Gonnet}, + title = {Expected Length of the Longest Probe Sequence in Hash Code Searching}, + journal = {J. ACM}, + volume = {28}, + number = {2}, + year = {1981}, + issn = {0004-5411}, + pages = {289--304}, + doi = {http://doi.acm.org/10.1145/322248.322254}, + publisher = {ACM Press}, + address = {New York, NY, USA}, + } + +@misc{r04, + author = "S. Rao", + title = "Combinatorial Algorithms Data Structures", + year = 2004, + howpublished = {CS 270 Spring}, + url = "citeseer.ist.psu.edu/700201.html" +} +@article{ra98, + author = {Martin Raab and Angelika Steger}, + title = {``{B}alls into Bins'' --- {A} Simple and Tight Analysis}, + journal = {Lecture Notes in Computer Science}, + volume = 1518, + pages = {159--170}, + year = 1998, + url = "citeseer.ist.psu.edu/raab98balls.html" +} + +@misc{mrs00, + author = "M. Mitzenmacher and A. Richa and R. Sitaraman", + title = "The power of two random choices: A survey of the techniques and results", + howpublished={In Handbook of Randomized + Computing, P. Pardalos, S. Rajasekaran, and J. Rolim, Eds. Kluwer}, + year = "2000", + url = "citeseer.ist.psu.edu/article/mitzenmacher00power.html" +} + +@article{dfm02, + author = {E. Drinea and A. Frieze and M. Mitzenmacher}, + title = {Balls and bins models with feedback}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + pages = {308--315}, + year = {2002} +} +@Article{j97, + author = {Bob Jenkins}, + title = {Algorithm Alley: Hash Functions}, + journal = {Dr. Dobb's Journal of Software Tools}, + volume = {22}, + number = {9}, + month = {september}, + year = {1997} +} + +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + +@article{s05, + author = {M. Seltzer}, + title = {Beyond Relational Databases}, + journal = {ACM Queue}, + volume = {3}, + number = {3}, + month = {April}, + year = {2005} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu;os para a Constru;o de Arquivos invertidos}, + school = {Departamento de Ci;cia da Computa;o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar;}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + +@Book{j91, + author = {R. Jain}, + title = {The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. }, + publisher = {John Wiley}, + year = {1991}, + edition = {first} +} + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa;es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi;o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q. Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@TechReport{bkz06t, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {An Approach for Minimal Perfect Hash Functions in Very Large Databases}, + institution = {Department of Computer Science, Federal University of Minas Gerais}, + note = {Available at http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html}, + year = {2006}, + OPTkey = {}, + OPTtype = {}, + number = {RT.DCC.003}, + address = {Belo Horizonte, MG, Brazil}, + month = {April}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04:_OLD, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + +@article {pw04, + AUTHOR = {Pittel, Boris and Wormald, Nicholas C.}, + TITLE = {Counting connected graphs inside-out}, + JOURNAL = {J. Combin. Theory Ser. B}, + FJOURNAL = {Journal of Combinatorial Theory. Series B}, + VOLUME = 93, + YEAR = 2005, + NUMBER = 2, + PAGES = {127--172}, + ISSN = {0095-8956}, + CODEN = {JCBTB8}, + MRCLASS = {05C30 (05A16 05C40 05C80)}, + MRNUMBER = {MR2117934 (2005m:05117)}, +MRREVIEWER = {Edward A. Bender}, +} diff --git a/vldb07/relatedwork.tex b/vldb07/relatedwork.tex new file mode 100755 index 0000000..7693002 --- /dev/null +++ b/vldb07/relatedwork.tex @@ -0,0 +1,112 @@ +% Time-stamp: +\vspace{-3mm} +\section{Related work} +\label{sec:relatedprevious-work} +\vspace{-2mm} + +% Optimal speed for hashing means that each key from the key set $S$ +% will map to an unique location in the hash table, avoiding time wasted +% in resolving collisions. That is achieved with a MPHF and +% because of that many algorithms for constructing static +% and dynamic MPHFs, when static or dynamic sets are involved, +% were developed. Our focus has been on static MPHFs, since +% in many applications the key sets change slowly, if at all~\cite{s05}. + +\enlargethispage{2\baselineskip} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical and practical results +on perfect hashing. +In this section we review some of the most important results. +%We also present more recent algorithms that share some features with +%the one presented hereinafter. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Mehlhorn~\cite{m84} showed +that at least $\Omega((1/\ln 2)n + \ln\ln u)$ bits are +required to represent a MPHF (i.e, at least 1.4427 bits per +key must be stored). +To the best of our knowledge our algorithm +is the first one capable of generating MPHFs for sets in the order +of billion of keys, and the generated functions +require less than 9 bits per key to be stored. +This increases one order of magnitude in the size of the greatest +key set for which a MPHF was obtained in the literature~\cite{bkz05}. +%which is close to the lower bound presented in~\cite{m84}. + +Some work on minimal perfect hashing has been done under the assumption that +the algorithm can pick and store truly random functions~\cite{bkz05,chm92,p99}. +Since the space requirements for truly random functions makes them unsuitable for +implementation, one has to settle for pseudo-random functions in practice. +Empirical studies show that limited randomness properties are often as good as +total randomness. +We could verify that phenomenon in our experiments by using the universal hash +function proposed by Jenkins~\cite{j97}, which is +time efficient at retrieval time and requires just an integer to be used as a +random seed (the function is completely determined by the seed). +% Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +% FHPs e FHPMs deterministicamente. +% As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +% A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +% $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +% A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +% Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +% de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +% FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +% que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +% $\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +% fun\c{c}\~oes com complexidade linear. +% Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +% limitar a utiliza\c{c}\~ao na pr\'atica. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing MPHFs +where the form of the resulting function is $h(x) = (f(x) + d[g(x)]) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n\log_2n$ bits. + +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n\log_2n$ to $(1+\epsilon)n\log_2n$ the number of bits +required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +%Differently from the works in~\cite{dh01, p99}, our algorithm generates a MPHF +%$h$ in expected linear time and $h$ can be stored in $O(n)$ bits (9 bits per key). + +% Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +% que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +% e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +% fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +% $h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. +%Our algorithm is the first one capable of generating MPHFs for sets in the order of +%billion of keys. It happens because we do not need to keep into main memory +%at generation time complex data structures as a graph, lists and so on. We just need to maintain +%a small vector that occupies around 8MB for a set of 1 billion keys. + +Fox et al.~\cite{fch92,fhcd92} studied MPHFs +%that also share features with the ones generated by our algorithm. +that bring down the storage requirements we got to between 2 and 4 bits per key. +However, it is shown in~\cite[Section 6.7]{chm97} that their algorithms have exponential +running times and cannot scale for sets larger than 11 million keys in our +implementation of the algorithm. + +Our previous work~\cite{bkz05} improves the one by Czech, Havas and Majewski~\cite{chm92}. +We obtained more compact functions in less time. Although +the algorithm in~\cite{bkz05} is the fastest algorithm +we know of, the resulting functions are stored in $O(n\log n)$ bits and +one needs to keep in main memory at generation time a random graph of $n$ edges +and $cn$ vertices, +where $c\in[0.93,1.15]$. Using the well known divide to conquer approach +we use that algorithm as a building block for the new one, where the +resulting functions are stored in $O(n)$ bits. diff --git a/vldb07/searching.tex b/vldb07/searching.tex new file mode 100755 index 0000000..8feb6f1 --- /dev/null +++ b/vldb07/searching.tex @@ -0,0 +1,155 @@ +%% Nivio: 22/jan/06 +% Time-stamp: +\vspace{-7mm} +\subsection{Searching step} +\label{sec:searching} + +\enlargethispage{2\baselineskip} +The searching step is responsible for generating a MPHF for each +bucket. +Figure~\ref{fig:searchingstep} presents the searching step algorithm. +\vspace{-2mm} +\begin{figure}[h] +%\centering +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $H$ be a minimum heap of size $N$, where the \\ +\> ~~ order relation in $H$ is given by Eq.~(\ref{eq:bucketindex}), that is, the\\ +\> ~~ remove operation removes the item with smallest $i$\\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \{ Heap construction \}\\ +\> ~~ $1.1$ Read key $k$ from File $j$ on disk\\ +\> ~~ $1.2$ Insert $(i, j, k)$ in $H$ \\ +\> $2.$ {\bf for} $i = 0$ {\bf to} $\lceil n/b \rceil - 1$ {\bf do} \\ +\> ~~ $2.1$ Read bucket $i$ from disk driven by heap $H$ \\ +\> ~~ $2.2$ Generate a MPHF for bucket $i$ \\ +\> ~~ $2.3$ Write the description of MPHF$_i$ to the disk +\end{tabbing} +\vspace{-1mm} +\hrule +\hrule +\caption{Searching step} +\label{fig:searchingstep} +\vspace{-4mm} +\end{figure} + +Statement 1 of Figure~\ref{fig:searchingstep} inserts one key from each file +in a minimum heap $H$ of size $N$. +The order relation in $H$ is given by the bucket address $i$ given by +Eq.~(\ref{eq:bucketindex}). + +%\enlargethispage{-\baselineskip} +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +%in Section~\ref{sec:readingbucket}. +In statement 2.2, a MPHF is generated for each bucket $i$, as described +in the following. +%in Section~\ref{sec:mphfbucket}. +The description of MPHF$_i$ is a vector $g_i$ of 8-bit integers. +Finally, statement 2.3 writes the description $g_i$ of MPHF$_i$ to disk. + +\vspace{-3mm} +\label{sec:readingbucket} +\subsubsection{Reading a bucket from disk.} + +In this section we present the refinement of statement 2.1 of +Figure~\ref{fig:searchingstep}. +The algorithm to read bucket $i$ from disk is presented +in Figure~\ref{fig:readingbucket}. + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $1.$ {\bf while} bucket $i$ is not full {\bf do} \\ +\> ~~ $1.1$ Remove $(i, j, k)$ from $H$\\ +\> ~~ $1.2$ Insert $k$ into bucket $i$ \\ +\> ~~ $1.3$ Read sequentially all keys $k$ from File $j$ that have \\ +\> ~~~~~~~ the same $i$ and insert them into bucket $i$ \\ +\> ~~ $1.4$ Insert the triple $(i, j, x)$ in $H$, where $x$ is the first \\ +\> ~~~~~~~ key read from File $j$ that does not have the \\ +\> ~~~~~~~ same bucket index $i$ +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Reading a bucket} +\vspace{-4.0mm} +\label{fig:readingbucket} +\end{figure} + +Bucket $i$ is distributed among many files and the heap $H$ is used to drive a +multiway merge operation. +In Figure~\ref{fig:readingbucket}, statement 1.1 extracts and removes triple +$(i, j, k)$ from $H$, where $i$ is a minimum value in $H$. +Statement 1.2 inserts key $k$ in bucket $i$. +Notice that the $k$ in the triple $(i, j, k)$ is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure~\ref{fig:searchingstep}). +Statement 1.3 performs a seek operation in File $j$ on disk for the first +read operation and reads sequentially all keys $k$ that have the same $i$ +%(obtained from Eq.~(\ref{eq:bucketindex})) +and inserts them all in bucket $i$. +Finally, statement 1.4 inserts in $H$ the triple $(i, j, x)$, +where $x$ is the first key read from File $j$ (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in Section~\ref{sec:linearcomplexity}, +where we present a buffering technique that brings down +the time spent with seeks. + +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\subsubsection{Generating a MPHF for each bucket.} \label{sec:mphfbucket} + +To the best of our knowledge the algorithm we have designed in +our previous work~\cite{bkz05} is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. + +%\enlargethispage{-\baselineskip} +Our previous algorithm is a three-step internal memory based algorithm +that produces a MPHF based on random graphs. +For a set of $n$ keys, the algorithm outputs the resulting MPHF in expected time $O(n)$. +For a given bucket $i$, $0 \leq i < \lceil n/b \rceil$, the corresponding MPHF$_i$ +has the following form: +\begin{eqnarray} + \mathrm{MPHF}_i(k) &=& g_i[a] + g_i[b] \label{eq:mphfi} +\end{eqnarray} +where $a = h_{i1}(k) \bmod t$, $b = h_{i2}(k) \bmod t$ and +$t = c\times \mathit{size}[i]$. The functions +$h_{i1}(k)$ and $h_{i2}(k)$ are the same universal function proposed by Jenkins~\cite{j97} +that was used in the partitioning step described in Section~\ref{sec:partitioning-keys}. + +In order to generate the function above the algorithm involves the generation of simple random graphs +$G_i = (V_i, E_i)$ with~$|V_i|=t=c\times\mathit{size}[i]$ and $|E_i|=\mathit{size}[i]$, with $c \in [0.93, 1.15]$. +To generate a simple random graph with high +probability\footnote{We use the terms `with high probability' +to mean `with probability tending to~$1$ as~$n\to\infty$'.}, two vertices $a$ and $b$ are +computed for each key $k$ in bucket $i$. +Thus, each bucket $i$ has a corresponding graph~$G_i=(V_i,E_i)$, where $V_i=\{0,1, +\ldots,t-1\}$ and $E_i=\big\{\{a,b\}:k \in \mathrm{bucket}\: i\big\}$. +In order to get a simple graph, +the algorithm repeatedly selects $h_{i1}$ and $h_{i2}$ from a family of universal hash functions +until the corresponding graph is simple. +The probability of getting a simple graph is $p=e^{-1/c^2}$. +For $c=1$, this probability is $p \simeq 0.368$, and the expected number of +iterations to obtain a simple graph is~$1/p \simeq 2.72$. + +The construction of MPHF$_i$ ends with a computation of a suitable labelling of the vertices +of~$G_i$. The labelling is stored into vector $g_i$. +We choose~$g_i[v]$ for each~$v\in V_i$ in such +a way that Eq.~(\ref{eq:mphfi}) is a MPHF for bucket $i$. +In order to get the values of each entry of $g_i$ we first +run a breadth-first search on the 2-\textit{core} of $G_i$, i.e., the maximal subgraph +of~$G_i$ with minimal degree at least~$2$ (see, e.g., \cite{b01,jlr00,pw04}) and +a depth-first search on the acyclic part of $G_i$ (see \cite{bkz05} for details). + diff --git a/vldb07/svglov2.clo b/vldb07/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb07/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb07/svjour2.cls b/vldb07/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb07/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb07/terminology.tex b/vldb07/terminology.tex new file mode 100755 index 0000000..fd2cf1d --- /dev/null +++ b/vldb07/terminology.tex @@ -0,0 +1,18 @@ +% Time-stamp: +\vspace{-3mm} +\section{Notation and terminology} +\vspace{-2mm} +\label{sec:notation} + +\enlargethispage{2\baselineskip} +The essential notation and terminology used throughout this paper are as follows. +\begin{itemize} +\item $U$: key universe. $|U| = u$. +\item $S$: actual static key set. $S \subset U$, $|S| = n \ll u$. +\item $h: U \to M$ is a hash function that maps keys from a universe $U$ into +a given range $M = \{0,1,\dots,m-1\}$ of integer numbers. +\item $h$ is a perfect hash function if it is one-to-one on~$S$, i.e., if + $h(k_1) \not = h(k_2)$ for all $k_1 \not = k_2$ from $S$. +\item $h$ is a minimal perfect hash function (MPHF) if it is one-to-one on~$S$ + and $n=m$. +\end{itemize} diff --git a/vldb07/thealgorithm.tex b/vldb07/thealgorithm.tex new file mode 100755 index 0000000..1fb256f --- /dev/null +++ b/vldb07/thealgorithm.tex @@ -0,0 +1,78 @@ +%% Nivio: 13/jan/06, 21/jan/06 29/jan/06 +% Time-stamp: +\vspace{-3mm} +\section{The algorithm} +\label{sec:new-algorithm} +\vspace{-2mm} + +\enlargethispage{2\baselineskip} +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF $h$ for a set $S$ of $n$ keys. +Figure~\ref{fig:new-algo-main-steps} illustrates the two steps of the +algorithm: the partitioning step and the searching step. + +\vspace{-2mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(3704,2091)(1426,-5161) +\put(2570,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2782,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(2996,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(4060,-4006){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets}}}} +\put(3776,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(4563,-3329){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Key Set $S$}}}} +\put(2009,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2221,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4315,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(1992,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2204,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4298,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(4546,-4977){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Hash Table}}}} +\put(1441,-3616){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Partitioning}}}} +\put(1441,-4426){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Searching}}}} +\put(1981,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_0$}}}} +\put(2521,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_1$}}}} +\put(3016,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_2$}}}} +\put(3826,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_{\lceil n/b \rceil - 1}$}}}} +\end{picture}% +\vspace{-1mm} +\caption{Main steps of our algorithm} +\label{fig:new-algo-main-steps} +\vspace{-3mm} +\end{figure} + +The partitioning step takes a key set $S$ and uses a universal hash function +$h_0$ proposed by Jenkins~\cite{j97} +%for each key $k \in S$ of length $|k|$ +to transform each key~$k\in S$ into an integer~$h_0(k)$. +Reducing~$h_0(k)$ modulo~$\lceil n/b\rceil$, we partition~$S$ into $\lceil n/b +\rceil$ buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF$_i$ for each bucket $i$, +$0 \leq i < \lceil n/b \rceil$. +The resulting MPHF $h(k)$, $k \in S$, is given by +\begin{eqnarray}\label{eq:mphf} +h(k) = \mathrm{MPHF}_i (k) + \mathit{offset}[i], +\end{eqnarray} +where~$i=h_0(k)\bmod\lceil n/b\rceil$. +The $i$th entry~$\mathit{offset}[i]$ of the displacement vector +$\mathit{offset}$, $0 \leq i < \lceil n/b \rceil$, contains the total number +of keys in the buckets from 0 to $i-1$, that is, it gives the interval of the +keys in the hash table addressed by the MPHF$_i$. In the following we explain +each step in detail. + + + diff --git a/vldb07/thedataandsetup.tex b/vldb07/thedataandsetup.tex new file mode 100755 index 0000000..8739705 --- /dev/null +++ b/vldb07/thedataandsetup.tex @@ -0,0 +1,21 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{The data and the experimental setup} +\label{sec:data-exper-set} + +The algorithms were implemented in the C language and +are available at \texttt{http://\-cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +% free software licence. +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + diff --git a/vldb07/vldb.tex b/vldb07/vldb.tex new file mode 100644 index 0000000..618c108 --- /dev/null +++ b/vldb07/vldb.tex @@ -0,0 +1,194 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +\usepackage{epsfig} +\usepackage{textcomp} +\usepackage[latin1]{inputenc} +\usepackage{amssymb} + +%\DeclareGraphicsExtensions{.png} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% + +\begin{document} + +\title{Space and Time Efficient Minimal Perfect Hash \\[0.2cm] +Functions for Very Large Databases\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +We propose a novel external memory based algorithm for constructing minimal +perfect hash functions~$h$ for huge sets of keys. +For a set of~$n$ keys, our algorithm outputs~$h$ in time~$O(n)$. +The algorithm needs a small vector of one byte entries +in main memory to construct $h$. +The evaluation of~$h(x)$ requires three memory accesses for any key~$x$. +The description of~$h$ takes a constant number of bits +for each key, which is optimal, i.e., the theoretical lower bound is $1/\ln 2$ +bits per key. +In our experiments, we used a collection of 1 billion URLs collected +from the web, each URL 64 characters long on average. +For this collection, our algorithm +(i) finds a minimal perfect hash function in approximately +3 hours using a commodity PC, +(ii) needs just 5.45 megabytes of internal memory to generate $h$ +and (iii) takes 8.1 bits per key for the description of~$h$. +\keywords{Minimal Perfect Hashing \and Large Databases} +\end{abstract} + +% main text + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} +\def\BSmax{\mathit{BS}_{\mathit{max}}} +\def\Bi{\mathop{\rm Bi}\nolimits} + +\input{introduction} +%\input{terminology} +\input{relatedwork} +\input{thealgorithm} +\input{partitioningthekeys} +\input{searching} +%\input{computingoffset} +%\input{hashingbuckets} +\input{determiningb} +%\input{analyticalandexperimentalresults} +\input{analyticalresults} +%\input{results} +\input{conclusions} + + + + +%\input{acknowledgments} +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\input{appendix} +\end{document} From bd2e291de92eb1592a2a1fc72281406d9b571e57 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 17:32:31 +0000 Subject: [PATCH 350/739] paper for vldb07 added --- vldb07/acknowledgments.tex | 7 + vldb07/analyticalresults.tex | 174 +++ vldb07/appendix.tex | 6 + vldb07/conclusions.tex | 42 + vldb07/costhashingbuckets.tex | 177 +++ vldb07/determiningb.tex | 146 +++ vldb07/diskaccess.tex | 113 ++ vldb07/experimentalresults.tex | 15 + vldb07/figs/bmz_temporegressao.png | Bin 0 -> 5769 bytes vldb07/figs/brz-partitioning.fig | 107 ++ vldb07/figs/brz-partitioningfabiano.fig | 126 ++ vldb07/figs/brz.fig | 183 +++ vldb07/figs/brz_temporegressao.png | Bin 0 -> 5671 bytes vldb07/figs/brzfabiano.fig | 153 +++ vldb07/figs/minimalperfecthash-ph-mph.png | Bin 0 -> 3916 bytes vldb07/introduction.tex | 109 ++ vldb07/makefile | 17 + vldb07/partitioningthekeys.tex | 141 ++ vldb07/performancenewalgorithm.tex | 113 ++ vldb07/references.bib | 814 ++++++++++++ vldb07/relatedwork.tex | 112 ++ vldb07/searching.tex | 155 +++ vldb07/svglov2.clo | 77 ++ vldb07/svjour2.cls | 1419 +++++++++++++++++++++ vldb07/terminology.tex | 18 + vldb07/thealgorithm.tex | 78 ++ vldb07/thedataandsetup.tex | 21 + vldb07/vldb.tex | 194 +++ 28 files changed, 4517 insertions(+) create mode 100755 vldb07/acknowledgments.tex create mode 100755 vldb07/analyticalresults.tex create mode 100644 vldb07/appendix.tex create mode 100755 vldb07/conclusions.tex create mode 100755 vldb07/costhashingbuckets.tex create mode 100755 vldb07/determiningb.tex create mode 100755 vldb07/diskaccess.tex create mode 100755 vldb07/experimentalresults.tex create mode 100644 vldb07/figs/bmz_temporegressao.png create mode 100644 vldb07/figs/brz-partitioning.fig create mode 100755 vldb07/figs/brz-partitioningfabiano.fig create mode 100755 vldb07/figs/brz.fig create mode 100644 vldb07/figs/brz_temporegressao.png create mode 100755 vldb07/figs/brzfabiano.fig create mode 100644 vldb07/figs/minimalperfecthash-ph-mph.png create mode 100755 vldb07/introduction.tex create mode 100755 vldb07/makefile create mode 100755 vldb07/partitioningthekeys.tex create mode 100755 vldb07/performancenewalgorithm.tex create mode 100755 vldb07/references.bib create mode 100755 vldb07/relatedwork.tex create mode 100755 vldb07/searching.tex create mode 100644 vldb07/svglov2.clo create mode 100644 vldb07/svjour2.cls create mode 100755 vldb07/terminology.tex create mode 100755 vldb07/thealgorithm.tex create mode 100755 vldb07/thedataandsetup.tex create mode 100644 vldb07/vldb.tex diff --git a/vldb07/acknowledgments.tex b/vldb07/acknowledgments.tex new file mode 100755 index 0000000..d903ceb --- /dev/null +++ b/vldb07/acknowledgments.tex @@ -0,0 +1,7 @@ +\section{Acknowledgments} +This section is optional; it is a location for you +to acknowledge grants, funding, editing assistance and +what have you. In the present case, for example, the +authors would like to thank Gerald Murray of ACM for +his help in codifying this \textit{Author's Guide} +and the \textbf{.cls} and \textbf{.tex} files that it describes. diff --git a/vldb07/analyticalresults.tex b/vldb07/analyticalresults.tex new file mode 100755 index 0000000..06ea049 --- /dev/null +++ b/vldb07/analyticalresults.tex @@ -0,0 +1,174 @@ +%% Nivio: 23/jan/06 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Analytical results} +\label{sec:analytcal-results} + +\vspace{-1mm} +The purpose of this section is fourfold. +First, we show that our algorithm runs in expected time $O(n)$. +Second, we present the main memory requirements for constructing the MPHF. +Third, we discuss the cost of evaluating the resulting MPHF. +Fourth, we present the space required to store the resulting MPHF. + +\vspace{-2mm} +\subsection{The linear time complexity} +\label{sec:linearcomplexity} + +First, we show that the partitioning step presented in +Figure~\ref{fig:partitioningstep} runs in $O(n)$ time. +Each iteration of the {\bf for} loop in statement~1 +runs in $O(|B_j|)$ time, $1 \leq j \leq N$, where $|B_j|$ is the +number of keys +that fit in block $B_j$ of size $\mu$. This is because statement 1.1 just reads +$|B_j|$ keys from disk, statement 1.2 runs a bucket sort like algorithm +that is well known to be linear in the number of keys it sorts (i.e., $|B_j|$ keys), +and statement 1.3 just dumps $|B_j|$ keys to the disk into File $j$. +Thus, the {\bf for} loop runs in $O(\sum_{j=1}^{N}|B_j|)$ time. +As $\sum_{j=1}^{N}|B_j|=n$, then the partitioning step runs in $O(n)$ time. + +Second, we show that the searching step presented in +Figure~\ref{fig:searchingstep} also runs in $O(n)$ time. +The heap construction in statement 1 runs in $O(N)$ time, for $N \ll n$. +We have assumed that insertions and deletions in the heap cost $O(1)$ because +$N$ is typically much smaller than $n$ (see \cite[Section 6.4]{bkz06t} for details). +Statement 2 runs in $O(\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i])$ time +(remember that $\mathit{size}[i]$ stores the number of keys in bucket $i$). +As $\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i] = n$, if +statements 2.1, 2.2 and 2.3 run in $O(\mathit{size}[i])$ time, then statement 2 +runs in $O(n)$ time. + +%Statement 2.1 runs the algorithm to read a bucket from disk. That algorithm reads $\mathit{size}[i]$ +%keys of bucket $i$ that might be spread into many files or, in the worst case, +%into $|BS_{max}|$ files, where $|BS_{max}|$ is the number of keys in the bucket of maximum size. +%It uses the heap $H$ to drive a multiway merge of the sprayed bucket $i$. +%As we are considering that each read/write on disk costs $O(1)$ and +%each heap operation also costs $O(1)$ (recall $N \ll n$), then statement 2.1 +%costs $O(\mathit{size}[i])$ time. +%We need to take into account that this step could generate a lot of seeks on disk. +%However, the number of seeks can be amortized (see Section~\ref{sec:contr-disk-access}) +%and that is why we have been able of getting a MPHF for a set of 1 billion keys in less +%than 4 hours using a machine with just 500 MB of main memory +%(see Section~\ref{sec:performance}). +Statement 2.1 reads $O(\mathit{size}[i])$ keys of bucket $i$ +and is detailed in Figure~\ref{fig:readingbucket}. +As we are assuming that each read or write on disk costs $O(1)$ and +each heap operation also costs $O(1)$, statement~2.1 +takes $O(\mathit{size}[i])$ time. +However, the keys of bucket $i$ are distributed in at most~$BS_{max}$ files on disk +in the worst case +(recall that $BS_{max}$ is the maximum number of keys found in any bucket). +Therefore, we need to take into account that +the critical step in reading a bucket is in statement~1.3 of Figure~\ref{fig:readingbucket}, +where a seek operation in File $j$ +may be performed by the first read operation. + +In order to amortize the number of seeks performed we use a buffering technique~\cite{k73}. +We create a buffer $j$ of size \textbaht$\: = \mu/N$ for each file $j$, +where $1\leq j \leq N$ +(recall that $\mu$ is the size in bytes of an a priori reserved internal memory area). +Every time a read operation is requested to file $j$ and the data is not found +in the $j$th~buffer, \textbaht~bytes are read from file $j$ to buffer $j$. +Hence, the number of seeks performed in the worst case is given by +$\beta/$\textbaht~(remember that $\beta$ is the size in bytes of $S$). +For that we have made the pessimistic assumption that one seek happens every time +buffer $j$ is filled in. +Thus, the number of seeks performed in the worst case is $64n/$\textbaht, since +each URL is 64 bytes long on average. Therefore, the number of seeks is linear on +$n$ and amortized by \textbaht. + +It is important to emphasize two things. +First, the operating system uses techniques +to diminish the number of seeks and the average seek time. +This makes the amortization factor to be greater than \textbaht~in practice. +Second, almost all main memory is available to be used as +file buffers because just a small vector +of $\lceil n/b\rceil$ one-byte entries must be maintained in main memory, +as we show in Section~\ref{sec:memconstruction}. + + +Statement 2.2 runs our internal memory based algorithm in order to generate a MPHF for each bucket. +That algorithm is linear, as we showed in~\cite{bkz05}. As it is applied to buckets with {\it size}$[i]$ keys, statement~2.2 takes $O(\mathit{size}[i])$ time. + +Statement 2.3 has time complexity $O(\mathit{size}[i])$ because it writes to disk +the description of each generated MPHF and each description is stored in +$c \times \mathit{size}[i] + O(1)$ bytes, where $c\in[0.93,1.15]$. +In conclusion, our algorithm takes $O(n)$ time because both the partitioning and +the searching steps run in $O(n)$ time. + +An experimental validation of the above proof and a performance comparison with +our internal memory based algorithm~\cite{bkz05} were not included here due to +space restrictions but can be found in~\cite{bkz06t} and also in the appendix. + +\vspace{-1mm} +\enlargethispage{2\baselineskip} +\subsection{Space used for constructing a MPHF} +\label{sec:memconstruction} + +The vector {\it size} is kept in main memory +all the time. +The vector {\it size} has $\lceil n/b \rceil$ one-byte entries. +It stores the number of keys in each bucket and +those values are less than or equal to 256. +For example, for a set of 1 billion keys and $b=175$ the vector size needs +$5.45$ megabytes of main memory. + +We need an internal memory area of size $\mu$ bytes to be used in +the partitioning step and in the searching step. +The size $\mu$ is fixed a priori and depends only on the amount +of internal memory available to run the algorithm +(i.e., it does not depend on the size $n$ of the problem). + +% One could argue about the a priori reserved internal memory area and the main memory +% required to run the indirect bucket sort algorithm. +% Those internal memory requirements do not depend on the size of the problem +% (i.e., the number of keys being hashed) and can be fixed a priori. + +The additional space required in the searching step +is constant, once the problem was broken down +into several small problems (at most 256 keys) and +the heap size is supposed to be much smaller than $n$ ($N \ll n$). +For example, for a set of 1 billion keys and an internal area of~$\mu = 250$ megabytes, +the number of files is $N = 248$. + +\vspace{-1mm} +\subsection{Evaluation cost of the MPHF} + +Now we consider the amount of CPU time +required by the resulting MPHF at retrieval time. +The MPHF requires for each key the computation of three +universal hash functions and three memory accesses +(see Eqs.~(\ref{eq:mphf}), (\ref{eq:bucketindex}) and (\ref{eq:mphfi})). +This is not optimal. Pagh~\cite{p99} showed that any MPHF requires +at least the computation of two universal hash functions and one memory +access. + +\subsection{Description size of the MPHF} + +The number of bits required to store the MPHF generated by the algorithm +is computed by Eq.~(\ref{eq:newmphfbits}). +We need to store each $g_i$ vector presented in Eq.~(\ref{eq:mphfi}), where +$0\leq i < \lceil n/b \rceil$. As each bucket has at most 256 keys, each +entry in a $g_i$ vector has 8~bits. In each $g_i$ vector there are +$c \times \mathit{size}[i]$ entries (recall $c\in[0.93, 1.15]$). +When we sum up the number of entries of $\lceil n/b \rceil$ $g_i$ vectors we have +$c\sum_{i=0}^{\lceil n/b \rceil -1} \mathit{size}[i]=cn$ entries. We also need to +store $3 \lceil n/b \rceil$ integer numbers of +$\log_2n$ bits referring respectively to the {\it offset} vector and the two random seeds of +$h_{1i}$ and $h_{2i}$. In addition, we need to store $\lceil n/b \rceil$ 8-bit entries of +the vector {\it size}. Therefore, +\begin{eqnarray}\label{eq:newmphfbits} +\mathrm{Required\: Space} = 8cn + \frac{n}{b}\left( 3\log_2n +8\right) \: +\mathrm{bits}. +\end{eqnarray} + +Considering $c=0.93$ and $b=175$, the number of bits per key to store +the description of the resulting MPHF for a set of 1~billion keys is $8.1$. +If we set $b=128$, then the bits per key ratio increases to $8.3$. +Theoretically, the number of bits required to store the MPHF in +Eq.~(\ref{eq:newmphfbits}) +is $O(n\log n)$ as~$n\to\infty$. However, for sets of size up to $2^{b/3}$ keys +the number of bits per key is lower than 9~bits (note that +$2^{b/3}>2^{58}>10^{17}$ for $b=175$). +%For $b=175$, the number of bits per key will be close to 9 for a set of $2^{58}$ keys. +Thus, in practice the resulting function is stored in $O(n)$ bits. diff --git a/vldb07/appendix.tex b/vldb07/appendix.tex new file mode 100644 index 0000000..288ad8a --- /dev/null +++ b/vldb07/appendix.tex @@ -0,0 +1,6 @@ +\appendix +\input{experimentalresults} +\input{thedataandsetup} +\input{costhashingbuckets} +\input{performancenewalgorithm} +\input{diskaccess} diff --git a/vldb07/conclusions.tex b/vldb07/conclusions.tex new file mode 100755 index 0000000..8d32741 --- /dev/null +++ b/vldb07/conclusions.tex @@ -0,0 +1,42 @@ +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Concluding remarks} +\label{sec:concuding-remarks} + +This paper has presented a novel external memory based algorithm for +constructing MPHFs that works for sets in the order of billions of keys. The +algorithm outputs the resulting function in~$O(n)$ time and, furthermore, it +can be tuned to run only $34\%$ slower (see \cite{bkz06t} for details) than the fastest +algorithm available in the literature for constructing MPHFs~\cite{bkz05}. +In addition, the space +requirement of the resulting MPHF is of up to 9 bits per key for datasets of +up to $2^{58}\simeq10^{17.4}$ keys. + +The algorithm is simple and needs just a +small vector of size approximately 5.45 megabytes in main memory to construct +a MPHF for a collection of 1 billion URLs, each one 64 bytes long on average. +Therefore, almost all main memory is available to be used as disk I/O buffer. +Making use of such a buffering scheme considering an internal memory area of size +$\mu=200$ megabytes, our algorithm can produce a MPHF for a +set of 1 billion URLs in approximately 3.6 hours using a commodity PC of 2.4 gigahertz and +500 megabytes of main memory. +If we increase both the main memory +available to 1 gigabyte and the internal memory area to $\mu=500$ megabytes, +a MPHF for the set of 1 billion URLs is produced in approximately 3 hours. For any +key, the evaluation of the resulting MPHF takes three memory accesses and the +computation of three universal hash functions. + +In order to allow the reproduction of our results and the utilization of both the internal memory +based algorithm and the external memory based algorithm, +the algorithms are available at \texttt{http://cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +They were implemented in the C language. + +In future work, we will exploit the fact that the searching step intrinsically +presents a high degree of parallelism and requires $73\%$ of the +construction time. Therefore, a parallel implementation of our algorithm will +allow the construction and the evaluation of the resulting function in parallel. +Therefore, the description of the resulting MPHFs will be distributed in the paralell +computer allowing the scalability to sets of hundreds of billions of keys. +This is an important contribution, mainly for applications related to the Web, as +mentioned in Section~\ref{sec:intro}. \ No newline at end of file diff --git a/vldb07/costhashingbuckets.tex b/vldb07/costhashingbuckets.tex new file mode 100755 index 0000000..3a624ce --- /dev/null +++ b/vldb07/costhashingbuckets.tex @@ -0,0 +1,177 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Performance of the internal memory based algorithm} +\label{sec:intern-memory-algor} + +%\begin{table*}[htb] +%\begin{center} +%{\scriptsize +%\begin{tabular}{|c|c|c|c|c|c|c|c|} +%\hline +%$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +%\hline +%Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +%SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +%\hline +%\end{tabular} +%\vspace{-3mm} +%} +%\end{center} +%\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +%the standard deviation (SD), and the confidence intervals considering +%a confidence level of $95\%$.} +%\label{tab:medias} +%\end{table*} + +Our three-step internal memory based algorithm presented in~\cite{bkz05} +is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have the form~$\alpha +nZ$ for an input of~$n$ keys, where~$\alpha$ is some machine dependent +constant that further depends on the length of the keys and~$Z$ is a random +variable with geometric distribution with mean~$1/p=e^{1/c^2}$ (see +Section~\ref{sec:mphfbucket}). All results in our experiments were obtained +taking $c=1$; the value of~$c$, with~$c\in[0.93,1.15]$, in fact has little +influence in the runtime, as shown in~\cite{bkz05}. + +The values chosen for $n$ were $1, 2, 4, 8, 16$ and $32$ million. +Although we have a dataset with 1~billion URLs, on a PC with +1~gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires $25n + O(1)$ bytes for constructing +a MPHF (details about the data structures used by the algorithm can +be found in~\texttt{http://cmph.sf.net}. +% for the details about the data structures +%used by the algorithm). + +In order to estimate the number of trials for each value of $n$ we use +a statistical method for determining a suitable sample size (see, e.g., +\cite[Chapter 13]{j91}). +As we obtained different values for each $n$, +we used the maximal value obtained, namely, 300~trials in order to have +a confidence level of $95\%$. + +% \begin{figure*}[ht] +% \noindent +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The previous algorithm] +% {\scalebox{0.5}{\includegraphics{figs/bmz_temporegressao.eps}}} +% \end{minipage} +% \hfill +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The new algorithm] +% {\scalebox{0.5}{\includegraphics{figs/brz_temporegressao.eps}}} +% \end{minipage} +% \caption{Time versus number of keys in $S$. The solid line corresponds to +% a linear regression model.} +% %obtained from the experimental measurements.} +% \label{fig:temporegressao} +% \end{figure*} + +Table~\ref{tab:medias} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in~\cite{bkz05}. + +\vspace{-2mm} +\begin{table*}[htb] +\begin{center} +{\scriptsize +\begin{tabular}{|c|c|c|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +\hline +Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$.} +\label{tab:medias} +\vspace{-4mm} +\end{table*} + +% \enlargethispage{\baselineskip} +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% (a) +% \begin{tabular}{|c|c|c|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +% \hline +% Average time (s)& $6.119 \pm 0.300$ & $12.190 \pm 0.615$ & $25.359 \pm 1.109$ & $51.408 \pm 2.003$ & $117.343 \pm 4.364$ & $262.215 \pm 8.724$\\ +% SD (s) & $2.644$ & $5.414$ & $9.757$ & $17.627$ & $37.333$ & $76.271$ \\ +% \hline +% \end{tabular} +% \\[5mm] (b) +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $6.927 \pm 0.309$ & $13.828 \pm 0.175$ & $31.936 \pm 0.663$ & $69.902 \pm 1.084$ & $140.617 \pm 2.502$ \\ +% SD & $0.431$ & $0.245$ & $0.926$ & $1.515$ & $3.498$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $284.330 \pm 1.135$ & $587.880 \pm 3.945$ & $1223.581 \pm 4.864$ & $5966.402 \pm 9.465$ & $13229.540 \pm 12.670$ \\ +% SD & $1.587$ & $5.514$ & $6.800$ & $13.232$ & $18.577$ \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$.} +% \label{tab:medias} +% \end{table*} + +\enlargethispage{2\baselineskip} +Figure~\ref{fig:bmz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given $n$ has a considerable +fluctuation. However, the fluctuation also grows linearly with $n$. + +\begin{figure}[htb] +\vspace{-2mm} +\begin{center} +\scalebox{0.4}{\includegraphics{figs/bmz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for the internal memory based algorithm. +The solid line corresponds to a linear regression model.} +\label{fig:bmz_temporegressao} +\end{center} +\vspace{-6mm} +\end{figure} + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form~$\alpha nZ$ with~$Z$ a geometric random variable with +mean~$1/p=e$. Thus, the runtime has mean~$\alpha n/p=\alpha en$ and standard +deviation~$\alpha n\sqrt{(1-p)/p^2}=\alpha n\sqrt{e(e-1)}$. +Therefore, the standard deviation also grows +linearly with $n$, as experimentally verified +in Table~\ref{tab:medias} and in Figure~\ref{fig:bmz_temporegressao}. + +%\noindent-------------------------------------------------------------------------\\ +%Comentario para Yoshi: Nao consegui reproduzir bem o que discutimos +%no paragrafo acima, acho que vc conseguira justificar melhor :-). \\ +%-------------------------------------------------------------------------\\ diff --git a/vldb07/determiningb.tex b/vldb07/determiningb.tex new file mode 100755 index 0000000..e9b3cb2 --- /dev/null +++ b/vldb07/determiningb.tex @@ -0,0 +1,146 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\subsection{Determining~$b$} +\label{sec:determining-b} +\begin{table*}[t] +\begin{center} +{\small %\scriptsize +\begin{tabular}{|c|ccc|ccc|} +\hline +\raisebox{-0.7em}{$n$} & \multicolumn{3}{c|}{\raisebox{-1mm}{b=128}} & +\multicolumn{3}{c|}{\raisebox{-1mm}{b=175}}\\ +\cline{2-4} \cline{5-7} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} \\ +\hline +$1.0 \times 10^6$ & 177 & 172.0 & 176 & 232 & 226.6 & 230 \\ +%$2.0 \times 10^6$ & 179 & 174.0 & 178 & 236 & 228.5 & 232 \\ +$4.0 \times 10^6$ & 182 & 177.5 & 179 & 241 & 231.8 & 234 \\ +%$8.0 \times 10^6$ & 186 & 181.6 & 181 & 238 & 234.2 & 236 \\ +$1.6 \times 10^7$ & 184 & 181.6 & 183 & 241 & 236.1 & 238 \\ +%$3.2 \times 10^7$ & 191 & 183.9 & 184 & 240 & 236.6 & 240 \\ +$6.4 \times 10^7$ & 195 & 185.2 & 186 & 244 & 239.0 & 242 \\ +%$1.28 \times 10^8$ & 193 & 187.7 & 187 & 244 & 239.7 & 244 \\ +$5.12 \times 10^8$ & 196 & 191.7 & 190 & 251 & 246.3 & 247 \\ +$1.0 \times 10^9$ & 197 & 191.6 & 192 & 253 & 248.9 & 249 \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Values for $\mathit{BS}_{\mathit{max}}$: worst case and average case obtained in the experiments and using Eq.~(\ref{eq:maxbs}), +considering $b=128$ and $b=175$ for different number $n$ of keys in $S$.} +\label{tab:comparison} +\vspace{-6mm} +\end{table*} + +The partitioning step can be viewed as the well known ``balls into bins'' +problem~\cite{ra98,dfm02} where~$n$ keys (the balls) are placed independently and +uniformly into $\lceil n/b\rceil$ buckets (the bins). The main question related to that problem we are interested +in is: what is the maximum number of keys in any bucket? +In fact, we want to get the maximum value for $b$ that makes the maximum number of keys in any bucket +no greater than 256 with high probability. +This is important, as we wish to use 8 bits per entry in the vector $g_i$ of +each $\mathrm{MPHF}_i$, +where $0 \leq i < \lceil n/b\rceil$. +Let $\mathit{BS}_{\mathit{max}}$ be the maximum number of keys in any bucket. + +Clearly, $\BSmax$ is the maximum +of~$\lceil n/b\rceil$ random variables~$Z_i$, each with binomial +distribution~$\Bi(n,p)$ with parameters~$n$ and~$p=1/\lceil n/b\rceil$. +However, the~$Z_i$ are not independent. Note that~$\Bi(n,p)$ has mean and +variance~$\simeq b$. To give an upper estimate for the probability of the +event~$\BSmax\geq \gamma$, we can estimate the probability that we have~$Z_i\geq \gamma$ +for a fixed~$i$, and then sum these estimates over all~$i$. +Let~$\gamma=b+\sigma\sqrt{b\ln(n/b)}$, where~$\sigma=\sqrt2$. +Approximating~$\Bi(n,p)$ by the normal distribution with mean and +variance~$b$, we obtain the +estimate~$(\sigma\sqrt{2\pi\ln(n/b)})^{-1}\times\exp(-(1/2)\sigma^2\ln(n/b))$ for +the probability that~$Z_i\geq \gamma$ occurs, which, summed over all~$i$, gives +that the probability that~$\BSmax\geq \gamma$ occurs is at +most~$1/(\sigma\sqrt{2\pi\ln(n/b)})$, which tends to~$0$ as~$n\to\infty$. +Thus, we have shown that, with high probability, +\begin{equation} + \label{eq:maxbs} + \BSmax\leq b+\sqrt{2b\ln{n\over b}}. +\end{equation} + +% The traditional approach used to estimate $\mathit{BS}_{\mathit{max}}$ with high probability is +% to consider $\mathit{BS}_{\mathit{max}}$ as a random variable that follows a binomial distribution +% that can be approximated by a poisson distribution. This yields a good approximation +% when the number of balls is lower than or equal to the number of bins~\cite{g81}. In our case, +% the number of balls is greater than the number of buckets. +% % and that is why we have used more recent works to estimate $\mathit{BS}_{\mathit{max}}$. +% As $b > \ln (n/b)$, we can use the result by Raab and Steger~\cite{ra98} to estimate +% $\mathit{BS}_{\mathit{max}}$ with high probability. +% The following equation gives the estimation, where $\sigma=\sqrt{2}$: +% \begin{eqnarray} \label{eq:maxbs} +% \mathit{BS}_{\mathit{max}} = b + O \left( \sqrt{b\ln\frac{n}{b}} \right) = b + \sigma \times \left(\sqrt{b\ln\frac{n}{b}} \right) +% \end{eqnarray} + +% In order to estimate the suitable constant $\sigma$ we did a linear +% regression suppressing the constant term. +% We use the equation $BS_{max} - b = \sigma \times \sqrt{b\ln (n/b)}$ +% in the linear regression considering $y=BS_{max} - b$ and $x=\sqrt{b\ln (n/b)}$. +% In order to obtain data to be used in the linear regression we set +% b=128 and ran the new algorithm ten times +% for n equal to 1, 2, 4, 8, 16, 32, 64, 128, 512, 1000 million keys. +% Taking a confidence level equal to 95\% we got +% $\sigma = 2.11 \pm 0.03$. +% The coefficient of determination was $99.6\%$, which means that the linear +% regression explains $99.6\%$ of the data variation and only $0.4\%$ +% is due to experimental errors. +% Therefore, Eq.~(\ref{eq:maxbs}) with $\sigma = 2.11 \pm 0.03$ and $b=128$ +% makes a very good estimation of the maximum number of keys in any bucket. + +% Repeating the same experiments for $b$ equals to $175$ and +% a confidence level of $95\%$ we got $\sigma = 2.07 \pm 0.03$. +% Again we verified that Eq.~(\ref{eq:maxbs}) with $\sigma = 2.07 \pm 0.03$ and $b=175$ is +% a very good estimation of the maximum number of keys in any bucket once the +% coefficient of determination obtained was $99.7 \%$ and $\sigma$ is in a very narrow range. + +In our algorithm the maximum number of keys in any bucket must be at most 256. +Table~\ref{tab:comparison} presents the values for $\mathit{BS}_{\mathit{max}}$ +obtained experimentally and using Eq.~(\ref{eq:maxbs}). +The table presents the worst case and the average case, +considering $b=128$, $b=175$ and Eq.~(\ref{eq:maxbs}), +for several numbers~$n$ of keys in $S$. +The estimation given by Eq.~(\ref{eq:maxbs}) is very close to the experimental +results. + +Now we estimate the biggest problem our algorithm is able to solve for +a given $b$. +Using Eq.~(\ref{eq:maxbs}) considering $b=128$, $b=175$ and imposing +that~$\mathit{BS}_{\mathit{max}}\leq256$, +the sizes of the biggest key set our algorithm +can deal with are $10^{30}$ keys and $10^{10}$ keys, respectively. +%It is also important to have $b$ as big as possible, once its value is +%related to the space required to store the resultant MPHF, as shown later on. +%Table~\ref{tab:bp} shows the biggest problem the algorithm can solve. +% The values were obtained from Eq.~(\ref{eq:maxbs}), +% considering $b=128$ and~$b=175$ and imposing +% that~$\mathit{BS}_{\mathit{max}}\leq256$. + +% We set $\sigma=2.14$ because it was the greatest value obtained for $\sigma$ +% in the two linear regression we did. +% \vspace{-3mm} +% \begin{table}[htb] +% \begin{center} +% {\small %\scriptsize +% \begin{tabular}{|c|c|} +% \hline +% b & Problem size ($n$) \\ +% \hline +% 128 & $10^{30}$ keys \\ +% 175 & $10^{10}$ keys \\ +% \hline +% \end{tabular} +% \vspace{-1mm} +% } +% \end{center} +% \caption{Using Eq.~(\ref{eq:maxbs}) to estimate the biggest problem our algorithm can solve.} +% %considering $\sigma=\sqrt{2}$.} +% \label{tab:bp} +% \vspace{-14mm} +% \end{table} diff --git a/vldb07/diskaccess.tex b/vldb07/diskaccess.tex new file mode 100755 index 0000000..08e54b9 --- /dev/null +++ b/vldb07/diskaccess.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Controlling disk accesses} +\label{sec:contr-disk-access} + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter $\mu$ +affects the runtime of our algorithm. +For that we fixed $n$ in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used $\mu$ equal to $100, 200, 300, 400, 500$ and $600$ +megabytes. + +\enlargethispage{2\baselineskip} +Table~\ref{tab:diskaccess} presents the number of files $N$, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in Section~\ref{sec:linearcomplexity}, and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table~\ref{tab:diskaccess} we noticed that the time spent in the construction +decreases as the value of $\mu$ increases. However, for $\mu > 400$, the variation +on the time is not as significant as for $\mu \leq 400$. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies +for avoiding seeks and diminishing the average seek time +(see \texttt{http://www.linuxjournal.com/article/6931}). +\begin{table*}[ht] +\vspace{-2mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|c|} +\hline +$\mu$ (MB) & $100$ & $200$ & $300$ & $400$ & $500$ & $600$ \\ +\hline +$N$ (files) & $619$ & $310$ & $207$ & $155$ & $124$ & $104$ \\ +%\hline +\textbaht~(buffer size in KB) & $165$ & $661$ & $1,484$ & $2,643$ & $4,129$ & $5,908$ \\ +%\hline +$\beta$/\textbaht~(\# of seeks in the worst case) & $384,478$ & $95,974$ & $42,749$ & $24,003$ & $15,365$ & $10,738$ \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$15,347$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & \\ +% \hline +Time (hours) & $4.04$ & $3.64$ & $3.34$ & $3.20$ & $3.13$ & $3.09$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +\label{tab:diskaccess} +\vspace{-14mm} +\end{table*} + + + +% \begin{table*}[ht] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|} +% \hline +% $\mu$ (MB) & $100$ & $150$ & $200$ & $250$ & $300$ & $350$ & $400$ & $450$ & $500$ & $550$ & $600$ \\ +% \hline +% $N$ (files) & $619$ & $413$ & $310$ & $248$ & $207$ & $177$ & $155$ & $138$ & $124$ & $113$ & $103$ \\ +% \hline +% \textbaht~(buffer size in KB) & $165$ & $372$ & $661$ & $1,033$ & $1,484$ & $2,025$ & $2,643$ & $3,339$ & & & \\ +% \hline +% \# of seeks (Worst case) & $384,478$ & $170,535$ & $95,974$ & $61,413$ & $42,749$ & $31,328$ & $24,003$ & $19,000$ & & & \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$170,385$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$61,388$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$31,296$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$18,978$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & & & & & & \\ +% \hline +% Time (horas) & $4.04$ & $3.93$ & $3.64$ & $3.46$ & $3.34$ & $3.26$ & $3.20$ & $3.13$ & & & \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +% \label{tab:diskaccess} +% \end{table*} + + + +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $14.124 \pm 0.128$ & $28.301 \pm 0.140$ & $56.807 \pm 0.312$ & $117.286 \pm 0.997$ & $241.086 \pm 0.936$ \\ +% SD & $0.179$ & $0.196$ & $0.437$ & $1.394$ & $1.308$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $492.430 \pm 1.565$ & $1006.307 \pm 1.425$ & $2081.208 \pm 0.740$ & $9253.188 \pm 4.406$ & $19021.480 \pm 13.850$ \\ +% SD & $2.188$ & $1.992$ & $1.035$ & $ 6.160$ & $18.016$ \\ +% \hline + +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$. +% } +% \label{tab:mediasbrz} +% \end{table*} diff --git a/vldb07/experimentalresults.tex b/vldb07/experimentalresults.tex new file mode 100755 index 0000000..58b4091 --- /dev/null +++ b/vldb07/experimentalresults.tex @@ -0,0 +1,15 @@ +%Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\section{Appendix: Experimental results} +\label{sec:experimental-results} +\vspace{-1mm} + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm~\cite{bkz05} +and for our algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of our algorithm. diff --git a/vldb07/figs/bmz_temporegressao.png b/vldb07/figs/bmz_temporegressao.png new file mode 100644 index 0000000000000000000000000000000000000000..e7198c1cea2b9f5d766b7f422b23a2e259209c79 GIT binary patch literal 5769 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 J@QQuN{{U&H=p48g`weTH#H5IX}; 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 ydE%}ySS(et!ZLcRyFa7rolcuCKId +\section{Introduction} +\label{sec:intro} + +\enlargethispage{2\baselineskip} +Suppose~$U$ is a universe of \textit{keys} of size $u$. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$, where $ n \ll u$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +% Hashing methods for {\em non-static sets} of keys can be used to construct +% data structures storing $S$ and supporting membership queries +% ``$x \in S$?'' in expected time $O(1)$. +% However, they involve a certain amount of wasted space owing to unused +% locations in the table and waisted time to resolve collisions when +% two keys are hashed to the same table location. +A perfect hash function maps a {\em static set} $S$ of $n$ keys from $U$ into a set of $m$ integer +numbers without collisions, where $m$ is greater than or equal to $n$. +If $m$ is equal to $n$, the function is called minimal. + +% Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash function and +% Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates a minimal perfect hash function (MPHF). +% +% \begin{figure} +% \centering +% \scalebox{0.7}{\epsfig{file=figs/minimalperfecthash-ph-mph.ps}} +% \caption{(a) Perfect hash function (b) Minimal perfect hash function (MPHF)} +% \label{fig:minimalperfecthash-ph-mph} +% %\vspace{-5mm} +% \end{figure} + +Minimal perfect hash functions are widely used for memory efficient storage and fast +retrieval of items from static sets, such as words in natural languages, +reserved words in programming languages or interactive systems, universal resource +locations (URLs) in web search engines, or item sets in data mining techniques. +Search engines are nowadays indexing tens of billions of pages and algorithms +like PageRank~\cite{Brin1998}, which uses the web link structure to derive a +measure of popularity for Web pages, would benefit from a MPHF for storage and +retrieval of such huge sets of URLs. +For instance, the TodoBr\footnote{TodoBr ({\texttt www.todobr.com.br}) is a trademark of +Akwan Information Technologies, which was acquired by Google Inc. in July 2005.} +search engine used the algorithm proposed hereinafter to +improve and to scale its link analysis system. +The WebGraph research group~\cite{bv04} would +also benefit from a MPHF for sets in the order of billions of URLs to scale +and to improve the storange requirements of their algorithms on Graph compression. + + Another interesting application for MPHFs is its use as an indexing structure + for databases. + The B+ tree is very popular as an indexing structure for dynamic applications + with frequent insertions and deletions of records. + However, for applications with sporadic modifications and a huge number of + queries the B+ tree is not the best option, + because it performs poorly with very large sets of keys + such as those required for the new frontiers of database applications~\cite{s05}. + Therefore, there are applications for MPHFs in + information retrieval systems, database systems, language translation systems, + electronic commerce systems, compilers, operating systems, among others. + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymore~\cite{s05}, the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. +% using stock hardware. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: +\begin{enumerate} +\item The amount of CPU time required by the algorithms for constructing MPHFs. +\item The space requirements of the algorithms for constructing MPHFs. +\item The amount of CPU time required by a MPHF for each retrieval. +\item The space requirements of the description of the resulting MPHFs to be + used at retrieval time. +\end{enumerate} + +\enlargethispage{2\baselineskip} +This paper presents a novel external memory based algorithm for constructing MPHFs that +is very efficient in these four requirements. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of $\lceil n/b \rceil$ +one byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using $b=175$, the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is $1/\ln2 \approx 1.4427$ bits per +key~\cite{m84}. + diff --git a/vldb07/makefile b/vldb07/makefile new file mode 100755 index 0000000..1b95644 --- /dev/null +++ b/vldb07/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log *.ps *.pdf *.dvi + diff --git a/vldb07/partitioningthekeys.tex b/vldb07/partitioningthekeys.tex new file mode 100755 index 0000000..e9a48c4 --- /dev/null +++ b/vldb07/partitioningthekeys.tex @@ -0,0 +1,141 @@ +%% Nivio: 21/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Partitioning step} +\label{sec:partitioning-keys} + +The set $S$ of $n$ keys is partitioned into $\lceil n/b \rceil$ buckets, +where $b$ is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see Section~\ref{sec:determining-b}). +The partitioning step works as follows: + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $\beta$ be the size in bytes of the set $S$ \\ +\> $\blacktriangleright$ Let $\mu$ be the size in bytes of an a priori reserved \\ +\> ~~~ internal memory area \\ +\> $\blacktriangleright$ Let $N = \lceil \beta/\mu \rceil$ be the number of key blocks that will \\ +\> ~~~ be read from disk into an internal memory area \\ +\> $\blacktriangleright$ Let $\mathit{size}$ be a vector that stores the size of each bucket \\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \\ +\> ~~ $1.1$ Read block $B_j$ of keys from disk \\ +\> ~~ $1.2$ Cluster $B_j$ into $\lceil n/b \rceil$ buckets using a bucket sort \\ +\> ~~~~~~~ algorithm and update the entries in the vector {\it size} \\ +\> ~~ $1.3$ Dump $B_j$ to the disk into File $j$\\ +\> $2.$ Compute the {\it offset} vector and dump it to the disk. +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Partitioning step} +\vspace{-3mm} +\label{fig:partitioningstep} +\end{figure} + +Statement 1.1 of the {\bf for} loop presented in Figure~\ref{fig:partitioningstep} +reads sequentially all the keys of block $B_j$ from disk into an internal area +of size $\mu$. + +Statement 1.2 performs an indirect bucket sort of the keys in block $B_j$ +and at the same time updates the entries in the vector {\em size}. +Let us briefly describe how~$B_j$ is partitioned among the~$\lceil n/b\rceil$ +buckets. +We use a local array of $\lceil n/b \rceil$ counters to store a +count of how many keys from $B_j$ belong to each bucket. +%At the same time, the global vector {\it size} is computed based on the local +%counters. +The pointers to the keys in each bucket $i$, $0 \leq i < \lceil n/b \rceil$, +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +\enlargethispage{2\baselineskip} +To find the bucket address of a given key +we use the universal hash function $h_0(k)$~\cite{j97}. +Key~$k$ goes into bucket~$i$, where +%Then, for each integer $h_0(k)$ the respective bucket address is obtained +%as follows: +\begin{eqnarray} \label{eq:bucketindex} +i=h_0(k) \bmod \left \lceil \frac{n}{b} \right \rceil. +\end{eqnarray} + +Figure~\ref{fig:brz-partitioning}(a) shows a \emph{logical} view of the +$\lceil n/b \rceil$ buckets generated in the partitioning step. +%In this case, the keys of each bucket are put together by the pointers to +%each key stored +%in contiguous positions in the array of pointers. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure~\ref{fig:brz-partitioning}(b). +In the example of Figure~\ref{fig:brz-partitioning}(b), the keys in bucket 0 +appear in files 1 and $N$, the keys in bucket 1 appear in files 1, 2 +and $N$, and so on. + +\vspace{-7mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz-partitioning.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(4371,1403)(1,-6977) +\put(333,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(545,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(759,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(1539,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(541,-6676){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Logical View}}}} +\put(3547,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6224){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6269){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6314){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3016,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 1}}}} +\put(3466,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 2}}}} +\put(4096,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File N}}}} +\put(3196,-6946){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Physical View}}}} +\end{picture}% +\caption{Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view} +\label{fig:brz-partitioning} +\vspace{-2mm} +\end{figure} + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the $N$ files in disk +during the searching step. +But, as we show later in Section~\ref{sec:analytcal-results}, the number of seeks +can be kept small using buffering techniques. +Considering that only the vector {\it size}, which has $\lceil n/b \rceil$ +one-byte entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the {\it offset} vector and dump it to the disk. +We use the vector $\mathit{size}$ to compute the +$\mathit{offset}$ displacement vector. +The $\mathit{offset}[i]$ entry contains the number of keys +in the buckets $0, 1, \dots, i-1$. +As {\it size}$[i]$ stores the number of keys +in bucket $i$, where $0 \leq i <\lceil n/b \rceil$, we have +\begin{displaymath} +\mathit{offset}[i] = \sum_{j=0}^{i-1} \mathit{size}[j] \cdot +\end{displaymath} + diff --git a/vldb07/performancenewalgorithm.tex b/vldb07/performancenewalgorithm.tex new file mode 100755 index 0000000..6911282 --- /dev/null +++ b/vldb07/performancenewalgorithm.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\subsection{Performance of the new algorithm} +\label{sec:performance} +%As we have done for the internal memory based algorithm, + +The runtime of our algorithm is also a random variable, but now it follows a +(highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +Section~\ref{sec:linearcomplexity}. Therefore, we ran the algorithm for +several numbers $n$ of keys in $S$. + +The values chosen for $n$ were $1, 2, 4, 8, 16, 32, 64, 128, 512$ and $1000$ +million. +%Just the small vector {\it size} must be kept in main memory, +%as we saw in Section~\ref{sec:memconstruction}. +We limited the main memory in 500 megabytes for the experiments. +The size $\mu$ of the a priori reserved internal memory area +was set to 250 megabytes, the parameter $b$ was set to $175$ and +the building block algorithm parameter $c$ was again set to $1$. +In Section~\ref{sec:contr-disk-access} we show how $\mu$ +affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +%~\cite[Chapter 13]{j91} +to estimate the number of trials to be run for each value of $n$. We got that +just one trial for each $n$ would be enough with a confidence level of $95\%$. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table~\ref{tab:mediasbrz} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in~Section~\ref{sec:linearcomplexity}. Better still, +it is only approximately $60\%$ slower than our internal memory based algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for our algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes (see Section~\ref{sec:contr-disk-access}), +we have brought the time to 3.09 hours. In this case, our algorithm is +just $34\%$ slower in this setup. + +\enlargethispage{2\baselineskip} +\begin{table*}[htb] +\vspace{-1mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +\hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +Average time (s) & $6.9 \pm 0.3$ & $13.8 \pm 0.2$ & $31.9 \pm 0.7$ & $69.9 \pm 1.1$ & $140.6 \pm 2.5$ \\ +SD & $0.4$ & $0.2$ & $0.9$ & $1.5$ & $3.5$ \\ +\hline +\hline +$n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +\hline % Part. 20 \% 20\% 20\% 18\% 18\% +Average time (s) & $284.3 \pm 1.1$ & $587.9 \pm 3.9$ & $1223.6 \pm 4.9$ & $5966.4 \pm 9.5$ & $13229.5 \pm 12.7$ \\ +SD & $1.6$ & $5.5$ & $6.8$ & $13.2$ & $18.6$ \\ +\hline + +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Our algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$. +} +\label{tab:mediasbrz} +\vspace{-5mm} +\end{table*} + +Figure~\ref{fig:brz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given $n$ has almost no +variation. + +\begin{figure}[htb] +\begin{center} +\scalebox{0.4}{\includegraphics{figs/brz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for our algorithm. The solid line corresponds to +a linear regression model.} +\label{fig:brz_temporegressao} +\end{center} +\vspace{-9mm} +\end{figure} + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket~$i$, +$0 \leq i < \lceil n/b \rceil$, is a small set of keys (at most 256 keys) and, +as argued in Section~\ref{sec:intern-memory-algor}, the runtime of the +building block algorithm is a random variable~$X_i$ with high fluctuation. +However, the runtime~$Y$ of the searching step of our algorithm is given +by~$Y=\sum_{0\leq i<\lceil n/b\rceil}X_i$. Under the hypothesis that +the~$X_i$ are independent and bounded, the {\it law of large numbers} (see, +e.g., \cite{j91}) implies that the random variable $Y/\lceil n/b\rceil$ +converges to a constant as~$n\to\infty$. This explains why the runtime of our +algorithm is almost deterministic. + + diff --git a/vldb07/references.bib b/vldb07/references.bib new file mode 100755 index 0000000..d2ea475 --- /dev/null +++ b/vldb07/references.bib @@ -0,0 +1,814 @@ + +@InProceedings{Brin1998, + author = "Sergey Brin and Lawrence Page", + title = "The Anatomy of a Large-Scale Hypertextual Web Search Engine", + booktitle = "Proceedings of the 7th International {World Wide Web} + Conference", + pages = "107--117", + adress = "Brisbane, Australia", + month = "April", + year = 1998, + annote = "Artigo do Google." +} + +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} +@article{g81, + author = {G. H. Gonnet}, + title = {Expected Length of the Longest Probe Sequence in Hash Code Searching}, + journal = {J. ACM}, + volume = {28}, + number = {2}, + year = {1981}, + issn = {0004-5411}, + pages = {289--304}, + doi = {http://doi.acm.org/10.1145/322248.322254}, + publisher = {ACM Press}, + address = {New York, NY, USA}, + } + +@misc{r04, + author = "S. Rao", + title = "Combinatorial Algorithms Data Structures", + year = 2004, + howpublished = {CS 270 Spring}, + url = "citeseer.ist.psu.edu/700201.html" +} +@article{ra98, + author = {Martin Raab and Angelika Steger}, + title = {``{B}alls into Bins'' --- {A} Simple and Tight Analysis}, + journal = {Lecture Notes in Computer Science}, + volume = 1518, + pages = {159--170}, + year = 1998, + url = "citeseer.ist.psu.edu/raab98balls.html" +} + +@misc{mrs00, + author = "M. Mitzenmacher and A. Richa and R. Sitaraman", + title = "The power of two random choices: A survey of the techniques and results", + howpublished={In Handbook of Randomized + Computing, P. Pardalos, S. Rajasekaran, and J. Rolim, Eds. Kluwer}, + year = "2000", + url = "citeseer.ist.psu.edu/article/mitzenmacher00power.html" +} + +@article{dfm02, + author = {E. Drinea and A. Frieze and M. Mitzenmacher}, + title = {Balls and bins models with feedback}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + pages = {308--315}, + year = {2002} +} +@Article{j97, + author = {Bob Jenkins}, + title = {Algorithm Alley: Hash Functions}, + journal = {Dr. Dobb's Journal of Software Tools}, + volume = {22}, + number = {9}, + month = {september}, + year = {1997} +} + +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + +@article{s05, + author = {M. Seltzer}, + title = {Beyond Relational Databases}, + journal = {ACM Queue}, + volume = {3}, + number = {3}, + month = {April}, + year = {2005} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu;os para a Constru;o de Arquivos invertidos}, + school = {Departamento de Ci;cia da Computa;o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar;}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + +@Book{j91, + author = {R. Jain}, + title = {The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. }, + publisher = {John Wiley}, + year = {1991}, + edition = {first} +} + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa;es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi;o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q. Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@TechReport{bkz06t, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {An Approach for Minimal Perfect Hash Functions in Very Large Databases}, + institution = {Department of Computer Science, Federal University of Minas Gerais}, + note = {Available at http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html}, + year = {2006}, + OPTkey = {}, + OPTtype = {}, + number = {RT.DCC.003}, + address = {Belo Horizonte, MG, Brazil}, + month = {April}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04:_OLD, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + +@article {pw04, + AUTHOR = {Pittel, Boris and Wormald, Nicholas C.}, + TITLE = {Counting connected graphs inside-out}, + JOURNAL = {J. Combin. Theory Ser. B}, + FJOURNAL = {Journal of Combinatorial Theory. Series B}, + VOLUME = 93, + YEAR = 2005, + NUMBER = 2, + PAGES = {127--172}, + ISSN = {0095-8956}, + CODEN = {JCBTB8}, + MRCLASS = {05C30 (05A16 05C40 05C80)}, + MRNUMBER = {MR2117934 (2005m:05117)}, +MRREVIEWER = {Edward A. Bender}, +} diff --git a/vldb07/relatedwork.tex b/vldb07/relatedwork.tex new file mode 100755 index 0000000..7693002 --- /dev/null +++ b/vldb07/relatedwork.tex @@ -0,0 +1,112 @@ +% Time-stamp: +\vspace{-3mm} +\section{Related work} +\label{sec:relatedprevious-work} +\vspace{-2mm} + +% Optimal speed for hashing means that each key from the key set $S$ +% will map to an unique location in the hash table, avoiding time wasted +% in resolving collisions. That is achieved with a MPHF and +% because of that many algorithms for constructing static +% and dynamic MPHFs, when static or dynamic sets are involved, +% were developed. Our focus has been on static MPHFs, since +% in many applications the key sets change slowly, if at all~\cite{s05}. + +\enlargethispage{2\baselineskip} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical and practical results +on perfect hashing. +In this section we review some of the most important results. +%We also present more recent algorithms that share some features with +%the one presented hereinafter. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Mehlhorn~\cite{m84} showed +that at least $\Omega((1/\ln 2)n + \ln\ln u)$ bits are +required to represent a MPHF (i.e, at least 1.4427 bits per +key must be stored). +To the best of our knowledge our algorithm +is the first one capable of generating MPHFs for sets in the order +of billion of keys, and the generated functions +require less than 9 bits per key to be stored. +This increases one order of magnitude in the size of the greatest +key set for which a MPHF was obtained in the literature~\cite{bkz05}. +%which is close to the lower bound presented in~\cite{m84}. + +Some work on minimal perfect hashing has been done under the assumption that +the algorithm can pick and store truly random functions~\cite{bkz05,chm92,p99}. +Since the space requirements for truly random functions makes them unsuitable for +implementation, one has to settle for pseudo-random functions in practice. +Empirical studies show that limited randomness properties are often as good as +total randomness. +We could verify that phenomenon in our experiments by using the universal hash +function proposed by Jenkins~\cite{j97}, which is +time efficient at retrieval time and requires just an integer to be used as a +random seed (the function is completely determined by the seed). +% Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +% FHPs e FHPMs deterministicamente. +% As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +% A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +% $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +% A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +% Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +% de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +% FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +% que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +% $\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +% fun\c{c}\~oes com complexidade linear. +% Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +% limitar a utiliza\c{c}\~ao na pr\'atica. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing MPHFs +where the form of the resulting function is $h(x) = (f(x) + d[g(x)]) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n\log_2n$ bits. + +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n\log_2n$ to $(1+\epsilon)n\log_2n$ the number of bits +required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +%Differently from the works in~\cite{dh01, p99}, our algorithm generates a MPHF +%$h$ in expected linear time and $h$ can be stored in $O(n)$ bits (9 bits per key). + +% Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +% que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +% e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +% fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +% $h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. +%Our algorithm is the first one capable of generating MPHFs for sets in the order of +%billion of keys. It happens because we do not need to keep into main memory +%at generation time complex data structures as a graph, lists and so on. We just need to maintain +%a small vector that occupies around 8MB for a set of 1 billion keys. + +Fox et al.~\cite{fch92,fhcd92} studied MPHFs +%that also share features with the ones generated by our algorithm. +that bring down the storage requirements we got to between 2 and 4 bits per key. +However, it is shown in~\cite[Section 6.7]{chm97} that their algorithms have exponential +running times and cannot scale for sets larger than 11 million keys in our +implementation of the algorithm. + +Our previous work~\cite{bkz05} improves the one by Czech, Havas and Majewski~\cite{chm92}. +We obtained more compact functions in less time. Although +the algorithm in~\cite{bkz05} is the fastest algorithm +we know of, the resulting functions are stored in $O(n\log n)$ bits and +one needs to keep in main memory at generation time a random graph of $n$ edges +and $cn$ vertices, +where $c\in[0.93,1.15]$. Using the well known divide to conquer approach +we use that algorithm as a building block for the new one, where the +resulting functions are stored in $O(n)$ bits. diff --git a/vldb07/searching.tex b/vldb07/searching.tex new file mode 100755 index 0000000..8feb6f1 --- /dev/null +++ b/vldb07/searching.tex @@ -0,0 +1,155 @@ +%% Nivio: 22/jan/06 +% Time-stamp: +\vspace{-7mm} +\subsection{Searching step} +\label{sec:searching} + +\enlargethispage{2\baselineskip} +The searching step is responsible for generating a MPHF for each +bucket. +Figure~\ref{fig:searchingstep} presents the searching step algorithm. +\vspace{-2mm} +\begin{figure}[h] +%\centering +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $H$ be a minimum heap of size $N$, where the \\ +\> ~~ order relation in $H$ is given by Eq.~(\ref{eq:bucketindex}), that is, the\\ +\> ~~ remove operation removes the item with smallest $i$\\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \{ Heap construction \}\\ +\> ~~ $1.1$ Read key $k$ from File $j$ on disk\\ +\> ~~ $1.2$ Insert $(i, j, k)$ in $H$ \\ +\> $2.$ {\bf for} $i = 0$ {\bf to} $\lceil n/b \rceil - 1$ {\bf do} \\ +\> ~~ $2.1$ Read bucket $i$ from disk driven by heap $H$ \\ +\> ~~ $2.2$ Generate a MPHF for bucket $i$ \\ +\> ~~ $2.3$ Write the description of MPHF$_i$ to the disk +\end{tabbing} +\vspace{-1mm} +\hrule +\hrule +\caption{Searching step} +\label{fig:searchingstep} +\vspace{-4mm} +\end{figure} + +Statement 1 of Figure~\ref{fig:searchingstep} inserts one key from each file +in a minimum heap $H$ of size $N$. +The order relation in $H$ is given by the bucket address $i$ given by +Eq.~(\ref{eq:bucketindex}). + +%\enlargethispage{-\baselineskip} +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +%in Section~\ref{sec:readingbucket}. +In statement 2.2, a MPHF is generated for each bucket $i$, as described +in the following. +%in Section~\ref{sec:mphfbucket}. +The description of MPHF$_i$ is a vector $g_i$ of 8-bit integers. +Finally, statement 2.3 writes the description $g_i$ of MPHF$_i$ to disk. + +\vspace{-3mm} +\label{sec:readingbucket} +\subsubsection{Reading a bucket from disk.} + +In this section we present the refinement of statement 2.1 of +Figure~\ref{fig:searchingstep}. +The algorithm to read bucket $i$ from disk is presented +in Figure~\ref{fig:readingbucket}. + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $1.$ {\bf while} bucket $i$ is not full {\bf do} \\ +\> ~~ $1.1$ Remove $(i, j, k)$ from $H$\\ +\> ~~ $1.2$ Insert $k$ into bucket $i$ \\ +\> ~~ $1.3$ Read sequentially all keys $k$ from File $j$ that have \\ +\> ~~~~~~~ the same $i$ and insert them into bucket $i$ \\ +\> ~~ $1.4$ Insert the triple $(i, j, x)$ in $H$, where $x$ is the first \\ +\> ~~~~~~~ key read from File $j$ that does not have the \\ +\> ~~~~~~~ same bucket index $i$ +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Reading a bucket} +\vspace{-4.0mm} +\label{fig:readingbucket} +\end{figure} + +Bucket $i$ is distributed among many files and the heap $H$ is used to drive a +multiway merge operation. +In Figure~\ref{fig:readingbucket}, statement 1.1 extracts and removes triple +$(i, j, k)$ from $H$, where $i$ is a minimum value in $H$. +Statement 1.2 inserts key $k$ in bucket $i$. +Notice that the $k$ in the triple $(i, j, k)$ is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure~\ref{fig:searchingstep}). +Statement 1.3 performs a seek operation in File $j$ on disk for the first +read operation and reads sequentially all keys $k$ that have the same $i$ +%(obtained from Eq.~(\ref{eq:bucketindex})) +and inserts them all in bucket $i$. +Finally, statement 1.4 inserts in $H$ the triple $(i, j, x)$, +where $x$ is the first key read from File $j$ (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in Section~\ref{sec:linearcomplexity}, +where we present a buffering technique that brings down +the time spent with seeks. + +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\subsubsection{Generating a MPHF for each bucket.} \label{sec:mphfbucket} + +To the best of our knowledge the algorithm we have designed in +our previous work~\cite{bkz05} is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. + +%\enlargethispage{-\baselineskip} +Our previous algorithm is a three-step internal memory based algorithm +that produces a MPHF based on random graphs. +For a set of $n$ keys, the algorithm outputs the resulting MPHF in expected time $O(n)$. +For a given bucket $i$, $0 \leq i < \lceil n/b \rceil$, the corresponding MPHF$_i$ +has the following form: +\begin{eqnarray} + \mathrm{MPHF}_i(k) &=& g_i[a] + g_i[b] \label{eq:mphfi} +\end{eqnarray} +where $a = h_{i1}(k) \bmod t$, $b = h_{i2}(k) \bmod t$ and +$t = c\times \mathit{size}[i]$. The functions +$h_{i1}(k)$ and $h_{i2}(k)$ are the same universal function proposed by Jenkins~\cite{j97} +that was used in the partitioning step described in Section~\ref{sec:partitioning-keys}. + +In order to generate the function above the algorithm involves the generation of simple random graphs +$G_i = (V_i, E_i)$ with~$|V_i|=t=c\times\mathit{size}[i]$ and $|E_i|=\mathit{size}[i]$, with $c \in [0.93, 1.15]$. +To generate a simple random graph with high +probability\footnote{We use the terms `with high probability' +to mean `with probability tending to~$1$ as~$n\to\infty$'.}, two vertices $a$ and $b$ are +computed for each key $k$ in bucket $i$. +Thus, each bucket $i$ has a corresponding graph~$G_i=(V_i,E_i)$, where $V_i=\{0,1, +\ldots,t-1\}$ and $E_i=\big\{\{a,b\}:k \in \mathrm{bucket}\: i\big\}$. +In order to get a simple graph, +the algorithm repeatedly selects $h_{i1}$ and $h_{i2}$ from a family of universal hash functions +until the corresponding graph is simple. +The probability of getting a simple graph is $p=e^{-1/c^2}$. +For $c=1$, this probability is $p \simeq 0.368$, and the expected number of +iterations to obtain a simple graph is~$1/p \simeq 2.72$. + +The construction of MPHF$_i$ ends with a computation of a suitable labelling of the vertices +of~$G_i$. The labelling is stored into vector $g_i$. +We choose~$g_i[v]$ for each~$v\in V_i$ in such +a way that Eq.~(\ref{eq:mphfi}) is a MPHF for bucket $i$. +In order to get the values of each entry of $g_i$ we first +run a breadth-first search on the 2-\textit{core} of $G_i$, i.e., the maximal subgraph +of~$G_i$ with minimal degree at least~$2$ (see, e.g., \cite{b01,jlr00,pw04}) and +a depth-first search on the acyclic part of $G_i$ (see \cite{bkz05} for details). + diff --git a/vldb07/svglov2.clo b/vldb07/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb07/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb07/svjour2.cls b/vldb07/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb07/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb07/terminology.tex b/vldb07/terminology.tex new file mode 100755 index 0000000..fd2cf1d --- /dev/null +++ b/vldb07/terminology.tex @@ -0,0 +1,18 @@ +% Time-stamp: +\vspace{-3mm} +\section{Notation and terminology} +\vspace{-2mm} +\label{sec:notation} + +\enlargethispage{2\baselineskip} +The essential notation and terminology used throughout this paper are as follows. +\begin{itemize} +\item $U$: key universe. $|U| = u$. +\item $S$: actual static key set. $S \subset U$, $|S| = n \ll u$. +\item $h: U \to M$ is a hash function that maps keys from a universe $U$ into +a given range $M = \{0,1,\dots,m-1\}$ of integer numbers. +\item $h$ is a perfect hash function if it is one-to-one on~$S$, i.e., if + $h(k_1) \not = h(k_2)$ for all $k_1 \not = k_2$ from $S$. +\item $h$ is a minimal perfect hash function (MPHF) if it is one-to-one on~$S$ + and $n=m$. +\end{itemize} diff --git a/vldb07/thealgorithm.tex b/vldb07/thealgorithm.tex new file mode 100755 index 0000000..1fb256f --- /dev/null +++ b/vldb07/thealgorithm.tex @@ -0,0 +1,78 @@ +%% Nivio: 13/jan/06, 21/jan/06 29/jan/06 +% Time-stamp: +\vspace{-3mm} +\section{The algorithm} +\label{sec:new-algorithm} +\vspace{-2mm} + +\enlargethispage{2\baselineskip} +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF $h$ for a set $S$ of $n$ keys. +Figure~\ref{fig:new-algo-main-steps} illustrates the two steps of the +algorithm: the partitioning step and the searching step. + +\vspace{-2mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(3704,2091)(1426,-5161) +\put(2570,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2782,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(2996,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(4060,-4006){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets}}}} +\put(3776,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(4563,-3329){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Key Set $S$}}}} +\put(2009,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2221,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4315,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(1992,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2204,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4298,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(4546,-4977){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Hash Table}}}} +\put(1441,-3616){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Partitioning}}}} +\put(1441,-4426){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Searching}}}} +\put(1981,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_0$}}}} +\put(2521,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_1$}}}} +\put(3016,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_2$}}}} +\put(3826,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_{\lceil n/b \rceil - 1}$}}}} +\end{picture}% +\vspace{-1mm} +\caption{Main steps of our algorithm} +\label{fig:new-algo-main-steps} +\vspace{-3mm} +\end{figure} + +The partitioning step takes a key set $S$ and uses a universal hash function +$h_0$ proposed by Jenkins~\cite{j97} +%for each key $k \in S$ of length $|k|$ +to transform each key~$k\in S$ into an integer~$h_0(k)$. +Reducing~$h_0(k)$ modulo~$\lceil n/b\rceil$, we partition~$S$ into $\lceil n/b +\rceil$ buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF$_i$ for each bucket $i$, +$0 \leq i < \lceil n/b \rceil$. +The resulting MPHF $h(k)$, $k \in S$, is given by +\begin{eqnarray}\label{eq:mphf} +h(k) = \mathrm{MPHF}_i (k) + \mathit{offset}[i], +\end{eqnarray} +where~$i=h_0(k)\bmod\lceil n/b\rceil$. +The $i$th entry~$\mathit{offset}[i]$ of the displacement vector +$\mathit{offset}$, $0 \leq i < \lceil n/b \rceil$, contains the total number +of keys in the buckets from 0 to $i-1$, that is, it gives the interval of the +keys in the hash table addressed by the MPHF$_i$. In the following we explain +each step in detail. + + + diff --git a/vldb07/thedataandsetup.tex b/vldb07/thedataandsetup.tex new file mode 100755 index 0000000..8739705 --- /dev/null +++ b/vldb07/thedataandsetup.tex @@ -0,0 +1,21 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{The data and the experimental setup} +\label{sec:data-exper-set} + +The algorithms were implemented in the C language and +are available at \texttt{http://\-cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +% free software licence. +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + diff --git a/vldb07/vldb.tex b/vldb07/vldb.tex new file mode 100644 index 0000000..618c108 --- /dev/null +++ b/vldb07/vldb.tex @@ -0,0 +1,194 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +\usepackage{epsfig} +\usepackage{textcomp} +\usepackage[latin1]{inputenc} +\usepackage{amssymb} + +%\DeclareGraphicsExtensions{.png} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% + +\begin{document} + +\title{Space and Time Efficient Minimal Perfect Hash \\[0.2cm] +Functions for Very Large Databases\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +We propose a novel external memory based algorithm for constructing minimal +perfect hash functions~$h$ for huge sets of keys. +For a set of~$n$ keys, our algorithm outputs~$h$ in time~$O(n)$. +The algorithm needs a small vector of one byte entries +in main memory to construct $h$. +The evaluation of~$h(x)$ requires three memory accesses for any key~$x$. +The description of~$h$ takes a constant number of bits +for each key, which is optimal, i.e., the theoretical lower bound is $1/\ln 2$ +bits per key. +In our experiments, we used a collection of 1 billion URLs collected +from the web, each URL 64 characters long on average. +For this collection, our algorithm +(i) finds a minimal perfect hash function in approximately +3 hours using a commodity PC, +(ii) needs just 5.45 megabytes of internal memory to generate $h$ +and (iii) takes 8.1 bits per key for the description of~$h$. +\keywords{Minimal Perfect Hashing \and Large Databases} +\end{abstract} + +% main text + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} +\def\BSmax{\mathit{BS}_{\mathit{max}}} +\def\Bi{\mathop{\rm Bi}\nolimits} + +\input{introduction} +%\input{terminology} +\input{relatedwork} +\input{thealgorithm} +\input{partitioningthekeys} +\input{searching} +%\input{computingoffset} +%\input{hashingbuckets} +\input{determiningb} +%\input{analyticalandexperimentalresults} +\input{analyticalresults} +%\input{results} +\input{conclusions} + + + + +%\input{acknowledgments} +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\input{appendix} +\end{document} From 80549b6ca664ba2338ebf96fbc886e145e5e40cd Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 17:32:31 +0000 Subject: [PATCH 351/739] paper for vldb07 added --- vldb07/acknowledgments.tex | 7 + vldb07/analyticalresults.tex | 174 +++ vldb07/appendix.tex | 6 + vldb07/conclusions.tex | 42 + vldb07/costhashingbuckets.tex | 177 +++ vldb07/determiningb.tex | 146 +++ vldb07/diskaccess.tex | 113 ++ vldb07/experimentalresults.tex | 15 + vldb07/figs/bmz_temporegressao.png | Bin 0 -> 5769 bytes vldb07/figs/brz-partitioning.fig | 107 ++ vldb07/figs/brz-partitioningfabiano.fig | 126 ++ vldb07/figs/brz.fig | 183 +++ vldb07/figs/brz_temporegressao.png | Bin 0 -> 5671 bytes vldb07/figs/brzfabiano.fig | 153 +++ vldb07/figs/minimalperfecthash-ph-mph.png | Bin 0 -> 3916 bytes vldb07/introduction.tex | 109 ++ vldb07/makefile | 17 + vldb07/partitioningthekeys.tex | 141 ++ vldb07/performancenewalgorithm.tex | 113 ++ vldb07/references.bib | 814 ++++++++++++ vldb07/relatedwork.tex | 112 ++ vldb07/searching.tex | 155 +++ vldb07/svglov2.clo | 77 ++ vldb07/svjour2.cls | 1419 +++++++++++++++++++++ vldb07/terminology.tex | 18 + vldb07/thealgorithm.tex | 78 ++ vldb07/thedataandsetup.tex | 21 + vldb07/vldb.tex | 194 +++ 28 files changed, 4517 insertions(+) create mode 100755 vldb07/acknowledgments.tex create mode 100755 vldb07/analyticalresults.tex create mode 100644 vldb07/appendix.tex create mode 100755 vldb07/conclusions.tex create mode 100755 vldb07/costhashingbuckets.tex create mode 100755 vldb07/determiningb.tex create mode 100755 vldb07/diskaccess.tex create mode 100755 vldb07/experimentalresults.tex create mode 100644 vldb07/figs/bmz_temporegressao.png create mode 100644 vldb07/figs/brz-partitioning.fig create mode 100755 vldb07/figs/brz-partitioningfabiano.fig create mode 100755 vldb07/figs/brz.fig create mode 100644 vldb07/figs/brz_temporegressao.png create mode 100755 vldb07/figs/brzfabiano.fig create mode 100644 vldb07/figs/minimalperfecthash-ph-mph.png create mode 100755 vldb07/introduction.tex create mode 100755 vldb07/makefile create mode 100755 vldb07/partitioningthekeys.tex create mode 100755 vldb07/performancenewalgorithm.tex create mode 100755 vldb07/references.bib create mode 100755 vldb07/relatedwork.tex create mode 100755 vldb07/searching.tex create mode 100644 vldb07/svglov2.clo create mode 100644 vldb07/svjour2.cls create mode 100755 vldb07/terminology.tex create mode 100755 vldb07/thealgorithm.tex create mode 100755 vldb07/thedataandsetup.tex create mode 100644 vldb07/vldb.tex diff --git a/vldb07/acknowledgments.tex b/vldb07/acknowledgments.tex new file mode 100755 index 0000000..d903ceb --- /dev/null +++ b/vldb07/acknowledgments.tex @@ -0,0 +1,7 @@ +\section{Acknowledgments} +This section is optional; it is a location for you +to acknowledge grants, funding, editing assistance and +what have you. In the present case, for example, the +authors would like to thank Gerald Murray of ACM for +his help in codifying this \textit{Author's Guide} +and the \textbf{.cls} and \textbf{.tex} files that it describes. diff --git a/vldb07/analyticalresults.tex b/vldb07/analyticalresults.tex new file mode 100755 index 0000000..06ea049 --- /dev/null +++ b/vldb07/analyticalresults.tex @@ -0,0 +1,174 @@ +%% Nivio: 23/jan/06 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Analytical results} +\label{sec:analytcal-results} + +\vspace{-1mm} +The purpose of this section is fourfold. +First, we show that our algorithm runs in expected time $O(n)$. +Second, we present the main memory requirements for constructing the MPHF. +Third, we discuss the cost of evaluating the resulting MPHF. +Fourth, we present the space required to store the resulting MPHF. + +\vspace{-2mm} +\subsection{The linear time complexity} +\label{sec:linearcomplexity} + +First, we show that the partitioning step presented in +Figure~\ref{fig:partitioningstep} runs in $O(n)$ time. +Each iteration of the {\bf for} loop in statement~1 +runs in $O(|B_j|)$ time, $1 \leq j \leq N$, where $|B_j|$ is the +number of keys +that fit in block $B_j$ of size $\mu$. This is because statement 1.1 just reads +$|B_j|$ keys from disk, statement 1.2 runs a bucket sort like algorithm +that is well known to be linear in the number of keys it sorts (i.e., $|B_j|$ keys), +and statement 1.3 just dumps $|B_j|$ keys to the disk into File $j$. +Thus, the {\bf for} loop runs in $O(\sum_{j=1}^{N}|B_j|)$ time. +As $\sum_{j=1}^{N}|B_j|=n$, then the partitioning step runs in $O(n)$ time. + +Second, we show that the searching step presented in +Figure~\ref{fig:searchingstep} also runs in $O(n)$ time. +The heap construction in statement 1 runs in $O(N)$ time, for $N \ll n$. +We have assumed that insertions and deletions in the heap cost $O(1)$ because +$N$ is typically much smaller than $n$ (see \cite[Section 6.4]{bkz06t} for details). +Statement 2 runs in $O(\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i])$ time +(remember that $\mathit{size}[i]$ stores the number of keys in bucket $i$). +As $\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i] = n$, if +statements 2.1, 2.2 and 2.3 run in $O(\mathit{size}[i])$ time, then statement 2 +runs in $O(n)$ time. + +%Statement 2.1 runs the algorithm to read a bucket from disk. That algorithm reads $\mathit{size}[i]$ +%keys of bucket $i$ that might be spread into many files or, in the worst case, +%into $|BS_{max}|$ files, where $|BS_{max}|$ is the number of keys in the bucket of maximum size. +%It uses the heap $H$ to drive a multiway merge of the sprayed bucket $i$. +%As we are considering that each read/write on disk costs $O(1)$ and +%each heap operation also costs $O(1)$ (recall $N \ll n$), then statement 2.1 +%costs $O(\mathit{size}[i])$ time. +%We need to take into account that this step could generate a lot of seeks on disk. +%However, the number of seeks can be amortized (see Section~\ref{sec:contr-disk-access}) +%and that is why we have been able of getting a MPHF for a set of 1 billion keys in less +%than 4 hours using a machine with just 500 MB of main memory +%(see Section~\ref{sec:performance}). +Statement 2.1 reads $O(\mathit{size}[i])$ keys of bucket $i$ +and is detailed in Figure~\ref{fig:readingbucket}. +As we are assuming that each read or write on disk costs $O(1)$ and +each heap operation also costs $O(1)$, statement~2.1 +takes $O(\mathit{size}[i])$ time. +However, the keys of bucket $i$ are distributed in at most~$BS_{max}$ files on disk +in the worst case +(recall that $BS_{max}$ is the maximum number of keys found in any bucket). +Therefore, we need to take into account that +the critical step in reading a bucket is in statement~1.3 of Figure~\ref{fig:readingbucket}, +where a seek operation in File $j$ +may be performed by the first read operation. + +In order to amortize the number of seeks performed we use a buffering technique~\cite{k73}. +We create a buffer $j$ of size \textbaht$\: = \mu/N$ for each file $j$, +where $1\leq j \leq N$ +(recall that $\mu$ is the size in bytes of an a priori reserved internal memory area). +Every time a read operation is requested to file $j$ and the data is not found +in the $j$th~buffer, \textbaht~bytes are read from file $j$ to buffer $j$. +Hence, the number of seeks performed in the worst case is given by +$\beta/$\textbaht~(remember that $\beta$ is the size in bytes of $S$). +For that we have made the pessimistic assumption that one seek happens every time +buffer $j$ is filled in. +Thus, the number of seeks performed in the worst case is $64n/$\textbaht, since +each URL is 64 bytes long on average. Therefore, the number of seeks is linear on +$n$ and amortized by \textbaht. + +It is important to emphasize two things. +First, the operating system uses techniques +to diminish the number of seeks and the average seek time. +This makes the amortization factor to be greater than \textbaht~in practice. +Second, almost all main memory is available to be used as +file buffers because just a small vector +of $\lceil n/b\rceil$ one-byte entries must be maintained in main memory, +as we show in Section~\ref{sec:memconstruction}. + + +Statement 2.2 runs our internal memory based algorithm in order to generate a MPHF for each bucket. +That algorithm is linear, as we showed in~\cite{bkz05}. As it is applied to buckets with {\it size}$[i]$ keys, statement~2.2 takes $O(\mathit{size}[i])$ time. + +Statement 2.3 has time complexity $O(\mathit{size}[i])$ because it writes to disk +the description of each generated MPHF and each description is stored in +$c \times \mathit{size}[i] + O(1)$ bytes, where $c\in[0.93,1.15]$. +In conclusion, our algorithm takes $O(n)$ time because both the partitioning and +the searching steps run in $O(n)$ time. + +An experimental validation of the above proof and a performance comparison with +our internal memory based algorithm~\cite{bkz05} were not included here due to +space restrictions but can be found in~\cite{bkz06t} and also in the appendix. + +\vspace{-1mm} +\enlargethispage{2\baselineskip} +\subsection{Space used for constructing a MPHF} +\label{sec:memconstruction} + +The vector {\it size} is kept in main memory +all the time. +The vector {\it size} has $\lceil n/b \rceil$ one-byte entries. +It stores the number of keys in each bucket and +those values are less than or equal to 256. +For example, for a set of 1 billion keys and $b=175$ the vector size needs +$5.45$ megabytes of main memory. + +We need an internal memory area of size $\mu$ bytes to be used in +the partitioning step and in the searching step. +The size $\mu$ is fixed a priori and depends only on the amount +of internal memory available to run the algorithm +(i.e., it does not depend on the size $n$ of the problem). + +% One could argue about the a priori reserved internal memory area and the main memory +% required to run the indirect bucket sort algorithm. +% Those internal memory requirements do not depend on the size of the problem +% (i.e., the number of keys being hashed) and can be fixed a priori. + +The additional space required in the searching step +is constant, once the problem was broken down +into several small problems (at most 256 keys) and +the heap size is supposed to be much smaller than $n$ ($N \ll n$). +For example, for a set of 1 billion keys and an internal area of~$\mu = 250$ megabytes, +the number of files is $N = 248$. + +\vspace{-1mm} +\subsection{Evaluation cost of the MPHF} + +Now we consider the amount of CPU time +required by the resulting MPHF at retrieval time. +The MPHF requires for each key the computation of three +universal hash functions and three memory accesses +(see Eqs.~(\ref{eq:mphf}), (\ref{eq:bucketindex}) and (\ref{eq:mphfi})). +This is not optimal. Pagh~\cite{p99} showed that any MPHF requires +at least the computation of two universal hash functions and one memory +access. + +\subsection{Description size of the MPHF} + +The number of bits required to store the MPHF generated by the algorithm +is computed by Eq.~(\ref{eq:newmphfbits}). +We need to store each $g_i$ vector presented in Eq.~(\ref{eq:mphfi}), where +$0\leq i < \lceil n/b \rceil$. As each bucket has at most 256 keys, each +entry in a $g_i$ vector has 8~bits. In each $g_i$ vector there are +$c \times \mathit{size}[i]$ entries (recall $c\in[0.93, 1.15]$). +When we sum up the number of entries of $\lceil n/b \rceil$ $g_i$ vectors we have +$c\sum_{i=0}^{\lceil n/b \rceil -1} \mathit{size}[i]=cn$ entries. We also need to +store $3 \lceil n/b \rceil$ integer numbers of +$\log_2n$ bits referring respectively to the {\it offset} vector and the two random seeds of +$h_{1i}$ and $h_{2i}$. In addition, we need to store $\lceil n/b \rceil$ 8-bit entries of +the vector {\it size}. Therefore, +\begin{eqnarray}\label{eq:newmphfbits} +\mathrm{Required\: Space} = 8cn + \frac{n}{b}\left( 3\log_2n +8\right) \: +\mathrm{bits}. +\end{eqnarray} + +Considering $c=0.93$ and $b=175$, the number of bits per key to store +the description of the resulting MPHF for a set of 1~billion keys is $8.1$. +If we set $b=128$, then the bits per key ratio increases to $8.3$. +Theoretically, the number of bits required to store the MPHF in +Eq.~(\ref{eq:newmphfbits}) +is $O(n\log n)$ as~$n\to\infty$. However, for sets of size up to $2^{b/3}$ keys +the number of bits per key is lower than 9~bits (note that +$2^{b/3}>2^{58}>10^{17}$ for $b=175$). +%For $b=175$, the number of bits per key will be close to 9 for a set of $2^{58}$ keys. +Thus, in practice the resulting function is stored in $O(n)$ bits. diff --git a/vldb07/appendix.tex b/vldb07/appendix.tex new file mode 100644 index 0000000..288ad8a --- /dev/null +++ b/vldb07/appendix.tex @@ -0,0 +1,6 @@ +\appendix +\input{experimentalresults} +\input{thedataandsetup} +\input{costhashingbuckets} +\input{performancenewalgorithm} +\input{diskaccess} diff --git a/vldb07/conclusions.tex b/vldb07/conclusions.tex new file mode 100755 index 0000000..8d32741 --- /dev/null +++ b/vldb07/conclusions.tex @@ -0,0 +1,42 @@ +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Concluding remarks} +\label{sec:concuding-remarks} + +This paper has presented a novel external memory based algorithm for +constructing MPHFs that works for sets in the order of billions of keys. The +algorithm outputs the resulting function in~$O(n)$ time and, furthermore, it +can be tuned to run only $34\%$ slower (see \cite{bkz06t} for details) than the fastest +algorithm available in the literature for constructing MPHFs~\cite{bkz05}. +In addition, the space +requirement of the resulting MPHF is of up to 9 bits per key for datasets of +up to $2^{58}\simeq10^{17.4}$ keys. + +The algorithm is simple and needs just a +small vector of size approximately 5.45 megabytes in main memory to construct +a MPHF for a collection of 1 billion URLs, each one 64 bytes long on average. +Therefore, almost all main memory is available to be used as disk I/O buffer. +Making use of such a buffering scheme considering an internal memory area of size +$\mu=200$ megabytes, our algorithm can produce a MPHF for a +set of 1 billion URLs in approximately 3.6 hours using a commodity PC of 2.4 gigahertz and +500 megabytes of main memory. +If we increase both the main memory +available to 1 gigabyte and the internal memory area to $\mu=500$ megabytes, +a MPHF for the set of 1 billion URLs is produced in approximately 3 hours. For any +key, the evaluation of the resulting MPHF takes three memory accesses and the +computation of three universal hash functions. + +In order to allow the reproduction of our results and the utilization of both the internal memory +based algorithm and the external memory based algorithm, +the algorithms are available at \texttt{http://cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +They were implemented in the C language. + +In future work, we will exploit the fact that the searching step intrinsically +presents a high degree of parallelism and requires $73\%$ of the +construction time. Therefore, a parallel implementation of our algorithm will +allow the construction and the evaluation of the resulting function in parallel. +Therefore, the description of the resulting MPHFs will be distributed in the paralell +computer allowing the scalability to sets of hundreds of billions of keys. +This is an important contribution, mainly for applications related to the Web, as +mentioned in Section~\ref{sec:intro}. \ No newline at end of file diff --git a/vldb07/costhashingbuckets.tex b/vldb07/costhashingbuckets.tex new file mode 100755 index 0000000..3a624ce --- /dev/null +++ b/vldb07/costhashingbuckets.tex @@ -0,0 +1,177 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Performance of the internal memory based algorithm} +\label{sec:intern-memory-algor} + +%\begin{table*}[htb] +%\begin{center} +%{\scriptsize +%\begin{tabular}{|c|c|c|c|c|c|c|c|} +%\hline +%$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +%\hline +%Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +%SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +%\hline +%\end{tabular} +%\vspace{-3mm} +%} +%\end{center} +%\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +%the standard deviation (SD), and the confidence intervals considering +%a confidence level of $95\%$.} +%\label{tab:medias} +%\end{table*} + +Our three-step internal memory based algorithm presented in~\cite{bkz05} +is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have the form~$\alpha +nZ$ for an input of~$n$ keys, where~$\alpha$ is some machine dependent +constant that further depends on the length of the keys and~$Z$ is a random +variable with geometric distribution with mean~$1/p=e^{1/c^2}$ (see +Section~\ref{sec:mphfbucket}). All results in our experiments were obtained +taking $c=1$; the value of~$c$, with~$c\in[0.93,1.15]$, in fact has little +influence in the runtime, as shown in~\cite{bkz05}. + +The values chosen for $n$ were $1, 2, 4, 8, 16$ and $32$ million. +Although we have a dataset with 1~billion URLs, on a PC with +1~gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires $25n + O(1)$ bytes for constructing +a MPHF (details about the data structures used by the algorithm can +be found in~\texttt{http://cmph.sf.net}. +% for the details about the data structures +%used by the algorithm). + +In order to estimate the number of trials for each value of $n$ we use +a statistical method for determining a suitable sample size (see, e.g., +\cite[Chapter 13]{j91}). +As we obtained different values for each $n$, +we used the maximal value obtained, namely, 300~trials in order to have +a confidence level of $95\%$. + +% \begin{figure*}[ht] +% \noindent +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The previous algorithm] +% {\scalebox{0.5}{\includegraphics{figs/bmz_temporegressao.eps}}} +% \end{minipage} +% \hfill +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The new algorithm] +% {\scalebox{0.5}{\includegraphics{figs/brz_temporegressao.eps}}} +% \end{minipage} +% \caption{Time versus number of keys in $S$. The solid line corresponds to +% a linear regression model.} +% %obtained from the experimental measurements.} +% \label{fig:temporegressao} +% \end{figure*} + +Table~\ref{tab:medias} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in~\cite{bkz05}. + +\vspace{-2mm} +\begin{table*}[htb] +\begin{center} +{\scriptsize +\begin{tabular}{|c|c|c|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +\hline +Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$.} +\label{tab:medias} +\vspace{-4mm} +\end{table*} + +% \enlargethispage{\baselineskip} +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% (a) +% \begin{tabular}{|c|c|c|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +% \hline +% Average time (s)& $6.119 \pm 0.300$ & $12.190 \pm 0.615$ & $25.359 \pm 1.109$ & $51.408 \pm 2.003$ & $117.343 \pm 4.364$ & $262.215 \pm 8.724$\\ +% SD (s) & $2.644$ & $5.414$ & $9.757$ & $17.627$ & $37.333$ & $76.271$ \\ +% \hline +% \end{tabular} +% \\[5mm] (b) +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $6.927 \pm 0.309$ & $13.828 \pm 0.175$ & $31.936 \pm 0.663$ & $69.902 \pm 1.084$ & $140.617 \pm 2.502$ \\ +% SD & $0.431$ & $0.245$ & $0.926$ & $1.515$ & $3.498$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $284.330 \pm 1.135$ & $587.880 \pm 3.945$ & $1223.581 \pm 4.864$ & $5966.402 \pm 9.465$ & $13229.540 \pm 12.670$ \\ +% SD & $1.587$ & $5.514$ & $6.800$ & $13.232$ & $18.577$ \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$.} +% \label{tab:medias} +% \end{table*} + +\enlargethispage{2\baselineskip} +Figure~\ref{fig:bmz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given $n$ has a considerable +fluctuation. However, the fluctuation also grows linearly with $n$. + +\begin{figure}[htb] +\vspace{-2mm} +\begin{center} +\scalebox{0.4}{\includegraphics{figs/bmz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for the internal memory based algorithm. +The solid line corresponds to a linear regression model.} +\label{fig:bmz_temporegressao} +\end{center} +\vspace{-6mm} +\end{figure} + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form~$\alpha nZ$ with~$Z$ a geometric random variable with +mean~$1/p=e$. Thus, the runtime has mean~$\alpha n/p=\alpha en$ and standard +deviation~$\alpha n\sqrt{(1-p)/p^2}=\alpha n\sqrt{e(e-1)}$. +Therefore, the standard deviation also grows +linearly with $n$, as experimentally verified +in Table~\ref{tab:medias} and in Figure~\ref{fig:bmz_temporegressao}. + +%\noindent-------------------------------------------------------------------------\\ +%Comentario para Yoshi: Nao consegui reproduzir bem o que discutimos +%no paragrafo acima, acho que vc conseguira justificar melhor :-). \\ +%-------------------------------------------------------------------------\\ diff --git a/vldb07/determiningb.tex b/vldb07/determiningb.tex new file mode 100755 index 0000000..e9b3cb2 --- /dev/null +++ b/vldb07/determiningb.tex @@ -0,0 +1,146 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\subsection{Determining~$b$} +\label{sec:determining-b} +\begin{table*}[t] +\begin{center} +{\small %\scriptsize +\begin{tabular}{|c|ccc|ccc|} +\hline +\raisebox{-0.7em}{$n$} & \multicolumn{3}{c|}{\raisebox{-1mm}{b=128}} & +\multicolumn{3}{c|}{\raisebox{-1mm}{b=175}}\\ +\cline{2-4} \cline{5-7} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} \\ +\hline +$1.0 \times 10^6$ & 177 & 172.0 & 176 & 232 & 226.6 & 230 \\ +%$2.0 \times 10^6$ & 179 & 174.0 & 178 & 236 & 228.5 & 232 \\ +$4.0 \times 10^6$ & 182 & 177.5 & 179 & 241 & 231.8 & 234 \\ +%$8.0 \times 10^6$ & 186 & 181.6 & 181 & 238 & 234.2 & 236 \\ +$1.6 \times 10^7$ & 184 & 181.6 & 183 & 241 & 236.1 & 238 \\ +%$3.2 \times 10^7$ & 191 & 183.9 & 184 & 240 & 236.6 & 240 \\ +$6.4 \times 10^7$ & 195 & 185.2 & 186 & 244 & 239.0 & 242 \\ +%$1.28 \times 10^8$ & 193 & 187.7 & 187 & 244 & 239.7 & 244 \\ +$5.12 \times 10^8$ & 196 & 191.7 & 190 & 251 & 246.3 & 247 \\ +$1.0 \times 10^9$ & 197 & 191.6 & 192 & 253 & 248.9 & 249 \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Values for $\mathit{BS}_{\mathit{max}}$: worst case and average case obtained in the experiments and using Eq.~(\ref{eq:maxbs}), +considering $b=128$ and $b=175$ for different number $n$ of keys in $S$.} +\label{tab:comparison} +\vspace{-6mm} +\end{table*} + +The partitioning step can be viewed as the well known ``balls into bins'' +problem~\cite{ra98,dfm02} where~$n$ keys (the balls) are placed independently and +uniformly into $\lceil n/b\rceil$ buckets (the bins). The main question related to that problem we are interested +in is: what is the maximum number of keys in any bucket? +In fact, we want to get the maximum value for $b$ that makes the maximum number of keys in any bucket +no greater than 256 with high probability. +This is important, as we wish to use 8 bits per entry in the vector $g_i$ of +each $\mathrm{MPHF}_i$, +where $0 \leq i < \lceil n/b\rceil$. +Let $\mathit{BS}_{\mathit{max}}$ be the maximum number of keys in any bucket. + +Clearly, $\BSmax$ is the maximum +of~$\lceil n/b\rceil$ random variables~$Z_i$, each with binomial +distribution~$\Bi(n,p)$ with parameters~$n$ and~$p=1/\lceil n/b\rceil$. +However, the~$Z_i$ are not independent. Note that~$\Bi(n,p)$ has mean and +variance~$\simeq b$. To give an upper estimate for the probability of the +event~$\BSmax\geq \gamma$, we can estimate the probability that we have~$Z_i\geq \gamma$ +for a fixed~$i$, and then sum these estimates over all~$i$. +Let~$\gamma=b+\sigma\sqrt{b\ln(n/b)}$, where~$\sigma=\sqrt2$. +Approximating~$\Bi(n,p)$ by the normal distribution with mean and +variance~$b$, we obtain the +estimate~$(\sigma\sqrt{2\pi\ln(n/b)})^{-1}\times\exp(-(1/2)\sigma^2\ln(n/b))$ for +the probability that~$Z_i\geq \gamma$ occurs, which, summed over all~$i$, gives +that the probability that~$\BSmax\geq \gamma$ occurs is at +most~$1/(\sigma\sqrt{2\pi\ln(n/b)})$, which tends to~$0$ as~$n\to\infty$. +Thus, we have shown that, with high probability, +\begin{equation} + \label{eq:maxbs} + \BSmax\leq b+\sqrt{2b\ln{n\over b}}. +\end{equation} + +% The traditional approach used to estimate $\mathit{BS}_{\mathit{max}}$ with high probability is +% to consider $\mathit{BS}_{\mathit{max}}$ as a random variable that follows a binomial distribution +% that can be approximated by a poisson distribution. This yields a good approximation +% when the number of balls is lower than or equal to the number of bins~\cite{g81}. In our case, +% the number of balls is greater than the number of buckets. +% % and that is why we have used more recent works to estimate $\mathit{BS}_{\mathit{max}}$. +% As $b > \ln (n/b)$, we can use the result by Raab and Steger~\cite{ra98} to estimate +% $\mathit{BS}_{\mathit{max}}$ with high probability. +% The following equation gives the estimation, where $\sigma=\sqrt{2}$: +% \begin{eqnarray} \label{eq:maxbs} +% \mathit{BS}_{\mathit{max}} = b + O \left( \sqrt{b\ln\frac{n}{b}} \right) = b + \sigma \times \left(\sqrt{b\ln\frac{n}{b}} \right) +% \end{eqnarray} + +% In order to estimate the suitable constant $\sigma$ we did a linear +% regression suppressing the constant term. +% We use the equation $BS_{max} - b = \sigma \times \sqrt{b\ln (n/b)}$ +% in the linear regression considering $y=BS_{max} - b$ and $x=\sqrt{b\ln (n/b)}$. +% In order to obtain data to be used in the linear regression we set +% b=128 and ran the new algorithm ten times +% for n equal to 1, 2, 4, 8, 16, 32, 64, 128, 512, 1000 million keys. +% Taking a confidence level equal to 95\% we got +% $\sigma = 2.11 \pm 0.03$. +% The coefficient of determination was $99.6\%$, which means that the linear +% regression explains $99.6\%$ of the data variation and only $0.4\%$ +% is due to experimental errors. +% Therefore, Eq.~(\ref{eq:maxbs}) with $\sigma = 2.11 \pm 0.03$ and $b=128$ +% makes a very good estimation of the maximum number of keys in any bucket. + +% Repeating the same experiments for $b$ equals to $175$ and +% a confidence level of $95\%$ we got $\sigma = 2.07 \pm 0.03$. +% Again we verified that Eq.~(\ref{eq:maxbs}) with $\sigma = 2.07 \pm 0.03$ and $b=175$ is +% a very good estimation of the maximum number of keys in any bucket once the +% coefficient of determination obtained was $99.7 \%$ and $\sigma$ is in a very narrow range. + +In our algorithm the maximum number of keys in any bucket must be at most 256. +Table~\ref{tab:comparison} presents the values for $\mathit{BS}_{\mathit{max}}$ +obtained experimentally and using Eq.~(\ref{eq:maxbs}). +The table presents the worst case and the average case, +considering $b=128$, $b=175$ and Eq.~(\ref{eq:maxbs}), +for several numbers~$n$ of keys in $S$. +The estimation given by Eq.~(\ref{eq:maxbs}) is very close to the experimental +results. + +Now we estimate the biggest problem our algorithm is able to solve for +a given $b$. +Using Eq.~(\ref{eq:maxbs}) considering $b=128$, $b=175$ and imposing +that~$\mathit{BS}_{\mathit{max}}\leq256$, +the sizes of the biggest key set our algorithm +can deal with are $10^{30}$ keys and $10^{10}$ keys, respectively. +%It is also important to have $b$ as big as possible, once its value is +%related to the space required to store the resultant MPHF, as shown later on. +%Table~\ref{tab:bp} shows the biggest problem the algorithm can solve. +% The values were obtained from Eq.~(\ref{eq:maxbs}), +% considering $b=128$ and~$b=175$ and imposing +% that~$\mathit{BS}_{\mathit{max}}\leq256$. + +% We set $\sigma=2.14$ because it was the greatest value obtained for $\sigma$ +% in the two linear regression we did. +% \vspace{-3mm} +% \begin{table}[htb] +% \begin{center} +% {\small %\scriptsize +% \begin{tabular}{|c|c|} +% \hline +% b & Problem size ($n$) \\ +% \hline +% 128 & $10^{30}$ keys \\ +% 175 & $10^{10}$ keys \\ +% \hline +% \end{tabular} +% \vspace{-1mm} +% } +% \end{center} +% \caption{Using Eq.~(\ref{eq:maxbs}) to estimate the biggest problem our algorithm can solve.} +% %considering $\sigma=\sqrt{2}$.} +% \label{tab:bp} +% \vspace{-14mm} +% \end{table} diff --git a/vldb07/diskaccess.tex b/vldb07/diskaccess.tex new file mode 100755 index 0000000..08e54b9 --- /dev/null +++ b/vldb07/diskaccess.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Controlling disk accesses} +\label{sec:contr-disk-access} + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter $\mu$ +affects the runtime of our algorithm. +For that we fixed $n$ in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used $\mu$ equal to $100, 200, 300, 400, 500$ and $600$ +megabytes. + +\enlargethispage{2\baselineskip} +Table~\ref{tab:diskaccess} presents the number of files $N$, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in Section~\ref{sec:linearcomplexity}, and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table~\ref{tab:diskaccess} we noticed that the time spent in the construction +decreases as the value of $\mu$ increases. However, for $\mu > 400$, the variation +on the time is not as significant as for $\mu \leq 400$. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies +for avoiding seeks and diminishing the average seek time +(see \texttt{http://www.linuxjournal.com/article/6931}). +\begin{table*}[ht] +\vspace{-2mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|c|} +\hline +$\mu$ (MB) & $100$ & $200$ & $300$ & $400$ & $500$ & $600$ \\ +\hline +$N$ (files) & $619$ & $310$ & $207$ & $155$ & $124$ & $104$ \\ +%\hline +\textbaht~(buffer size in KB) & $165$ & $661$ & $1,484$ & $2,643$ & $4,129$ & $5,908$ \\ +%\hline +$\beta$/\textbaht~(\# of seeks in the worst case) & $384,478$ & $95,974$ & $42,749$ & $24,003$ & $15,365$ & $10,738$ \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$15,347$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & \\ +% \hline +Time (hours) & $4.04$ & $3.64$ & $3.34$ & $3.20$ & $3.13$ & $3.09$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +\label{tab:diskaccess} +\vspace{-14mm} +\end{table*} + + + +% \begin{table*}[ht] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|} +% \hline +% $\mu$ (MB) & $100$ & $150$ & $200$ & $250$ & $300$ & $350$ & $400$ & $450$ & $500$ & $550$ & $600$ \\ +% \hline +% $N$ (files) & $619$ & $413$ & $310$ & $248$ & $207$ & $177$ & $155$ & $138$ & $124$ & $113$ & $103$ \\ +% \hline +% \textbaht~(buffer size in KB) & $165$ & $372$ & $661$ & $1,033$ & $1,484$ & $2,025$ & $2,643$ & $3,339$ & & & \\ +% \hline +% \# of seeks (Worst case) & $384,478$ & $170,535$ & $95,974$ & $61,413$ & $42,749$ & $31,328$ & $24,003$ & $19,000$ & & & \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$170,385$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$61,388$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$31,296$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$18,978$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & & & & & & \\ +% \hline +% Time (horas) & $4.04$ & $3.93$ & $3.64$ & $3.46$ & $3.34$ & $3.26$ & $3.20$ & $3.13$ & & & \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +% \label{tab:diskaccess} +% \end{table*} + + + +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $14.124 \pm 0.128$ & $28.301 \pm 0.140$ & $56.807 \pm 0.312$ & $117.286 \pm 0.997$ & $241.086 \pm 0.936$ \\ +% SD & $0.179$ & $0.196$ & $0.437$ & $1.394$ & $1.308$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $492.430 \pm 1.565$ & $1006.307 \pm 1.425$ & $2081.208 \pm 0.740$ & $9253.188 \pm 4.406$ & $19021.480 \pm 13.850$ \\ +% SD & $2.188$ & $1.992$ & $1.035$ & $ 6.160$ & $18.016$ \\ +% \hline + +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$. +% } +% \label{tab:mediasbrz} +% \end{table*} diff --git a/vldb07/experimentalresults.tex b/vldb07/experimentalresults.tex new file mode 100755 index 0000000..58b4091 --- /dev/null +++ b/vldb07/experimentalresults.tex @@ -0,0 +1,15 @@ +%Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\section{Appendix: Experimental results} +\label{sec:experimental-results} +\vspace{-1mm} + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm~\cite{bkz05} +and for our algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of our algorithm. diff --git a/vldb07/figs/bmz_temporegressao.png b/vldb07/figs/bmz_temporegressao.png new file mode 100644 index 0000000000000000000000000000000000000000..e7198c1cea2b9f5d766b7f422b23a2e259209c79 GIT binary patch literal 5769 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 J@QQuN{{U&H=p48g`weTH#H5IX}; z3=HT10I*FOLv(E(zuTO>m5IB;_0ny`B4LB|*sSd6^R;LZvClNfZ%^=5*8XT_Q=PU! z>Hq@rPdtO^0pD&g8UP^2p~3WoaIM@uJvjNm3@gQ+mVDHQaX1NsXgL|6j^8YIqG{|Z z`y>>l4S3d~VEaF1!&_r8EPBitz#~l7%Q!keGnyt&bP{oJSugwgBAZn99c4OkFPrr7 zt#~kZ#3`czk#h<%r0LRZ)8(CET-_u=U(x(-!uZ9ZQQ|96$7rFr^)z(`khM6^$qqR` zYbNU~Tr1Uff6wRJInASy33*R1_eSPyyJdDY4?kC02Ua<800*^hi3_m+BM}~8q7Ilw zH-12wF$`^8uJNYGMJ- z$UnH<$&TzaR6d-J2Nx@%-5lRfd_^bT5$mhi=Zq`k95@2R^P57czZS_Y*r!#i`Q|ARmIa-Y zH11`r*zxY71XTaj8@xnf1Yg{*D96ift2QtbJwoMoUA*3P8LEPc11FXP=V#h6E9&1v zcce21+-FtM?3R*(?sEpwZPHdtZ};A3(eJB}eU>uc!|C>`*B&NBZHg%s0^uPznG-+m z*g$DnbP~l(r}j9#;M?U#NS+)?gqiwEk^ZQKB2MOeoPW|g4N0pVyC&i1d{+vstsOVz zPVX$gD)KC-+f@bKQ~q`hDKQeJ|*~uV7t78}Cke;?_@sVm^Ovnvk$J;N`JLUB0O%y`CVTJwLmJbw-B{(3ea;8g(A;i}Se$1}M zATPs0VQhQO7{MmOr2=8vQwHP<~KC5Ito!!75o!WD>q46_RQy$2Y>}Gx6jRL{;d;U*npbfU* z`Ovkw{(xp{MS4eWgUFgWid)BDPIG6GLkBcGg2&T&dCsUEmm=kbKK^^;T{Au73&}!f zU$w-wW-F&cuxxxLe2)bR7I%xAe|I>WYQYhkMSuCDkm+y+?mcCX6fK7J?7XUVH{?Q2 zFhSC<$-KDr^{|7_+fqU%3(WB^PJGk3$q{_{!QkYO<(e_=16~Ug^>zw>Wi!im$tn!1elOvr)iVmw>uI^>mc0}A zOpe~vEV9`1GT|{cQwX#qeJQ;NK1#6~IqO-HkNZ+i`v|!rEHxV9P5G`QUIycotI{i% zn`pNp9xzOAl8dvwkAmr8e|%F<$KWykOevs21Z9Ej{(XE6 zp$*nHAM}+CLt&>MG@XcM({K?47;2_o^3N;q&BZnI%_;fp--z);!+9(ETlp+lnC+g4 z(&t7stheM`rsaRneB;Ce1+1vLSG*RW+P~QHR4W&Cc2cXAjXI@ZwY0r69CsO=H&X^k z*VPm{iQJE)fWCkWnVxi*;RBWS=^8ipKeesSp+V{78Z4adL;iuo@SyxJO2xX$umVk@ zB;P7)t1yZ2Yx|?QuwW^~?WATE_p?DwjI-1oFbm|`^T5D(X}-6$7L5^&1UZB_#|)Y2R|Va`p-11NeVm zr3lJnrCgKaq>wYLFvGo8fJ#M*hp<#)fUQBPy%S)F4Aa8~I*%3blC5u7WTc7eCK zPY@swJOX(AzdBBbW(P3Q{g2RtkxWVZZ)WivCEp@vkm`A-I6&Ix4p zDK3&U8u1h7c$f1QQa~PQJc(d55bb%c$FnB8GgmpF#*2pSzffVPpK9EQ6K)9+XUkXQ zK=rdkXmzO4u`cu47F~qoE*R3A63smWa)ajVLY%4|#-BF;Jd~#P^^Mxs1>OJR(?9n0 z-vFcIvj5{=mD9b`qy&MRuPH{l_cjX}G0Wv^+mWH_8}7VhC|?YC^df16g$$)J$fNSN zA|0!MPEwy^hsD^_c8l>C=YJ;DP^O<1T!;;pAw<0ot3#F~jwvL2JTYd4p%$8qCxqjc z+Rm(&F>c;;`Pvh;ot!}j)m70*B&ab${_yssecs5Lrda2PG9N%p9{fLG{l~&9W`BtE z-PYsvSo~Py3RagjNgYeMpG*bq-PCv+54LhQ*Dp|75x35_?6BSkC|j-Ry1m^8gjm4c zRQAQ?iAu*`i7>kKN7pQU@q^9j(6TVU} z#sl;~3ymLqJa_70uRF1^rJr*(?jmKS2xz-?_9|JH=X@Oqf zv{4d|e$Pzc?ckA!xuvK5F4lzD2&A3h*7Zu)=S51GK7ZxH=1uf1wi12t2aXTI8=NlV zdfQ5QJf33Zr;|Pl&v(_PyG2WDJa2M-uC*es&g-F>tAy>e|8SS4m??aFRx&h zC11i)tX#(ZGM4jhNZ4B4NLQcKiKyP)uq{m8#7GWnE7;+_@ct|@dut>S6J{_t;F)jV z1o~AM`aS7BQS%!cN!s3AGqc=r(M1?iF&1p7Ab$xW7Vs`7l;a#?&WQ7PW#?pnM7IC^ zeu)}S`P)vwp~fs%8t)_C2iI%y7eAij79>;(<}C6Sp?Xt`VL8>uyrqI9jr6_qLgGckv-Ga{^jpC)YR%iT zel?2r^JYt{uOaU{ebZwlKYmLHiW^|L-O!Y^6rF$bApJAnn25GW(XUz*>=M&Y>5j6K zz@gzg0tr%OrbAN0+eU;ITQ@zr{F_lnc9s_*Vz(SsIu54>=9L?-z*3eQyxtAb;J5yM z-9*p7wk%-f;gLq#X&8tm5%sCwIiRtGR?RtjRJxTPz0C09vIityF0jqnAVJl7>Yj&g zLg~dTSg&#^m_!?L&7%R^Y%Ei`~BW){Iewi*?ah6OVypCAHnFg4?zMq;7YisJ`T~ zzV4P_jwY2ojQ~PL%JqoZu~~7Oz464OwWq2z&~INsvjk75PkXWF$yh03JHk1CW606k z0KC?DI5}mY)_qKtT6KwI?zhwdM=Lf$Jc~vaNTIF!hN0vlix%9YFEjr1f3j{crZ(vOFr^C6vju_nzHhs~ef|EzWtUnkS9W^xr$y=Z ztQ5g3nL!z=ztgrt4zRvh^sz(#Lik22yHsh`t9{Al2soJG|asSMp0mlMaBte2kdt#2>AmYwt~fYYs* zXo^(}q1nHDd335fpbD2^n7@{E* z&dAz-ANMUiZV#qoJ)OF*&!m8o6m>u(CbliO)POEXJ!u)880NPF8WIGM1)h}@^AAaqB?<5 zCIx7ixz%P4&xcSgkQCADpS{ulNjQutN!||EG%CL%^C{#=YCp}}m5B-(WH&B6XZ*@r zx#Kq)AZ8Q|)(%aQxI1D; zL8xY1(r!^t^c}00ezBDShy;awC*L8(+cJ5&LO{6$LT$j(8EU ydE%}ySS(et!ZLcRyFa7rolcuCKId +\section{Introduction} +\label{sec:intro} + +\enlargethispage{2\baselineskip} +Suppose~$U$ is a universe of \textit{keys} of size $u$. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$, where $ n \ll u$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +% Hashing methods for {\em non-static sets} of keys can be used to construct +% data structures storing $S$ and supporting membership queries +% ``$x \in S$?'' in expected time $O(1)$. +% However, they involve a certain amount of wasted space owing to unused +% locations in the table and waisted time to resolve collisions when +% two keys are hashed to the same table location. +A perfect hash function maps a {\em static set} $S$ of $n$ keys from $U$ into a set of $m$ integer +numbers without collisions, where $m$ is greater than or equal to $n$. +If $m$ is equal to $n$, the function is called minimal. + +% Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash function and +% Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates a minimal perfect hash function (MPHF). +% +% \begin{figure} +% \centering +% \scalebox{0.7}{\epsfig{file=figs/minimalperfecthash-ph-mph.ps}} +% \caption{(a) Perfect hash function (b) Minimal perfect hash function (MPHF)} +% \label{fig:minimalperfecthash-ph-mph} +% %\vspace{-5mm} +% \end{figure} + +Minimal perfect hash functions are widely used for memory efficient storage and fast +retrieval of items from static sets, such as words in natural languages, +reserved words in programming languages or interactive systems, universal resource +locations (URLs) in web search engines, or item sets in data mining techniques. +Search engines are nowadays indexing tens of billions of pages and algorithms +like PageRank~\cite{Brin1998}, which uses the web link structure to derive a +measure of popularity for Web pages, would benefit from a MPHF for storage and +retrieval of such huge sets of URLs. +For instance, the TodoBr\footnote{TodoBr ({\texttt www.todobr.com.br}) is a trademark of +Akwan Information Technologies, which was acquired by Google Inc. in July 2005.} +search engine used the algorithm proposed hereinafter to +improve and to scale its link analysis system. +The WebGraph research group~\cite{bv04} would +also benefit from a MPHF for sets in the order of billions of URLs to scale +and to improve the storange requirements of their algorithms on Graph compression. + + Another interesting application for MPHFs is its use as an indexing structure + for databases. + The B+ tree is very popular as an indexing structure for dynamic applications + with frequent insertions and deletions of records. + However, for applications with sporadic modifications and a huge number of + queries the B+ tree is not the best option, + because it performs poorly with very large sets of keys + such as those required for the new frontiers of database applications~\cite{s05}. + Therefore, there are applications for MPHFs in + information retrieval systems, database systems, language translation systems, + electronic commerce systems, compilers, operating systems, among others. + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymore~\cite{s05}, the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. +% using stock hardware. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: +\begin{enumerate} +\item The amount of CPU time required by the algorithms for constructing MPHFs. +\item The space requirements of the algorithms for constructing MPHFs. +\item The amount of CPU time required by a MPHF for each retrieval. +\item The space requirements of the description of the resulting MPHFs to be + used at retrieval time. +\end{enumerate} + +\enlargethispage{2\baselineskip} +This paper presents a novel external memory based algorithm for constructing MPHFs that +is very efficient in these four requirements. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of $\lceil n/b \rceil$ +one byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using $b=175$, the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is $1/\ln2 \approx 1.4427$ bits per +key~\cite{m84}. + diff --git a/vldb07/makefile b/vldb07/makefile new file mode 100755 index 0000000..1b95644 --- /dev/null +++ b/vldb07/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log *.ps *.pdf *.dvi + diff --git a/vldb07/partitioningthekeys.tex b/vldb07/partitioningthekeys.tex new file mode 100755 index 0000000..e9a48c4 --- /dev/null +++ b/vldb07/partitioningthekeys.tex @@ -0,0 +1,141 @@ +%% Nivio: 21/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Partitioning step} +\label{sec:partitioning-keys} + +The set $S$ of $n$ keys is partitioned into $\lceil n/b \rceil$ buckets, +where $b$ is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see Section~\ref{sec:determining-b}). +The partitioning step works as follows: + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $\beta$ be the size in bytes of the set $S$ \\ +\> $\blacktriangleright$ Let $\mu$ be the size in bytes of an a priori reserved \\ +\> ~~~ internal memory area \\ +\> $\blacktriangleright$ Let $N = \lceil \beta/\mu \rceil$ be the number of key blocks that will \\ +\> ~~~ be read from disk into an internal memory area \\ +\> $\blacktriangleright$ Let $\mathit{size}$ be a vector that stores the size of each bucket \\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \\ +\> ~~ $1.1$ Read block $B_j$ of keys from disk \\ +\> ~~ $1.2$ Cluster $B_j$ into $\lceil n/b \rceil$ buckets using a bucket sort \\ +\> ~~~~~~~ algorithm and update the entries in the vector {\it size} \\ +\> ~~ $1.3$ Dump $B_j$ to the disk into File $j$\\ +\> $2.$ Compute the {\it offset} vector and dump it to the disk. +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Partitioning step} +\vspace{-3mm} +\label{fig:partitioningstep} +\end{figure} + +Statement 1.1 of the {\bf for} loop presented in Figure~\ref{fig:partitioningstep} +reads sequentially all the keys of block $B_j$ from disk into an internal area +of size $\mu$. + +Statement 1.2 performs an indirect bucket sort of the keys in block $B_j$ +and at the same time updates the entries in the vector {\em size}. +Let us briefly describe how~$B_j$ is partitioned among the~$\lceil n/b\rceil$ +buckets. +We use a local array of $\lceil n/b \rceil$ counters to store a +count of how many keys from $B_j$ belong to each bucket. +%At the same time, the global vector {\it size} is computed based on the local +%counters. +The pointers to the keys in each bucket $i$, $0 \leq i < \lceil n/b \rceil$, +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +\enlargethispage{2\baselineskip} +To find the bucket address of a given key +we use the universal hash function $h_0(k)$~\cite{j97}. +Key~$k$ goes into bucket~$i$, where +%Then, for each integer $h_0(k)$ the respective bucket address is obtained +%as follows: +\begin{eqnarray} \label{eq:bucketindex} +i=h_0(k) \bmod \left \lceil \frac{n}{b} \right \rceil. +\end{eqnarray} + +Figure~\ref{fig:brz-partitioning}(a) shows a \emph{logical} view of the +$\lceil n/b \rceil$ buckets generated in the partitioning step. +%In this case, the keys of each bucket are put together by the pointers to +%each key stored +%in contiguous positions in the array of pointers. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure~\ref{fig:brz-partitioning}(b). +In the example of Figure~\ref{fig:brz-partitioning}(b), the keys in bucket 0 +appear in files 1 and $N$, the keys in bucket 1 appear in files 1, 2 +and $N$, and so on. + +\vspace{-7mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz-partitioning.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(4371,1403)(1,-6977) +\put(333,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(545,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(759,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(1539,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(541,-6676){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Logical View}}}} +\put(3547,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6224){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6269){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6314){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3016,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 1}}}} +\put(3466,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 2}}}} +\put(4096,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File N}}}} +\put(3196,-6946){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Physical View}}}} +\end{picture}% +\caption{Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view} +\label{fig:brz-partitioning} +\vspace{-2mm} +\end{figure} + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the $N$ files in disk +during the searching step. +But, as we show later in Section~\ref{sec:analytcal-results}, the number of seeks +can be kept small using buffering techniques. +Considering that only the vector {\it size}, which has $\lceil n/b \rceil$ +one-byte entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the {\it offset} vector and dump it to the disk. +We use the vector $\mathit{size}$ to compute the +$\mathit{offset}$ displacement vector. +The $\mathit{offset}[i]$ entry contains the number of keys +in the buckets $0, 1, \dots, i-1$. +As {\it size}$[i]$ stores the number of keys +in bucket $i$, where $0 \leq i <\lceil n/b \rceil$, we have +\begin{displaymath} +\mathit{offset}[i] = \sum_{j=0}^{i-1} \mathit{size}[j] \cdot +\end{displaymath} + diff --git a/vldb07/performancenewalgorithm.tex b/vldb07/performancenewalgorithm.tex new file mode 100755 index 0000000..6911282 --- /dev/null +++ b/vldb07/performancenewalgorithm.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\subsection{Performance of the new algorithm} +\label{sec:performance} +%As we have done for the internal memory based algorithm, + +The runtime of our algorithm is also a random variable, but now it follows a +(highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +Section~\ref{sec:linearcomplexity}. Therefore, we ran the algorithm for +several numbers $n$ of keys in $S$. + +The values chosen for $n$ were $1, 2, 4, 8, 16, 32, 64, 128, 512$ and $1000$ +million. +%Just the small vector {\it size} must be kept in main memory, +%as we saw in Section~\ref{sec:memconstruction}. +We limited the main memory in 500 megabytes for the experiments. +The size $\mu$ of the a priori reserved internal memory area +was set to 250 megabytes, the parameter $b$ was set to $175$ and +the building block algorithm parameter $c$ was again set to $1$. +In Section~\ref{sec:contr-disk-access} we show how $\mu$ +affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +%~\cite[Chapter 13]{j91} +to estimate the number of trials to be run for each value of $n$. We got that +just one trial for each $n$ would be enough with a confidence level of $95\%$. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table~\ref{tab:mediasbrz} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in~Section~\ref{sec:linearcomplexity}. Better still, +it is only approximately $60\%$ slower than our internal memory based algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for our algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes (see Section~\ref{sec:contr-disk-access}), +we have brought the time to 3.09 hours. In this case, our algorithm is +just $34\%$ slower in this setup. + +\enlargethispage{2\baselineskip} +\begin{table*}[htb] +\vspace{-1mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +\hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +Average time (s) & $6.9 \pm 0.3$ & $13.8 \pm 0.2$ & $31.9 \pm 0.7$ & $69.9 \pm 1.1$ & $140.6 \pm 2.5$ \\ +SD & $0.4$ & $0.2$ & $0.9$ & $1.5$ & $3.5$ \\ +\hline +\hline +$n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +\hline % Part. 20 \% 20\% 20\% 18\% 18\% +Average time (s) & $284.3 \pm 1.1$ & $587.9 \pm 3.9$ & $1223.6 \pm 4.9$ & $5966.4 \pm 9.5$ & $13229.5 \pm 12.7$ \\ +SD & $1.6$ & $5.5$ & $6.8$ & $13.2$ & $18.6$ \\ +\hline + +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Our algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$. +} +\label{tab:mediasbrz} +\vspace{-5mm} +\end{table*} + +Figure~\ref{fig:brz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given $n$ has almost no +variation. + +\begin{figure}[htb] +\begin{center} +\scalebox{0.4}{\includegraphics{figs/brz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for our algorithm. The solid line corresponds to +a linear regression model.} +\label{fig:brz_temporegressao} +\end{center} +\vspace{-9mm} +\end{figure} + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket~$i$, +$0 \leq i < \lceil n/b \rceil$, is a small set of keys (at most 256 keys) and, +as argued in Section~\ref{sec:intern-memory-algor}, the runtime of the +building block algorithm is a random variable~$X_i$ with high fluctuation. +However, the runtime~$Y$ of the searching step of our algorithm is given +by~$Y=\sum_{0\leq i<\lceil n/b\rceil}X_i$. Under the hypothesis that +the~$X_i$ are independent and bounded, the {\it law of large numbers} (see, +e.g., \cite{j91}) implies that the random variable $Y/\lceil n/b\rceil$ +converges to a constant as~$n\to\infty$. This explains why the runtime of our +algorithm is almost deterministic. + + diff --git a/vldb07/references.bib b/vldb07/references.bib new file mode 100755 index 0000000..d2ea475 --- /dev/null +++ b/vldb07/references.bib @@ -0,0 +1,814 @@ + +@InProceedings{Brin1998, + author = "Sergey Brin and Lawrence Page", + title = "The Anatomy of a Large-Scale Hypertextual Web Search Engine", + booktitle = "Proceedings of the 7th International {World Wide Web} + Conference", + pages = "107--117", + adress = "Brisbane, Australia", + month = "April", + year = 1998, + annote = "Artigo do Google." +} + +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} +@article{g81, + author = {G. H. Gonnet}, + title = {Expected Length of the Longest Probe Sequence in Hash Code Searching}, + journal = {J. ACM}, + volume = {28}, + number = {2}, + year = {1981}, + issn = {0004-5411}, + pages = {289--304}, + doi = {http://doi.acm.org/10.1145/322248.322254}, + publisher = {ACM Press}, + address = {New York, NY, USA}, + } + +@misc{r04, + author = "S. Rao", + title = "Combinatorial Algorithms Data Structures", + year = 2004, + howpublished = {CS 270 Spring}, + url = "citeseer.ist.psu.edu/700201.html" +} +@article{ra98, + author = {Martin Raab and Angelika Steger}, + title = {``{B}alls into Bins'' --- {A} Simple and Tight Analysis}, + journal = {Lecture Notes in Computer Science}, + volume = 1518, + pages = {159--170}, + year = 1998, + url = "citeseer.ist.psu.edu/raab98balls.html" +} + +@misc{mrs00, + author = "M. Mitzenmacher and A. Richa and R. Sitaraman", + title = "The power of two random choices: A survey of the techniques and results", + howpublished={In Handbook of Randomized + Computing, P. Pardalos, S. Rajasekaran, and J. Rolim, Eds. Kluwer}, + year = "2000", + url = "citeseer.ist.psu.edu/article/mitzenmacher00power.html" +} + +@article{dfm02, + author = {E. Drinea and A. Frieze and M. Mitzenmacher}, + title = {Balls and bins models with feedback}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + pages = {308--315}, + year = {2002} +} +@Article{j97, + author = {Bob Jenkins}, + title = {Algorithm Alley: Hash Functions}, + journal = {Dr. Dobb's Journal of Software Tools}, + volume = {22}, + number = {9}, + month = {september}, + year = {1997} +} + +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + +@article{s05, + author = {M. Seltzer}, + title = {Beyond Relational Databases}, + journal = {ACM Queue}, + volume = {3}, + number = {3}, + month = {April}, + year = {2005} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu;os para a Constru;o de Arquivos invertidos}, + school = {Departamento de Ci;cia da Computa;o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar;}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + +@Book{j91, + author = {R. Jain}, + title = {The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. }, + publisher = {John Wiley}, + year = {1991}, + edition = {first} +} + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa;es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi;o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q. Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@TechReport{bkz06t, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {An Approach for Minimal Perfect Hash Functions in Very Large Databases}, + institution = {Department of Computer Science, Federal University of Minas Gerais}, + note = {Available at http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html}, + year = {2006}, + OPTkey = {}, + OPTtype = {}, + number = {RT.DCC.003}, + address = {Belo Horizonte, MG, Brazil}, + month = {April}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04:_OLD, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + +@article {pw04, + AUTHOR = {Pittel, Boris and Wormald, Nicholas C.}, + TITLE = {Counting connected graphs inside-out}, + JOURNAL = {J. Combin. Theory Ser. B}, + FJOURNAL = {Journal of Combinatorial Theory. Series B}, + VOLUME = 93, + YEAR = 2005, + NUMBER = 2, + PAGES = {127--172}, + ISSN = {0095-8956}, + CODEN = {JCBTB8}, + MRCLASS = {05C30 (05A16 05C40 05C80)}, + MRNUMBER = {MR2117934 (2005m:05117)}, +MRREVIEWER = {Edward A. Bender}, +} diff --git a/vldb07/relatedwork.tex b/vldb07/relatedwork.tex new file mode 100755 index 0000000..7693002 --- /dev/null +++ b/vldb07/relatedwork.tex @@ -0,0 +1,112 @@ +% Time-stamp: +\vspace{-3mm} +\section{Related work} +\label{sec:relatedprevious-work} +\vspace{-2mm} + +% Optimal speed for hashing means that each key from the key set $S$ +% will map to an unique location in the hash table, avoiding time wasted +% in resolving collisions. That is achieved with a MPHF and +% because of that many algorithms for constructing static +% and dynamic MPHFs, when static or dynamic sets are involved, +% were developed. Our focus has been on static MPHFs, since +% in many applications the key sets change slowly, if at all~\cite{s05}. + +\enlargethispage{2\baselineskip} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical and practical results +on perfect hashing. +In this section we review some of the most important results. +%We also present more recent algorithms that share some features with +%the one presented hereinafter. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Mehlhorn~\cite{m84} showed +that at least $\Omega((1/\ln 2)n + \ln\ln u)$ bits are +required to represent a MPHF (i.e, at least 1.4427 bits per +key must be stored). +To the best of our knowledge our algorithm +is the first one capable of generating MPHFs for sets in the order +of billion of keys, and the generated functions +require less than 9 bits per key to be stored. +This increases one order of magnitude in the size of the greatest +key set for which a MPHF was obtained in the literature~\cite{bkz05}. +%which is close to the lower bound presented in~\cite{m84}. + +Some work on minimal perfect hashing has been done under the assumption that +the algorithm can pick and store truly random functions~\cite{bkz05,chm92,p99}. +Since the space requirements for truly random functions makes them unsuitable for +implementation, one has to settle for pseudo-random functions in practice. +Empirical studies show that limited randomness properties are often as good as +total randomness. +We could verify that phenomenon in our experiments by using the universal hash +function proposed by Jenkins~\cite{j97}, which is +time efficient at retrieval time and requires just an integer to be used as a +random seed (the function is completely determined by the seed). +% Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +% FHPs e FHPMs deterministicamente. +% As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +% A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +% $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +% A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +% Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +% de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +% FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +% que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +% $\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +% fun\c{c}\~oes com complexidade linear. +% Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +% limitar a utiliza\c{c}\~ao na pr\'atica. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing MPHFs +where the form of the resulting function is $h(x) = (f(x) + d[g(x)]) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n\log_2n$ bits. + +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n\log_2n$ to $(1+\epsilon)n\log_2n$ the number of bits +required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +%Differently from the works in~\cite{dh01, p99}, our algorithm generates a MPHF +%$h$ in expected linear time and $h$ can be stored in $O(n)$ bits (9 bits per key). + +% Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +% que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +% e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +% fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +% $h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. +%Our algorithm is the first one capable of generating MPHFs for sets in the order of +%billion of keys. It happens because we do not need to keep into main memory +%at generation time complex data structures as a graph, lists and so on. We just need to maintain +%a small vector that occupies around 8MB for a set of 1 billion keys. + +Fox et al.~\cite{fch92,fhcd92} studied MPHFs +%that also share features with the ones generated by our algorithm. +that bring down the storage requirements we got to between 2 and 4 bits per key. +However, it is shown in~\cite[Section 6.7]{chm97} that their algorithms have exponential +running times and cannot scale for sets larger than 11 million keys in our +implementation of the algorithm. + +Our previous work~\cite{bkz05} improves the one by Czech, Havas and Majewski~\cite{chm92}. +We obtained more compact functions in less time. Although +the algorithm in~\cite{bkz05} is the fastest algorithm +we know of, the resulting functions are stored in $O(n\log n)$ bits and +one needs to keep in main memory at generation time a random graph of $n$ edges +and $cn$ vertices, +where $c\in[0.93,1.15]$. Using the well known divide to conquer approach +we use that algorithm as a building block for the new one, where the +resulting functions are stored in $O(n)$ bits. diff --git a/vldb07/searching.tex b/vldb07/searching.tex new file mode 100755 index 0000000..8feb6f1 --- /dev/null +++ b/vldb07/searching.tex @@ -0,0 +1,155 @@ +%% Nivio: 22/jan/06 +% Time-stamp: +\vspace{-7mm} +\subsection{Searching step} +\label{sec:searching} + +\enlargethispage{2\baselineskip} +The searching step is responsible for generating a MPHF for each +bucket. +Figure~\ref{fig:searchingstep} presents the searching step algorithm. +\vspace{-2mm} +\begin{figure}[h] +%\centering +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $H$ be a minimum heap of size $N$, where the \\ +\> ~~ order relation in $H$ is given by Eq.~(\ref{eq:bucketindex}), that is, the\\ +\> ~~ remove operation removes the item with smallest $i$\\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \{ Heap construction \}\\ +\> ~~ $1.1$ Read key $k$ from File $j$ on disk\\ +\> ~~ $1.2$ Insert $(i, j, k)$ in $H$ \\ +\> $2.$ {\bf for} $i = 0$ {\bf to} $\lceil n/b \rceil - 1$ {\bf do} \\ +\> ~~ $2.1$ Read bucket $i$ from disk driven by heap $H$ \\ +\> ~~ $2.2$ Generate a MPHF for bucket $i$ \\ +\> ~~ $2.3$ Write the description of MPHF$_i$ to the disk +\end{tabbing} +\vspace{-1mm} +\hrule +\hrule +\caption{Searching step} +\label{fig:searchingstep} +\vspace{-4mm} +\end{figure} + +Statement 1 of Figure~\ref{fig:searchingstep} inserts one key from each file +in a minimum heap $H$ of size $N$. +The order relation in $H$ is given by the bucket address $i$ given by +Eq.~(\ref{eq:bucketindex}). + +%\enlargethispage{-\baselineskip} +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +%in Section~\ref{sec:readingbucket}. +In statement 2.2, a MPHF is generated for each bucket $i$, as described +in the following. +%in Section~\ref{sec:mphfbucket}. +The description of MPHF$_i$ is a vector $g_i$ of 8-bit integers. +Finally, statement 2.3 writes the description $g_i$ of MPHF$_i$ to disk. + +\vspace{-3mm} +\label{sec:readingbucket} +\subsubsection{Reading a bucket from disk.} + +In this section we present the refinement of statement 2.1 of +Figure~\ref{fig:searchingstep}. +The algorithm to read bucket $i$ from disk is presented +in Figure~\ref{fig:readingbucket}. + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $1.$ {\bf while} bucket $i$ is not full {\bf do} \\ +\> ~~ $1.1$ Remove $(i, j, k)$ from $H$\\ +\> ~~ $1.2$ Insert $k$ into bucket $i$ \\ +\> ~~ $1.3$ Read sequentially all keys $k$ from File $j$ that have \\ +\> ~~~~~~~ the same $i$ and insert them into bucket $i$ \\ +\> ~~ $1.4$ Insert the triple $(i, j, x)$ in $H$, where $x$ is the first \\ +\> ~~~~~~~ key read from File $j$ that does not have the \\ +\> ~~~~~~~ same bucket index $i$ +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Reading a bucket} +\vspace{-4.0mm} +\label{fig:readingbucket} +\end{figure} + +Bucket $i$ is distributed among many files and the heap $H$ is used to drive a +multiway merge operation. +In Figure~\ref{fig:readingbucket}, statement 1.1 extracts and removes triple +$(i, j, k)$ from $H$, where $i$ is a minimum value in $H$. +Statement 1.2 inserts key $k$ in bucket $i$. +Notice that the $k$ in the triple $(i, j, k)$ is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure~\ref{fig:searchingstep}). +Statement 1.3 performs a seek operation in File $j$ on disk for the first +read operation and reads sequentially all keys $k$ that have the same $i$ +%(obtained from Eq.~(\ref{eq:bucketindex})) +and inserts them all in bucket $i$. +Finally, statement 1.4 inserts in $H$ the triple $(i, j, x)$, +where $x$ is the first key read from File $j$ (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in Section~\ref{sec:linearcomplexity}, +where we present a buffering technique that brings down +the time spent with seeks. + +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\subsubsection{Generating a MPHF for each bucket.} \label{sec:mphfbucket} + +To the best of our knowledge the algorithm we have designed in +our previous work~\cite{bkz05} is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. + +%\enlargethispage{-\baselineskip} +Our previous algorithm is a three-step internal memory based algorithm +that produces a MPHF based on random graphs. +For a set of $n$ keys, the algorithm outputs the resulting MPHF in expected time $O(n)$. +For a given bucket $i$, $0 \leq i < \lceil n/b \rceil$, the corresponding MPHF$_i$ +has the following form: +\begin{eqnarray} + \mathrm{MPHF}_i(k) &=& g_i[a] + g_i[b] \label{eq:mphfi} +\end{eqnarray} +where $a = h_{i1}(k) \bmod t$, $b = h_{i2}(k) \bmod t$ and +$t = c\times \mathit{size}[i]$. The functions +$h_{i1}(k)$ and $h_{i2}(k)$ are the same universal function proposed by Jenkins~\cite{j97} +that was used in the partitioning step described in Section~\ref{sec:partitioning-keys}. + +In order to generate the function above the algorithm involves the generation of simple random graphs +$G_i = (V_i, E_i)$ with~$|V_i|=t=c\times\mathit{size}[i]$ and $|E_i|=\mathit{size}[i]$, with $c \in [0.93, 1.15]$. +To generate a simple random graph with high +probability\footnote{We use the terms `with high probability' +to mean `with probability tending to~$1$ as~$n\to\infty$'.}, two vertices $a$ and $b$ are +computed for each key $k$ in bucket $i$. +Thus, each bucket $i$ has a corresponding graph~$G_i=(V_i,E_i)$, where $V_i=\{0,1, +\ldots,t-1\}$ and $E_i=\big\{\{a,b\}:k \in \mathrm{bucket}\: i\big\}$. +In order to get a simple graph, +the algorithm repeatedly selects $h_{i1}$ and $h_{i2}$ from a family of universal hash functions +until the corresponding graph is simple. +The probability of getting a simple graph is $p=e^{-1/c^2}$. +For $c=1$, this probability is $p \simeq 0.368$, and the expected number of +iterations to obtain a simple graph is~$1/p \simeq 2.72$. + +The construction of MPHF$_i$ ends with a computation of a suitable labelling of the vertices +of~$G_i$. The labelling is stored into vector $g_i$. +We choose~$g_i[v]$ for each~$v\in V_i$ in such +a way that Eq.~(\ref{eq:mphfi}) is a MPHF for bucket $i$. +In order to get the values of each entry of $g_i$ we first +run a breadth-first search on the 2-\textit{core} of $G_i$, i.e., the maximal subgraph +of~$G_i$ with minimal degree at least~$2$ (see, e.g., \cite{b01,jlr00,pw04}) and +a depth-first search on the acyclic part of $G_i$ (see \cite{bkz05} for details). + diff --git a/vldb07/svglov2.clo b/vldb07/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb07/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb07/svjour2.cls b/vldb07/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb07/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb07/terminology.tex b/vldb07/terminology.tex new file mode 100755 index 0000000..fd2cf1d --- /dev/null +++ b/vldb07/terminology.tex @@ -0,0 +1,18 @@ +% Time-stamp: +\vspace{-3mm} +\section{Notation and terminology} +\vspace{-2mm} +\label{sec:notation} + +\enlargethispage{2\baselineskip} +The essential notation and terminology used throughout this paper are as follows. +\begin{itemize} +\item $U$: key universe. $|U| = u$. +\item $S$: actual static key set. $S \subset U$, $|S| = n \ll u$. +\item $h: U \to M$ is a hash function that maps keys from a universe $U$ into +a given range $M = \{0,1,\dots,m-1\}$ of integer numbers. +\item $h$ is a perfect hash function if it is one-to-one on~$S$, i.e., if + $h(k_1) \not = h(k_2)$ for all $k_1 \not = k_2$ from $S$. +\item $h$ is a minimal perfect hash function (MPHF) if it is one-to-one on~$S$ + and $n=m$. +\end{itemize} diff --git a/vldb07/thealgorithm.tex b/vldb07/thealgorithm.tex new file mode 100755 index 0000000..1fb256f --- /dev/null +++ b/vldb07/thealgorithm.tex @@ -0,0 +1,78 @@ +%% Nivio: 13/jan/06, 21/jan/06 29/jan/06 +% Time-stamp: +\vspace{-3mm} +\section{The algorithm} +\label{sec:new-algorithm} +\vspace{-2mm} + +\enlargethispage{2\baselineskip} +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF $h$ for a set $S$ of $n$ keys. +Figure~\ref{fig:new-algo-main-steps} illustrates the two steps of the +algorithm: the partitioning step and the searching step. + +\vspace{-2mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(3704,2091)(1426,-5161) +\put(2570,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2782,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(2996,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(4060,-4006){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets}}}} +\put(3776,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(4563,-3329){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Key Set $S$}}}} +\put(2009,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2221,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4315,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(1992,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2204,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4298,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(4546,-4977){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Hash Table}}}} +\put(1441,-3616){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Partitioning}}}} +\put(1441,-4426){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Searching}}}} +\put(1981,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_0$}}}} +\put(2521,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_1$}}}} +\put(3016,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_2$}}}} +\put(3826,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_{\lceil n/b \rceil - 1}$}}}} +\end{picture}% +\vspace{-1mm} +\caption{Main steps of our algorithm} +\label{fig:new-algo-main-steps} +\vspace{-3mm} +\end{figure} + +The partitioning step takes a key set $S$ and uses a universal hash function +$h_0$ proposed by Jenkins~\cite{j97} +%for each key $k \in S$ of length $|k|$ +to transform each key~$k\in S$ into an integer~$h_0(k)$. +Reducing~$h_0(k)$ modulo~$\lceil n/b\rceil$, we partition~$S$ into $\lceil n/b +\rceil$ buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF$_i$ for each bucket $i$, +$0 \leq i < \lceil n/b \rceil$. +The resulting MPHF $h(k)$, $k \in S$, is given by +\begin{eqnarray}\label{eq:mphf} +h(k) = \mathrm{MPHF}_i (k) + \mathit{offset}[i], +\end{eqnarray} +where~$i=h_0(k)\bmod\lceil n/b\rceil$. +The $i$th entry~$\mathit{offset}[i]$ of the displacement vector +$\mathit{offset}$, $0 \leq i < \lceil n/b \rceil$, contains the total number +of keys in the buckets from 0 to $i-1$, that is, it gives the interval of the +keys in the hash table addressed by the MPHF$_i$. In the following we explain +each step in detail. + + + diff --git a/vldb07/thedataandsetup.tex b/vldb07/thedataandsetup.tex new file mode 100755 index 0000000..8739705 --- /dev/null +++ b/vldb07/thedataandsetup.tex @@ -0,0 +1,21 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{The data and the experimental setup} +\label{sec:data-exper-set} + +The algorithms were implemented in the C language and +are available at \texttt{http://\-cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +% free software licence. +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + diff --git a/vldb07/vldb.tex b/vldb07/vldb.tex new file mode 100644 index 0000000..618c108 --- /dev/null +++ b/vldb07/vldb.tex @@ -0,0 +1,194 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +\usepackage{epsfig} +\usepackage{textcomp} +\usepackage[latin1]{inputenc} +\usepackage{amssymb} + +%\DeclareGraphicsExtensions{.png} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% + +\begin{document} + +\title{Space and Time Efficient Minimal Perfect Hash \\[0.2cm] +Functions for Very Large Databases\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +We propose a novel external memory based algorithm for constructing minimal +perfect hash functions~$h$ for huge sets of keys. +For a set of~$n$ keys, our algorithm outputs~$h$ in time~$O(n)$. +The algorithm needs a small vector of one byte entries +in main memory to construct $h$. +The evaluation of~$h(x)$ requires three memory accesses for any key~$x$. +The description of~$h$ takes a constant number of bits +for each key, which is optimal, i.e., the theoretical lower bound is $1/\ln 2$ +bits per key. +In our experiments, we used a collection of 1 billion URLs collected +from the web, each URL 64 characters long on average. +For this collection, our algorithm +(i) finds a minimal perfect hash function in approximately +3 hours using a commodity PC, +(ii) needs just 5.45 megabytes of internal memory to generate $h$ +and (iii) takes 8.1 bits per key for the description of~$h$. +\keywords{Minimal Perfect Hashing \and Large Databases} +\end{abstract} + +% main text + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} +\def\BSmax{\mathit{BS}_{\mathit{max}}} +\def\Bi{\mathop{\rm Bi}\nolimits} + +\input{introduction} +%\input{terminology} +\input{relatedwork} +\input{thealgorithm} +\input{partitioningthekeys} +\input{searching} +%\input{computingoffset} +%\input{hashingbuckets} +\input{determiningb} +%\input{analyticalandexperimentalresults} +\input{analyticalresults} +%\input{results} +\input{conclusions} + + + + +%\input{acknowledgments} +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\input{appendix} +\end{document} From f959c3b7eb551bed556c63af30ca35781e187840 Mon Sep 17 00:00:00 2001 From: fc_botelho Date: Fri, 11 Aug 2006 17:32:31 +0000 Subject: [PATCH 352/739] paper for vldb07 added --- vldb07/acknowledgments.tex | 7 + vldb07/analyticalresults.tex | 174 +++ vldb07/appendix.tex | 6 + vldb07/conclusions.tex | 42 + vldb07/costhashingbuckets.tex | 177 +++ vldb07/determiningb.tex | 146 +++ vldb07/diskaccess.tex | 113 ++ vldb07/experimentalresults.tex | 15 + vldb07/figs/bmz_temporegressao.png | Bin 0 -> 5769 bytes vldb07/figs/brz-partitioning.fig | 107 ++ vldb07/figs/brz-partitioningfabiano.fig | 126 ++ vldb07/figs/brz.fig | 183 +++ vldb07/figs/brz_temporegressao.png | Bin 0 -> 5671 bytes vldb07/figs/brzfabiano.fig | 153 +++ vldb07/figs/minimalperfecthash-ph-mph.png | Bin 0 -> 3916 bytes vldb07/introduction.tex | 109 ++ vldb07/makefile | 17 + vldb07/partitioningthekeys.tex | 141 ++ vldb07/performancenewalgorithm.tex | 113 ++ vldb07/references.bib | 814 ++++++++++++ vldb07/relatedwork.tex | 112 ++ vldb07/searching.tex | 155 +++ vldb07/svglov2.clo | 77 ++ vldb07/svjour2.cls | 1419 +++++++++++++++++++++ vldb07/terminology.tex | 18 + vldb07/thealgorithm.tex | 78 ++ vldb07/thedataandsetup.tex | 21 + vldb07/vldb.tex | 194 +++ 28 files changed, 4517 insertions(+) create mode 100755 vldb07/acknowledgments.tex create mode 100755 vldb07/analyticalresults.tex create mode 100644 vldb07/appendix.tex create mode 100755 vldb07/conclusions.tex create mode 100755 vldb07/costhashingbuckets.tex create mode 100755 vldb07/determiningb.tex create mode 100755 vldb07/diskaccess.tex create mode 100755 vldb07/experimentalresults.tex create mode 100644 vldb07/figs/bmz_temporegressao.png create mode 100644 vldb07/figs/brz-partitioning.fig create mode 100755 vldb07/figs/brz-partitioningfabiano.fig create mode 100755 vldb07/figs/brz.fig create mode 100644 vldb07/figs/brz_temporegressao.png create mode 100755 vldb07/figs/brzfabiano.fig create mode 100644 vldb07/figs/minimalperfecthash-ph-mph.png create mode 100755 vldb07/introduction.tex create mode 100755 vldb07/makefile create mode 100755 vldb07/partitioningthekeys.tex create mode 100755 vldb07/performancenewalgorithm.tex create mode 100755 vldb07/references.bib create mode 100755 vldb07/relatedwork.tex create mode 100755 vldb07/searching.tex create mode 100644 vldb07/svglov2.clo create mode 100644 vldb07/svjour2.cls create mode 100755 vldb07/terminology.tex create mode 100755 vldb07/thealgorithm.tex create mode 100755 vldb07/thedataandsetup.tex create mode 100644 vldb07/vldb.tex diff --git a/vldb07/acknowledgments.tex b/vldb07/acknowledgments.tex new file mode 100755 index 0000000..d903ceb --- /dev/null +++ b/vldb07/acknowledgments.tex @@ -0,0 +1,7 @@ +\section{Acknowledgments} +This section is optional; it is a location for you +to acknowledge grants, funding, editing assistance and +what have you. In the present case, for example, the +authors would like to thank Gerald Murray of ACM for +his help in codifying this \textit{Author's Guide} +and the \textbf{.cls} and \textbf{.tex} files that it describes. diff --git a/vldb07/analyticalresults.tex b/vldb07/analyticalresults.tex new file mode 100755 index 0000000..06ea049 --- /dev/null +++ b/vldb07/analyticalresults.tex @@ -0,0 +1,174 @@ +%% Nivio: 23/jan/06 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Analytical results} +\label{sec:analytcal-results} + +\vspace{-1mm} +The purpose of this section is fourfold. +First, we show that our algorithm runs in expected time $O(n)$. +Second, we present the main memory requirements for constructing the MPHF. +Third, we discuss the cost of evaluating the resulting MPHF. +Fourth, we present the space required to store the resulting MPHF. + +\vspace{-2mm} +\subsection{The linear time complexity} +\label{sec:linearcomplexity} + +First, we show that the partitioning step presented in +Figure~\ref{fig:partitioningstep} runs in $O(n)$ time. +Each iteration of the {\bf for} loop in statement~1 +runs in $O(|B_j|)$ time, $1 \leq j \leq N$, where $|B_j|$ is the +number of keys +that fit in block $B_j$ of size $\mu$. This is because statement 1.1 just reads +$|B_j|$ keys from disk, statement 1.2 runs a bucket sort like algorithm +that is well known to be linear in the number of keys it sorts (i.e., $|B_j|$ keys), +and statement 1.3 just dumps $|B_j|$ keys to the disk into File $j$. +Thus, the {\bf for} loop runs in $O(\sum_{j=1}^{N}|B_j|)$ time. +As $\sum_{j=1}^{N}|B_j|=n$, then the partitioning step runs in $O(n)$ time. + +Second, we show that the searching step presented in +Figure~\ref{fig:searchingstep} also runs in $O(n)$ time. +The heap construction in statement 1 runs in $O(N)$ time, for $N \ll n$. +We have assumed that insertions and deletions in the heap cost $O(1)$ because +$N$ is typically much smaller than $n$ (see \cite[Section 6.4]{bkz06t} for details). +Statement 2 runs in $O(\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i])$ time +(remember that $\mathit{size}[i]$ stores the number of keys in bucket $i$). +As $\sum_{i=0}^{\lceil n/b \rceil - 1} \mathit{size}[i] = n$, if +statements 2.1, 2.2 and 2.3 run in $O(\mathit{size}[i])$ time, then statement 2 +runs in $O(n)$ time. + +%Statement 2.1 runs the algorithm to read a bucket from disk. That algorithm reads $\mathit{size}[i]$ +%keys of bucket $i$ that might be spread into many files or, in the worst case, +%into $|BS_{max}|$ files, where $|BS_{max}|$ is the number of keys in the bucket of maximum size. +%It uses the heap $H$ to drive a multiway merge of the sprayed bucket $i$. +%As we are considering that each read/write on disk costs $O(1)$ and +%each heap operation also costs $O(1)$ (recall $N \ll n$), then statement 2.1 +%costs $O(\mathit{size}[i])$ time. +%We need to take into account that this step could generate a lot of seeks on disk. +%However, the number of seeks can be amortized (see Section~\ref{sec:contr-disk-access}) +%and that is why we have been able of getting a MPHF for a set of 1 billion keys in less +%than 4 hours using a machine with just 500 MB of main memory +%(see Section~\ref{sec:performance}). +Statement 2.1 reads $O(\mathit{size}[i])$ keys of bucket $i$ +and is detailed in Figure~\ref{fig:readingbucket}. +As we are assuming that each read or write on disk costs $O(1)$ and +each heap operation also costs $O(1)$, statement~2.1 +takes $O(\mathit{size}[i])$ time. +However, the keys of bucket $i$ are distributed in at most~$BS_{max}$ files on disk +in the worst case +(recall that $BS_{max}$ is the maximum number of keys found in any bucket). +Therefore, we need to take into account that +the critical step in reading a bucket is in statement~1.3 of Figure~\ref{fig:readingbucket}, +where a seek operation in File $j$ +may be performed by the first read operation. + +In order to amortize the number of seeks performed we use a buffering technique~\cite{k73}. +We create a buffer $j$ of size \textbaht$\: = \mu/N$ for each file $j$, +where $1\leq j \leq N$ +(recall that $\mu$ is the size in bytes of an a priori reserved internal memory area). +Every time a read operation is requested to file $j$ and the data is not found +in the $j$th~buffer, \textbaht~bytes are read from file $j$ to buffer $j$. +Hence, the number of seeks performed in the worst case is given by +$\beta/$\textbaht~(remember that $\beta$ is the size in bytes of $S$). +For that we have made the pessimistic assumption that one seek happens every time +buffer $j$ is filled in. +Thus, the number of seeks performed in the worst case is $64n/$\textbaht, since +each URL is 64 bytes long on average. Therefore, the number of seeks is linear on +$n$ and amortized by \textbaht. + +It is important to emphasize two things. +First, the operating system uses techniques +to diminish the number of seeks and the average seek time. +This makes the amortization factor to be greater than \textbaht~in practice. +Second, almost all main memory is available to be used as +file buffers because just a small vector +of $\lceil n/b\rceil$ one-byte entries must be maintained in main memory, +as we show in Section~\ref{sec:memconstruction}. + + +Statement 2.2 runs our internal memory based algorithm in order to generate a MPHF for each bucket. +That algorithm is linear, as we showed in~\cite{bkz05}. As it is applied to buckets with {\it size}$[i]$ keys, statement~2.2 takes $O(\mathit{size}[i])$ time. + +Statement 2.3 has time complexity $O(\mathit{size}[i])$ because it writes to disk +the description of each generated MPHF and each description is stored in +$c \times \mathit{size}[i] + O(1)$ bytes, where $c\in[0.93,1.15]$. +In conclusion, our algorithm takes $O(n)$ time because both the partitioning and +the searching steps run in $O(n)$ time. + +An experimental validation of the above proof and a performance comparison with +our internal memory based algorithm~\cite{bkz05} were not included here due to +space restrictions but can be found in~\cite{bkz06t} and also in the appendix. + +\vspace{-1mm} +\enlargethispage{2\baselineskip} +\subsection{Space used for constructing a MPHF} +\label{sec:memconstruction} + +The vector {\it size} is kept in main memory +all the time. +The vector {\it size} has $\lceil n/b \rceil$ one-byte entries. +It stores the number of keys in each bucket and +those values are less than or equal to 256. +For example, for a set of 1 billion keys and $b=175$ the vector size needs +$5.45$ megabytes of main memory. + +We need an internal memory area of size $\mu$ bytes to be used in +the partitioning step and in the searching step. +The size $\mu$ is fixed a priori and depends only on the amount +of internal memory available to run the algorithm +(i.e., it does not depend on the size $n$ of the problem). + +% One could argue about the a priori reserved internal memory area and the main memory +% required to run the indirect bucket sort algorithm. +% Those internal memory requirements do not depend on the size of the problem +% (i.e., the number of keys being hashed) and can be fixed a priori. + +The additional space required in the searching step +is constant, once the problem was broken down +into several small problems (at most 256 keys) and +the heap size is supposed to be much smaller than $n$ ($N \ll n$). +For example, for a set of 1 billion keys and an internal area of~$\mu = 250$ megabytes, +the number of files is $N = 248$. + +\vspace{-1mm} +\subsection{Evaluation cost of the MPHF} + +Now we consider the amount of CPU time +required by the resulting MPHF at retrieval time. +The MPHF requires for each key the computation of three +universal hash functions and three memory accesses +(see Eqs.~(\ref{eq:mphf}), (\ref{eq:bucketindex}) and (\ref{eq:mphfi})). +This is not optimal. Pagh~\cite{p99} showed that any MPHF requires +at least the computation of two universal hash functions and one memory +access. + +\subsection{Description size of the MPHF} + +The number of bits required to store the MPHF generated by the algorithm +is computed by Eq.~(\ref{eq:newmphfbits}). +We need to store each $g_i$ vector presented in Eq.~(\ref{eq:mphfi}), where +$0\leq i < \lceil n/b \rceil$. As each bucket has at most 256 keys, each +entry in a $g_i$ vector has 8~bits. In each $g_i$ vector there are +$c \times \mathit{size}[i]$ entries (recall $c\in[0.93, 1.15]$). +When we sum up the number of entries of $\lceil n/b \rceil$ $g_i$ vectors we have +$c\sum_{i=0}^{\lceil n/b \rceil -1} \mathit{size}[i]=cn$ entries. We also need to +store $3 \lceil n/b \rceil$ integer numbers of +$\log_2n$ bits referring respectively to the {\it offset} vector and the two random seeds of +$h_{1i}$ and $h_{2i}$. In addition, we need to store $\lceil n/b \rceil$ 8-bit entries of +the vector {\it size}. Therefore, +\begin{eqnarray}\label{eq:newmphfbits} +\mathrm{Required\: Space} = 8cn + \frac{n}{b}\left( 3\log_2n +8\right) \: +\mathrm{bits}. +\end{eqnarray} + +Considering $c=0.93$ and $b=175$, the number of bits per key to store +the description of the resulting MPHF for a set of 1~billion keys is $8.1$. +If we set $b=128$, then the bits per key ratio increases to $8.3$. +Theoretically, the number of bits required to store the MPHF in +Eq.~(\ref{eq:newmphfbits}) +is $O(n\log n)$ as~$n\to\infty$. However, for sets of size up to $2^{b/3}$ keys +the number of bits per key is lower than 9~bits (note that +$2^{b/3}>2^{58}>10^{17}$ for $b=175$). +%For $b=175$, the number of bits per key will be close to 9 for a set of $2^{58}$ keys. +Thus, in practice the resulting function is stored in $O(n)$ bits. diff --git a/vldb07/appendix.tex b/vldb07/appendix.tex new file mode 100644 index 0000000..288ad8a --- /dev/null +++ b/vldb07/appendix.tex @@ -0,0 +1,6 @@ +\appendix +\input{experimentalresults} +\input{thedataandsetup} +\input{costhashingbuckets} +\input{performancenewalgorithm} +\input{diskaccess} diff --git a/vldb07/conclusions.tex b/vldb07/conclusions.tex new file mode 100755 index 0000000..8d32741 --- /dev/null +++ b/vldb07/conclusions.tex @@ -0,0 +1,42 @@ +% Time-stamp: +\enlargethispage{2\baselineskip} +\section{Concluding remarks} +\label{sec:concuding-remarks} + +This paper has presented a novel external memory based algorithm for +constructing MPHFs that works for sets in the order of billions of keys. The +algorithm outputs the resulting function in~$O(n)$ time and, furthermore, it +can be tuned to run only $34\%$ slower (see \cite{bkz06t} for details) than the fastest +algorithm available in the literature for constructing MPHFs~\cite{bkz05}. +In addition, the space +requirement of the resulting MPHF is of up to 9 bits per key for datasets of +up to $2^{58}\simeq10^{17.4}$ keys. + +The algorithm is simple and needs just a +small vector of size approximately 5.45 megabytes in main memory to construct +a MPHF for a collection of 1 billion URLs, each one 64 bytes long on average. +Therefore, almost all main memory is available to be used as disk I/O buffer. +Making use of such a buffering scheme considering an internal memory area of size +$\mu=200$ megabytes, our algorithm can produce a MPHF for a +set of 1 billion URLs in approximately 3.6 hours using a commodity PC of 2.4 gigahertz and +500 megabytes of main memory. +If we increase both the main memory +available to 1 gigabyte and the internal memory area to $\mu=500$ megabytes, +a MPHF for the set of 1 billion URLs is produced in approximately 3 hours. For any +key, the evaluation of the resulting MPHF takes three memory accesses and the +computation of three universal hash functions. + +In order to allow the reproduction of our results and the utilization of both the internal memory +based algorithm and the external memory based algorithm, +the algorithms are available at \texttt{http://cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +They were implemented in the C language. + +In future work, we will exploit the fact that the searching step intrinsically +presents a high degree of parallelism and requires $73\%$ of the +construction time. Therefore, a parallel implementation of our algorithm will +allow the construction and the evaluation of the resulting function in parallel. +Therefore, the description of the resulting MPHFs will be distributed in the paralell +computer allowing the scalability to sets of hundreds of billions of keys. +This is an important contribution, mainly for applications related to the Web, as +mentioned in Section~\ref{sec:intro}. \ No newline at end of file diff --git a/vldb07/costhashingbuckets.tex b/vldb07/costhashingbuckets.tex new file mode 100755 index 0000000..3a624ce --- /dev/null +++ b/vldb07/costhashingbuckets.tex @@ -0,0 +1,177 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Performance of the internal memory based algorithm} +\label{sec:intern-memory-algor} + +%\begin{table*}[htb] +%\begin{center} +%{\scriptsize +%\begin{tabular}{|c|c|c|c|c|c|c|c|} +%\hline +%$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +%\hline +%Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +%SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +%\hline +%\end{tabular} +%\vspace{-3mm} +%} +%\end{center} +%\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +%the standard deviation (SD), and the confidence intervals considering +%a confidence level of $95\%$.} +%\label{tab:medias} +%\end{table*} + +Our three-step internal memory based algorithm presented in~\cite{bkz05} +is used for constructing a MPHF for each bucket. +It is a randomized algorithm because it needs to generate a simple random graph +in its first step. +Once the graph is obtained the other two steps are deterministic. + +Thus, we can consider the runtime of the algorithm to have the form~$\alpha +nZ$ for an input of~$n$ keys, where~$\alpha$ is some machine dependent +constant that further depends on the length of the keys and~$Z$ is a random +variable with geometric distribution with mean~$1/p=e^{1/c^2}$ (see +Section~\ref{sec:mphfbucket}). All results in our experiments were obtained +taking $c=1$; the value of~$c$, with~$c\in[0.93,1.15]$, in fact has little +influence in the runtime, as shown in~\cite{bkz05}. + +The values chosen for $n$ were $1, 2, 4, 8, 16$ and $32$ million. +Although we have a dataset with 1~billion URLs, on a PC with +1~gigabyte of main memory, the algorithm is able +to handle an input with at most 32 million keys. +This is mainly because of the graph we need to keep in main memory. +The algorithm requires $25n + O(1)$ bytes for constructing +a MPHF (details about the data structures used by the algorithm can +be found in~\texttt{http://cmph.sf.net}. +% for the details about the data structures +%used by the algorithm). + +In order to estimate the number of trials for each value of $n$ we use +a statistical method for determining a suitable sample size (see, e.g., +\cite[Chapter 13]{j91}). +As we obtained different values for each $n$, +we used the maximal value obtained, namely, 300~trials in order to have +a confidence level of $95\%$. + +% \begin{figure*}[ht] +% \noindent +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The previous algorithm] +% {\scalebox{0.5}{\includegraphics{figs/bmz_temporegressao.eps}}} +% \end{minipage} +% \hfill +% \begin{minipage}[b]{0.5\linewidth} +% \centering +% \subfigure[The new algorithm] +% {\scalebox{0.5}{\includegraphics{figs/brz_temporegressao.eps}}} +% \end{minipage} +% \caption{Time versus number of keys in $S$. The solid line corresponds to +% a linear regression model.} +% %obtained from the experimental measurements.} +% \label{fig:temporegressao} +% \end{figure*} + +Table~\ref{tab:medias} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages one sees that +the algorithm runs in expected linear time, +as shown in~\cite{bkz05}. + +\vspace{-2mm} +\begin{table*}[htb] +\begin{center} +{\scriptsize +\begin{tabular}{|c|c|c|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +\hline +Average time (s)& $6.1 \pm 0.3$ & $12.2 \pm 0.6$ & $25.4 \pm 1.1$ & $51.4 \pm 2.0$ & $117.3 \pm 4.4$ & $262.2 \pm 8.7$\\ +SD (s) & $2.6$ & $5.4$ & $9.8$ & $17.6$ & $37.3$ & $76.3$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Internal memory based algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$.} +\label{tab:medias} +\vspace{-4mm} +\end{table*} + +% \enlargethispage{\baselineskip} +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% (a) +% \begin{tabular}{|c|c|c|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 & 32 \\ +% \hline +% Average time (s)& $6.119 \pm 0.300$ & $12.190 \pm 0.615$ & $25.359 \pm 1.109$ & $51.408 \pm 2.003$ & $117.343 \pm 4.364$ & $262.215 \pm 8.724$\\ +% SD (s) & $2.644$ & $5.414$ & $9.757$ & $17.627$ & $37.333$ & $76.271$ \\ +% \hline +% \end{tabular} +% \\[5mm] (b) +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $6.927 \pm 0.309$ & $13.828 \pm 0.175$ & $31.936 \pm 0.663$ & $69.902 \pm 1.084$ & $140.617 \pm 2.502$ \\ +% SD & $0.431$ & $0.245$ & $0.926$ & $1.515$ & $3.498$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $284.330 \pm 1.135$ & $587.880 \pm 3.945$ & $1223.581 \pm 4.864$ & $5966.402 \pm 9.465$ & $13229.540 \pm 12.670$ \\ +% SD & $1.587$ & $5.514$ & $6.800$ & $13.232$ & $18.577$ \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$.} +% \label{tab:medias} +% \end{table*} + +\enlargethispage{2\baselineskip} +Figure~\ref{fig:bmz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we can see, the runtime for a given $n$ has a considerable +fluctuation. However, the fluctuation also grows linearly with $n$. + +\begin{figure}[htb] +\vspace{-2mm} +\begin{center} +\scalebox{0.4}{\includegraphics{figs/bmz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for the internal memory based algorithm. +The solid line corresponds to a linear regression model.} +\label{fig:bmz_temporegressao} +\end{center} +\vspace{-6mm} +\end{figure} + +The observed fluctuation in the runtimes is as expected; recall that this +runtime has the form~$\alpha nZ$ with~$Z$ a geometric random variable with +mean~$1/p=e$. Thus, the runtime has mean~$\alpha n/p=\alpha en$ and standard +deviation~$\alpha n\sqrt{(1-p)/p^2}=\alpha n\sqrt{e(e-1)}$. +Therefore, the standard deviation also grows +linearly with $n$, as experimentally verified +in Table~\ref{tab:medias} and in Figure~\ref{fig:bmz_temporegressao}. + +%\noindent-------------------------------------------------------------------------\\ +%Comentario para Yoshi: Nao consegui reproduzir bem o que discutimos +%no paragrafo acima, acho que vc conseguira justificar melhor :-). \\ +%-------------------------------------------------------------------------\\ diff --git a/vldb07/determiningb.tex b/vldb07/determiningb.tex new file mode 100755 index 0000000..e9b3cb2 --- /dev/null +++ b/vldb07/determiningb.tex @@ -0,0 +1,146 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\enlargethispage{2\baselineskip} +\subsection{Determining~$b$} +\label{sec:determining-b} +\begin{table*}[t] +\begin{center} +{\small %\scriptsize +\begin{tabular}{|c|ccc|ccc|} +\hline +\raisebox{-0.7em}{$n$} & \multicolumn{3}{c|}{\raisebox{-1mm}{b=128}} & +\multicolumn{3}{c|}{\raisebox{-1mm}{b=175}}\\ +\cline{2-4} \cline{5-7} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} + & \raisebox{-0.5mm}{Worst Case} & \raisebox{-0.5mm}{Average} &\raisebox{-0.5mm}{Eq.~(\ref{eq:maxbs})} \\ +\hline +$1.0 \times 10^6$ & 177 & 172.0 & 176 & 232 & 226.6 & 230 \\ +%$2.0 \times 10^6$ & 179 & 174.0 & 178 & 236 & 228.5 & 232 \\ +$4.0 \times 10^6$ & 182 & 177.5 & 179 & 241 & 231.8 & 234 \\ +%$8.0 \times 10^6$ & 186 & 181.6 & 181 & 238 & 234.2 & 236 \\ +$1.6 \times 10^7$ & 184 & 181.6 & 183 & 241 & 236.1 & 238 \\ +%$3.2 \times 10^7$ & 191 & 183.9 & 184 & 240 & 236.6 & 240 \\ +$6.4 \times 10^7$ & 195 & 185.2 & 186 & 244 & 239.0 & 242 \\ +%$1.28 \times 10^8$ & 193 & 187.7 & 187 & 244 & 239.7 & 244 \\ +$5.12 \times 10^8$ & 196 & 191.7 & 190 & 251 & 246.3 & 247 \\ +$1.0 \times 10^9$ & 197 & 191.6 & 192 & 253 & 248.9 & 249 \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Values for $\mathit{BS}_{\mathit{max}}$: worst case and average case obtained in the experiments and using Eq.~(\ref{eq:maxbs}), +considering $b=128$ and $b=175$ for different number $n$ of keys in $S$.} +\label{tab:comparison} +\vspace{-6mm} +\end{table*} + +The partitioning step can be viewed as the well known ``balls into bins'' +problem~\cite{ra98,dfm02} where~$n$ keys (the balls) are placed independently and +uniformly into $\lceil n/b\rceil$ buckets (the bins). The main question related to that problem we are interested +in is: what is the maximum number of keys in any bucket? +In fact, we want to get the maximum value for $b$ that makes the maximum number of keys in any bucket +no greater than 256 with high probability. +This is important, as we wish to use 8 bits per entry in the vector $g_i$ of +each $\mathrm{MPHF}_i$, +where $0 \leq i < \lceil n/b\rceil$. +Let $\mathit{BS}_{\mathit{max}}$ be the maximum number of keys in any bucket. + +Clearly, $\BSmax$ is the maximum +of~$\lceil n/b\rceil$ random variables~$Z_i$, each with binomial +distribution~$\Bi(n,p)$ with parameters~$n$ and~$p=1/\lceil n/b\rceil$. +However, the~$Z_i$ are not independent. Note that~$\Bi(n,p)$ has mean and +variance~$\simeq b$. To give an upper estimate for the probability of the +event~$\BSmax\geq \gamma$, we can estimate the probability that we have~$Z_i\geq \gamma$ +for a fixed~$i$, and then sum these estimates over all~$i$. +Let~$\gamma=b+\sigma\sqrt{b\ln(n/b)}$, where~$\sigma=\sqrt2$. +Approximating~$\Bi(n,p)$ by the normal distribution with mean and +variance~$b$, we obtain the +estimate~$(\sigma\sqrt{2\pi\ln(n/b)})^{-1}\times\exp(-(1/2)\sigma^2\ln(n/b))$ for +the probability that~$Z_i\geq \gamma$ occurs, which, summed over all~$i$, gives +that the probability that~$\BSmax\geq \gamma$ occurs is at +most~$1/(\sigma\sqrt{2\pi\ln(n/b)})$, which tends to~$0$ as~$n\to\infty$. +Thus, we have shown that, with high probability, +\begin{equation} + \label{eq:maxbs} + \BSmax\leq b+\sqrt{2b\ln{n\over b}}. +\end{equation} + +% The traditional approach used to estimate $\mathit{BS}_{\mathit{max}}$ with high probability is +% to consider $\mathit{BS}_{\mathit{max}}$ as a random variable that follows a binomial distribution +% that can be approximated by a poisson distribution. This yields a good approximation +% when the number of balls is lower than or equal to the number of bins~\cite{g81}. In our case, +% the number of balls is greater than the number of buckets. +% % and that is why we have used more recent works to estimate $\mathit{BS}_{\mathit{max}}$. +% As $b > \ln (n/b)$, we can use the result by Raab and Steger~\cite{ra98} to estimate +% $\mathit{BS}_{\mathit{max}}$ with high probability. +% The following equation gives the estimation, where $\sigma=\sqrt{2}$: +% \begin{eqnarray} \label{eq:maxbs} +% \mathit{BS}_{\mathit{max}} = b + O \left( \sqrt{b\ln\frac{n}{b}} \right) = b + \sigma \times \left(\sqrt{b\ln\frac{n}{b}} \right) +% \end{eqnarray} + +% In order to estimate the suitable constant $\sigma$ we did a linear +% regression suppressing the constant term. +% We use the equation $BS_{max} - b = \sigma \times \sqrt{b\ln (n/b)}$ +% in the linear regression considering $y=BS_{max} - b$ and $x=\sqrt{b\ln (n/b)}$. +% In order to obtain data to be used in the linear regression we set +% b=128 and ran the new algorithm ten times +% for n equal to 1, 2, 4, 8, 16, 32, 64, 128, 512, 1000 million keys. +% Taking a confidence level equal to 95\% we got +% $\sigma = 2.11 \pm 0.03$. +% The coefficient of determination was $99.6\%$, which means that the linear +% regression explains $99.6\%$ of the data variation and only $0.4\%$ +% is due to experimental errors. +% Therefore, Eq.~(\ref{eq:maxbs}) with $\sigma = 2.11 \pm 0.03$ and $b=128$ +% makes a very good estimation of the maximum number of keys in any bucket. + +% Repeating the same experiments for $b$ equals to $175$ and +% a confidence level of $95\%$ we got $\sigma = 2.07 \pm 0.03$. +% Again we verified that Eq.~(\ref{eq:maxbs}) with $\sigma = 2.07 \pm 0.03$ and $b=175$ is +% a very good estimation of the maximum number of keys in any bucket once the +% coefficient of determination obtained was $99.7 \%$ and $\sigma$ is in a very narrow range. + +In our algorithm the maximum number of keys in any bucket must be at most 256. +Table~\ref{tab:comparison} presents the values for $\mathit{BS}_{\mathit{max}}$ +obtained experimentally and using Eq.~(\ref{eq:maxbs}). +The table presents the worst case and the average case, +considering $b=128$, $b=175$ and Eq.~(\ref{eq:maxbs}), +for several numbers~$n$ of keys in $S$. +The estimation given by Eq.~(\ref{eq:maxbs}) is very close to the experimental +results. + +Now we estimate the biggest problem our algorithm is able to solve for +a given $b$. +Using Eq.~(\ref{eq:maxbs}) considering $b=128$, $b=175$ and imposing +that~$\mathit{BS}_{\mathit{max}}\leq256$, +the sizes of the biggest key set our algorithm +can deal with are $10^{30}$ keys and $10^{10}$ keys, respectively. +%It is also important to have $b$ as big as possible, once its value is +%related to the space required to store the resultant MPHF, as shown later on. +%Table~\ref{tab:bp} shows the biggest problem the algorithm can solve. +% The values were obtained from Eq.~(\ref{eq:maxbs}), +% considering $b=128$ and~$b=175$ and imposing +% that~$\mathit{BS}_{\mathit{max}}\leq256$. + +% We set $\sigma=2.14$ because it was the greatest value obtained for $\sigma$ +% in the two linear regression we did. +% \vspace{-3mm} +% \begin{table}[htb] +% \begin{center} +% {\small %\scriptsize +% \begin{tabular}{|c|c|} +% \hline +% b & Problem size ($n$) \\ +% \hline +% 128 & $10^{30}$ keys \\ +% 175 & $10^{10}$ keys \\ +% \hline +% \end{tabular} +% \vspace{-1mm} +% } +% \end{center} +% \caption{Using Eq.~(\ref{eq:maxbs}) to estimate the biggest problem our algorithm can solve.} +% %considering $\sigma=\sqrt{2}$.} +% \label{tab:bp} +% \vspace{-14mm} +% \end{table} diff --git a/vldb07/diskaccess.tex b/vldb07/diskaccess.tex new file mode 100755 index 0000000..08e54b9 --- /dev/null +++ b/vldb07/diskaccess.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Controlling disk accesses} +\label{sec:contr-disk-access} + +In order to bring down the number of seek operations on disk +we benefit from the fact that our algorithm leaves almost all main +memory available to be used as disk I/O buffer. +In this section we evaluate how much the parameter $\mu$ +affects the runtime of our algorithm. +For that we fixed $n$ in 1 billion of URLs, +set the main memory of the machine used for the experiments +to 1 gigabyte and used $\mu$ equal to $100, 200, 300, 400, 500$ and $600$ +megabytes. + +\enlargethispage{2\baselineskip} +Table~\ref{tab:diskaccess} presents the number of files $N$, +the buffer size used for all files, the number of seeks in the worst case considering +the pessimistic assumption mentioned in Section~\ref{sec:linearcomplexity}, and +the time to generate a MPHF for 1 billion of keys as a function of the amount of internal +memory available. Observing Table~\ref{tab:diskaccess} we noticed that the time spent in the construction +decreases as the value of $\mu$ increases. However, for $\mu > 400$, the variation +on the time is not as significant as for $\mu \leq 400$. +This can be explained by the fact that the kernel 2.6 I/O scheduler of Linux +has smart policies +for avoiding seeks and diminishing the average seek time +(see \texttt{http://www.linuxjournal.com/article/6931}). +\begin{table*}[ht] +\vspace{-2mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|c|} +\hline +$\mu$ (MB) & $100$ & $200$ & $300$ & $400$ & $500$ & $600$ \\ +\hline +$N$ (files) & $619$ & $310$ & $207$ & $155$ & $124$ & $104$ \\ +%\hline +\textbaht~(buffer size in KB) & $165$ & $661$ & $1,484$ & $2,643$ & $4,129$ & $5,908$ \\ +%\hline +$\beta$/\textbaht~(\# of seeks in the worst case) & $384,478$ & $95,974$ & $42,749$ & $24,003$ & $15,365$ & $10,738$ \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$15,347$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & \\ +% \hline +Time (hours) & $4.04$ & $3.64$ & $3.34$ & $3.20$ & $3.13$ & $3.09$ \\ +\hline +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +\label{tab:diskaccess} +\vspace{-14mm} +\end{table*} + + + +% \begin{table*}[ht] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|} +% \hline +% $\mu$ (MB) & $100$ & $150$ & $200$ & $250$ & $300$ & $350$ & $400$ & $450$ & $500$ & $550$ & $600$ \\ +% \hline +% $N$ (files) & $619$ & $413$ & $310$ & $248$ & $207$ & $177$ & $155$ & $138$ & $124$ & $113$ & $103$ \\ +% \hline +% \textbaht~(buffer size in KB) & $165$ & $372$ & $661$ & $1,033$ & $1,484$ & $2,025$ & $2,643$ & $3,339$ & & & \\ +% \hline +% \# of seeks (Worst case) & $384,478$ & $170,535$ & $95,974$ & $61,413$ & $42,749$ & $31,328$ & $24,003$ & $19,000$ & & & \\ +% \hline +% \raisebox{-0.2em}{\# of seeks performed in} & \raisebox{-0.7em}{$383,056$} & \raisebox{-0.7em}{$170,385$} & \raisebox{-0.7em}{$95,919$} & \raisebox{-0.7em}{$61,388$} & \raisebox{-0.7em}{$42,700$} & \raisebox{-0.7em}{$31,296$} & \raisebox{-0.7em}{$23,980$} & \raisebox{-0.7em}{$18,978$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} & \raisebox{-0.7em}{$xx,xxx$} \\ +% \raisebox{0.2em}{statement 1.3 of Figure~\ref{fig:readingbucket}} & & & & & & & & & & & \\ +% \hline +% Time (horas) & $4.04$ & $3.93$ & $3.64$ & $3.46$ & $3.34$ & $3.26$ & $3.20$ & $3.13$ & & & \\ +% \hline +% \end{tabular} +% } +% \end{center} +% \caption{Influence of the internal memory area size ($\mu$) in our algorithm runtime.} +% \label{tab:diskaccess} +% \end{table*} + + + +% \begin{table*}[htb] +% \begin{center} +% {\scriptsize +% \begin{tabular}{|l|c|c|c|c|c|} +% \hline +% $n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +% \hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +% Average time (s) & $14.124 \pm 0.128$ & $28.301 \pm 0.140$ & $56.807 \pm 0.312$ & $117.286 \pm 0.997$ & $241.086 \pm 0.936$ \\ +% SD & $0.179$ & $0.196$ & $0.437$ & $1.394$ & $1.308$ \\ +% \hline +% \hline +% $n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +% \hline % Part. 20 \% 20\% 20\% 18\% 18\% +% Average time (s) & $492.430 \pm 1.565$ & $1006.307 \pm 1.425$ & $2081.208 \pm 0.740$ & $9253.188 \pm 4.406$ & $19021.480 \pm 13.850$ \\ +% SD & $2.188$ & $1.992$ & $1.035$ & $ 6.160$ & $18.016$ \\ +% \hline + +% \end{tabular} +% } +% \end{center} +% \caption{The runtime averages in seconds, +% the standard deviation (SD), and +% the confidence intervals given by the average time $\pm$ +% the distance from average time considering +% a confidence level of $95\%$. +% } +% \label{tab:mediasbrz} +% \end{table*} diff --git a/vldb07/experimentalresults.tex b/vldb07/experimentalresults.tex new file mode 100755 index 0000000..58b4091 --- /dev/null +++ b/vldb07/experimentalresults.tex @@ -0,0 +1,15 @@ +%Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\section{Appendix: Experimental results} +\label{sec:experimental-results} +\vspace{-1mm} + +In this section we present the experimental results. +We start presenting the experimental setup. +We then present experimental results for +the internal memory based algorithm~\cite{bkz05} +and for our algorithm. +Finally, we discuss how the amount of internal memory available +affects the runtime of our algorithm. diff --git a/vldb07/figs/bmz_temporegressao.png b/vldb07/figs/bmz_temporegressao.png new file mode 100644 index 0000000000000000000000000000000000000000..e7198c1cea2b9f5d766b7f422b23a2e259209c79 GIT binary patch literal 5769 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 J@QQuN{{U&H=p48g`weTH#H5IX}; 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 ydE%}ySS(et!ZLcRyFa7rolcuCKId +\section{Introduction} +\label{sec:intro} + +\enlargethispage{2\baselineskip} +Suppose~$U$ is a universe of \textit{keys} of size $u$. +Let $h:U\to M$ be a {\em hash function} that maps the keys from~$U$ +to a given interval of integers $M=[0,m-1]=\{0,1,\dots,m-1\}$. +Let~$S\subseteq U$ be a set of~$n$ keys from~$U$, where $ n \ll u$. +Given a key~$x\in S$, the hash function~$h$ computes an integer in +$[0,m-1]$ for the storage or retrieval of~$x$ in a {\em hash table}. +% Hashing methods for {\em non-static sets} of keys can be used to construct +% data structures storing $S$ and supporting membership queries +% ``$x \in S$?'' in expected time $O(1)$. +% However, they involve a certain amount of wasted space owing to unused +% locations in the table and waisted time to resolve collisions when +% two keys are hashed to the same table location. +A perfect hash function maps a {\em static set} $S$ of $n$ keys from $U$ into a set of $m$ integer +numbers without collisions, where $m$ is greater than or equal to $n$. +If $m$ is equal to $n$, the function is called minimal. + +% Figure~\ref{fig:minimalperfecthash-ph-mph}(a) illustrates a perfect hash function and +% Figure~\ref{fig:minimalperfecthash-ph-mph}(b) illustrates a minimal perfect hash function (MPHF). +% +% \begin{figure} +% \centering +% \scalebox{0.7}{\epsfig{file=figs/minimalperfecthash-ph-mph.ps}} +% \caption{(a) Perfect hash function (b) Minimal perfect hash function (MPHF)} +% \label{fig:minimalperfecthash-ph-mph} +% %\vspace{-5mm} +% \end{figure} + +Minimal perfect hash functions are widely used for memory efficient storage and fast +retrieval of items from static sets, such as words in natural languages, +reserved words in programming languages or interactive systems, universal resource +locations (URLs) in web search engines, or item sets in data mining techniques. +Search engines are nowadays indexing tens of billions of pages and algorithms +like PageRank~\cite{Brin1998}, which uses the web link structure to derive a +measure of popularity for Web pages, would benefit from a MPHF for storage and +retrieval of such huge sets of URLs. +For instance, the TodoBr\footnote{TodoBr ({\texttt www.todobr.com.br}) is a trademark of +Akwan Information Technologies, which was acquired by Google Inc. in July 2005.} +search engine used the algorithm proposed hereinafter to +improve and to scale its link analysis system. +The WebGraph research group~\cite{bv04} would +also benefit from a MPHF for sets in the order of billions of URLs to scale +and to improve the storange requirements of their algorithms on Graph compression. + + Another interesting application for MPHFs is its use as an indexing structure + for databases. + The B+ tree is very popular as an indexing structure for dynamic applications + with frequent insertions and deletions of records. + However, for applications with sporadic modifications and a huge number of + queries the B+ tree is not the best option, + because it performs poorly with very large sets of keys + such as those required for the new frontiers of database applications~\cite{s05}. + Therefore, there are applications for MPHFs in + information retrieval systems, database systems, language translation systems, + electronic commerce systems, compilers, operating systems, among others. + +Until now, because of the limitations of current algorithms, +the use of MPHFs is restricted to scenarios where the set of keys being hashed is +relatively small. +However, in many cases it is crucial to deal in an efficient way with very large +sets of keys. +Due to the exponential growth of the Web, the work with huge collections is becoming +a daily task. +For instance, the simple assignment of number identifiers to web pages of a collection +can be a challenging task. +While traditional databases simply cannot handle more traffic once the working +set of URLs does not fit in main memory anymore~\cite{s05}, the algorithm we propose here to +construct MPHFs can easily scale to billions of entries. +% using stock hardware. + +As there are many applications for MPHFs, it is +important to design and implement space and time efficient algorithms for +constructing such functions. +The attractiveness of using MPHFs depends on the following issues: +\begin{enumerate} +\item The amount of CPU time required by the algorithms for constructing MPHFs. +\item The space requirements of the algorithms for constructing MPHFs. +\item The amount of CPU time required by a MPHF for each retrieval. +\item The space requirements of the description of the resulting MPHFs to be + used at retrieval time. +\end{enumerate} + +\enlargethispage{2\baselineskip} +This paper presents a novel external memory based algorithm for constructing MPHFs that +is very efficient in these four requirements. +First, the algorithm is linear on the size of keys to construct a MPHF, +which is optimal. +For instance, for a collection of 1 billion URLs +collected from the web, each one 64 characters long on average, the time to construct a +MPHF using a 2.4 gigahertz PC with 500 megabytes of available main memory +is approximately 3 hours. +Second, the algorithm needs a small a priori defined vector of $\lceil n/b \rceil$ +one byte entries in main memory to construct a MPHF. +For the collection of 1 billion URLs and using $b=175$, the algorithm needs only +5.45 megabytes of internal memory. +Third, the evaluation of the MPHF for each retrieval requires three memory accesses and +the computation of three universal hash functions. +This is not optimal as any MPHF requires at least one memory access and the computation +of two universal hash functions. +Fourth, the description of a MPHF takes a constant number of bits for each key, which is optimal. +For the collection of 1 billion URLs, it needs 8.1 bits for each key, +while the theoretical lower bound is $1/\ln2 \approx 1.4427$ bits per +key~\cite{m84}. + diff --git a/vldb07/makefile b/vldb07/makefile new file mode 100755 index 0000000..1b95644 --- /dev/null +++ b/vldb07/makefile @@ -0,0 +1,17 @@ +all: + latex vldb.tex + bibtex vldb + latex vldb.tex + latex vldb.tex + dvips vldb.dvi -o vldb.ps + ps2pdf vldb.ps + chmod -R g+rwx * + +perm: + chmod -R g+rwx * + +run: clean all + gv vldb.ps & +clean: + rm *.aux *.bbl *.blg *.log *.ps *.pdf *.dvi + diff --git a/vldb07/partitioningthekeys.tex b/vldb07/partitioningthekeys.tex new file mode 100755 index 0000000..e9a48c4 --- /dev/null +++ b/vldb07/partitioningthekeys.tex @@ -0,0 +1,141 @@ +%% Nivio: 21/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{Partitioning step} +\label{sec:partitioning-keys} + +The set $S$ of $n$ keys is partitioned into $\lceil n/b \rceil$ buckets, +where $b$ is a suitable parameter chosen to guarantee +that each bucket has at most 256 keys with high probability +(see Section~\ref{sec:determining-b}). +The partitioning step works as follows: + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $\beta$ be the size in bytes of the set $S$ \\ +\> $\blacktriangleright$ Let $\mu$ be the size in bytes of an a priori reserved \\ +\> ~~~ internal memory area \\ +\> $\blacktriangleright$ Let $N = \lceil \beta/\mu \rceil$ be the number of key blocks that will \\ +\> ~~~ be read from disk into an internal memory area \\ +\> $\blacktriangleright$ Let $\mathit{size}$ be a vector that stores the size of each bucket \\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \\ +\> ~~ $1.1$ Read block $B_j$ of keys from disk \\ +\> ~~ $1.2$ Cluster $B_j$ into $\lceil n/b \rceil$ buckets using a bucket sort \\ +\> ~~~~~~~ algorithm and update the entries in the vector {\it size} \\ +\> ~~ $1.3$ Dump $B_j$ to the disk into File $j$\\ +\> $2.$ Compute the {\it offset} vector and dump it to the disk. +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Partitioning step} +\vspace{-3mm} +\label{fig:partitioningstep} +\end{figure} + +Statement 1.1 of the {\bf for} loop presented in Figure~\ref{fig:partitioningstep} +reads sequentially all the keys of block $B_j$ from disk into an internal area +of size $\mu$. + +Statement 1.2 performs an indirect bucket sort of the keys in block $B_j$ +and at the same time updates the entries in the vector {\em size}. +Let us briefly describe how~$B_j$ is partitioned among the~$\lceil n/b\rceil$ +buckets. +We use a local array of $\lceil n/b \rceil$ counters to store a +count of how many keys from $B_j$ belong to each bucket. +%At the same time, the global vector {\it size} is computed based on the local +%counters. +The pointers to the keys in each bucket $i$, $0 \leq i < \lceil n/b \rceil$, +are stored in contiguous positions in an array. +For this we first reserve the required number of entries +in this array of pointers using the information from the array of counters. +Next, we place the pointers to the keys in each bucket into the respective +reserved areas in the array (i.e., we place the pointers to the keys in bucket 0, +followed by the pointers to the keys in bucket 1, and so on). + +\enlargethispage{2\baselineskip} +To find the bucket address of a given key +we use the universal hash function $h_0(k)$~\cite{j97}. +Key~$k$ goes into bucket~$i$, where +%Then, for each integer $h_0(k)$ the respective bucket address is obtained +%as follows: +\begin{eqnarray} \label{eq:bucketindex} +i=h_0(k) \bmod \left \lceil \frac{n}{b} \right \rceil. +\end{eqnarray} + +Figure~\ref{fig:brz-partitioning}(a) shows a \emph{logical} view of the +$\lceil n/b \rceil$ buckets generated in the partitioning step. +%In this case, the keys of each bucket are put together by the pointers to +%each key stored +%in contiguous positions in the array of pointers. +In reality, the keys belonging to each bucket are distributed among many files, +as depicted in Figure~\ref{fig:brz-partitioning}(b). +In the example of Figure~\ref{fig:brz-partitioning}(b), the keys in bucket 0 +appear in files 1 and $N$, the keys in bucket 1 appear in files 1, 2 +and $N$, and so on. + +\vspace{-7mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz-partitioning.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(4371,1403)(1,-6977) +\put(333,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(545,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(759,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(1539,-6421){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(541,-6676){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Logical View}}}} +\put(3547,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3547,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6120){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6188){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3107,-6255){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6224){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6269){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(4177,-6314){\makebox(0,0)[lb]{\smash{{\SetFigFont{12}{14.4}{\familydefault}{\mddefault}{\updefault}.}}}} +\put(3016,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 1}}}} +\put(3466,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File 2}}}} +\put(4096,-6721){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}File N}}}} +\put(3196,-6946){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets Physical View}}}} +\end{picture}% +\caption{Situation of the buckets at the end of the partitioning step: (a) Logical view (b) Physical view} +\label{fig:brz-partitioning} +\vspace{-2mm} +\end{figure} + +This scattering of the keys in the buckets could generate a performance +problem because of the potential number of seeks +needed to read the keys in each bucket from the $N$ files in disk +during the searching step. +But, as we show later in Section~\ref{sec:analytcal-results}, the number of seeks +can be kept small using buffering techniques. +Considering that only the vector {\it size}, which has $\lceil n/b \rceil$ +one-byte entries (remember that each bucket has at most 256 keys), +must be maintained in main memory during the searching step, +almost all main memory is available to be used as disk I/O buffer. + +The last step is to compute the {\it offset} vector and dump it to the disk. +We use the vector $\mathit{size}$ to compute the +$\mathit{offset}$ displacement vector. +The $\mathit{offset}[i]$ entry contains the number of keys +in the buckets $0, 1, \dots, i-1$. +As {\it size}$[i]$ stores the number of keys +in bucket $i$, where $0 \leq i <\lceil n/b \rceil$, we have +\begin{displaymath} +\mathit{offset}[i] = \sum_{j=0}^{i-1} \mathit{size}[j] \cdot +\end{displaymath} + diff --git a/vldb07/performancenewalgorithm.tex b/vldb07/performancenewalgorithm.tex new file mode 100755 index 0000000..6911282 --- /dev/null +++ b/vldb07/performancenewalgorithm.tex @@ -0,0 +1,113 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\subsection{Performance of the new algorithm} +\label{sec:performance} +%As we have done for the internal memory based algorithm, + +The runtime of our algorithm is also a random variable, but now it follows a +(highly concentrated) normal distribution, as we discuss at the end of this +section. Again, we are interested in verifying the linearity claim made in +Section~\ref{sec:linearcomplexity}. Therefore, we ran the algorithm for +several numbers $n$ of keys in $S$. + +The values chosen for $n$ were $1, 2, 4, 8, 16, 32, 64, 128, 512$ and $1000$ +million. +%Just the small vector {\it size} must be kept in main memory, +%as we saw in Section~\ref{sec:memconstruction}. +We limited the main memory in 500 megabytes for the experiments. +The size $\mu$ of the a priori reserved internal memory area +was set to 250 megabytes, the parameter $b$ was set to $175$ and +the building block algorithm parameter $c$ was again set to $1$. +In Section~\ref{sec:contr-disk-access} we show how $\mu$ +affects the runtime of the algorithm. The other two parameters +have insignificant influence on the runtime. + +We again use a statistical method for determining a suitable sample size +%~\cite[Chapter 13]{j91} +to estimate the number of trials to be run for each value of $n$. We got that +just one trial for each $n$ would be enough with a confidence level of $95\%$. +However, we made 10 trials. This number of trials seems rather small, but, as +shown below, the behavior of our algorithm is very stable and its runtime is +almost deterministic (i.e., the standard deviation is very small). + +Table~\ref{tab:mediasbrz} presents the runtime average for each $n$, +the respective standard deviations, and +the respective confidence intervals given by +the average time $\pm$ the distance from average time +considering a confidence level of $95\%$. +Observing the runtime averages we noticed that +the algorithm runs in expected linear time, +as shown in~Section~\ref{sec:linearcomplexity}. Better still, +it is only approximately $60\%$ slower than our internal memory based algorithm. +To get that value we used the linear regression model obtained for the runtime of +the internal memory based algorithm to estimate how much time it would require +for constructing a MPHF for a set of 1 billion keys. +We got 2.3 hours for the internal memory based algorithm and we measured +3.67 hours on average for our algorithm. +Increasing the size of the internal memory area +from 250 to 600 megabytes (see Section~\ref{sec:contr-disk-access}), +we have brought the time to 3.09 hours. In this case, our algorithm is +just $34\%$ slower in this setup. + +\enlargethispage{2\baselineskip} +\begin{table*}[htb] +\vspace{-1mm} +\begin{center} +{\scriptsize +\begin{tabular}{|l|c|c|c|c|c|} +\hline +$n$ (millions) & 1 & 2 & 4 & 8 & 16 \\ +\hline % Part. 16 \% 16 \% 16 \% 18 \% 20\% +Average time (s) & $6.9 \pm 0.3$ & $13.8 \pm 0.2$ & $31.9 \pm 0.7$ & $69.9 \pm 1.1$ & $140.6 \pm 2.5$ \\ +SD & $0.4$ & $0.2$ & $0.9$ & $1.5$ & $3.5$ \\ +\hline +\hline +$n$ (millions) & 32 & 64 & 128 & 512 & 1000 \\ +\hline % Part. 20 \% 20\% 20\% 18\% 18\% +Average time (s) & $284.3 \pm 1.1$ & $587.9 \pm 3.9$ & $1223.6 \pm 4.9$ & $5966.4 \pm 9.5$ & $13229.5 \pm 12.7$ \\ +SD & $1.6$ & $5.5$ & $6.8$ & $13.2$ & $18.6$ \\ +\hline + +\end{tabular} +\vspace{-1mm} +} +\end{center} +\caption{Our algorithm: average time in seconds for constructing a MPHF, +the standard deviation (SD), and the confidence intervals considering +a confidence level of $95\%$. +} +\label{tab:mediasbrz} +\vspace{-5mm} +\end{table*} + +Figure~\ref{fig:brz_temporegressao} +presents the runtime for each trial. In addition, +the solid line corresponds to a linear regression model +obtained from the experimental measurements. +As we were expecting the runtime for a given $n$ has almost no +variation. + +\begin{figure}[htb] +\begin{center} +\scalebox{0.4}{\includegraphics{figs/brz_temporegressao.eps}} +\caption{Time versus number of keys in $S$ for our algorithm. The solid line corresponds to +a linear regression model.} +\label{fig:brz_temporegressao} +\end{center} +\vspace{-9mm} +\end{figure} + +An intriguing observation is that the runtime of the algorithm is almost +deterministic, in spite of the fact that it uses as building block an +algorithm with a considerable fluctuation in its runtime. A given bucket~$i$, +$0 \leq i < \lceil n/b \rceil$, is a small set of keys (at most 256 keys) and, +as argued in Section~\ref{sec:intern-memory-algor}, the runtime of the +building block algorithm is a random variable~$X_i$ with high fluctuation. +However, the runtime~$Y$ of the searching step of our algorithm is given +by~$Y=\sum_{0\leq i<\lceil n/b\rceil}X_i$. Under the hypothesis that +the~$X_i$ are independent and bounded, the {\it law of large numbers} (see, +e.g., \cite{j91}) implies that the random variable $Y/\lceil n/b\rceil$ +converges to a constant as~$n\to\infty$. This explains why the runtime of our +algorithm is almost deterministic. + + diff --git a/vldb07/references.bib b/vldb07/references.bib new file mode 100755 index 0000000..d2ea475 --- /dev/null +++ b/vldb07/references.bib @@ -0,0 +1,814 @@ + +@InProceedings{Brin1998, + author = "Sergey Brin and Lawrence Page", + title = "The Anatomy of a Large-Scale Hypertextual Web Search Engine", + booktitle = "Proceedings of the 7th International {World Wide Web} + Conference", + pages = "107--117", + adress = "Brisbane, Australia", + month = "April", + year = 1998, + annote = "Artigo do Google." +} + +@inproceedings{p99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@article{p00, + author = {R. Pagh}, + title = {Faster deterministic dictionaries}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + OPTvolume = {43}, + OPTnumber = {5}, + pages = {487--493}, + year = {2000} +} +@article{g81, + author = {G. H. Gonnet}, + title = {Expected Length of the Longest Probe Sequence in Hash Code Searching}, + journal = {J. ACM}, + volume = {28}, + number = {2}, + year = {1981}, + issn = {0004-5411}, + pages = {289--304}, + doi = {http://doi.acm.org/10.1145/322248.322254}, + publisher = {ACM Press}, + address = {New York, NY, USA}, + } + +@misc{r04, + author = "S. Rao", + title = "Combinatorial Algorithms Data Structures", + year = 2004, + howpublished = {CS 270 Spring}, + url = "citeseer.ist.psu.edu/700201.html" +} +@article{ra98, + author = {Martin Raab and Angelika Steger}, + title = {``{B}alls into Bins'' --- {A} Simple and Tight Analysis}, + journal = {Lecture Notes in Computer Science}, + volume = 1518, + pages = {159--170}, + year = 1998, + url = "citeseer.ist.psu.edu/raab98balls.html" +} + +@misc{mrs00, + author = "M. Mitzenmacher and A. Richa and R. Sitaraman", + title = "The power of two random choices: A survey of the techniques and results", + howpublished={In Handbook of Randomized + Computing, P. Pardalos, S. Rajasekaran, and J. Rolim, Eds. Kluwer}, + year = "2000", + url = "citeseer.ist.psu.edu/article/mitzenmacher00power.html" +} + +@article{dfm02, + author = {E. Drinea and A. Frieze and M. Mitzenmacher}, + title = {Balls and bins models with feedback}, + journal = {Symposium on Discrete Algorithms (ACM SODA)}, + pages = {308--315}, + year = {2002} +} +@Article{j97, + author = {Bob Jenkins}, + title = {Algorithm Alley: Hash Functions}, + journal = {Dr. Dobb's Journal of Software Tools}, + volume = {22}, + number = {9}, + month = {september}, + year = {1997} +} + +@article{gss01, + author = {N. Galli and B. Seybold and K. Simon}, + title = {Tetris-Hashing or optimal table compression}, + journal = {Discrete Applied Mathematics}, + volume = {110}, + number = {1}, + pages = {41--58}, + month = {june}, + publisher = {Elsevier Science}, + year = {2001} +} + +@article{s05, + author = {M. Seltzer}, + title = {Beyond Relational Databases}, + journal = {ACM Queue}, + volume = {3}, + number = {3}, + month = {April}, + year = {2005} +} + +@InProceedings{ss89, + author = {P. Schmidt and A. Siegel}, + title = {On aspects of universality and performance for closed hashing}, + booktitle = {Proc. 21th Ann. ACM Symp. on Theory of Computing -- STOC'89}, + month = {May}, + year = {1989}, + pages = {355--366} +} + +@article{asw00, + author = {M. Atici and D. R. Stinson and R. Wei.}, + title = {A new practical algorithm for the construction of a perfect hash function}, + journal = {Journal Combin. Math. Combin. Comput.}, + volume = {35}, + pages = {127--145}, + year = {2000} +} + +@article{swz00, + author = {D. R. Stinson and R. Wei and L. Zhu}, + title = {New constructions for perfect hash families and related structures using combinatorial designs and codes}, + journal = {Journal Combin. Designs.}, + volume = {8}, + pages = {189--200}, + year = {2000} +} + +@inproceedings{ht01, + author = {T. Hagerup and T. Tholey}, + title = {Efficient minimal perfect hashing in nearly minimal space}, + booktitle = {The 18th Symposium on Theoretical Aspects of Computer Science (STACS), volume 2010 of Lecture Notes in Computer Science}, + year = 2001, + pages = {317--326}, + key = {author} +} + +@inproceedings{dh01, + author = {M. Dietzfelbinger and T. Hagerup}, + title = {Simple minimal perfect hashing in less space}, + booktitle = {The 9th European Symposium on Algorithms (ESA), volume 2161 of Lecture Notes in Computer Science}, + year = 2001, + pages = {109--120}, + key = {author} +} + + +@MastersThesis{mar00, + author = {M. S. Neubert}, + title = {Algoritmos Distribu;os para a Constru;o de Arquivos invertidos}, + school = {Departamento de Ci;cia da Computa;o, Universidade Federal de Minas Gerais}, + year = 2000, + month = {Mar;}, + key = {author} +} + + +@Book{clrs01, + author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest and C. Stein}, + title = {Introduction to Algorithms}, + publisher = {MIT Press}, + year = {2001}, + edition = {second}, +} + +@Book{j91, + author = {R. Jain}, + title = {The art of computer systems performance analysis: techniques for experimental design, measurement, simulation, and modeling. }, + publisher = {John Wiley}, + year = {1991}, + edition = {first} +} + +@Book{k73, + author = {D. E. Knuth}, + title = {The Art of Computer Programming: Sorting and Searching}, + publisher = {Addison-Wesley}, + volume = {3}, + year = {1973}, + edition = {second}, +} + +@inproceedings{rp99, + author = {R. Pagh}, + title = {Hash and Displace: Efficient Evaluation of Minimal Perfect Hash Functions}, + booktitle = {Workshop on Algorithms and Data Structures}, + pages = {49-54}, + year = 1999, + url = {citeseer.nj.nec.com/pagh99hash.html}, + key = {author} +} + +@inproceedings{hmwc93, + author = {G. Havas and B.S. Majewski and N.C. Wormald and Z.J. Czech}, + title = {Graphs, Hypergraphs and Hashing}, + booktitle = {19th International Workshop on Graph-Theoretic Concepts in Computer Science}, + publisher = {Springer Lecture Notes in Computer Science vol. 790}, + pages = {153-165}, + year = 1993, + key = {author} +} + +@inproceedings{bkz05, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {A Practical Minimal Perfect Hashing Method}, + booktitle = {4th International Workshop on Efficient and Experimental Algorithms}, + publisher = {Springer Lecture Notes in Computer Science vol. 3503}, + pages = {488-500}, + Moth = May, + year = 2005, + key = {author} +} + +@Article{chm97, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {Fundamental Study Perfect Hashing}, + journal = {Theoretical Computer Science}, + volume = {182}, + year = {1997}, + pages = {1-143}, + key = {author} +} + +@article{chm92, + author = {Z.J. Czech and G. Havas and B.S. Majewski}, + title = {An Optimal Algorithm for Generating Minimal Perfect Hash Functions}, + journal = {Information Processing Letters}, + volume = {43}, + number = {5}, + pages = {257-264}, + year = {1992}, + url = {citeseer.nj.nec.com/czech92optimal.html}, + key = {author} +} + +@Article{mwhc96, + author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech}, + title = {A family of perfect hashing methods}, + journal = {The Computer Journal}, + year = {1996}, + volume = {39}, + number = {6}, + pages = {547-554}, + key = {author} +} + +@InProceedings{bv04, +author = {P. Boldi and S. Vigna}, +title = {The WebGraph Framework I: Compression Techniques}, +booktitle = {13th International World Wide Web Conference}, +pages = {595--602}, +year = {2004} +} + + +@Book{z04, + author = {N. Ziviani}, + title = {Projeto de Algoritmos com implementa;es em Pascal e C}, + publisher = {Pioneira Thompson}, + year = 2004, + edition = {segunda edi;o} +} + + +@Book{p85, + author = {E. M. Palmer}, + title = {Graphical Evolution: An Introduction to the Theory of Random Graphs}, + publisher = {John Wiley \& Sons}, + year = {1985}, + address = {New York} +} + +@Book{imb99, + author = {I.H. Witten and A. Moffat and T.C. Bell}, + title = {Managing Gigabytes: Compressing and Indexing Documents and Images}, + publisher = {Morgan Kaufmann Publishers}, + year = 1999, + edition = {second edition} +} +@Book{wfe68, + author = {W. Feller}, + title = { An Introduction to Probability Theory and Its Applications}, + publisher = {Wiley}, + year = 1968, + volume = 1, + optedition = {second edition} +} + + +@Article{fhcd92, + author = {E.A. Fox and L. S. Heath and Q. Chen and A.M. Daoud}, + title = {Practical Minimal Perfect Hash Functions For Large Databases}, + journal = {Communications of the ACM}, + year = {1992}, + volume = {35}, + number = {1}, + pages = {105--121} +} + + +@inproceedings{fch92, + author = {E.A. Fox and Q.F. Chen and L.S. Heath}, + title = {A Faster Algorithm for Constructing Minimal Perfect Hash Functions}, + booktitle = {Proceedings of the 15th Annual International ACM SIGIR Conference + on Research and Development in Information Retrieval}, + year = {1992}, + pages = {266-273}, +} + +@article{c80, + author = {R.J. Cichelli}, + title = {Minimal perfect hash functions made simple}, + journal = {Communications of the ACM}, + volume = {23}, + number = {1}, + year = {1980}, + issn = {0001-0782}, + pages = {17--19}, + doi = {http://doi.acm.org/10.1145/358808.358813}, + publisher = {ACM Press}, + } + + +@TechReport{fhc89, + author = {E.A. Fox and L.S. Heath and Q.F. Chen}, + title = {An $O(n\log n)$ algorithm for finding minimal perfect hash functions}, + institution = {Virginia Polytechnic Institute and State University}, + year = {1989}, + OPTkey = {}, + OPTtype = {}, + OPTnumber = {}, + address = {Blacksburg, VA}, + month = {April}, + OPTnote = {}, + OPTannote = {} +} + +@TechReport{bkz06t, + author = {F.C. Botelho and Y. Kohayakawa and N. Ziviani}, + title = {An Approach for Minimal Perfect Hash Functions in Very Large Databases}, + institution = {Department of Computer Science, Federal University of Minas Gerais}, + note = {Available at http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html}, + year = {2006}, + OPTkey = {}, + OPTtype = {}, + number = {RT.DCC.003}, + address = {Belo Horizonte, MG, Brazil}, + month = {April}, + OPTannote = {} +} + +@inproceedings{fcdh90, + author = {E.A. Fox and Q.F. Chen and A.M. Daoud and L.S. Heath}, + title = {Order preserving minimal perfect hash functions and information retrieval}, + booktitle = {Proceedings of the 13th annual international ACM SIGIR conference on Research and development in information retrieval}, + year = {1990}, + isbn = {0-89791-408-2}, + pages = {279--311}, + location = {Brussels, Belgium}, + doi = {http://doi.acm.org/10.1145/96749.98233}, + publisher = {ACM Press}, + } + +@Article{fkp89, + author = {P. Flajolet and D. E. Knuth and B. Pittel}, + title = {The first cycles in an evolving graph}, + journal = {Discrete Math}, + year = {1989}, + volume = {75}, + pages = {167-215}, +} + +@Article{s77, + author = {R. Sprugnoli}, + title = {Perfect Hashing Functions: A Single Probe Retrieving + Method For Static Sets}, + journal = {Communications of the ACM}, + year = {1977}, + volume = {20}, + number = {11}, + pages = {841--850}, + month = {November}, +} + +@Article{j81, + author = {G. Jaeschke}, + title = {Reciprocal Hashing: A method For Generating Minimal Perfect + Hashing Functions}, + journal = {Communications of the ACM}, + year = {1981}, + volume = {24}, + number = {12}, + month = {December}, + pages = {829--833} +} + +@Article{c84, + author = {C. C. Chang}, + title = {The Study Of An Ordered Minimal Perfect Hashing Scheme}, + journal = {Communications of the ACM}, + year = {1984}, + volume = {27}, + number = {4}, + month = {December}, + pages = {384--387} +} + +@Article{c86, + author = {C. C. Chang}, + title = {Letter-Oriented Reciprocal Hashing Scheme}, + journal = {Inform. Sci.}, + year = {1986}, + volume = {27}, + pages = {243--255} +} + +@Article{cl86, + author = {C. C. Chang and R. C. T. Lee}, + title = {A Letter-Oriented Minimal Perfect Hashing Scheme}, + journal = {Computer Journal}, + year = {1986}, + volume = {29}, + number = {3}, + month = {June}, + pages = {277--281} +} + + +@Article{cc88, + author = {C. C. Chang and C. H. Chang}, + title = {An Ordered Minimal Perfect Hashing Scheme with Single Parameter}, + journal = {Inform. Process. Lett.}, + year = {1988}, + volume = {27}, + number = {2}, + month = {February}, + pages = {79--83} +} + +@Article{w90, + author = {V. G. Winters}, + title = {Minimal Perfect Hashing in Polynomial Time}, + journal = {BIT}, + year = {1990}, + volume = {30}, + number = {2}, + pages = {235--244} +} + +@Article{fcdh91, + author = {E. A. Fox and Q. F. Chen and A. M. Daoud and L. S. Heath}, + title = {Order Preserving Minimal Perfect Hash Functions and Information Retrieval}, + journal = {ACM Trans. Inform. Systems}, + year = {1991}, + volume = {9}, + number = {3}, + month = {July}, + pages = {281--308} +} + +@Article{fks84, + author = {M. L. Fredman and J. Koml\'os and E. Szemer\'edi}, + title = {Storing a sparse table with {O(1)} worst case access time}, + journal = {J. ACM}, + year = {1984}, + volume = {31}, + number = {3}, + month = {July}, + pages = {538--544} +} + +@Article{dhjs83, + author = {M. W. Du and T. M. Hsieh and K. F. Jea and D. W. Shieh}, + title = {The study of a new perfect hash scheme}, + journal = {IEEE Trans. Software Eng.}, + year = {1983}, + volume = {9}, + number = {3}, + month = {May}, + pages = {305--313} +} + +@Article{bt94, + author = {M. D. Brain and A. L. Tharp}, + title = {Using Tries to Eliminate Pattern Collisions in Perfect Hashing}, + journal = {IEEE Trans. on Knowledge and Data Eng.}, + year = {1994}, + volume = {6}, + number = {2}, + month = {April}, + pages = {239--247} +} + +@Article{bt90, + author = {M. D. Brain and A. L. Tharp}, + title = {Perfect hashing using sparse matrix packing}, + journal = {Inform. Systems}, + year = {1990}, + volume = {15}, + number = {3}, + OPTmonth = {April}, + pages = {281--290} +} + +@Article{ckw93, + author = {C. C. Chang and H. C.Kowng and T. C. Wu}, + title = {A refinement of a compression-oriented addressing scheme}, + journal = {BIT}, + year = {1993}, + volume = {33}, + number = {4}, + OPTmonth = {April}, + pages = {530--535} +} + +@Article{cw91, + author = {C. C. Chang and T. C. Wu}, + title = {A letter-oriented perfect hashing scheme based upon sparse table compression}, + journal = {Software -- Practice Experience}, + year = {1991}, + volume = {21}, + number = {1}, + month = {january}, + pages = {35--49} +} + +@Article{ty79, + author = {R. E. Tarjan and A. C. C. Yao}, + title = {Storing a sparse table}, + journal = {Comm. ACM}, + year = {1979}, + volume = {22}, + number = {11}, + month = {November}, + pages = {606--611} +} + +@Article{yd85, + author = {W. P. Yang and M. W. Du}, + title = {A backtracking method for constructing perfect hash functions from a set of mapping functions}, + journal = {BIT}, + year = {1985}, + volume = {25}, + number = {1}, + pages = {148--164} +} + +@Article{s85, + author = {T. J. Sager}, + title = {A polynomial time generator for minimal perfect hash functions}, + journal = {Commun. ACM}, + year = {1985}, + volume = {28}, + number = {5}, + month = {May}, + pages = {523--532} +} + +@Article{cm93, + author = {Z. J. Czech and B. S. Majewski}, + title = {A linear time algorithm for finding minimal perfect hash functions}, + journal = {The computer Journal}, + year = {1993}, + volume = {36}, + number = {6}, + pages = {579--587} +} + +@Article{gbs94, + author = {R. Gupta and S. Bhaskar and S. Smolka}, + title = {On randomization in sequential and distributed algorithms}, + journal = {ACM Comput. Surveys}, + year = {1994}, + volume = {26}, + number = {1}, + month = {March}, + pages = {7--86} +} + +@InProceedings{sb84, + author = {C. Slot and P. V. E. Boas}, + title = {On tape versus core; an application of space efficient perfect hash functions to the + invariance of space}, + booktitle = {Proc. 16th Ann. ACM Symp. on Theory of Computing -- STOC'84}, + address = {Washington}, + month = {May}, + year = {1984}, + pages = {391--400}, +} + +@InProceedings{wi90, + author = {V. G. Winters}, + title = {Minimal perfect hashing for large sets of data}, + booktitle = {Internat. Conf. on Computing and Information -- ICCI'90}, + address = {Canada}, + month = {May}, + year = {1990}, + pages = {275--284}, +} + +@InProceedings{lr85, + author = {P. Larson and M. V. Ramakrishna}, + title = {External perfect hashing}, + booktitle = {Proc. ACM SIGMOD Conf.}, + address = {Austin TX}, + month = {June}, + year = {1985}, + pages = {190--199}, +} + +@Book{m84, + author = {K. Mehlhorn}, + editor = {W. Brauer and G. Rozenberg and A. Salomaa}, + title = {Data Structures and Algorithms 1: Sorting and Searching}, + publisher = {Springer-Verlag}, + year = {1984}, +} + +@PhdThesis{c92, + author = {Q. F. Chen}, + title = {An Object-Oriented Database System for Efficient Information Retrieval Appliations}, + school = {Virginia Tech Dept. of Computer Science}, + year = {1992}, + month = {March} +} + +@article {er59, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On random graphs {I}}, + JOURNAL = {Pub. Math. Debrecen}, + VOLUME = {6}, + YEAR = {1959}, + PAGES = {290--297}, + MRCLASS = {05.00}, + MRNUMBER = {MR0120167 (22 \#10924)}, +MRREVIEWER = {A. Dvoretzky}, +} + + +@article {erdos61, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Bull. Inst. Internat. Statist.}, + VOLUME = 38, + YEAR = 1961, + PAGES = {343--347}, + MRCLASS = {05.40 (55.10)}, + MRNUMBER = {MR0148055 (26 \#5564)}, +} + +@article {er60, + AUTHOR = {Erd{\H{o}}s, P. and R{\'e}nyi, A.}, + TITLE = {On the evolution of random graphs}, + JOURNAL = {Magyar Tud. Akad. Mat. Kutat\'o Int. K\"ozl.}, + VOLUME = {5}, + YEAR = {1960}, + PAGES = {17--61}, + MRCLASS = {05.40}, + MRNUMBER = {MR0125031 (23 \#A2338)}, +MRREVIEWER = {J. Riordan}, +} + +@Article{er60:_Old, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the evolution of random graphs}, + journal = {Publications of the Mathematical Institute of the Hungarian + Academy of Sciences}, + year = {1960}, + volume = {56}, + pages = {17-61} +} + +@Article{er61, + author = {P. Erd{\H{o}}s and A. R\'enyi}, + title = {On the strength of connectedness of a random graph}, + journal = {Acta Mathematica Scientia Hungary}, + year = {1961}, + volume = {12}, + pages = {261-267} +} + + +@Article{bp04, + author = {B. Bollob\'as and O. Pikhurko}, + title = {Integer Sets with Prescribed Pairwise Differences Being Distinct}, + journal = {European Journal of Combinatorics}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + +@Article{pw04:_OLD, + author = {B. Pittel and N. C. Wormald}, + title = {Counting connected graphs inside-out}, + journal = {Journal of Combinatorial Theory}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTpages = {}, + OPTmonth = {}, + note = {To Appear}, + OPTannote = {} +} + + +@Article{mr95, + author = {M. Molloy and B. Reed}, + title = {A critical point for random graphs with a given degree sequence}, + journal = {Random Structures and Algorithms}, + year = {1995}, + volume = {6}, + pages = {161-179} +} + +@TechReport{bmz04, + author = {F. C. Botelho and D. Menoti and N. Ziviani}, + title = {A New algorithm for constructing minimal perfect hash functions}, + institution = {Federal Univ. of Minas Gerais}, + year = {2004}, + OPTkey = {}, + OPTtype = {}, + number = {TR004}, + OPTaddress = {}, + OPTmonth = {}, + note = {(http://www.dcc.ufmg.br/\texttt{\~ }nivio/pub/technicalreports.html)}, + OPTannote = {} +} + +@Article{mr98, + author = {M. Molloy and B. Reed}, + title = {The size of the giant component of a random graph with a given degree sequence}, + journal = {Combinatorics, Probability and Computing}, + year = {1998}, + volume = {7}, + pages = {295-305} +} + +@misc{h98, + author = {D. Hawking}, + title = {Overview of TREC-7 Very Large Collection Track (Draft for Notebook)}, + url = {citeseer.ist.psu.edu/4991.html}, + year = {1998}} + +@book {jlr00, + AUTHOR = {Janson, S. and {\L}uczak, T. and Ruci{\'n}ski, A.}, + TITLE = {Random graphs}, + PUBLISHER = {Wiley-Inter.}, + YEAR = 2000, + PAGES = {xii+333}, + ISBN = {0-471-17541-2}, + MRCLASS = {05C80 (60C05 82B41)}, + MRNUMBER = {2001k:05180}, +MRREVIEWER = {Mark R. Jerrum}, +} + +@incollection {jlr90, + AUTHOR = {Janson, Svante and {\L}uczak, Tomasz and Ruci{\'n}ski, + Andrzej}, + TITLE = {An exponential bound for the probability of nonexistence of a + specified subgraph in a random graph}, + BOOKTITLE = {Random graphs '87 (Pozna\'n, 1987)}, + PAGES = {73--87}, + PUBLISHER = {Wiley}, + ADDRESS = {Chichester}, + YEAR = 1990, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {91m:05168}, +MRREVIEWER = {J. Spencer}, +} + +@book {b01, + AUTHOR = {Bollob{\'a}s, B.}, + TITLE = {Random graphs}, + SERIES = {Cambridge Studies in Advanced Mathematics}, + VOLUME = 73, + EDITION = {Second}, + PUBLISHER = {Cambridge University Press}, + ADDRESS = {Cambridge}, + YEAR = 2001, + PAGES = {xviii+498}, + ISBN = {0-521-80920-7; 0-521-79722-5}, + MRCLASS = {05C80 (60C05)}, + MRNUMBER = {MR1864966 (2002j:05132)}, +} + +@article {pw04, + AUTHOR = {Pittel, Boris and Wormald, Nicholas C.}, + TITLE = {Counting connected graphs inside-out}, + JOURNAL = {J. Combin. Theory Ser. B}, + FJOURNAL = {Journal of Combinatorial Theory. Series B}, + VOLUME = 93, + YEAR = 2005, + NUMBER = 2, + PAGES = {127--172}, + ISSN = {0095-8956}, + CODEN = {JCBTB8}, + MRCLASS = {05C30 (05A16 05C40 05C80)}, + MRNUMBER = {MR2117934 (2005m:05117)}, +MRREVIEWER = {Edward A. Bender}, +} diff --git a/vldb07/relatedwork.tex b/vldb07/relatedwork.tex new file mode 100755 index 0000000..7693002 --- /dev/null +++ b/vldb07/relatedwork.tex @@ -0,0 +1,112 @@ +% Time-stamp: +\vspace{-3mm} +\section{Related work} +\label{sec:relatedprevious-work} +\vspace{-2mm} + +% Optimal speed for hashing means that each key from the key set $S$ +% will map to an unique location in the hash table, avoiding time wasted +% in resolving collisions. That is achieved with a MPHF and +% because of that many algorithms for constructing static +% and dynamic MPHFs, when static or dynamic sets are involved, +% were developed. Our focus has been on static MPHFs, since +% in many applications the key sets change slowly, if at all~\cite{s05}. + +\enlargethispage{2\baselineskip} +Czech, Havas and Majewski~\cite{chm97} provide a +comprehensive survey of the most important theoretical and practical results +on perfect hashing. +In this section we review some of the most important results. +%We also present more recent algorithms that share some features with +%the one presented hereinafter. + +Fredman, Koml\'os and Szemer\'edi~\cite{FKS84} showed that it is possible to +construct space efficient perfect hash functions that can be evaluated in +constant time with table sizes that are linear in the number of keys: +$m=O(n)$. In their model of computation, an element of the universe~$U$ fits +into one machine word, and arithmetic operations and memory accesses have unit +cost. Randomized algorithms in the FKS model can construct a perfect hash +function in expected time~$O(n)$: +this is the case of our algorithm and the works in~\cite{chm92,p99}. + +Mehlhorn~\cite{m84} showed +that at least $\Omega((1/\ln 2)n + \ln\ln u)$ bits are +required to represent a MPHF (i.e, at least 1.4427 bits per +key must be stored). +To the best of our knowledge our algorithm +is the first one capable of generating MPHFs for sets in the order +of billion of keys, and the generated functions +require less than 9 bits per key to be stored. +This increases one order of magnitude in the size of the greatest +key set for which a MPHF was obtained in the literature~\cite{bkz05}. +%which is close to the lower bound presented in~\cite{m84}. + +Some work on minimal perfect hashing has been done under the assumption that +the algorithm can pick and store truly random functions~\cite{bkz05,chm92,p99}. +Since the space requirements for truly random functions makes them unsuitable for +implementation, one has to settle for pseudo-random functions in practice. +Empirical studies show that limited randomness properties are often as good as +total randomness. +We could verify that phenomenon in our experiments by using the universal hash +function proposed by Jenkins~\cite{j97}, which is +time efficient at retrieval time and requires just an integer to be used as a +random seed (the function is completely determined by the seed). +% Os trabalhos~\cite{asw00,swz00} apresentam algoritmos para construir +% FHPs e FHPMs deterministicamente. +% As fun\c{c}\~oes geradas necessitam de $O(n \log(n) + \log(\log(u)))$ bits para serem descritas. +% A complexidade de caso m\'edio dos algoritmos para gerar as fun\c{c}\~oes \'e +% $O(n\log(n) \log( \log (u)))$ e a de pior caso \'e $O(n^3\log(n) \log(\log(u)))$. +% A complexidade de avalia\c{c}\~ao das fun\c{c}\~oes \'e $O(\log(n) + \log(\log(u)))$. +% Assim, os algoritmos n\~ao geram fun\c{c}\~oes que podem ser avaliadas com complexidade +% de tempo $O(1)$, est\~ao distantes a um fator de $\log n$ da complexidade \'otima para descrever +% FHPs e FHPMs (Mehlhorn mostra em~\cite{m84} +% que para armazenar uma FHP s\~ao necess\'arios no m\'{\i}nimo +% $\Omega(n^2/(2\ln 2) m + \log\log u)$ bits), e n\~ao geram as +% fun\c{c}\~oes com complexidade linear. +% Al\'em disso, o universo $U$ das chaves \'e restrito a n\'umeros inteiros, o que pode +% limitar a utiliza\c{c}\~ao na pr\'atica. + +Pagh~\cite{p99} proposed a family of randomized algorithms for +constructing MPHFs +where the form of the resulting function is $h(x) = (f(x) + d[g(x)]) \bmod n$, +where $f$ and $g$ are universal hash functions and $d$ is a set of +displacement values to resolve collisions that are caused by the function $f$. +Pagh identified a set of conditions concerning $f$ and $g$ and showed +that if these conditions are satisfied, then a minimal perfect hash +function can be computed in expected time $O(n)$ and stored in +$(2+\epsilon)n\log_2n$ bits. + +Dietzfelbinger and Hagerup~\cite{dh01} improved~\cite{p99}, +reducing from $(2+\epsilon)n\log_2n$ to $(1+\epsilon)n\log_2n$ the number of bits +required to store the function, but in their approach~$f$ and~$g$ must +be chosen from a class +of hash functions that meet additional requirements. +%Differently from the works in~\cite{dh01, p99}, our algorithm generates a MPHF +%$h$ in expected linear time and $h$ can be stored in $O(n)$ bits (9 bits per key). + +% Galli, Seybold e Simon~\cite{gss01} propuseram um algoritmo r\^andomico +% que gera FHPMs da mesma forma das geradas pelos algoritmos de Pagh~\cite{p99} +% e, Dietzfelbinger e Hagerup~\cite{dh01}. No entanto, eles definiram a forma das +% fun\c{c}\~oes $f(k) = h_c(k) \bmod n$ e $g(k) = \lfloor h_c(k)/n \rfloor$ para obter em tempo esperado $O(n)$ uma fun\c{c}\~ao que pode ser descrita em $O(n\log n)$ bits, onde +% $h_c(k) = (ck \bmod p) \bmod n^2$, $1 \leq c \leq p-1$ e $p$ um primo maior do que $u$. +%Our algorithm is the first one capable of generating MPHFs for sets in the order of +%billion of keys. It happens because we do not need to keep into main memory +%at generation time complex data structures as a graph, lists and so on. We just need to maintain +%a small vector that occupies around 8MB for a set of 1 billion keys. + +Fox et al.~\cite{fch92,fhcd92} studied MPHFs +%that also share features with the ones generated by our algorithm. +that bring down the storage requirements we got to between 2 and 4 bits per key. +However, it is shown in~\cite[Section 6.7]{chm97} that their algorithms have exponential +running times and cannot scale for sets larger than 11 million keys in our +implementation of the algorithm. + +Our previous work~\cite{bkz05} improves the one by Czech, Havas and Majewski~\cite{chm92}. +We obtained more compact functions in less time. Although +the algorithm in~\cite{bkz05} is the fastest algorithm +we know of, the resulting functions are stored in $O(n\log n)$ bits and +one needs to keep in main memory at generation time a random graph of $n$ edges +and $cn$ vertices, +where $c\in[0.93,1.15]$. Using the well known divide to conquer approach +we use that algorithm as a building block for the new one, where the +resulting functions are stored in $O(n)$ bits. diff --git a/vldb07/searching.tex b/vldb07/searching.tex new file mode 100755 index 0000000..8feb6f1 --- /dev/null +++ b/vldb07/searching.tex @@ -0,0 +1,155 @@ +%% Nivio: 22/jan/06 +% Time-stamp: +\vspace{-7mm} +\subsection{Searching step} +\label{sec:searching} + +\enlargethispage{2\baselineskip} +The searching step is responsible for generating a MPHF for each +bucket. +Figure~\ref{fig:searchingstep} presents the searching step algorithm. +\vspace{-2mm} +\begin{figure}[h] +%\centering +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $\blacktriangleright$ Let $H$ be a minimum heap of size $N$, where the \\ +\> ~~ order relation in $H$ is given by Eq.~(\ref{eq:bucketindex}), that is, the\\ +\> ~~ remove operation removes the item with smallest $i$\\ +\> $1.$ {\bf for} $j = 1$ {\bf to} $N$ {\bf do} \{ Heap construction \}\\ +\> ~~ $1.1$ Read key $k$ from File $j$ on disk\\ +\> ~~ $1.2$ Insert $(i, j, k)$ in $H$ \\ +\> $2.$ {\bf for} $i = 0$ {\bf to} $\lceil n/b \rceil - 1$ {\bf do} \\ +\> ~~ $2.1$ Read bucket $i$ from disk driven by heap $H$ \\ +\> ~~ $2.2$ Generate a MPHF for bucket $i$ \\ +\> ~~ $2.3$ Write the description of MPHF$_i$ to the disk +\end{tabbing} +\vspace{-1mm} +\hrule +\hrule +\caption{Searching step} +\label{fig:searchingstep} +\vspace{-4mm} +\end{figure} + +Statement 1 of Figure~\ref{fig:searchingstep} inserts one key from each file +in a minimum heap $H$ of size $N$. +The order relation in $H$ is given by the bucket address $i$ given by +Eq.~(\ref{eq:bucketindex}). + +%\enlargethispage{-\baselineskip} +Statement 2 has two important steps. +In statement 2.1, a bucket is read from disk, +as described below. +%in Section~\ref{sec:readingbucket}. +In statement 2.2, a MPHF is generated for each bucket $i$, as described +in the following. +%in Section~\ref{sec:mphfbucket}. +The description of MPHF$_i$ is a vector $g_i$ of 8-bit integers. +Finally, statement 2.3 writes the description $g_i$ of MPHF$_i$ to disk. + +\vspace{-3mm} +\label{sec:readingbucket} +\subsubsection{Reading a bucket from disk.} + +In this section we present the refinement of statement 2.1 of +Figure~\ref{fig:searchingstep}. +The algorithm to read bucket $i$ from disk is presented +in Figure~\ref{fig:readingbucket}. + +\begin{figure}[h] +\hrule +\hrule +\vspace{2mm} +\begin{tabbing} +aa\=type booleanx \== (false, true); \kill +\> $1.$ {\bf while} bucket $i$ is not full {\bf do} \\ +\> ~~ $1.1$ Remove $(i, j, k)$ from $H$\\ +\> ~~ $1.2$ Insert $k$ into bucket $i$ \\ +\> ~~ $1.3$ Read sequentially all keys $k$ from File $j$ that have \\ +\> ~~~~~~~ the same $i$ and insert them into bucket $i$ \\ +\> ~~ $1.4$ Insert the triple $(i, j, x)$ in $H$, where $x$ is the first \\ +\> ~~~~~~~ key read from File $j$ that does not have the \\ +\> ~~~~~~~ same bucket index $i$ +\end{tabbing} +\hrule +\hrule +\vspace{-1.0mm} +\caption{Reading a bucket} +\vspace{-4.0mm} +\label{fig:readingbucket} +\end{figure} + +Bucket $i$ is distributed among many files and the heap $H$ is used to drive a +multiway merge operation. +In Figure~\ref{fig:readingbucket}, statement 1.1 extracts and removes triple +$(i, j, k)$ from $H$, where $i$ is a minimum value in $H$. +Statement 1.2 inserts key $k$ in bucket $i$. +Notice that the $k$ in the triple $(i, j, k)$ is in fact a pointer to +the first byte of the key that is kept in contiguous positions of an array of characters +(this array containing the keys is initialized during the heap construction +in statement 1 of Figure~\ref{fig:searchingstep}). +Statement 1.3 performs a seek operation in File $j$ on disk for the first +read operation and reads sequentially all keys $k$ that have the same $i$ +%(obtained from Eq.~(\ref{eq:bucketindex})) +and inserts them all in bucket $i$. +Finally, statement 1.4 inserts in $H$ the triple $(i, j, x)$, +where $x$ is the first key read from File $j$ (in statement 1.3) +that does not have the same bucket address as the previous keys. + +The number of seek operations on disk performed in statement 1.3 is discussed +in Section~\ref{sec:linearcomplexity}, +where we present a buffering technique that brings down +the time spent with seeks. + +\vspace{-2mm} +\enlargethispage{2\baselineskip} +\subsubsection{Generating a MPHF for each bucket.} \label{sec:mphfbucket} + +To the best of our knowledge the algorithm we have designed in +our previous work~\cite{bkz05} is the fastest published algorithm for +constructing MPHFs. +That is why we are using that algorithm as a building block for the +algorithm presented here. + +%\enlargethispage{-\baselineskip} +Our previous algorithm is a three-step internal memory based algorithm +that produces a MPHF based on random graphs. +For a set of $n$ keys, the algorithm outputs the resulting MPHF in expected time $O(n)$. +For a given bucket $i$, $0 \leq i < \lceil n/b \rceil$, the corresponding MPHF$_i$ +has the following form: +\begin{eqnarray} + \mathrm{MPHF}_i(k) &=& g_i[a] + g_i[b] \label{eq:mphfi} +\end{eqnarray} +where $a = h_{i1}(k) \bmod t$, $b = h_{i2}(k) \bmod t$ and +$t = c\times \mathit{size}[i]$. The functions +$h_{i1}(k)$ and $h_{i2}(k)$ are the same universal function proposed by Jenkins~\cite{j97} +that was used in the partitioning step described in Section~\ref{sec:partitioning-keys}. + +In order to generate the function above the algorithm involves the generation of simple random graphs +$G_i = (V_i, E_i)$ with~$|V_i|=t=c\times\mathit{size}[i]$ and $|E_i|=\mathit{size}[i]$, with $c \in [0.93, 1.15]$. +To generate a simple random graph with high +probability\footnote{We use the terms `with high probability' +to mean `with probability tending to~$1$ as~$n\to\infty$'.}, two vertices $a$ and $b$ are +computed for each key $k$ in bucket $i$. +Thus, each bucket $i$ has a corresponding graph~$G_i=(V_i,E_i)$, where $V_i=\{0,1, +\ldots,t-1\}$ and $E_i=\big\{\{a,b\}:k \in \mathrm{bucket}\: i\big\}$. +In order to get a simple graph, +the algorithm repeatedly selects $h_{i1}$ and $h_{i2}$ from a family of universal hash functions +until the corresponding graph is simple. +The probability of getting a simple graph is $p=e^{-1/c^2}$. +For $c=1$, this probability is $p \simeq 0.368$, and the expected number of +iterations to obtain a simple graph is~$1/p \simeq 2.72$. + +The construction of MPHF$_i$ ends with a computation of a suitable labelling of the vertices +of~$G_i$. The labelling is stored into vector $g_i$. +We choose~$g_i[v]$ for each~$v\in V_i$ in such +a way that Eq.~(\ref{eq:mphfi}) is a MPHF for bucket $i$. +In order to get the values of each entry of $g_i$ we first +run a breadth-first search on the 2-\textit{core} of $G_i$, i.e., the maximal subgraph +of~$G_i$ with minimal degree at least~$2$ (see, e.g., \cite{b01,jlr00,pw04}) and +a depth-first search on the acyclic part of $G_i$ (see \cite{bkz05} for details). + diff --git a/vldb07/svglov2.clo b/vldb07/svglov2.clo new file mode 100644 index 0000000..d98306e --- /dev/null +++ b/vldb07/svglov2.clo @@ -0,0 +1,77 @@ +% SVJour2 DOCUMENT CLASS OPTION SVGLOV2 -- for standardised journals +% +% This is an enhancement for the LaTeX +% SVJour2 document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\ProvidesFile{svglov2.clo} + [2004/10/25 v2.1 + style option for standardised journals] +\typeout{SVJour Class option: svglov2.clo for standardised journals} +\def\validfor{svjour2} +\ExecuteOptions{final,10pt,runningheads} +% No size changing allowed, hence a copy of size10.clo is included +\renewcommand\normalsize{% + \@setfontsize\normalsize{10.2pt}{4mm}% + \abovedisplayskip=3 mm plus6pt minus 4pt + \belowdisplayskip=3 mm plus6pt minus 4pt + \abovedisplayshortskip=0.0 mm plus6pt + \belowdisplayshortskip=2 mm plus4pt minus 4pt + \let\@listi\@listI} +\normalsize +\newcommand\small{% + \@setfontsize\small{8.7pt}{3.25mm}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 4\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} +\let\footnotesize\small +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14pt}} +\newcommand\Large{\@setfontsize\Large\@xivpt{16dd}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{17dd}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +% +%ALT% \def\runheadhook{\rlap{\smash{\lower5pt\hbox to\textwidth{\hrulefill}}}} +\def\runheadhook{\rlap{\smash{\lower11pt\hbox to\textwidth{\hrulefill}}}} +\AtEndOfClass{\advance\headsep by5pt} +\if@twocolumn +\setlength{\textwidth}{17.6cm} +\setlength{\textheight}{230mm} +\AtEndOfClass{\setlength\columnsep{4mm}} +\else +\setlength{\textwidth}{11.7cm} +\setlength{\textheight}{517.5dd} % 19.46cm +\fi +% +\AtBeginDocument{% +\@ifundefined{@journalname} + {\typeout{Unknown journal: specify \string\journalname\string{% +\string} in preambel^^J}}{}} +% +\endinput +%% +%% End of file `svglov2.clo'. diff --git a/vldb07/svjour2.cls b/vldb07/svjour2.cls new file mode 100644 index 0000000..56d9216 --- /dev/null +++ b/vldb07/svjour2.cls @@ -0,0 +1,1419 @@ +% SVJour2 DOCUMENT CLASS -- version 2.8 for LaTeX2e +% +% LaTeX document class for Springer journals +% +%% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{svjour2}[2005/08/29 v2.8 +^^JLaTeX document class for Springer journals] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{fleqn}{\input{fleqn.clo}\AtBeginDocument{\mathindent\z@}} +\DeclareOption{twocolumn}{\@twocolumntrue\ExecuteOptions{fleqn}} +\newif\if@avier\@avierfalse +\DeclareOption{onecollarge}{\@aviertrue} +\let\if@mathematic\iftrue +\let\if@numbook\iffalse +\DeclareOption{numbook}{\let\if@envcntsect\iftrue + \AtEndOfPackage{% + \renewcommand\thefigure{\thesection.\@arabic\c@figure}% + \renewcommand\thetable{\thesection.\@arabic\c@table}% + \renewcommand\theequation{\thesection.\@arabic\c@equation}% + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{equation}{section}% + }% +} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\DeclareOption{natbib}{% +\AtEndOfClass{\RequirePackage{natbib}% +% Changing some parameters of NATBIB +\setlength{\bibhang}{\parindent}% +%\setlength{\bibsep}{0mm}% +\let\bibfont=\small +\def\@biblabel#1{#1.}% +\newcommand{\etal}{et al.}% +\bibpunct{(}{)}{;}{a}{}{,}}} +% +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} +\let\if@smartrunh\iffalse +\DeclareOption{smartrunhead}{\let\if@smartrunh\iftrue} +\DeclareOption{nosmartrunhead}{\let\if@smartrunh\iffalse} +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@referee\iffalse +\DeclareOption{referee}{\let\if@referee\iftrue} +\def\makereferee{\def\baselinestretch{2}} +\let\if@instindent\iffalse +\DeclareOption{instindent}{\let\if@instindent\iftrue} +\let\if@smartand\iffalse +\DeclareOption{smartand}{\let\if@smartand\iftrue} +\let\if@spthms\iftrue +\DeclareOption{nospthms}{\let\if@spthms\iffalse} +% +% language and babel dependencies +\DeclareOption{deutsch}{\def\switcht@@therlang{\switcht@deutsch}% +\gdef\svlanginfo{\typeout{Man spricht deutsch.}\global\let\svlanginfo\relax}} +\DeclareOption{francais}{\def\switcht@@therlang{\switcht@francais}% +\gdef\svlanginfo{\typeout{On parle francais.}\global\let\svlanginfo\relax}} +\let\switcht@@therlang\relax +\let\svlanginfo\relax +% +\AtBeginDocument{\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasUKenglish}{}{\addto\extrasUKenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +% +\def\ClassInfoNoLine#1#2{% + \ClassInfo{#1}{#2\@gobble}% +} +\let\journalopt\@empty +\DeclareOption*{% +\InputIfFileExists{sv\CurrentOption.clo}{% +\global\let\journalopt\CurrentOption}{% +\ClassWarning{Springer-SVJour2}{Specified option or subpackage +"\CurrentOption" not found -}\OptionNotUsed}} +\ExecuteOptions{a4paper,twoside,10pt,instindent} +\ProcessOptions +% +\ifx\journalopt\@empty\relax +\ClassInfoNoLine{Springer-SVJour2}{extra/valid Springer sub-package (-> *.clo) +\MessageBreak not found in option list of \string\documentclass +\MessageBreak - autoactivating "global" style}{} +\input{svglov2.clo} +\else +\@ifundefined{validfor}{% +\ClassError{Springer-SVJour2}{Possible option clash for sub-package +\MessageBreak "sv\journalopt.clo" - option file not valid +\MessageBreak for this class}{Perhaps you used an option of the old +Springer class SVJour!} +}{} +\fi +% +\if@smartrunh\AtEndDocument{\islastpageeven\getlastpagenumber}\fi +% +\newcommand{\twocoltest}[2]{\if@twocolumn\def\@gtempa{#2}\else\def\@gtempa{#1}\fi +\@gtempa\makeatother} +\newcommand{\columncase}{\makeatletter\twocoltest} +% +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} +% +\setlength\parindent{15\p@} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +\setlength\headheight{12\p@} +\setlength\headsep {16.74dd} +\setlength\topskip {10\p@} +\setlength\footskip{30\p@} +\setlength\maxdepth{.5\topskip} +% +\@settopoint\textwidth +\setlength\marginparsep {10\p@} +\setlength\marginparpush{5\p@} +\setlength\topmargin{-10pt} +\if@twocolumn + \setlength\oddsidemargin {-30\p@} + \setlength\evensidemargin{-30\p@} +\else + \setlength\oddsidemargin {\z@} + \setlength\evensidemargin{\z@} +\fi +\setlength\marginparwidth {48\p@} +\setlength\footnotesep{8\p@} +\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {20\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\@fptop{0\p@} +\setlength\@fpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@fpbot{0\p@ \@plus 1fil} +\setlength\@dblfptop{0\p@} +\setlength\@dblfpsep{12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 6\p@ \@plus2\p@ \@minus4\p@ + \itemsep\parsep} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \topsep + \itemsep \parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{4} +\renewcommand\topfraction{.9} +\setcounter{bottomnumber}{2} +\renewcommand\bottomfraction{.7} +\setcounter{totalnumber}{6} +\renewcommand\textfraction{.1} +\renewcommand\floatpagefraction{.85} +\setcounter{dbltopnumber}{3} +\renewcommand\dbltopfraction{.85} +\renewcommand\dblfloatpagefraction{.85} +\def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\small\csname runheadhook\endcsname + \rlap{\thepage}\hfil\leftmark\unskip}% + \def\@oddhead{\small\csname runheadhook\endcsname + \ignorespaces\rightmark\hfil\llap{\thepage}}% + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + } +% make indentations changeable +\def\setitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmargini\labelwidth + \advance\leftmargini\labelsep + \def\@listi{\leftmargin\leftmargini + \labelwidth\leftmargini\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\medskipamount + \itemsep=\parskip \advance\itemsep by -\parsep}} +\def\setitemitemindent#1{\settowidth{\labelwidth}{#1}% + \leftmarginii\labelwidth + \advance\leftmarginii\labelsep +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth by -\labelsep + \parsep=\parskip + \topsep=\z@ + \itemsep=\parskip \advance\itemsep by -\parsep}} +% labels of description +\def\descriptionlabel#1{\hspace\labelsep #1\hfil} +% adjusted environment "description" +% if an optional parameter (at the first two levels of lists) +% is present, its width is considered to be the widest mark +% throughout the current list. +\def\description{\@ifnextchar[{\@describe}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin \let\makelabel\descriptionlabel}}} +\let\enddescription\endlist +% +\def\describelabel#1{#1\hfil} +\def\@describe[#1]{\relax\ifnum\@listdepth=0 +\setitemindent{#1}\else\ifnum\@listdepth=1 +\setitemitemindent{#1}\fi\fi +\list{--}{\let\makelabel\describelabel}} +% +\newdimen\logodepth +\logodepth=1.2cm +\newdimen\headerboxheight +\headerboxheight=180pt % 18 10.5dd-lines - 2\baselineskip +\advance\headerboxheight by-14.5mm +\newdimen\betweenumberspace % dimension for space between +\betweenumberspace=3.33pt % number and text of titles. +\newdimen\aftertext % dimension for space after +\aftertext=5pt % text of title. +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. +\if@mathematic + \def\runinend{} % \enspace} + \def\floatcounterend{\enspace} + \def\sectcounterend{} +\else + \def\runinend{.} + \def\floatcounterend{.\ } + \def\sectcounterend{.} +\fi +\def\email#1{\emailname: #1} +\def\keywords#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\keywordname\enspace\ignorespaces#1\par}} +% +\def\subclassname{{\bfseries Mathematics Subject Classification +(2000)}\enspace} +\def\subclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\subclassname\ignorespaces#1\par}} +% +\def\PACSname{\textbf{PACS}\enspace} +\def\PACS#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\PACSname\ignorespaces#1\par}} +% +\def\CRclassname{{\bfseries CR Subject Classification}\enspace} +\def\CRclass#1{\par\addvspace\medskipamount{\rightskip=0pt plus1cm +\def\and{\ifhmode\unskip\nobreak\fi\ $\cdot$ +}\noindent\CRclassname\ignorespaces#1\par}} +% +\def\ESMname{\textbf{Electronic Supplementary Material}\enspace} +\def\ESM#1{\par\addvspace\medskipamount +\noindent\ESMname\ignorespaces#1\par} +% +\newcounter{inst} +\newcounter{auth} +\def\authdepth{2} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newbox\titrun +\newtoks\titlerunning +\def\authorfont{\bfseries} + +\def\combirunning#1{\gdef\@combi{#1}} +\def\@combi{} +\newbox\combirun +% +\def\ps@last{\def\@evenhead{\small\rlap{\thepage}\hfil +\lastevenhead}} +\newcounter{lastpage} +\def\islastpageeven{\@ifundefined{lastpagenumber} +{\setcounter{lastpage}{0}}{\setcounter{lastpage}{\lastpagenumber}} +\ifnum\value{lastpage}>0 + \ifodd\value{lastpage}% + \else + \if@smartrunh + \thispagestyle{last}% + \fi + \fi +\fi} +\def\getlastpagenumber{\clearpage +\addtocounter{page}{-1}% + \immediate\write\@auxout{\string\gdef\string\lastpagenumber{\thepage}}% + \immediate\write\@auxout{\string\newlabel{LastPage}{{}{\thepage}}}% + \addtocounter{page}{1}} + +\def\journalname#1{\gdef\@journalname{#1}} + +\def\dedication#1{\gdef\@dedic{#1}} +\def\@dedic{} + +\let\@date\undefined +\def\notused{~} + +\def\institute#1{\gdef\@institute{#1}} + +\def\offprints#1{\begingroup +\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks +\protect\footnotetext[0]{\unskip\hskip-15pt{\itshape Send offprint requests +to\/}: \ignorespaces#1}}\endgroup\ignorespaces} + +%\def\mail#1{\gdef\@mail{#1}} +%\def\@mail{} + +\def\@thanks{} + +\def\@fnsymbol#1{\ifcase#1\or\star\or{\star\star}\or{\star\star\star}% + \or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi\relax} +% +%\def\invthanks#1{\footnotetext[0]{\kern-\bibindent#1}} +% +\def\nothanksmarks{\def\thanks##1{\protected@xdef\@thanks{\@thanks + \protect\footnotetext[0]{\kern-\bibindent##1}}}} +% +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\@subtitle{} + +\def\headnote#1{\gdef\@headnote{#1}} +\def\@headnote{} + +\def\papertype#1{\gdef\paper@type{\MakeUppercase{#1}}} +\def\paper@type{} + +\def\ch@ckobl#1#2{\@ifundefined{@#1} + {\typeout{SVJour2 warning: Missing +\expandafter\string\csname#1\endcsname}% + \csname #1\endcsname{#2}} + {}} +% +\def\ProcessRunnHead{% + \def\\{\unskip\ \ignorespaces}% + \def\thanks##1{\unskip{}}% + \instindent=\textwidth + \advance\instindent by-\headlineindent + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rmfamily\unboldmath\ignorespaces\@title + \unskip}% + \ifdim\wd\titrun>\instindent + \typeout{^^JSVJour2 Warning: Title too long for running head.}% + \typeout{Please supply a shorter form with \string\titlerunning + \space prior to \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rmfamily + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% +% + \if!\the\authorrunning! + \else + \setcounter{auth}{1}% + \edef\@author{\the\authorrunning}% + \fi + \ifnum\value{inst}>\authdepth + \def\stripauthor##1\and##2\endauthor{% + \protected@xdef\@author{##1\unskip\unskip\if!##2!\else\ et al.\fi}}% + \expandafter\stripauthor\@author\and\endauthor + \else + \gdef\and{\unskip, \ignorespaces}% + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\@author{\@author}} + \fi + \global\setbox\authrun=\hbox{\small\rmfamily\unboldmath\ignorespaces + \@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{^^JSVJour2 Warning: Author name(s) too long for running head. + ^^JPlease supply a shorter form with \string\authorrunning + \space prior to \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rmfamily Please give a shorter version + with: {\tt\string\authorrunning\space and + \string\titlerunning\space prior to \string\maketitle}}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% +} +% +\let\orithanks=\thanks +\def\thanks#1{\ClassWarning{SVJour2}{\string\thanks\space may only be +used inside of \string\title, \string\author,\MessageBreak +and \string\date\space prior to \string\maketitle}} +% +\def\maketitle{\par\let\thanks=\orithanks +\ch@ckobl{journalname}{Noname} +\ch@ckobl{date}{the date of receipt and acceptance should be inserted +later} +\ch@ckobl{title}{A title should be given} +\ch@ckobl{author}{Name(s) and initial(s) of author(s) should be given} +\ch@ckobl{institute}{Address(es) of author(s) should be given} +\begingroup +% + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{$^{\@thefnmark}$}% + \renewcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}##1\vrule height0pt + width0pt depth8pt} +% + \def\lastand{\ifnum\value{inst}=2\relax + \unskip{} \andname\ + \else + \unskip, \andname\ + \fi}% + \def\and{\stepcounter{auth}\relax + \if@smartand + \ifnum\value{auth}=\value{inst}% + \lastand + \else + \unskip, + \fi + \else + \unskip, + \fi}% + \thispagestyle{empty} + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi +% + \global\@topnum\z@ + \if!\@thanks!\else + \@thanks +\insert\footins{\vskip-3pt\hrule width\columnwidth\vskip3pt}% + \fi + {\def\thanks##1{\unskip{}}% + \def\iand{\\[5pt]\let\and=\nand}% + \def\nand{\ifhmode\unskip\nobreak\fi\ $\cdot$ }% + \let\and=\nand + \def\at{\\\let\and=\iand}% + \footnotetext[0]{\kern-\bibindent + \ignorespaces\@institute}\vspace{5dd}}% +%\if!\@mail!\else +% \footnotetext[0]{\kern-\bibindent\mailname\ +% \ignorespaces\@mail}% +%\fi +% + \if@runhead + \ProcessRunnHead + \fi +% + \endgroup + \setcounter{footnote}{0} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\@subtitle\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax} + +\def\makeheadbox{{% +\hbox to0pt{\vbox{\baselineskip=10dd\hrule\hbox +to\hsize{\vrule\kern3pt\vbox{\kern3pt +\hbox{\bfseries\@journalname\ manuscript No.} +\hbox{(will be inserted by the editor)} +\kern3pt}\hfil\kern3pt\vrule}\hrule}% +\hss}}} +% +\def\rubric{\setbox0=\hbox{\small\strut}\@tempdima=\ht0\advance +\@tempdima\dp0\advance\@tempdima2\fboxsep\vrule\@height\@tempdima +\@width\z@} +\newdimen\rubricwidth +% +\def\@maketitle{\newpage +\normalfont +\vbox to0pt{\if@twocolumn\vskip-39pt\else\vskip-49pt\fi +\nointerlineskip +\makeheadbox\vss}\nointerlineskip +\vbox to 0pt{\offinterlineskip\rubricwidth=\columnwidth +\vskip-12.5pt +\if@twocolumn\else % one column journal + \divide\rubricwidth by144\multiply\rubricwidth by89 % perform golden section + \vskip-\topskip +\fi +\hrule\@height0.35mm\noindent +\advance\fboxsep by.25mm +\global\advance\rubricwidth by0pt +\rubric +\vss}\vskip19.5pt +% +\if@twocolumn\else + \gdef\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth %rubricwidth + \kern2.6\p@} +\fi +% + \setbox\authrun=\vbox\bgroup + \hrule\@height 9mm\@width0\p@ + \pretolerance=10000 + \rightskip=0pt plus 4cm + \nothanksmarks +% \if!\@headnote!\else +% \noindent +% {\LARGE\normalfont\itshape\ignorespaces\@headnote\par}\vskip 3.5mm +% \fi + {\authorfont + \setbox0=\vbox{\setcounter{auth}{1}\def\and{\stepcounter{auth} }% + \hfuzz=2\textwidth\def\thanks##1{}\@author}% + \setcounter{footnote}{0}% + \global\value{inst}=\value{auth}% + \setcounter{auth}{1}% + \if@twocolumn + \rightskip43mm plus 4cm minus 3mm + \else % one column journal + \rightskip=\linewidth + \advance\rightskip by-\rubricwidth + \advance\rightskip by0pt plus 4cm minus 3mm + \fi +% +\def\and{\unskip\nobreak\enskip{\boldmath$\cdot$}\enskip\ignorespaces}% + \noindent\ignorespaces\@author\vskip7.23pt} + {\LARGE\bfseries + \noindent\ignorespaces + \@title \par}\vskip 11.24pt\relax + \if!\@subtitle!\else + {\large\bfseries + \pretolerance=10000 + \rightskip=0pt plus 3cm + \vskip-5pt + \noindent\ignorespaces\@subtitle \par}\vskip 11.24pt + \fi + \small + \if!\@dedic!\else + \par + \normalsize\it + \addvspace\baselineskip + \noindent\@dedic + \fi + \egroup % end of header box + \@tempdima=\headerboxheight + \advance\@tempdima by-\ht\authrun + \unvbox\authrun + \ifdim\@tempdima>0pt + \vrule width0pt height\@tempdima\par + \fi + \noindent{\small\@date\vskip 6.2mm} + \global\@minipagetrue + \global\everypar{\global\@minipagefalse\global\everypar{}}% +%\vskip22.47pt +} +% +\if@mathematic + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle\mathbf{#1}$}} + {\mbox{\boldmath$\textstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}} + {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}} +\else + \def\vec#1{\ensuremath{\mathchoice + {\mbox{\boldmath$\displaystyle#1$}} + {\mbox{\boldmath$\textstyle#1$}} + {\mbox{\boldmath$\scriptstyle#1$}} + {\mbox{\boldmath$\scriptscriptstyle#1$}}}} +\fi +% +\def\tens#1{\ensuremath{\mathsf{#1}}} +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% +\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}% + \hangindent \z@\noindent\box\@tempboxa} +% +\def\@seccntformat#1{\csname the#1\endcsname\sectcounterend +\hskip\betweenumberspace} +% +\newif\if@sectrule +\if@twocolumn\else\let\@sectruletrue=\relax\fi +\if@avier\let\@sectruletrue=\relax\fi +\def\makesectrule{\if@sectrule\global\@sectrulefalse\null\vglue-\topskip +\hrule\nobreak\parskip=5pt\relax\fi} +% +\let\makesectruleori=\makesectrule +\def\restoresectrule{\global\let\makesectrule=\makesectruleori\global\@sectrulefalse} +\def\nosectrule{\let\makesectrule=\restoresectrule} +% +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \ifnum#2=1\relax\@sectruletrue\fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{\makesectrule + \@hangfrom{\hskip #3\relax\@svsec}% + \raggedright + \hyphenpenalty \@M% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname\sectcounterend}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8\/\hskip\aftertext}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + #4{\makesectrule + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} + +% +% measures and setting of sections +% +\def\section{\@startsection{section}{1}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\bfseries\boldmath}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-21dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\upshape}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-13dd plus-8pt minus-4pt}{10.5dd} + {\normalsize\itshape}} +\def\paragraph{\@startsection{paragraph}{4}{\z@}% + {-13pt plus-8pt minus-4pt}{\z@}{\normalsize\itshape}} + +\setlength\leftmargini {\parindent} +\leftmargin \leftmargini +\setlength\leftmarginii {\parindent} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {.5em} +\setlength\leftmarginvi {.5em} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\normalfont\bfseries --} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\bullet$} +\newcommand\labelitemiv{$\m@th\cdot$} + +\if@spthms +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{} +\newcommand\nocaption{\noexpand\@gobble} +\newdimen\spthmsep \spthmsep=5pt + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\labelsep=\spthmsep\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\normalthmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##1\ ##2\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4(##3)\@thmcounterend\ }##5}} +\normalthmheadings + +\def\reversethmheadings{\def\@spbegintheorem##1##2##3##4{\trivlist\normalfont + \item[\hskip\labelsep{##3##2\ ##1\@thmcounterend}]##4} +\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##2\ ##1}]{##4(##3)\@thmcounterend\ }##5}} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +% initialize theorem environment + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % all environments like "Theorem" - using its counter + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % all environments with their own counter + \if@envcntsect % show section counter + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % not numbered with section + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \let\spn@wtheorem=\@spynthm + \fi + \fi +\fi +% +\let\spdefaulttheorem=\spn@wtheorem +% +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\rmfamily} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\bfseries}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\bfseries}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\bfseries}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} +% +\newenvironment{theopargself} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}}{} +\newenvironment{theopargself*} + {\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{\hspace*{-\labelsep}##4##3\@thmcounterend}##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{\hspace*{-\labelsep}##3##2\@thmcounterend}}}{} +% +\fi + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\else\unskip\quad\fi\squareforqed} +\def\smartqed{\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}} + +% Define `abstract' environment +\def\abstract{\topsep=0pt\partopsep=0pt\parsep=0pt\itemsep=0pt\relax +\trivlist\item[\hskip\labelsep +{\bfseries\abstractname}]\if!\abstractname!\hskip-\labelsep\fi} +\if@twocolumn + \if@avier + \def\endabstract{\endtrivlist\addvspace{5mm}\strich} + \def\strich{\hrule\vskip1ptplus12pt} + \else + \def\endabstract{\endtrivlist\addvspace{3mm}} + \fi +\else +\fi +% +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\newcommand\appendix{\par\small + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \renewcommand\thesection{\@Alph\c@section}} +\setlength\arraycolsep{1.5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\@arabic\c@equation} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +% +\newcommand{\tableheadseprule}{\noalign{\hrule height.375mm}} +% +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\newcommand\leftlegendglue{} + +\def\fig@type{figure} + +\newdimen\figcapgap\figcapgap=3pt +\newdimen\tabcapgap\tabcapgap=5.5pt + +\@ifundefined{floatlegendstyle}{\def\floatlegendstyle{\bfseries}}{} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +\def\capstrut{\vrule\@width\z@\@height\topskip} + +\@ifundefined{captionstyle}{\def\captionstyle{\normalfont\small}}{} + +\long\def\@makecaption#1#2{% + \captionstyle + \ifx\@captype\fig@type + \vskip\figcapgap + \fi + \setbox\@tempboxa\hbox{{\floatlegendstyle #1\floatcounterend}% + \capstrut #2}% + \ifdim \wd\@tempboxa >\hsize + {\floatlegendstyle #1\floatcounterend}\capstrut #2\par + \else + \hbox to\hsize{\leftlegendglue\unhbox\@tempboxa\hfil}% + \fi + \ifx\@captype\fig@type\else + \vskip\tabcapgap + \fi} + +\newdimen\figgap\figgap=1cc +\long\def\@makesidecaption#1#2{% + \parbox[b]{\@tempdimb}{\captionstyle{\floatlegendstyle + #1\floatcounterend}#2}} +\def\sidecaption#1\caption{% +\setbox\@tempboxa=\hbox{#1\unskip}% +\if@twocolumn + \ifdim\hsize<\textwidth\else + \ifdim\wd\@tempboxa<\columnwidth + \typeout{Double column float fits into single column - + ^^Jyou'd better switch the environment. }% + \fi + \fi +\fi +\@tempdimb=\hsize +\advance\@tempdimb by-\figgap +\advance\@tempdimb by-\wd\@tempboxa +\ifdim\@tempdimb<3cm + \typeout{\string\sidecaption: No sufficient room for the legend; + using normal \string\caption. }% + \unhbox\@tempboxa + \let\@capcommand=\@caption +\else + \let\@capcommand=\@sidecaption + \leavevmode + \unhbox\@tempboxa + \hfill +\fi +\refstepcounter\@captype +\@dblarg{\@capcommand\@captype}} + +\long\def\@sidecaption#1[#2]#3{\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makesidecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% Define `acknowledgement' environment +\def\acknowledgement{\par\addvspace{17pt}\small\rmfamily +\trivlist\if!\ackname!\item[]\else +\item[\hskip\labelsep +{\bfseries\ackname}]\fi} +\def\endacknowledgement{\endtrivlist\addvspace{6pt}} +\newenvironment{acknowledgements}{\begin{acknowledgement}} +{\end{acknowledgement}} +% Define `noteadd' environment +\def\noteadd{\par\addvspace{17pt}\small\rmfamily +\trivlist\item[\hskip\labelsep +{\itshape\noteaddname}]} +\def\endnoteadd{\endtrivlist\addvspace{6pt}} + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{1} +\newcommand\tableofcontents{% + \section*{\contentsname}% + \@starttoc{toc}% + \addtocontents{toc}{\begingroup\protect\small}% + \AtEndDocument{\addtocontents{toc}{\endgroup}}% + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \fi + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{0pt}{1.5em}} +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}% + {\listfigurename}}% + \@starttoc{lof}% + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{\parindent} +\def\@biblabel#1{#1.} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newenvironment{thebibliography}[1] + {\section*{\refname + \@mkboth{\refname}{\refname}}\small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,\hskip0.1em\ignorespaces}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\hskip0.1em\ignorespaces}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +% +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + +\if@twocolumn + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width\columnwidth + \kern2.6\p@} +\else + \renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.382\columnwidth + \kern2.6\p@} +\fi +\newcommand\@makefntext[1]{% + \noindent + \hb@xt@\bibindent{\hss\@makefnmark\enspace}#1} +% +\def\trans@english{\switcht@albion} +\def\trans@french{\switcht@francais} +\def\trans@german{\switcht@deutsch} +\newenvironment{translation}[1]{\if!#1!\else +\@ifundefined{selectlanguage}{\csname trans@#1\endcsname}{\selectlanguage{#1}}% +\fi}{} +% languages +% English section +\def\switcht@albion{%\typeout{English spoken.}% + \def\abstractname{Abstract}% + \def\ackname{Acknowledgements}% + \def\andname{and}% + \def\lastandname{, and}% + \def\appendixname{Appendix}% + \def\chaptername{Chapter}% + \def\claimname{Claim}% + \def\conjecturename{Conjecture}% + \def\contentsname{Contents}% + \def\corollaryname{Corollary}% + \def\definitionname{Definition}% + \def\emailname{E-mail}% + \def\examplename{Example}% + \def\exercisename{Exercise}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Keywords}}% + \def\indexname{Index}% + \def\lemmaname{Lemma}% + \def\contriblistname{List of Contributors}% + \def\listfigurename{List of Figures}% + \def\listtablename{List of Tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note added in proof}% + \def\notename{Note}% + \def\partname{Part}% + \def\problemname{Problem}% + \def\proofname{Proof}% + \def\propertyname{Property}% + \def\questionname{Question}% + \def\refname{References}% + \def\remarkname{Remark}% + \def\seename{see}% + \def\solutionname{Solution}% + \def\tablename{Table}% + \def\theoremname{Theorem}% +}\switcht@albion % make English default +% +% French section +\def\switcht@francais{\svlanginfo +%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e\runinend}% + \def\ackname{Remerciements\runinend}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice}% + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\emailname{E-mail}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bfseries Mots-cl\'e\runinend}}% + \def\indexname{Index}% + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs}% + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\refname{Bibliographie}% + \def\remarkname{Remarque}% + \def\seename{voyez}% + \def\solutionname{Solution}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{\svlanginfo +%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung\runinend}% + \def\ackname{Danksagung\runinend}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\emailname{E-Mail}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bfseries Schl\"usselw\"orter\runinend}}% + \def\indexname{Index}% +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter}% + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\itshape Correspondence to\/}:}% + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\refname{Literatur}% + \def\remarkname{Anmerkung}% + \def\seename{siehe}% + \def\solutionname{L\"osung}% +%\def\subclassname{{\it Subject Classifications\/}:}% + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} +\newcommand\today{} +\edef\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{1.5cc} +\setlength\columnseprule{0\p@} +% +\frenchspacing +\clubpenalty=10000 +\widowpenalty=10000 +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twocolumn + \twocolumn +\fi +\if@avier + \onecolumn + \setlength{\textwidth}{156mm} + \setlength{\textheight}{226mm} +\fi +\if@referee + \makereferee +\fi +\flushbottom +\endinput +%% +%% End of file `svjour2.cls'. diff --git a/vldb07/terminology.tex b/vldb07/terminology.tex new file mode 100755 index 0000000..fd2cf1d --- /dev/null +++ b/vldb07/terminology.tex @@ -0,0 +1,18 @@ +% Time-stamp: +\vspace{-3mm} +\section{Notation and terminology} +\vspace{-2mm} +\label{sec:notation} + +\enlargethispage{2\baselineskip} +The essential notation and terminology used throughout this paper are as follows. +\begin{itemize} +\item $U$: key universe. $|U| = u$. +\item $S$: actual static key set. $S \subset U$, $|S| = n \ll u$. +\item $h: U \to M$ is a hash function that maps keys from a universe $U$ into +a given range $M = \{0,1,\dots,m-1\}$ of integer numbers. +\item $h$ is a perfect hash function if it is one-to-one on~$S$, i.e., if + $h(k_1) \not = h(k_2)$ for all $k_1 \not = k_2$ from $S$. +\item $h$ is a minimal perfect hash function (MPHF) if it is one-to-one on~$S$ + and $n=m$. +\end{itemize} diff --git a/vldb07/thealgorithm.tex b/vldb07/thealgorithm.tex new file mode 100755 index 0000000..1fb256f --- /dev/null +++ b/vldb07/thealgorithm.tex @@ -0,0 +1,78 @@ +%% Nivio: 13/jan/06, 21/jan/06 29/jan/06 +% Time-stamp: +\vspace{-3mm} +\section{The algorithm} +\label{sec:new-algorithm} +\vspace{-2mm} + +\enlargethispage{2\baselineskip} +The main idea supporting our algorithm is the classical divide and conquer technique. +The algorithm is a two-step external memory based algorithm +that generates a MPHF $h$ for a set $S$ of $n$ keys. +Figure~\ref{fig:new-algo-main-steps} illustrates the two steps of the +algorithm: the partitioning step and the searching step. + +\vspace{-2mm} +\begin{figure}[ht] +\centering +\begin{picture}(0,0)% +\includegraphics{figs/brz.ps}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(3704,2091)(1426,-5161) +\put(2570,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2782,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(2996,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}2}}}} +\put(4060,-4006){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Buckets}}}} +\put(3776,-4301){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}${\lceil n/b\rceil - 1}$}}}} +\put(4563,-3329){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Key Set $S$}}}} +\put(2009,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2221,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4315,-3160){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(1992,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}0}}}} +\put(2204,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}1}}}} +\put(4298,-5146){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}n-1}}}} +\put(4546,-4977){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Hash Table}}}} +\put(1441,-3616){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Partitioning}}}} +\put(1441,-4426){\makebox(0,0)[lb]{\smash{{\SetFigFont{7}{8.4}{\familydefault}{\mddefault}{\updefault}Searching}}}} +\put(1981,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_0$}}}} +\put(2521,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_1$}}}} +\put(3016,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_2$}}}} +\put(3826,-4786){\makebox(0,0)[lb]{\smash{{\SetFigFont{5}{6.0}{\familydefault}{\mddefault}{\updefault}MPHF$_{\lceil n/b \rceil - 1}$}}}} +\end{picture}% +\vspace{-1mm} +\caption{Main steps of our algorithm} +\label{fig:new-algo-main-steps} +\vspace{-3mm} +\end{figure} + +The partitioning step takes a key set $S$ and uses a universal hash function +$h_0$ proposed by Jenkins~\cite{j97} +%for each key $k \in S$ of length $|k|$ +to transform each key~$k\in S$ into an integer~$h_0(k)$. +Reducing~$h_0(k)$ modulo~$\lceil n/b\rceil$, we partition~$S$ into $\lceil n/b +\rceil$ buckets containing at most 256 keys in each bucket (with high +probability). + +The searching step generates a MPHF$_i$ for each bucket $i$, +$0 \leq i < \lceil n/b \rceil$. +The resulting MPHF $h(k)$, $k \in S$, is given by +\begin{eqnarray}\label{eq:mphf} +h(k) = \mathrm{MPHF}_i (k) + \mathit{offset}[i], +\end{eqnarray} +where~$i=h_0(k)\bmod\lceil n/b\rceil$. +The $i$th entry~$\mathit{offset}[i]$ of the displacement vector +$\mathit{offset}$, $0 \leq i < \lceil n/b \rceil$, contains the total number +of keys in the buckets from 0 to $i-1$, that is, it gives the interval of the +keys in the hash table addressed by the MPHF$_i$. In the following we explain +each step in detail. + + + diff --git a/vldb07/thedataandsetup.tex b/vldb07/thedataandsetup.tex new file mode 100755 index 0000000..8739705 --- /dev/null +++ b/vldb07/thedataandsetup.tex @@ -0,0 +1,21 @@ +% Nivio: 29/jan/06 +% Time-stamp: +\vspace{-2mm} +\subsection{The data and the experimental setup} +\label{sec:data-exper-set} + +The algorithms were implemented in the C language and +are available at \texttt{http://\-cmph.sf.net} +under the GNU Lesser General Public License (LGPL). +% free software licence. +All experiments were carried out on +a computer running the Linux operating system, version 2.6, +with a 2.4 gigahertz processor and +1 gigabyte of main memory. +In the experiments related to the new +algorithm we limited the main memory in 500 megabytes. + +Our data consists of a collection of 1 billion +URLs collected from the Web, each URL 64 characters long on average. +The collection is stored on disk in 60.5 gigabytes. + diff --git a/vldb07/vldb.tex b/vldb07/vldb.tex new file mode 100644 index 0000000..618c108 --- /dev/null +++ b/vldb07/vldb.tex @@ -0,0 +1,194 @@ +%%%%%%%%%%%%%%%%%%%%%%% file template.tex %%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is a template file for the LaTeX package SVJour2 for the +% Springer journal "The VLDB Journal". +% +% Springer Heidelberg 2004/12/03 +% +% Copy it to a new file with a new name and use it as the basis +% for your article. Delete % as needed. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% First comes an example EPS file -- just ignore it and +% proceed on the \documentclass line +% your LaTeX will extract the file if required +%\begin{filecontents*}{figs/minimalperfecthash-ph-mph.ps} +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 19 19 221 221 +%%CreationDate: Mon Sep 29 1997 +%%Creator: programmed by hand (JK) +%%EndComments +%gsave +%newpath +% 20 20 moveto +% 20 220 lineto +% 220 220 lineto +% 220 20 lineto +%closepath +%2 setlinewidth +%gsave +% .4 setgray fill +%grestore +%stroke +%grestore +%\end{filecontents*} +% +\documentclass[twocolumn,fleqn,runningheads]{svjour2} +% +\smartqed % flush right qed marks, e.g. at end of proof +% +\usepackage{graphicx} +\usepackage{listings} +\usepackage{epsfig} +\usepackage{textcomp} +\usepackage[latin1]{inputenc} +\usepackage{amssymb} + +%\DeclareGraphicsExtensions{.png} +% +% \usepackage{mathptmx} % use Times fonts if available on your TeX system +% +% insert here the call for the packages your document requires +%\usepackage{latexsym} +% etc. +% +% please place your own definitions here and don't use \def but +% \newcommand{}{} +% + +\lstset{ + language=Pascal, + basicstyle=\fontsize{9}{9}\selectfont, + captionpos=t, + aboveskip=1mm, + belowskip=1mm, + abovecaptionskip=1mm, + belowcaptionskip=1mm, +% numbers = left, + mathescape=true, + escapechar=@, + extendedchars=true, + showstringspaces=false, + columns=fixed, + basewidth=0.515em, + frame=single, + framesep=2mm, + xleftmargin=2mm, + xrightmargin=2mm, + framerule=0.5pt +} + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} + +\journalname{The VLDB Journal} +% + +\begin{document} + +\title{Space and Time Efficient Minimal Perfect Hash \\[0.2cm] +Functions for Very Large Databases\thanks{ +This work was supported in part by +GERINDO Project--grant MCT/CNPq/CT-INFO 552.087/02-5, +CAPES/PROF Scholarship (Fabiano C. Botelho), +FAPESP Proj.\ Tem.\ 03/09925-5 and CNPq Grant 30.0334/93-1 +(Yoshiharu Kohayakawa), +and CNPq Grant 30.5237/02-0 (Nivio Ziviani).} +} +%\subtitle{Do you have a subtitle?\\ If so, write it here} + +%\titlerunning{Short form of title} % if too long for running head + +\author{Fabiano C. Botelho \and Davi C. Reis \and Yoshiharu Kohayakawa \and Nivio Ziviani} +%\authorrunning{Short form of author list} % if too long for running head +\institute{ +F. C. Botelho \and +N. Ziviani \at +Dept. of Computer Science, +Federal Univ. of Minas Gerais, +Belo Horizonte, Brazil\\ +\email{\{fbotelho,nivio\}@dcc.ufmg.br} +\and +D. C. Reis \at +Google, Brazil \\ +\email{davi.reis@gmail.com} +\and +Y. Kohayakawa +Dept. of Computer Science, +Univ. of S\~ao Paulo, +S\~ao Paulo, Brazil\\ +\email{yoshi@ime.usp.br} +} + +\date{Received: date / Accepted: date} +% The correct dates will be entered by the editor + + +\maketitle + +\begin{abstract} +We propose a novel external memory based algorithm for constructing minimal +perfect hash functions~$h$ for huge sets of keys. +For a set of~$n$ keys, our algorithm outputs~$h$ in time~$O(n)$. +The algorithm needs a small vector of one byte entries +in main memory to construct $h$. +The evaluation of~$h(x)$ requires three memory accesses for any key~$x$. +The description of~$h$ takes a constant number of bits +for each key, which is optimal, i.e., the theoretical lower bound is $1/\ln 2$ +bits per key. +In our experiments, we used a collection of 1 billion URLs collected +from the web, each URL 64 characters long on average. +For this collection, our algorithm +(i) finds a minimal perfect hash function in approximately +3 hours using a commodity PC, +(ii) needs just 5.45 megabytes of internal memory to generate $h$ +and (iii) takes 8.1 bits per key for the description of~$h$. +\keywords{Minimal Perfect Hashing \and Large Databases} +\end{abstract} + +% main text + +\def\cG{{\mathcal G}} +\def\crit{{\rm crit}} +\def\ncrit{{\rm ncrit}} +\def\scrit{{\rm scrit}} +\def\bedges{{\rm bedges}} +\def\ZZ{{\mathbb Z}} +\def\BSmax{\mathit{BS}_{\mathit{max}}} +\def\Bi{\mathop{\rm Bi}\nolimits} + +\input{introduction} +%\input{terminology} +\input{relatedwork} +\input{thealgorithm} +\input{partitioningthekeys} +\input{searching} +%\input{computingoffset} +%\input{hashingbuckets} +\input{determiningb} +%\input{analyticalandexperimentalresults} +\input{analyticalresults} +%\input{results} +\input{conclusions} + + + + +%\input{acknowledgments} +%\begin{acknowledgements} +%If you'd like to thank anyone, place your comments here +%and remove the percent signs. +%\end{acknowledgements} + +% BibTeX users please use +%\bibliographystyle{spmpsci} +%\bibliography{} % name your BibTeX data base +\bibliographystyle{plain} +\bibliography{references} +\input{appendix} +\end{document} From 995d68898b2ba2cd259cbfe495a7f3fefe796de8 Mon Sep 17 00:00:00 2001 From: davi Date: Tue, 29 Aug 2006 18:46:28 +0000 Subject: [PATCH 353/739] Compressed papers files. --- papers/bmz_tr004_04.ps | 10732 ------------------------------------ papers/bmz_tr004_04.ps.gz | Bin 0 -> 200470 bytes papers/bmz_wea2005.ps | 8159 --------------------------- papers/bmz_wea2005.ps.gz | Bin 0 -> 184899 bytes 4 files changed, 18891 deletions(-) delete mode 100755 papers/bmz_tr004_04.ps create mode 100755 papers/bmz_tr004_04.ps.gz delete mode 100755 papers/bmz_wea2005.ps create mode 100755 papers/bmz_wea2005.ps.gz diff --git a/papers/bmz_tr004_04.ps b/papers/bmz_tr004_04.ps deleted file mode 100755 index ba82d25..0000000 --- a/papers/bmz_tr004_04.ps +++ /dev/null @@ -1,10732 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software -%%Title: paper.dvi -%%Pages: 13 -%%PageOrder: Ascend -%%BoundingBox: 0 0 612 792 -%%DocumentFonts: CMBX12 CMR12 CMR10 CMSY10 CMTT10 CMR9 CMMI10 CMTI10 -%%+ CMMI7 CMBX10 CMEX10 CMSY7 CMR7 CMMI5 CMBX9 CMMI9 CMMI6 CMR5 CMSY5 -%%+ CMSY9 CMTI9 wasy10 CMSY6 CMTI7 CMR6 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips -t letter paper.dvi -o paper.ps -%DVIPSParameters: dpi=1200, compressed -%DVIPSSource: TeX output 2004.09.23:1319 -%%BeginProcSet: texc.pro -%! -/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S -N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 -mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 -0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ -landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize -mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ -matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round -exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ -statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] -N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin -/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array -/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 -array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N -df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A -definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get -}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} -B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr -1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 -1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx -0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx -sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn -/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put -}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ -bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A -mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ -SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ -userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X -1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 -index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N -/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ -/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) -(LaserWriter 16/600)]{A length product length le{A length product exch 0 -exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse -end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask -grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} -imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round -exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto -fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p -delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} -B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ -p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S -rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end - -%%EndProcSet -%%BeginProcSet: f7b6d320.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10 -% cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8 -% cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10 -% cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10 -% -/TeXf7b6d320Encoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve -/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash -/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand -/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen -/period /slash /zero /one /two /three /four /five /six /seven /eight -/nine /colon /semicolon /exclamdown /equal /questiondown /question /at -/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X -/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent -/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u -/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef -/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute -/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE -/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: bbad153f.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9 -% -/TeXbbad153fEncoding [ -/minus /periodcentered /multiply /asteriskmath /divide /diamondmath -/plusminus /minusplus /circleplus /circleminus /circlemultiply -/circledivide /circledot /circlecopyrt /openbullet /bullet -/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal -/greaterequal /precedesequal /followsequal /similar /approxequal -/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows -/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast -/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup -/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional -/prime /infinity /element /owner /triangle /triangleinv /negationslash -/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur -/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K -/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection -/unionmulti /logicaland /logicalor /turnstileleft /turnstileright -/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright -/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv -/backslash /wreathproduct /radical /coproduct /nabla /integral -/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section -/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/minus /periodcentered /multiply /asteriskmath /divide /diamondmath -/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef -/circlemultiply /circledivide /circledot /circlecopyrt /openbullet -/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset -/lessequal /greaterequal /precedesequal /followsequal /similar -/approxequal /propersubset /propersuperset /lessmuch /greatermuch -/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: 09fbbfac.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9 -/TeX09fbbfacEncoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi -/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown -/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla -/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam -/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft -/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one -/two /three /four /five /six /seven /eight /nine /colon /semicolon /less -/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N -/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright -/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l -/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright -/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi -/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown -/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute -/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE -/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: aae443f0.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmmi10 cmmi12 cmmi5 cmmi6 cmmi7 cmmi8 cmmi9 cmmib10 -% -/TeXaae443f0Encoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa -/lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi -/omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf -/arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft -/arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle -/twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle -/sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash -/greater /star /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N -/O /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbelow -/slurabove /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p -/q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass /vector -/tie /psi /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi -/.notdef /.notdef /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta -/theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon -/phi /chi /psi /tie /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: 74afc74c.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10 -% -/TeX74afc74cEncoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve -/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash -/suppress /exclam /quotedblright /numbersign /sterling /percent -/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma -/hyphen /period /slash /zero /one /two /three /four /five /six /seven -/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question -/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W -/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent -/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u -/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef -/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute -/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE -/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: 0ef0afca.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmr5 -% -/TeX0ef0afcaEncoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi -/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls -/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright -/numbersign /dollar /percent /ampersand /quoteright /parenleft -/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one -/two /three /four /five /six /seven /eight /nine /colon /semicolon -/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K -/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft -/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h -/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash -/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda -/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup -/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj -/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe -/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: texps.pro -%! -TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 -index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll -exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 -ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ -pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get -div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type -/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end -definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup -sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll -mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ -exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} -forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def -end - -%%EndProcSet -%%BeginProcSet: special.pro -%! -TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N -/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N -/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N -/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ -/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho -X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B -/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ -/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known -{userdict/md get type/dicttype eq{userdict begin md length 10 add md -maxlength ge{/md md dup length 20 add dict copy def}if end md begin -/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S -atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ -itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll -transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll -curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf -pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} -if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 --1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 -get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip -yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub -neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ -noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop -90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get -neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr -1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr -2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 --1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S -TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ -Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale -}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState -save N userdict maxlength dict begin/magscale true def normalscale -currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts -/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x -psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx -psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub -TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def -@MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll -newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto -closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N -/@beginspecial{SDict begin/SpecialSave save N gsave normalscale -currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} -N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs -neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate -rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse -scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg -lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx -ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N -/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ -pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave -restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B -/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 -setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY -moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix -matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc -savematrix setmatrix}N end - -%%EndProcSet -%%BeginFont: CMR6 -%!PS-AdobeFont-1.1: CMR6 1.0 -%%CreationDate: 1991 Aug 20 16:39:02 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR6) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR6 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-20 -250 1193 750}readonly def -/UniqueID 5000789 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C -68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 -3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C -BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E -CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A -C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 -D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D -23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 -D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B -93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 -6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 -EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 -CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF -D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE -00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 -B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA -99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 -A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB -11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 -50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB67C3039A0F -BF0BA4B455D035FF3126F33A4DF59FF96752CF58DC0863924F6042B14DC2DEE4 -099CAA764A8EFFEB78F7FFD276F0928BA32624C3A69ACEB8777A461298B201D3 -4DA271476B8AC8966668D4E28A6FBA952F6D295AA80CC09B0CFD6BE840703B07 -7ED93999EB5630C2C7CD9BA683ED457D1341C3AA702B5FA8593A51E8E9165FF6 -1385693E19161FF1ADC1FE0BE16FD3AFCDC3916A309FCE6B3F2B362C9F958A16 -821E1EB2DD899522DD3155C0B7A7F0876E4DA32FD30D8289266D9F05E77F1F1C -D3BFD2D4D6C8B6FDE0E8957BDBBEC54458C70B96F4CD77E734EE0CF620684024 -EB05DF0536FAFF10FC6F6050AB338D44EA9C38150D3779A550C505C06D417A71 -62D41C2D23843E0A2A73F72D4B5286E3CB7B8695B2434479776A59CB3BC6D352 -677CCABF4133E20F12D91CFD8978C09FB81DF801707194AB8FABA9A6599C20FA -B36DB0A166490D20BB0BD53581A8715B099754E6FA0F7D2892F5573380DDFF1E -F9C3DA9F74BDBEBBDFA5715AE23264F967BC7841CE58E5EE2764555978D904F6 -E8DEF6ED66C478848FC35A9827ACEA1D7CE85C8626C162FF296869DE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTI7 -%!PS-AdobeFont-1.1: CMTI7 1.0 -%%CreationDate: 1991 Aug 18 21:07:18 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTI7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMTI7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-27 -250 1268 750}readonly def -/UniqueID 5000825 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F -C0962CCA6FACCEA6B71BEEF7C056FBD376F2F0D0BD6BE0A0A8259139B28B99C6 -25119B8C60FF7BA002476930DFDC2F6B1B5A80F1C0E544A22E3F0FB2FEAB64B6 -A509B61E1AB96121FBF7F2BC27CDE5B4961048FC2169C8DB745FCC7AF0EED507 -284038B15CE53E69AA22CA76C2A208F6AD8614CD500D479A5E0FD25E7BB14C7F -C47C503E4CC38975CB0A8F7E109665FB69EBAE6EB68B2D6FA3C967D5BDE7830E -9CE6F13DFAEBC852DF1D7D0CDD33DD4D5CD6D94DD8AE0D48AB638013CF75A25C -04FDEA8775EC52A13AF40FA41F7354624D917EE620318C702237AF8C0E1FFA02 -127F862D4DFD0A56774235A881AFBB8F7F4BCB33811C581CFF38462F669B7F97 -1F97AC09373B8F9B7E653013AF8170613E8D7E17235A893BE296A0CD2096B71F -16778388993EDF1B003EBCE23DD02949CBFAAAB5D9F6A08178BFB8ED1043FC1B -0B90D9AFC27B19783740E8DDE0E5E01D116A8CB083C721FBB8EBF71018A9570E -78590CD831116BC0FDA4229F79A581874FC3A1F108A4FCA80CE27FA54A2A7505 -5BDB3D52E2595512837732322FB5BBE459C0205EB38439E34A39544F0A1567C6 -F29FBB7CF931708C8F92786CCBCBB443D54462B3B4B7BD38E90D325EBC31BA05 -FAAB393C7EBDB9EC48E4ACC15A247D2348A62293A726FCA4250B4A407F64270F -923EB516CB8A3B5D19876C8755EB291357E4E4CC5903D1A536A635E267F7A971 -B1C33AA7F58E1ADA931C450EA8367B18E20E683CCEEC1BC079E837DDAFFF0D16 -23C4AED0DC04DD9458A630FD498794823FFA55705315F0687E7592A5DFC8B8D6 -FE2F3C607AF59B61C2CF0BBCA640A018631A007E54D6CE655ADD721D1A90DADF -9D4BF7CB51EC717803A3A058C449480508A472C0DAA9891C9A1E027752B04DF6 -EC4CD5F68774DED98FEE15B631A11D9B3A6747CC741CDE5C373A17B34424AB41 -F47EC07C506E44E3318A12B32C3FB277769017FD7F8A5104DA9593D186091EE8 -1B20846B98982730B1D37E10709AD245A788220FD17D836969EF8E2B44D6D55F -C042F657815AD39C1ECEF7771BFC034DFD953069F2283F78B4DA8214F1CB162D -0A663E39CEFB4C32D31602CA443C7E6B96236A594333B3A6B1CC00A8C3D567B5 -6CBDE4A4567E794BF61CE7B40BD51C6F2F2D981CC4C3FC95423366A8EE8EE144 -BDD3745CF982A1910132B38CE4C09FC9BBCB8BFD68F2DEE2546843982B0087D3 -B168A233D983E52F1F972C15119B67D6326EF8F1428D50D70860424229A1ECA5 -BE0CA6D3D7E5473FB26BDF0642543265BDCA70D5D00AAE390936F360E1C48AA1 -F4D8E199B8AAD8FD0C7FE36AA77B5B1899D8F07EE99D213AF39D17285EADEF19 -53E5B712E437DE4284954FA25F7589BE9E93E24294327AE50C7CB696DDB5FBF3 -1E23F0564186E355782FA2E046E5F4A90C9E978154EFAC7F0A95A52C120A1022 -2F4E1480C1B740259A4B846429FA213D0B2D8A3134596CFCEE58AAA1DCCFC635 -EAFB454FCDEE955B7EF43546904C0238A447E8EBC15AF39611A3606F2F435154 -DA583B8DA718EC07020EB18CD85244B287C2AD60FB4AE81337E0237E20C3CE1F -CCAB857DDB3FF4D215087B2BD5B22145A58678ECA1BA9A3DD04DABAD34474077 -FDA8D95BF1DD4AE3E5E5E16FBBC22AF13F9F57A81A57D40C0B938E1683C6A85B -7F507875E655DDD3957C03E88A8D07D9581319CDB1EBACA431CAE416DD995555 -0C4AC37E3F2BFEB75BF409B25BD207E6AC9E42AC6772A39F8B18108EDEF22F6F -7CEFCD79FDE1CE888C3B883108E1D19E25654077F60C93D9191DB4B5D7D8F356 -745B3FB4AC90FD23A461AEC36180D2FE6DECF43DE0397B396E63DE8C532ACA36 -19CACD2CB28A2BC3C608DE37F77F4CEC07DB1A4DE38321DD4307EB1FC0E598AA -51637B7FB8F26D753767EE0AC13DB203D1E7DA9F0C38840483FAECACFE16F967 -FB2E2E827C6B8E6B7AEE7967A4FFFB7181C9028AC6718F8CD7AB78D59E18255B -7504B50C316630DE015E9B429C26F616DBF41EAD9DB27BBF765766BD7ABCD1F7 -367D97B20D297C73FAE25317D626F7BB7224BC7A62F078A6D6B823B16EA4410A -7AF89041E2F8B87DE09B58D5FE2CB7964ACDBB6ED6A3A7E0EC21172FBAD0647F -1F8802A0EF20D438F1168932D84008B9D76335BF1CF5E11AAA77932C18AC9DFE -61E77B440BB51132C9B890E756D4BF2DE0D89862BA864327DB3BA99B831D6CDC -76F92718A54B52EA0F219043B248939602AADD302F7F5D82691E4AA980809776 -5D421C9EAE029FFDDF27BA935A03C450B651B99565AB77CF5910EB76B906272F -9BB16464C6CA864052ACF3BFE39E3704020E3B77C7E38D2BBFE76CBC62A11437 - -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY6 -%!PS-AdobeFont-1.1: CMSY6 1.0 -%%CreationDate: 1991 Aug 15 07:21:34 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY6) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY6 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-4 -948 1329 786}readonly def -/UniqueID 5000816 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D5FC1B2109839E5B52DFB7605D7BA557CC35D6 -49F6EB651B83771034BA0C39DB8D426A24543EF4529E2D939125B5157482688E -9045C2242F4AFA4C489D975C029177CD6497EACD181FF151A45F521A4C4043C2 -1F3E76EF5B3291A941583E27DFC68B9211105827590393ABFB8AA4D1623D1761 -6AC0DF1D3154B0277BE821712BE7B33385E7A4105E8F3370F981B8FE9E3CF3E0 -007B8C9F2D934F24D591C330487DDF179CECEC5258C47E4B32538F948AB00673 -F9D549C971B0822056B339600FC1E3A5E51844CC8A75B857F15E7276260ED115 -C5FD550F53CE5583743B50B0F9B7C4F836DEF7499F439A6EBE9BF559D2EE0571 -CE54AEC4608D684B710390C353F426CCBF1E4E9F2402A09140A3C8DFF140E8A1 -023AEDED8DA500B8D1D6FFED6FCBB157910CEBD8E4896790F6280EDBE5327ED5 -209F6545BD8774FBFF15C391561D2D1BB9CB2F6107EB7B0244DFF0910A2856BD -96BB0634061D6987A901BC48366195C42BA629F0B4C03E41EDDAB46742E28699 -A2BC635F9EC5C3EBDC2078260D37D767B13029FAC9FC1260814D12F4433DF4C7 -669729F8552BFE591F0EE15F390F1D76D8C6BB15AF21ABF2CD40DDC5CE839502 -B0261AD919 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: wasy10 -%!PS-AdobeFont-1.0: wasy10 001.000 -%%CreationDate: Sun Mar 22 11:13:35 1998 -%%VMusage: 120000 150000 -11 dict begin -/FontInfo 14 dict dup begin -/version (001.002) readonly def -/Copyright (Metafont original (c) 1992 Ronald Waldi, Metafont curve conversion by Metafog (c) 1995 Richard Kinch.) readonly def -/Notice (Copyright 1998 Taco Hoekwater) readonly def -/FullName (wasy10) readonly def -/FamilyName (wasy10) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -/Weight (Normal) readonly def -end readonly def -/FontName /wasy10 def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 50 /Box put -readonly def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/FontBBox {-23 -1667 1720 881} readonly def -currentdict end -currentfile eexec -D9D66F633B846A989B9974B0179FC6CC445BCF7C3C3333173232E3FDBFF43949 -1DB866C39088C203DC22FDC758584860EC7BB67FDA28CC6208249060E18FAB32 -204779B5C03C0493BBBBC95CF02692CC4DEAA8D2EA90B5C2E64374E92BCB8501 -429B8FAE4A76C0C6B76D6FF7CF9A7D5EDFBCA0E959541C59BD05B7DE43D25D53 -FC3DDA6EF0C2743978A6D03E19CCED4A11F2EA4BCC3110BE8B8D9E2772361969 -C19258EFAFDC276CB1ADE9208A941A36D18F9FB1C33DEF76AA315DDB02CB1AAE -36F1D7B67C605A37687A9C3F7067F07673039D1E3E1F5D9B09E6A389A55EBF12 -06E72531469F768EDBC4DCCA572BD608C4BA8F7EC3E5BC61C6D949C94A843E69 -0622F0AAEBF5CB25A2395DFF6342106C198751CF0B33691FC18800254AC54C04 -02494A0E3670008E8BA57A3CD823BF47494F2EF9244421A8A0AED84D153D7201 -BB12EE9478DF00CA573F64C2474817FF401EE94BACCA8AFC16E776665C3E1E31 -89AEEC906A2B9F8974BEA7160C33F0AE7FB04B2666A5B16659D6DF66A688D80A -B531D9F866F21F15D55C6FE75A8787091359698E434EF9C129EED0427EB96787 -B3F25C530E3664725C63D4C5DFF9D05CD13619FC41A001275A78C58F85FC7C4A -911CC31CB426231473202A698E5715B032D2206BB361EFCBFE3E32BC0C8D9BC1 -353AAEC62EE632FC8FFFDCF6E7D928F562F689406CA00C11C7EAA723B62FFD2F -5F6343AF494085662CE2CE880B04F5589396EAAA8823DBCDE56D868B9E66BB8F -10EA91AF37D76A1BF27E69C2A2ED1D8B25434C0F205313ECB8A6E039093FFB32 -983346BEC569B175529DAAD1FFEC1A9302918FC947C390A86C061AE0F6522D79 -2D4FE06AE4FABA59F225D7ECE2EECD4BA1359DB18F8957F551C5D6F037F18545 -CC6D03EB2DCCCFA294492ED72A737588457E5B18FA4CA0F6D6D8963CA35DFEDF -31A684FC0388D416D7BF6CD9837AD8692F284F24B80CF9F24DB10DAD0C4198BC -2D2A52D9F75CF6C52C7AE0D8D4598DB750E9CC97D0FD31EE8C598A2FF3745694 -29DA808141AF4D8F8AA36D7DDCC3457D5E082B2BDF7EE060296721D44B092E70 -3607B2335488925E41B22D659C8F0FFEE19A7C19547A147DB851262E47E9C4FB -0A8364BCBC1C77E29A1183EF185EF35B9A5B13170730ED52D5C52CCB460E7D37 -F4F37F772794BEA0DA201C99C52F8AC2E4CE7FF33F6ACB796E55BA2372E3B035 -52C4F57AB5C0BF828DC7E5A8F8F00ACE0120B99667816FAF5D736BCEBF7D45A5 -79C9B5EAA32C9B672D764D2F51B2393ADC71A36AC0D5CA76F3F571D50CB4C1D7 -CA77149B8F0C98198919DC43890A7D49B0A6C7268E399C6C68B6ACC0D1E9F5B2 -931BAF9EEEA6ED985835323E85D72C6A607A99212BA2DDD24D579ABCE9507F81 -3F3F6A4B5F54DC2FDF114847B2F7B0167E1F0417E97182201606B94B5414E7A9 -8B1367CD6C7C73C87FFE4044BC0A9FC2FDF191635485D1C5D53788EC23F132A6 -366FB239D95FF50A120A40DA54E38DFE799F05AD21C9A03DC2126229863D4E37 -23F9A6316A3ABA13F01AD5B7CC89F6DA386EB1A6E9832296073E66ACF986636F -69D122F85FB913206721BCCD2F23B289E20B37783D7D2713575DC39ADAD05BA4 -004B6C01D512A91F -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTI9 -%!PS-AdobeFont-1.1: CMTI9 1.0 -%%CreationDate: 1991 Aug 18 21:08:07 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTI9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMTI9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-35 -250 1148 750}readonly def -/UniqueID 5000827 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496 -4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D -DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A -F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458 -8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6 -03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9 -211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3 -E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B -D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1 -6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9 -0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC -1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2 -298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D -C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574 -433484BA1466709A4B186761655C8E482833B697673E847C691079E7F1DCB8D6 -1AD91101D757B83E2090337D525AEECB028FB3C9F6A6E6AD2F322CFDC5A833E6 -1CE4EDBF41FD34FD61630581D222F854A76C2EA9FD72796A7C9CC1F6C2FCCD16 -E95CA05826A4ECFADA6A5FB83C41A7131E52BA6585DD6DD78515D8F7327DFC6F -9404F891DDE3C21035A7EB1204E3403503B2F66527D92D7C148484B16C329BB3 -11607F8970AFF62DE5A426F6EB40CE191A6D045C9CC884C3B1B44920D7D8E573 -B8C0BC1CA0C706A4F51457A10615920AC6079CC28DBCF15B3B92B9493348925B -A32C2A907199470331FAA8F7011C65B5D34A4E604935AACA7F33D64F921D89BF -F72D223FA7A656EC05467DEC2E81136A8E237A909672BE1C1929E1622C66FCD5 -35A84F34EE4E4216D6A80693240AAADE28089CDD3232095B6B5E60EFC46A87E6 -4CBC48B1110A5455B1F2BA5391E0968310FC2471DD6548B07C8241FA1F6AC171 -EDA3B333A586EFA53C486D2D79DCC5FB9AC8A4490DE5594C11CA80B0D63485D7 -201EEAD83F9F7AB79B6BD5468782FADAFF86560251C299E61FA50671BE778EFB -163B8D8C6E8991536E63BE508F695AE80E0318AE28BB9AAA5A02CCC71952E922 -36D5519CDD32063B310B70FED64CE4211D76A8085D2C37C982A7EAC4AE153B95 -0DAD15434017F49BE14197211DEA4419EE970A44D2295C2D6CACC28CCB239FBB -923A8ED11094A38F7495FDCC4CFBFB8E9D5CCD2F9F3B10135DFC0779CC22FB7C -41FB7B56B21E604EFBAF4C269D0F868BA08731F46500F35F09A6D53DE7B6351F -C84539D1E41F6C01B62F39258378C0A500905307A003C3C0C8D5EF5EF6534C07 -E602C284C8A06E090CD41124C4150051E4830DE17F7C9A13B15F8898F8CA6731 -33F25E6CB52ACCFD339DCD86FF3F6231B331299DA9201D6D13E91694A1CB67A1 -2F470E4BD7C4E65648C723BB56A5763353276EF90ECF9C77775FCBD79BD02753 -7D625D9E850AB8D41D463F16A55896045F50957F02124AF19CBB4180E0288E44 -290A344770FB44FB296E36B0B163C5012BD2C0C2EB044844A978F6E1F10D649D -2DDC9E0E6A211397B76C620A3F3D8ABF68E40158ECC9FAFC3DC6D1D2116DED8F -7B4221BD9301D160C500A2600A5E5856896A3FCA73D9CA3757786940D76BA9D5 -EB4831413FFE29A9F3938A91AF8E88ABCD58FD4409BB0DCF297619EFBA7595DD -1AE4D1F656BF533509FFD45563886A479FD2963988797205503CFA0D0F113682 -65DC868956173AEC96538C0C9E901F3B5C5EEC7BBE45C53B6F2D927C6997228A -CBA46F1FFA5E5A81B3B0D4DA6BC6C6179197D02B8EA7CDF7A77614D1E75A8E44 -124F5B0C45CC5B6F14E4784D324EBFA12B3063768E1C680143FE9EF93323C2D7 -24047D2818DB5454E022CE4F6CE6AA51D478C6515E4D34B79004E51BF84C4499 -5462F44E461EEBAC3C02651030B068BAF72F67F7A9AEA776976283B4F3BCB74B -2B2FA005EF6F4BF01BC847EC27B51A7E8825A840B6AF48AAC8D80FF4181D5C3D -BFE0C9FBE24F0C1E183959F8F394A22259A2A04A763DE2BCA8251C2217EA5005 -AE7672E341BA1A61EA69A7832FDFBEE6498CF89D7832A4694FC1846850F3DE53 -3FC9F6DBF686BFC5DF9220806F7889529DD2756438951F1282E20FA028C83B33 -8923ECA084C62343E6C6AEE05730FC746A09BE304D2244301929712E03BF6F68 -7168A06E2327D98B41958A6789E715F38A7D633425059A44CC1A0191FAAD0528 -AA2C416DB8045E4C95BF6AADFFABF13647E0887C373E74A9840E7CF2BF3062ED -3AD914822D61C44151381A37C79C1914C77ADB4EB3390A5D4A9894600FF497A6 -4BBA72E6E288F94DB2F8DFC9D1DC5ACFE835BB13D3765D647EA019C809D866CC -2CFBE461018CBA0170A93297A58ADA6132B474A0DFAA4107A4920C501C135DFC -CAFDDD6FBB1F7674A922D4BAD19AF5D9302E574D5BAA5131CB9F5FEC35264DAD -4E98E998B82462CBCC3F5F33D0E68B5AB73EDFAC1731629F216A554A0AF281E3 -22CB9C08705DB6D935AAA1C9D9BEC1084CCFD2973589CB8279FC24A77998F5AE -5EED2EB865E69AD0F18989BF35A9627774C3FCD014D96140C3BA88A633C4313D -E085CD2043D9A07CA548D9A5037CB035C8E3B24435953403FF7633B77083C9B7 -B952F8443F6CC854D5EEB3B9BA953DE77BAD94D0C2C3AB36B9D33EA29D007802 -E9B304E5E9313A8F89535D57E43E113C746597CAA2C1A60826250DB7B37F3F20 -D1D57194411281B3666554BE93BC276C0513FAD8FD90DF33A9F0CFAE374B0472 -FE9E676E4E03F7E67F2EB38346788B37FC8D5B654295C6FDD795D2B9B7908A62 -71296438F6F7A6B9C2CEE2A378005B36C53C063AC81A87F999D2CAEDC72848B8 -2D9168BAED61B0DBDB408602EEDB83D5A5557041C67019B72FC68026A37A93F9 -53084A169878BF5A18782CC93D3D55C20ED8536F16FEDACDCA44EF8D21C23289 -655196E12AECF2777E6FCEE05B66EF2179A619399B5E1D121256B0FB91AE7492 -7B3851F161AEE1747CF163CD1A9452ECC75F3954946440A40D400C33F95502E6 -66A716EA6FA8B540EC6945AA9FA90308D0ECD202425A76D2BD52EBA00B8BAF58 -4E046A87FBFA6537F03191C63DE84780A1E3AC959386D191D3155573D2827B05 -ACBEFFAE21F460E2D84F7EE8BC34E55C4EFCAB026D9F1BD3C926C14974BDAA9D -C8D9AE2F7FB985511ED9BE5FFC5374124830CC03462E73E3B40ECF93D43D92ED -4375BDB0B93EDFE63B81B5128D1C65E049FD51D35AD11D98E1646DB7506D60F3 -DF28C210823B7AD6A0D762C088C4B2F05C3A0BED426AB6B7B9E4D6C6F8C1A6ED -E2B512532FF420631DFD3EB48944B149AFCA6E2DD741992B468CEC9CA316CAA9 -678D1F27649E5F7108266DE9256FF6FE13867F8CDF86A9F375D94FB174FAE308 -E452A68468AB1A8E657897903F391A7E475159C108367DC0717A87058F389BD2 -0ABBBFF0C6950567DC54D9490543BC185B70AA387C23AC4356F1F175A3A875B9 -4ED6AC0A33DE635751704D8B615322D3A2D5F9F6C5B5D08CFFA99C291B549E4C -DF3FC3563ACD8BE98C1B8209E3A122DF652E8E266220A1B9C9A5AC9D19EB8DCF -3A552A1DF322B5A1F7E05BA6DDCBC6A7FA4E6BCD5D85F37F5E9F7733FB317EFB -26CAE7C8BD3F550C958232719164647CB135C19623A5BEB7C29D74EB65BDE17B -CF07CFE1D0208A9C5D54D941CED377728EFB4EF98BC67445C30FFBBD73C6569D -40FC33DABB506476ACC7AB02132012F7BECC6F4AF63DD84A5197D391F73EF871 -0E3A454AEE515F425240CA8BAD98D18D7FFB08481E856D8984314BC14FDF7EF6 -50E5C5047A1B8B207A1BBBF1B10BEC12EF410103F817D1720380914800A0BE4E -3A7D392605C1C7DE0343D25E8233663ECC5A657C2D13630B068D3441FBAFC029 -7EA44F43742E91F57E923E237CD5785152D320D13052CA2723D066CB921B7E63 -F670777C151241FE8BE42E42292EDEC99571D5B12D340A94157519DAA4DC3959 -403B3475F23441CA9133B9DCCE7CD961B1EBACB8F15E9C5FAC4D9AAD330D7A09 -3A52864203AA3BBDB49534B7596A07B58966A6CA79E10C15D389782B888FADCE -B732319EFB29D80A56FBB86D2B1E74C482DBE7B43803039F0EEA8F48E99A29CD -D171D00B7F845A1F284E217924B6DCA1DCE2E8604C3038AACD2F613F29186CF4 -C11445A1D6DC1E6A58DA69B8EEB44FB5C5854EFB403DBFB4D8043EFA4E4EFA98 -6B69DD3DB4FD1EC2178C559790B8AFD3BD4D56F341FBC9882334906BCA363C37 -2B9BC23974AB1C670BE17EAA36C75430ACEDF6C431E6A8B2D7148DF946AE5223 -5A34C072023DA4ECA348F57EF228733FD34388374F6A515C1830DFDF8B00BEF0 -82F1F6E2D1E9E1A8E254EDFAF7C16F984D7A4393065C5C84F4E761D0E27478F5 -93E914C76A32E518006934C229140D6A62C3B33683B3D2DAEBD137A604DE459A -08C733401FAF1E468F9C230E87E79C402BD7D465A7CEE13B7166A90D81DDF850 -A95F0CD600F9E88CF04588DCBFB307B882772E833202C0C33DC56DF020CEE95D -BD140C0C2C88CCF359E51CCB3B3DB1BB74DF41F60FA8B3F9069B6E6B63D6B3DD -7447C926853A7078AF24CD92FB35326D4330DE4398D46FC8E43D959D202B0CAD -0FFFE0586A9339DF42A6C6A902C51CAFB59C19D0E181E8537DA5C8F3F7E08D57 -8E364C56D23D1CE142D48FCE5DE496C457FDBC461D5013BBA521FB04247934F7 -91DF6C81153D2708107EC948C67F3906606560EE251ACBFE8177E71AB8863C82 -E3D1FEEC9C711F70A231416F926736A08F18FEE43949843DA32AA7CAF1E4B42E -BE23B3385809F1D40A44F8EACAE8E64E7350B864E07128BC3438C85FDC44A3E7 -B347912034AE9026F2C716251FE62D3989807C1D0CE0C51A2D0582528B47DEA4 -BAF793AB949F32FA017FC03946C6202EB49D8DDF26C04128C7616022E6A9C060 -22C67C7FAB15A9C1C6E9D9DE6A8815A4963FADEEC2C95F95D99CB1830932E5BC -0A7E13160F5057329F9225FF0A246DD0BD5906836ED15BCF62FA97262DD5A1AD -42977B5B8D23A640E061D6B3CBA9742E817CD155585646679ACCD15BAFF4D046 -565829C1BD29E3FDC8FA787E135CE9B53A09B31AA09774CDD90F6FCFD59A17AF -9167EA2026E18CEF83643D5B5F5254E6B61205B63FFE8599E6D97358089E9162 -C7D2A9032B5B932C5FF703D3DDA411A435D6098F58089962734A59807CB55420 -60E5AFD1280003CBE6D31734F9ADF3BFD95FCAE880A13E7F9385C5B98FED3C26 -19083CF2C222A899C0C9FC5CBD4D42F0C2E239BF34F9EEE327D7490A07E32582 -FAF263277255C83776F404B9353E2B06A58F6A9856CD3C8BB92F865E981AD7B2 -874FAF570319CD4F69152A18D1AB82909D23BDCDFB0D477BFCE4C6EE51967CF3 -0D0EEC20729340598F4435ADAAA86DA9B8B480A6C5991A62B0256EE217C6F1E0 -1E8001EF5D349C9CABEF3EE88CB2DED0D9BEEDC1F21C1CE298C2462C6E66FE29 -3D53EEEC45B691C6266DBB3BD68F1D7E30125D92B01EC25BB37F2ECC0170E6AB -C00385B9D33A1BDE7606F2D710644FE4D4C9481FF0E233D7946FC093478614E9 -20582322684C6C6ABF8F8750ACCD1A4A94EEB8FE3B57F4FFB229D5EC8C3DC9E2 -527B004A6098AEB44E2830AE726B6D724C7CE32C6697395F6C2E29E8D7919E93 -B9A1C9E17BF86E7D7FE3F2F7C20771DA823896F141733BFAC034920D3B6F3FFD -44CD296FF1A159FD3A6A543795BB3AB0EF517E58ACF8300938CA4010DC5AB519 -7E4B9448 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY9 -%!PS-AdobeFont-1.1: CMSY9 1.0 -%%CreationDate: 1991 Aug 15 07:22:27 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-30 -958 1146 777}readonly def -/UniqueID 5000819 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A -27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC -65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380 -D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C -77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA -15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F -491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F -1A06C514D91C4C937D4E642503392B1CD1BDEFA5A4E8EE5B7640ED58FF8462CE -11BB30D2BF7CDBA39A6C6C7C79290BAA317BE23D9C56AB8D17D2EF41B087CCC7 -FACD376461F020EBDF5A0CFA1908A7C5D82F24F0F830A8D127552DA050A4D6EC -F79E2004E971CE05139446300320249316F11E7BFB588A2278A3052198247128 -D46B0F9068B5CAB3D8EF7FDAD9713A6E9B971E41BEBA5CC37751EA5DCB05AB8D -24350CA4EF096E93EF3D752951E89F9CB38952ABF48D1586636D0F47570D8A66 -5FF0DDADFADDB34C3A5C7238E3096F2A3CB9130D9BF135B033150DC0CFFAA101 -B73638E691BE95792D3FB49E4C9F54D96C784906ED33D21F4DC9E14ED0C42517 -C0EC6F87EC0448AC09A2A967C590A9198FBA369AED2AC98ED5E5A6117F85F75B -5FCBDD9E66BA18E3A37AC24E32F0F66E786DFD327F042B9AC0A63D50F5F23C42 -226B340F90C496F9CAF4265E2DABBBD44425FD8F0526510428E008CE0E3B0BB9 -DAED95A40C61AB1E838A9E7FDE0189C208F2E2E839F70E8223F9127AD808A2B6 -42F9CD616BB65F279301241D28CC9BD4DE5D3E2150A8CC7299DAFF8E5D97B3DA -59936547572FA39E078169B565B2715894095264D641F7FF5B3018BF7285BD5A -74D72F7C84B4CA87326E7BE14BBA23D7DCD2C611EDB1056FE38F84F557CFBA27 -64D3D2A7280C9C1A65E58AB4AA7676132262BB81C87A94A1ED21A44774BE53ED -B50B845514AE8F00B64C1AF6F66E477FA683F2B0E560AA37513F4E84BE3A32B5 -A1C0695986D05276BEE540759A7DC10E6CE7BA15A545CDFD4BC61EB145EA43BC -4154E0B48443B2781641A0B2A0FA4C3D4AFFA3008737641252B0E1EAC68A3E03 -A7DBE9E5431FE3ED09DB6D07A02AA581B5DF6D54577C04866200A30207495881 -1288C6A2F9F499A27DE3EAD7D266CA9C526248491605033826C6931D187C57BC -860BB4E63112B0AB1158F80E8A024790C318DF8479992258D804F9B8E275B612 -E821591F2726A4876AF63D41FF4CDB629931F2AF132346A982C6F47FC46B6AC3 -A487D515DE937432470941CD921B2A2D79D5C1B9E50051B423204151C72F0859 -BE2954C967D2A4221618EB1AC2448F7DACDEAAE30A17A218BD883E4268523F9D -16157CBB03D699811E288D63F563C5BD17330A34C0EECFA8627BD9A070D081C9 -E49B46CE2B289813AC67EE366D9E1FA93A73AC1768E618EE5FF1CD58D4BC6641 -CF1EC9DBE9F4A750BAE5CC39E288B97610CBABC62BC92CB898ECFA45AFB04BCD -DD346B917F8159E479470DF3E600E91DC0EDDAF6A3D20492DB8434D28ECEC206 -7A3F6C36F0650A92DA7C5FEED82AAA38425731B8FDDB222B6F9444E8A390FD8A -FA98F1D18487E7C6C7920B5F4996577D3E8C3B493F505F7BD991E8062E527F06 -6E5BA37A820B56D2EB54F29BC16D05DB5BF31CC8839B83335BEB6F1B49E6D19F -D2272416A4851FC83FCBDD85EE56716E12755CBFA854ABA2E2D58B41DD9C5E62 -BFE9975746DD5721754F0CFF650E59E371D6693AFE842E686286FF1142238727 -45CCC0EA9FD3A1BD9A32D2C5688530E12D457B64F5EFFF26B41DA11AFC82595C -0966882616CE28C5674100363BEB2A73AF6E691B01FC667A7AB8E627D24FC98F -8985435D1F58B19A4A03CF9B856F8891092D8C9FE0106FD2048A264F6DB029E5 -3D5A7DD5B920117CF67654A2DCF896F20971BE27FCA956BE8A81C6401EB4F964 -45CC8DBC798DAA09BEFDDEBB8930079056E94B5C0F6D0836FDCEA8F827E90936 -086E9E0D12A1EBF2FEDAAF618DA424546D627FB4AC3EAF623057C7D317817EAE -C1E8D7FA50716190D6BC0083478221A4C3C41CE46F69B48FB03E1D5846A7CD7D -FDE7782FB24979CA4EFB6433110A89DAC1C6CACA528A6E8673B985DCB0559F0E -28AB69CDB406236DF6727E19BB24399736BE54FD7114FDBFE32C3A7C81D61694 -40010792F78DC876FAF5509A6CA82916BA86A89DF34F4BF84295346E9CD7FDA3 -235FABAD737276685E6F93B543EE35BD69E88F7E0F9CA4C59F28D12196234355 -918297AF1C2C7918C0FCE5E308D3BC65E3319744DEE55CF9B3349E6361DF6F50 -4F5600B23168105F5A2574F4417109C8509FF8A9DBACB3BB519B7C24449EBA28 -91E98B28738139775562BFB9002E1DD9A001ACF9A14E465A8894EC42A2060CED -CB3F7E244F5C276F4BB7DA9D4BD08C607F4ABC1FBFE5F33B06B553320315056D -3796E46C1ADDAEE5E999480AE8E4AACAB5D6D9A22F8FE36D318703FA11B7EEA6 -8AB708D264B54533749092491D0616F90B01442D117700746AAE926188549013 -710856EDF09852E46A0EE6F08671E10567507E500DF93F61 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY5 -%!PS-AdobeFont-1.1: CMSY5 1.0 -%%CreationDate: 1991 Aug 15 07:21:16 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY5) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY5 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{21 -944 1448 791}readonly def -/UniqueID 5000815 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D5FC1B2109839E5B52DFBAF552B11EFFB6A16C -F03FB920C15AE724EFDF0CCBF00A838D34440FF9FED532F44036AD22561184C5 -283722DDFA7285E62754372D716D704AC0E00B2F6AB67154241C7449AA047833 -94CEDB08E8C92907FE72A0B05AE36A7B9226ACD6E7890A0B528FDDE84A950FC6 -801DE75CF2E739E9121149CCB8B1C87A106822648D84A3D3FBF295EE6C4BF403 -BBE9A1C1F6DAEDD1E642ACC486E609703D7612BFFD10C324F5DC710811F7F614 -3691B400E3773987424C0D2B0D8A736873C6371DDB2442F05E018A2B5CA9A4AA -17AABB95D09E5890CFFFED5AC01495D89A53D3C89F3D8DBAC85E06561646557A -B16BAE67D1C3D5F6EC51F05178B6CBC34F9F491056E5ADE1256277DB904A7F75 -6105D774449D6CBB70F2F539D739D011BDBE27A9674A5CA3D5BD42B7FBFBBA35 -89966597639DE60F2A4812AFAEFBBBB26C9E24F72439F3AF2A7D5C0D2AFB5146 -58112FC60E9307B9FE29090D81441A1C3B7E371656A3321A0031038D54BB6670 -0594C9C72FDDE3DE50EE1CFBDEEE5B6DDBA17B1D6328651FE1EFD1E2B8376949 -5353E35A988064FDB6CE37ED4570B49903AF26304DE40164903476EC2F4830D6 -4995CEE9B37B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR5 -%!PS-AdobeFont-1.1: CMR5 1.00B -%%CreationDate: 1992 Feb 19 19:55:02 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR5) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR5 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-341 -250 1304 965}readonly def -/UniqueID 5000788 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 -87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F -D1F017CE45884D76EF2CB9BC5821FD25365DDEA1F9B0FF4CFF25B8E64D0747A3 -7CAD14E0DBA3E3CA95F10F24B7D5D75451845F1FB7221D7794A860756CFBB3E7 -704A52A22448C34812C3DBEDD41892577AABA7D555E9298C1A0F7DA638078167 -F56E29672683C51CF1C003764A8E7AD9D8ADE77B4983F56FE2D12723AAD8BF36 -682CFBB71B1D12210144D39DD841A971F71DB82AC6CD815987CDCF29ABC3CC96 -5EEBD5D661F452C6E0C74F9ED8D0C5B3755551A172E0FE31EA02344176E32666 -14B6853A1C303A5E818C2E455A6CF8FC9A66DC6E279101D61C523BD9DB8EB82F -EAF4D7FDF6372383C0794C4568D079648689A199D4B65BA646CF95B7647E4BEC -83856C27A8EF177B3A686EDA6354FE9573E123C12EC4BA56A7E8BFB8F9B75147 -9DD79A743968F36F7D0D479FA610F0816E6267E5CE327686A5485AB72201525C -FB3B7CA10E1BF26E44C24E1696CB089CB0055BD692C89B237CF269F77A31DC81 -0F4B75C8400ABCFDCEC6443CD0E81871CD71AA3064ABDE882C4C52322C27FA8B -41C689F827FB0F8AAF8022CF3C1F41C0B45601190C1328831857CBF9B1E7D1AA -246117E56D6B7938488055F4E63E2A1C8D57C17D213729C68349FEC2C3466F41 -171E00413D39DF1F67BC15912F30775AFDF7FB3312587E20A68CF77AD3906040 -842D63C45E19278622DD228C18ABDD024DD9613CDC0B109095DB0ADC3A3C0CB5 -AB597D490189EA81239E39202CBC7A829EB9B313A8F962F7879D374ADF529BD0 -5533EF977142F647AD2F5975BA7E340419116099B19ACCCC37C5512599441893 -4BB8166C90763910DBD81A48165798C072DB4EFB12A003DE185EC8DA0975B616 -DC461B2F25044D4281673031D5965447DDB56FF0A36265C4AB054CA9B823CC13 -6EBB9E3ECC48ECEAF586E5455667DEFCDC4FD44B54BDAAE5CF12C75303FF9182 -68095966BA066ECE1A94BC152C1941FA99CFB7E76D338913F7B8DC9511A5388D -CE37AA9865DDEA5F47CC724E4511CD46C4BBC7DD7FE722FFBED6163407CD37E5 -B5235B4A7E8D035689CAFAE7B285E5DE419CE5DEFEDE30A84679457E3409B8CF -5FB9AFA7FE52F21DF15D3C9154BF3BB2C685C686D7399382D5552D4E68F16621 -B7E48419AD107DA8B9C76D119DC27286DD487DB321EF2A6CEEA68C9C09865F4F -9A00AB335BA08B3500067B209C1B444E34C5476A58BBCEF59690D1EF1A3F6CBA -2840F385F08BBC60B5B56A7C78800712E83CFE696C3B0C1E56CE7464C918F5A1 -F942301035902160F7EFA27E147F531DFAF16600B20EF00BD593DEC38CB025BB -B499346ED04A5114EBD58E51D71F8B1FC005FC0A802930D1090D4ED11F07CA5E -F613353AD9A84FA7023CEE5E8D9535479475C32CE36FECBFAB07D0FEC10A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMBX12 -%!PS-AdobeFont-1.1: CMBX12 1.0 -%%CreationDate: 1991 Aug 20 16:34:54 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMBX12) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Bold) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMBX12 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-53 -251 1139 750}readonly def -/UniqueID 5000769 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 -B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 -AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 -7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF -20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 -B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D -68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 -D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E -26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D -F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 -77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 -BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E -C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 -30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 -148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C -E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D -E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 -337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 -0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 -472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E -A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 -32696950409CA08F623B079769D877EC7F8D3FED89B2F414AEA478D22747FD30 -F05FF57C8B6BD9F051C6345E3557BC9C6469C5EF8B591D85599F3A873BE19EAC -FA7EB2DD7473C508C6E2C051E2273F1E635E1407925A2DBBD463C6CE30B26F10 -161D1CC5BA6CA59736692A689D92E50B79C09930AE5D581D8EA434190D751A17 -D6D3710D3EB8C8C9013419B5CAAB4BF489BACB26FE7076DF99D31CECFDD33E23 -098F4D9E81E739FB2EA65C294819A75A90BE5026ADD0DD6AD85CC84E2AA62E94 -A43FCB2628B2FEB5C7A942668003A4BA3DFF838DA9E4A836670E2E6FB1177CD4 -55DEDB05B65D4E3AF7A46F40578B1F330A26B3F7CAD6855E468C95F4B5206A4E -3F642058086900E5468634FCAE5CA1F67F09E33F4240D556EACA8FB0286735B2 -207730F0721CDDBE76CBC2F8B6D091262FDA491ED93517F78BDFE2F578A2D656 -44B1E4D0AD041EE26539E978ABFD0CF7432EE0A4CDE183CBB7F91F86C70B233E -DAD0AF64F308278D68C2CBD0D34FE3F4E0F16658A4CF03C3AB9B5D4505EBD86C -B7D4DC513FCB68AE908990C625396B2A3933CD3EE7B6C062A5950FED3C864D5B -FE08EE2A20D6D8D9BC3E9FB981FE48A0EBE061136D616BC63423214A37ACC8C0 -6544AA233081A0B9FFEF9CFE8A38EACCBC802DAAAA49CD1324E29A6008918879 -B4F2A65F4B457E54310E1E2F69E5AF61DBFE1DEB7C14E2D6972A2D29ED873F5C -663E90C57C19E82ECC0F3202D09ED023F1FA4EC958BD0DFA8E594107F77A6697 -C7BB52BA7B80BC0E3B26A2EAF4A3BF1A25173B8242B6579FAB050750D1F1318A -B3AB9A7E3A1F81C532C54D7A6A296B32F71AF308EFA05C7F4F4780B72E401CF6 -CED86112CCF025B270E10DAB248AA13E3E316A42F07011DB2457A0C7100BE982 -2B37CEC488AACEA8278F4C281EC2152931D4E63D974C80CCD2A4A539FCB525EF -E4EBCCA92D032157A84407BC25FDF77A5ED28C0EEF9F20BDF50E3E2545B82CCF -0AF75216AA2CA421CEFE61330316955BF8A5D75D877907C9E5C0EAB5DD7D4A8F -98052F792C7E1770B768D783327ED1C19B9BDB768E64B55BCEB9DC71D0797350 -F39E720F4EC0B3D81CC23BB286DAC3214A0ABBA29741F654B47B8C0B25D607AF -21EE82D66AD832BECB2578C993A6F75E4BB474FE79390A3332EE348C803AB0A4 -F811D02B31343F4A963BCCDFAEB098BF9E8F3A6C5347CA9BC975186FAD311763 -EC02644C1365E7F473FD9B3725389EB37104B68F2E5006D06B8926442F63B9C8 -10DC646D2EC9E321B0D531D966357C9ECD88EDD23E1842101B58026779AA0772 -9E18574DEB4523AB93581C9965070258379F698DDC6C384C65D2DCD92264C01B -E0AECE1EF45A7BBFC7E6D356612FB2A5F1B7CCE88278383393AE8D4A7C9276AF -0250CCB5A92FBDEF076933D878D370B812AC9B1C0DB37E84723A6F0467FD5794 -7BCA39762C643F5A27F70E4D162FAF6E3EC93FA026C0358E95BDA8F460093534 -FEF536A902F8133B3045C9FF3F296B91D92E4622E563E79E06DEAB375E78C797 -F10FD03F41E24FAC3767C6A5CA76FA5FC787BF2D20655B3A7BF064DC19A0A5B3 -9B385DDDD2CD667B3830F4E8DB9E64DF1F58328B41E67316ACA9EAD314E179D4 -CC3D171B8D4B0928E8E3E2D47F670037C2B7A299C226EAA0C3B264661F5E101C -187C317C26874AE7A34067C6579654DB68BDC950741AB18554506F8BA0DA5D46 -B8E8AF6383E6FE55E26048F4EC8252DD4FC725407D3A99E9BEB02F789F0CFE87 -C5C8A22D8BFDEA4CF92834A4A5F32296CB5F8E6481FEF54EF3590EAD2723C788 -194AA9C26AC0BE76C07C5F42BF874F1F0C53D6EED2F925E7C95BEB542B099F57 -EBDF7EB915A571E54E74567F48E6D1AC4B0CE3941A4835867D3ECF94B7EE78BB -9F55C0F176436B19C2262EDAA59ADA1E0CCE995B45C48F33F85DD67D81C4E71B -5DCC4482AE9DE803E0A37406CE5F00478A90EA1456F6C1172ECBA11A0AC29EAB -2CEA779CD7950EBFCDAE40E163939E6991E1909E547D18F9E9D2718724D6A3B3 -34D7CB9DA8E7FCA9E79AA2AAA95BFACE030284FF14B2FD0931267C2EEF68C204 -AE01AF890DE24409115A02922342380E8FD8E62B7864D21BFEFB8209B605944C -62C3566253689B42D25982B68F73DB91B10C8A6FBEF0351A8440D1F3CAB28341 -92C6C12B8D26DAD0AA7D024D640496438EB9844AC3398E631109BFDFECBB82E6 -3C160371EA47D3A1F0351E97BB3C8AA99F4A2FFE45AC705BD2A07CA07D8BFCC0 -7F133708C7FA45D2EF5BB5774C94D7351443EC2BA688AC0FEFB15477ADD0F1FA -ACC58B33197227605E1733BA8CBF4E50E3D5AF866C11E35F28AA30051D262E7D -40231267BEED1CAEF039914F23B6ADF04BDEC72941AB6E6B28C2BF47A3556731 -A02920B5B5FD094D4A152F5C68DB7AE081FB042932B8ABBD7FCAC00854A0FAE0 -9B473DFB8A1376D32EEEE97CFDB669E9C669FDC9881023F4727F5DE92B7E4C92 -E530228D503FD4E193A46A472D7394C3FD1F28435799A2B71EB4E7CDE9D60765 -3FD70390DFBFBA1A227F29BFC30A337B12B58F145B3EB25A8C5CC9733E8A1497 -90C8E47291D149939A862FBF40EDDB37864A8A1EF840E8ED9B9326CBB13CBF88 -829506A576049AAB1979290EACD4D6C7D8BC13225BA567A23AD348353948A3B5 -CED44DEF11BB6EFAD3B830BCA6FC6E65D3FADE5A25C7E3EE810D314A80534D27 -71B98394D43F697C884591798251A15DD1A908C021A170465E852DD27F085486 -5106A8D4B9F20ABD048F4FF67E5A5E7D6E2EDC960E95641AC38CDDBB7DC8E4BF -854BA776807EC54E25863797D3B4C97367636C1A5E92B1324F05C9FE3CE74CA4 -0DBA4E255F6FB1451B371640144B5952AAA34FA850A26F6CCB12B7CDD0B3CBE0 -D7883C33A5A526FFCA213EC336BA6CED653C04B458E6F02C3C7149824B5E321E -3A23DAE71F685100F6796D8A9AF2697309539BB186E8DDC3212E3FC8D096CF56 -E6AF692CA08009ECF9D917F55A8E04F2B85833B7DF6D6A291A04E5DDA383C3E9 -7EC5CB874F817965BA66438DB760D45835FE3E82D0031F9D21274E606E6FB383 -8F90744E12BB090E6BA2D6355EE718FB3BFB14B5C10FF95791F8590C6B07C090 -3CB6D34D7CEA567CF844B1DD833135E56FD801688A4550E5B99029A07A7B2E83 -081B247F5C18293633847B73856209C9331150D17FA70157F988889393675CB1 -69B12CB4B5861F6CAD49E47A1BF534DA3AB8986362488CBAA5DD57848C6400D3 -0A23D759793CA140794E7ADF67278831C6DDA5F934D571D7D3F6D15C6369A9CD -50167A580BBD77435C4755DE5FA01B7A14985ECE0CB2D37A45CCBB5F30A410B8 -31BFA2A3E9F6BCEA5DCC226ADCBCACBE3156ACC4BB6BED16F527E003059DCC22 -9E5D234D2F4A9C03B48A561AE7B52BF86DA4060E1F26E6E0E74C248C52163844 -C9163CB9E5C7637B652CFE815CFA9F99009BE112AC26DB9DAE9BD0795A40D766 -A2874F626A6B9B22AA0CB2A69BD16AC1EE47AE6F37AA221140967E845A1DF19A -F910FD37B726988CF48B6F3A30B8E8F7B3AF54FB96F5F1B7C04480442CBDFAA5 -D04726B1E0380E08252B45F67C74E7B51D8C201C794850D6DF4FC7DE4C0FA7DF -DC104D9F389F0B4EC6F567679CB9699DF7A578F3EDC35379F42A4477C14B2493 -2E346A54576521E840161BC76672513EC8B893707B1588D7791125D5E5F364DB -E91EF2EBC5DA914F9424DFDA1737F04C96AEADE542266648CA4F6325D54DF7F3 -3A97144F4BA999D5928D54DCA806B6486A1361072AB07E67DB96E8C9745705A4 -8D7CD002689F1B3229E408E273ECD86A338AD072BA0C9833DC0F7B8FEF2794A1 -36BAFF6F4EBBF6DE928323E69777C06802392960F72D5436A40AFE69D87FF507 -B5676749B4851BF29F0559D50C2196BB78EE62B6DEC08C30C8C3BA273A370D20 -6487030220CFBAC9D7E1089B71C25FB2EB7E89779617EF82BF8A5C1F57974B9C -BCE18CA23E06C227633F2C1CE2476BF5A7114FDDA733DA3D5212E714EE0FD1C1 -2BB315120137D6FFFD0F54271A91B521B7949C3F53A5E46894388088556586E8 -93D53C4A872E8A9EA3E78F272C1CC2C5D68B9B793881209E269EA60DDE7270DA -32822D71A9CED08940A17BB920C422680AD72D41C944925CF31E57EC7B23DFF9 -D0A67208AC81B343FDA5225A06B6FE7BBB95602F206CD4A5E5FC4A9CB05CA3A9 -2449217141D5AF38FD8A1C8F7C4F5571AD78C3C13861AF1336747E9AA791D5B8 -58B0F17F2501329E33708421DC7DC85781FC6B1FAFCB666BA5FDBC9C537416E6 -474C08117E67875FC2BA9CB0EF222E2256555CD09A44E98092680F7CA4ABE77F -8DBBB97A82EC81591B3E1E2084B4CCCC4C5903626D3E5C4417B0B917896E0D71 -4ADD6B3BF5840B30504610D12E5835C34022DD379D5023F0404EAD5CE80029D3 -26803B75A19352775B6CEDA8FF50F416229A20B4F9A64E6B784EC4896E69023F -5A34D46A380CBE64E178F506322652F0791EFF17832E040A6C018E45B00831FF -691D420F09BCB59D91EFAB06E1821411A72D6C7C29C084AB7B0A42F1CC29C627 -95F8AAEFD63A09175690BE9546B20B6DE02FAEC865CB31C54C6BEBB1442F6E89 -17378EE5731B03B89D1361F80A97FBA380F41DE3F787AFB050DAF4213BD06177 -20F51A46C8CBFC5DBB29CB2F5B246C194405AC7820926D1F3D9123FC7923BB0F -312764CE1727DB970A3E7054C168B5DE8189944C7857C4A1C0E39EA4389B03A2 -5EB044D70CC239CAE3712DBB7B1F5FC32AD9A729CBDABD0A5D571F2463757A94 -9B78B75761AF853D804D30177DA75FA901C5D4661D3B8ABBDFEFC95F44A065AD -57BC9AFA444E0168AB8807CEE80C7B0964A3E5F85CA7C639FBF08FE579068986 -3B9BC7ED440195D084664785E3C58B2967186FD4A8CF7DD8B2F04ACE45E805AF -CC58E800C3CC2941854E05FCD590E6B17BFA4B2030D20707A91039D80C0F7F1F -76791ED3649994B8EEEAC64019AF1D74D15FB3BFC704A43830B85060DA4ECBC9 -657AE36D6FB0076857397777A15677171E3EC5408E430B22C58D669C9AB27C88 -E6195298D0FB679AE6BE713112013DFC15CC32220A8A9028642B938C37ECD4E8 -1FBB0942803EBE048F908E1343F3149E1FD97AA9DD48F4F865695AE60DACDF5B -B958BCEC8540717D5292C2632922BE089CEE3B0A7620BD6E7CCCD8AFCD8DC451 -730D77AF372FFD36FD39363404FDC40880245148032A8E9762312F936F5FC9F3 -D8F619B7E5AFF821E827655167F4AFD91DEB34FB03C43BE3E59B78D37989AC7F -0FC0C731DC90BEC3566FBF603B1B522D5B2678AC0ECA785A118073A3DEAEDB48 -06949A6D6325FACDCF6745CE4315B23C9415F3ECF8D1A61317B6C898F0CF4AF4 -BE29EF34E078AAA02DB3B7B34A5F74594CA51DDCC794D0C5F60E3B4633B8A163 -FA3A9C0D43B2D89B07848A0F15E8C0DD472FF5A121D161459F03DF7F7F6E5B2A -D466F8AD00CE5C5BE4CCE727690FB04BE852D09C94BA2B4551BF8A4703D4B573 -097CD22AE7A18488CCE4612F048AC2D2A826DCDAB9DCDB4A984BE564A3FEDF89 -583B40B21BA66D541252CAD5C5319832B5C120C87F945889B7BAB52BB9241178 -09607B7F8E04941CC716E5D805FAF81B513B6C76B15F6F23197B66DEE304DB3A -7DC113009F161601094E39AADA48C699663CEB4CBA35655E3B90884CEA2635DB -282F82C0637574DA81EB4D0EBC7CCE336511129451601364D3371B0FCB889C54 -D7730824F1F2942D40244C0622E0E31132A1B7DD5F6739E3478072D954011E96 -DA5D6E5BB8765178BDF300CEA1E40B167BD791AA6430EBFF99448B605BAFFC88 -B7D1511F288BB27D50BC1C60210C4163905B2B253228EE7D19A7ACF7F3C255BF -6343AAACD5B4980FE8DFE5B4CB920DA276432C44C2D4427BBDA03F8417C16B75 -D956BEE4BEC66CA8969553A0B81D890E36400BC9F6EB363D32B68EC925ADA004 -0B0C03166D20AB315A1B933CCCBD8F35C6BF081D357F2B34D903E47284682831 -CCD8F9B26FED7A7A4D8BCB76A6523AEAEE19703EDE988B2E6EAAD7C9A6947AE2 -C85A3EB57FFEEB50026E483B2A2B14CE1E0887BA9EA3A45CEB5D7316030C607A -A04D5C80525377F226C435C57BA2B4A7A4629B7CE45FA466D4C321314A69EE80 -DAA9585E64EEF0B5F3D210245C09815DC4646C49589B64D0C15AB47626F02DB2 -D053A4EE45A472CB8D472DAB03DDD260A911C1E797D627C62627915B4D7D34D7 -930F2BFDC398291C22E8784B4AFFEA33175B9B40158992B2441D38FE4FEE5C2A -44FCA4E2A1DBEB6082E8247028C2BD5478B0304B13D1999A2D84CB1EBD3115D7 -58F9EEFF315DFD9C4847161F869C001870B1EC766284C45CAD75D236B9B99D67 -CA5A8850AB703644B63928FE099C627A6D0B6A1F444673D44C8C137F88A613DF -28E8A2F726A0F90475A7A76895248FBD54958DF7387062157BEEB14952E87DE8 -823953A9C9D4C9554CA335A4523CBAF5EA4A978DFDA686C9004F4446EDA882C4 -E061F2B6DA01FB2E0735EE3273B7434973D4313CC30EF797439A41D05C6432F8 -6641031665E82168BA353C6F46358A8BACA882EEA5584534A041D9E5F20E3BCD -DD55BC728C90F598A72741EF0A03C94E41C0DF1A34BEA1202A4B9D9C13488352 -E09CD23DCB5982841828FA924FC0DB43FF402A350403374BECDAE917FD4ED796 -F7C2618C57A2D6BB7E55A8A0A32B18B10739258FF1879FAF5CADB10CE8300D2F -34924EF2D264777D0E57238CEE4A627766D2EBBB31C30C8DE5F8E81E47A7CD9D -AE1B5CCAB0CCE7EDB2F88D27C8C86CCD33991143B054DA306A743DFE4D0AE6E6 -1C78290C9EB1EEBF911287AE5EEE3DE565AD47E0FA25027184DA138CB582462E -BC58728725415C44B066B030C85A82254BF7012D98E4327383B4C263C6FED818 -650D31F9CDFB3356D771E8379138DE6125D7BA74B191E3EC40CD12ABD14B7F0D -6270CCE8288D28514B972C0209507574D984666DD9742D2B1C5F5212407947EA -F387A3C4923BC85D8CF6A4BBD0244960AE65642BB19B674DE316E505782E747A -68BFC55517D5F82B11E71575FF1CE239C8B99D4B7A2BAB0946FDC716F7623C8E -7CA1830D86CAFCA0DD6150EA6914224CE3C847E8A570BBAEB0326789C5B955EF -742C06DE9A8CE3440BABA116DFEDBA3DBDB2842778CBADEB7AA13D2B3ED192E6 -FC395975B134D233D90CA58518DD602A7B606688B1740CBF407E1190238F71A4 -B194929AC18A2C95A604904DBEE39C868BF30D2FE472A0288FCEA7BB90BC746F -DAAA45B97F98A002732609F59A76FB89E72EABAD506BDF1C38B94BD6D22F033C -0552C87C633D0C504DCC39BE71F5B3528C1CB666EAEB4E3639ABBFE6FB4B19F1 -C61869F6C98FEDA4388EF64ABD7A05ED222B06405A75B26CCBCA7A9B1808E0AD -DC4BB57DFABB9908697A73CE83C54324608309AD7127F42C3E7FB8CD7F4CF829 -E28CF1B6DAD4364F879210DA542E1CDD4249423E5280C418F8CAAF5B62B6E36B -0AC8CF20C06D76238388A88F33A038442214BB4F1554E3EB694FE5AE3DBD765A -56B499C061236BFA5F8E4DA53609C3F994FD0C8DCB2671AC7518DA62DA735E85 -A79CB8438349715EBEE98090DF2FCA885E386707FFB67C7550963E74C530B454 -142518222E754DC083BE110F4C9D84EDA51B4F34EE503330B3A1BCBF5E924FCE -E262E3A35FFBCD47E86020FE0C3A41AB3A4F8519D50D650B161626F1A96C35FB -99EE65BDDAE997027958D9DE5F250934DEDD8AA7B93FAA54CEC076E80A770A67 -8D1F4D952960D84CEE4C7B15C633C67D7915DBCC78FC5D7D82E5E664CE97C58C -8344C1B0C99047714674BF46E4C97A6EF5030CB72400515AC19FB04CE179145B -D43A3E96DF82C6AF2A09B517AB585D1E466F31FD081A5028E0541C3C080C82A3 -6629A6BAD8D71CB98E109684DD38CE3D4F51CE189879753DC77F28DF0411B98D -F4556A0D1C931E2A9E319D590A30FF3D9DDAD36992A360BF4F67092396630BDB -34BC5EFE7CD806F1C23C325411105E13F557D3BAF9D0DA30FF89153C896E90CA -A4AD0AA392F9AA4FAD92E1146712218FF911A95453D56FE20CF5FB40B5CAC7EC -700BA14091E6D5F667223B0240370FAD569E2AADF70F086C9ECCF411C4B242CD -6E6B732E3A4C07E27933C453B7261A188F1E60DAB9C69C960F3C3888CEAFF9DC -49A5C03779F323503A4A465D8291AB12564980E45671E182E0150ECC057ACAAC -360AAE46534480CC2E2B7D73047A0545FA59EB710ED9CFA1B7931946413A89C8 -EA0231399023684034107CBB3D51BB7CA5E14D4128E29AA4775D749A346888D1 -A5938E78606DBC5069823B0A890F9D243EE09950E8DBD3EE1F2E8683F95599F4 -5033DBFC38F88E841E346AAA432746DCA1851EAD10140E8DFF840D90F2EA7A80 -175E3208FED025F5ABA702BEBA3C729E7A7A5CC3901C1AB50477D5561EBCBF7C -450FD652A0FC8B3BEC521B6E71D4D7AC15304A37DF03C3766EBA4C6FCF04AB8F -65396AD82B65B49D37D15A0BCBB9A295606D7050E34FB9B0258D995349D8A35B -B93EF18E267D7BA484CC2E040605B14C5D7BF3B04EE958582838A063190BB715 -87FCBC6739B81C38006E4B2FBF88D335D8F889AA4D6B493FC71E9C9877FAFA0F -A89A15ED16CF316CC3EE1E92E30717526EED2D742D1394CA53E94C2E050E623A -0A33E57675C7B6487EA34D5DC0C22C968DF3EA623887ACE6FFE10A41A8A7D025 -6009F30C7395573A4AA40C2C0EBF9E80FF7EEFD4D9D2FC1C69CEAF25C80E282A -F9F31261DF9A37A35816F31E1D2D27FB08D0C936ED364BAD6F0FC23C4467920F -AC67EEAB3A5D7A50021715B1AF5C5392C943DF781EA8E805C93D3604ADA43E9C -810447F9FA089AE320FAE56F1A264B6D32689B2ACE7703442634642CD104BD3F -CE150494CAC33A87CEC69CFBDD3D34419C2964CC78E14AD80D7050B51EEC76F5 -D566009BC64EC06CDE50095BE79F76605FD3C6A25C096D9E06E6D38A7EC189A4 -97103ED03A1CF05CE62BA31BBFC86180D12D76AE33734A64302EC1D80025A3F6 -5FD95C9C30406C60A9A4EBE5FB973F3D68C566EF74FAA857D63767504B8EDF58 -AAB6BCA39B14C4083F3A7256C9AF5070B7690CF58DD6776BB6F416F6EFDBDE7D -5B9D3840102FE0FB6CE7960CC058A0A2AA7C27B7259A9DD9CEDB90629308C95D -FCEACA2779951D4309BCB71AFCE76250D446A51447FA0B43C830FC7B1D3364C9 -484861057116FD4DBA048743CC7A0964898D06F087CB0FC64A00D1BDF8C91581 -28AD8E69A937FCFD9D1ACA7D4A85AEA9AB7047E11BB4047AA248227E999AE218 -575291E19D3545915AEA2C3729C6906965BB1F9F9C6D0D78268F23BA46CD86CC -5F7B020353E609AFC90967AE3671007916DE115A164310829D092969563D1C4E -C2E147715C28F61E705F3DBD3AE7274427A6F25E39EE2E9DCBC4FBB80AF69C0D -5B7391CD4BA26C2D974B4295807B63BAC79B718FAA4A49F9C6A166F32EE923CB -3B0A89D6E2FF495015D5A85D0B17B10F2BB783F292DD1FD303C06CE8A0858C8B -844244CF2790B31532F123DBB53CCBE099DC152890F5082BF9315BD50FD9F539 -32DD8F71589987BAE9270B55697AEB7DCD3773E6F93802663061698168BF0A34 -90B3860BD2A3412CD23C4068B5FF5841A45E29DE529AB3953CE8DC51724C66B6 -F1F23FDDAF58B22D7E4EA6D64ABB5988B04DD4847FBAD61625EE898A757C8543 -551928AD250D71923CB6C51D1CFC9A696C17764C0BBA62BD0CC3909C7B50AE1F -A6C7DE2641814BD76BE618AC99B6B2144A78AB9652D5976681185C6602D5AA79 -31C75366530E7EAF3E5359442207B8421727658AA986D28FE1802D23280007B5 -EFEA1C2C4534CE4A96D9D00D74B2D707D42B4095F1F97EB63904EBA734912AAB -DC29247413311E1127329611D3ACBB278B438CA8B69A874045AE15472C037096 -EC321EC22802BB4CA636870BA41166866465C23FE77AAD0E2B6A78C160925501 -25922D3252BEB328F1C14BA743BD44751578DEA334F727E698EECC57D3884900 -DBEDD28082EFCFBF2166DE577DA95D4B2889FF6466607D7FA499F1C01A565063 -2293EAB619956B54348B41BB6DF2B4E2A1F6E6817F268C515D08B6B5386F6F3C -39 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI6 -%!PS-AdobeFont-1.1: CMMI6 1.100 -%%CreationDate: 1996 Jul 23 07:53:52 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI6) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI6 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{11 -250 1241 750}readonly def -/UniqueID 5087381 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 -5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC -4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583 -6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1 -8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283 -9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9 -387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E -6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7 -A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169 -70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE -EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927 -BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F -3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3 -3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF -9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46 -D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93 -FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5 -79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69 -C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508 -0797B87C7BBD9D6B4435A339057C62703403E5F5AB422421963F37C30666839E -9A2D8B5FC2CF513DEDBFC9517F18F547B4AB993DD09F438A2CEC6528BD48B3B0 -CD86B2E153388BE7DB6726D5C67C275DA6CB9C645120CC8F426ED3138AB22771 -A6C7C29BFEE26A6B6F0866186E5C6BF1673CE53D9B02A54612CC234D918C83FC -C5A059319085453C9077F24C2FF52A921785F5E7BE485EA7760DE5856228C30F -C1A4FAEE7258A49FC04480F817502439D92D6D19402F758C49A531214C00E524 -A022115B08464B6743D28FB757E8A84F3C8C6D4B736B7586CDE0550684071A44 -C6E640EF57CD289A8A6DC66F8CD180C684806542B16F60BD00D1EE6E19F86001 -A2AB18E5AA145DB000AC4717986B978A1BBD18982AFD9ACA81FDD4FDA35793CA -60669A19F15459B94AAD9BE6C91C9B3290BB0374C683A5F7E13106BEE3B20CCB -4969FC0F99AD1537EF233105F1991524464294E05F9D7FDE7B7FC7039495D365 -7E670F32C5AE66FDF3FC41DDC850A59366AF006B100C553B2A9B195B0774B742 -6FAB29E8DEB63D86F2013AD9324443BB60173AE21BA6615EB1C00C2486316991 -85CA5A11381B143D71CB1192C9E6173410812F2601EB9368D0BD29579A50AA3D -B1FF52367D5DDC3B39A53E229279EA51996A817BEA9AA44B59EF08B1CC183FC8 -CC71FE3ECD2681DBD526A5ACF8E899D316F660A9DF250013882FD09E65333CEB -53829FF3E5FF7C9C2CA02C4F893E3841C1993D3C4FD2166BC77411C0405CD7FF -C112BC33F7A9945CA3FF42EF1F3A0702F28064F104DA5DA0696AF2DD97BC225C -9B749F6833B5B275AA42B0702AA7AE9AA2EBDF1E6B55F8568BA4C3027199B8ED -939F6540525EA18963F788D2DB51A7779BCBFE02EF87CEDB346AA84BB872444D -43B2C2B00EFC3D5737CCAB52C6982BBB75980961CEAD44E663E4BBD24F9EB754 -694B72D5CE57B0726ECEC06516C66BFB39319E07CF2CE643F1FC282670BC66F9 -A7413D07E29CB416AE987B2CBC1EAFFDA8E0CD1C4CA4933DB25C742E81C6464C -3BD993ED9B050071A8A0AB7ED5C92D21FEFB1B9E5312E0513D83C87F629F08DA -F5D8732B2EF40F708A7B952FC296D5A9485B977013EF06045137BEDD5F8837C0 -A5345D4092FD50EB328674BAC072D3783ED4EA223B5952BC18116AC0C6D72AC7 -618201DBD816C47673BD3409347ACA934BAA904F73BE80251375D0598A992371 -89246229BD0FAC2ED4542F5CA50D563288ACC8FA025C54912B1778387431380A -154E9AE821245D4C1A8EA7F931ED266668B80F3BD371F3F1C13FE5E76B503BB9 -A5321F505D975FB7DA5AD6C2F7714F2104773452CF1B7D0AB4F6DCB4A15757A9 -A679AEF1CA23843613B0B4C1E876C8059286DD5ED2FA0C5FB95002D3DCA9CE61 -E1FDCF0D20D2A70521D056BD65299A47632DD64D1284E87242E5EFFC40199D96 -62866CAB9EB8FAFCB1D3A192B08AE13DC4B5C141324A0DE972D0FCBD83FF6FE7 -3DD2B64547B02A73E07A19CB8677A89024291325F96B8290DD43E120DFDCF4C3 -5A58B4BFA2D78D9226DFD91DE48C94DBB2B30383CE9E95AA68378FFA317BA90A -4E6B4F4CA7434BEC72EC8FDF20357EBA4EE6CC59633AAD55BC6263E9A3E6E76E -F00311E9C60696463A4281B59869DCAC673040368F8C668C292CD2B1531D4F0B -058C2936C8D4DF78997CFDEB95DCA4A6D5244C647EB5C5791FB3967F13D5A990 -A64F8A2008020A179AAE968A6881E5A64F0211D05A4FE791B0A80C5B3405DD21 -9E82F86A3749AB114BE565F5D64587B8E361E20CDEF7AC0A657F1F0D84055F9A -EC068951A8A513877DB9ECF6930A7974D74074DC40C139F56B13278E19664914 -27DB992343A7813ACF469C1B4D09B5D1B3B51F9C585C12513D2E4F8F810A7284 -2BA1676832FCE35E6BD07BF25B7AEFB6292AD35ABEC2374EDF79FE02A806E1AB -078CED3A748EF14A15D2573E5890A179C9C8E7A98EC6E30D91D452AFEBE5232F -A6D5C181E5DDB2967FFFFAC662452AC6724DC898D6563EB1A21264FB416745E0 -1628D25DDCA679E3FC4B6353AB563DFC50F6AFD0A543C3C4FB2C4DE1CC403FFB -B7B57CC5FD1D16490C883E6D913B955DDF2E413955 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI9 -%!PS-AdobeFont-1.1: CMMI9 1.100 -%%CreationDate: 1996 Jul 23 07:53:55 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-29 -250 1075 750}readonly def -/UniqueID 5087384 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 -86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 -DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD -67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF -6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 -FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 -22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD -730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F -449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 -97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A -E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C -AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA -A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 -B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B -9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E -759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3 -5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2 -BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680 -3435E9C947DCC09FCAA752A2ECB71CC82AC536ED9047F4480EBEC318BBFA9C41 -F803672E84E22E99B9FE2285DBBBD84B4C24D64542C3E62928E2707CE35B2150 -A1930B04764E87358EEBE4C7B514099B9C66DD6DEB3A5311DCEEC3C9409E4EEA -4FB5C20699F30358E108072A77465CDBA904C778412DC805D9084EBD50209224 -B45353F49841BF44A63F88FD6E05D8622F5DE69E764CC8002D0E4FCA19AC9306 -58FF04BAB30DE40EB606C86CEEFEBAF7A4F08C5B238FA55EA6AA7452EA88F453 -854705541146CF4B94016A28A6A8C322B213B5006F5541DC2C5C756D2FB6E1C8 -DB662BF5B4D09FE8AAF4CF46425CCC8D99343B9FCA0B2AB785334C0677926B76 -52ABA355E5D739EDC10A340A2E76E19220C6BD6C43D69D38CF0DE35A5CBC35C5 -271AF76738C57CA043BCAF569316EC5D57100D39DD2D082E7CDCAA52282E4577 -B2ABE5055FF9C155F80003F7CBCC3440A62C8F5CF3E79CC7322DF4EF4A5ECA32 -580F99EE300E5CF00A7B0ADE3708780CD6575CF0CE6F3720C48CE07411BE5207 -6DA667100B3D62FB3F68F50AA11FE4B5EDFC12AF6165A38C024B560AB9C5DDDC -7922FCBA28473B0773215D06867020572CC2DA5E04CC087E17706E938084F9DC -2170FD4C742478D1897FF634EC2A6DF3865766EA5E4306D1CC73C4114416411F -33B1F7D104386D9495214874C763F694B0BD49B9C5B5BA08FCE4E4E57629851F -1DC1FBD0F49D483382E330424EE7C3DF5F30F5BE8DAEE4C479F8BA03E124EB92 -CE5A3891FB5010A4F9B53E6A4CE3167C126CB3D1055F70807A2F993393A9493B -2BD98192FC37434FFBAAB244AFEDA3BD2A6471CB4F2CA19612E8D602DC6C1E8D -F534C808731E63BF0AF5C2CB4251B05F70446901F59E0B0E3C5B2370F5F84A30 -B5554244F135248D719C803ECE2D098F3CAB61305AA37205C1383A0083254C27 -A66A673B80B3555D0F55190909C3692FBD7AB4101A2F5FC1BD815B7E905378F3 -B720EB82A42A08488ECFFA61E9F3EFDC4B7A4DF8F178AFC184DC843049FF9BE4 -765B36E7E7DBEBAC01C35D24E4A1C40BA5006A049FBCB39C6EF2BF796473AEF9 -4CDCAEEBE04B9DD51A8665B6CC0AC2B7B40AD6168997BCA15A7356DF49B87844 -D114ADDD67E44903DC05A98509D1D918E0E5A65F90296F45913A46DD3C0D7B2C -1E92D354D7F8869159CC25266D166718F70E39CB079EABEB2C37ED8C1A6C3239 -865BFDF8F5240672F3B67F6112860FC5A17688661752EFE3FCDAF878C5F66A92 -ACA13E0864AAEEB62D0F3B7EFB0A12237969BF53C7841F0B1AB0E72183D59F83 -CA99076A8D0EAEC4AF02AFA643332C4B6E13E30B23016C249A5AA8732ED48849 -D2E8B37AC280E2C7C0748FB30270D371E4F75FDCF059CD595996FA3D586BA38E -71825486D473EBF806038669731519621BAF265E1093BF43FBA3A1977909E8A3 -C0923DF966632B07C6EC1CB4B41C306D387BD5BFFAD811B0DEAF5E687B83B940 -67E18D8C7167B19A8BA5C3760180C715804248F6772AB5AEB6F024B7B5D30E7A -201B8360640BA3C6B8875729BA3E21BC2890B099796870020D8E28057E3722BA -0EB31130104823A4D673CF3B48EE7473B81E327CBCF0BCD895F5E6D5509F8C14 -124D9F849286027F42E8C91CF2E42542736622E17BF751B26BAE612DBA60AB7C -B73BD45D6096165845B5ADEE3739AB8E6176C6FAA943A078DF7828FB9EE32F4E -BBB46E27226CDF133B8FC9EDD3B749CBAF17837E6111FE15E268AB0B1DBC81EB -03B2ED3559F3D11E73D558A68F5C7C381E1068D923924F81FCE8011A0A24308F -3942BE79E2A464807E1D7A261AE034A081A07C8B12938616D7B068798E218E87 -F15684FFF51FBDE159BA0DBA39F76EA7D22628D7D8D8982A6C6EB210E7902698 -949BB94DBE647FF7B51C32F9EE98F1EEA88085E32E357BA784CBFAAB2935410D -64C93B09476B1832D3ABD0D29790DE4992A4229BC304F0F093F05F7B9CAC0487 -46399BF56572FCF2BD0B59A0D70F7270F21981831E12E2388747109BABEABF21 -21A43087A987720D2DA27CBD23D34BFE402721FE9ECC270F768D15A153048ED8 -20EF34C18416445AE25F53E5B90B394D2D02D5A838912D1D2F4F159759DAE30C -03BB44101D94177B578CDB771B155AABF690B395E65BD3DD6D3289886EA536F3 -894300A53B6C6B30C5588122D9AD1539F51A5017371B66E6AF080617FDEBAB18 -3B0E8733330D0743DC733C601DF9F42A98C263EB3DB2DDFCB9CC747336D79338 -CC3CA8D58F9C98EEFAEB211748E8D6D0E9BA01EDF82AD22B41F87F2E87C9AEB3 -B26F16245C46A6A6647348A820F3D28543EF4452C3CDA6A8A6DC587204C19A9F -2C2AD66E2C82A6D6FB1FA77EB5EF7F97DBA74B35D26251C285B659924C735F34 -FB9DB04E515221F91A01E6F6C8CA93A02F29604A8CE30D2D4E5625B299C7CFDD -3E60E86430A393984E0463B4E7F7A9278C920703B460B27DBF6F4DBD8A506AFF -2BC7A171867F33D5698741476EA614452F12E24E93BEAD6B4705A392B980C024 -99CF61764EF4494276AD84E58D6AAE5382C306AC04D4DBC2264922B849BFA7FD -269A54782CD08947F612BCBC418E6667BDA05FF6C783B17AF25988219F9AA38A -30CCBD78BBBBD1DF93E72D6A78620958B06F42481046ACFE4B06AA7F892325D3 -F4663BA0251FD43E31BD324CA2FEC16C4BEDAE09A5F6E93189CA848C6CCF9A8C -FE11B88FE31C42FA68241D82D2D1F4905F1F76853C00C163FB7E3AFCFEC1405E -F6F05C2268BF90188EDA0F4C69B3020D9635102F9EA1ECB4DEA4392E555A8E9C -4DA51C5F40BB889190533E079BD660974F8957DFCFB30475573ABF62D6F5E7F7 -66347F3F15646CA5E82954477ADFEF8D8621AC6AED4365CAAFE4D53CB3F46670 -5034704DF5605D25C3D2F2AA99F7F2AF3E5583870D100C3132E5B8EC8386B655 -07D9056B211C925242EE41160DCA51C58E416EE510C9AD93BA2B6327D9E5EE1D -B85EA2325DBC4A12578D7BBA7DACC3434E0D8EF07836E56DFFB69DD918D4F886 -A9A4C1C95BA41C3B8F0FA6FE0CCE5301871CBAB57B0AF5D8DEFBEA44DE7F014E -AE4D835D603B1304823434C1A01453F152528D01B5B6F46C8D83DFB1CE3D9D05 -2CE0B2FC0EC926CD9066763B8008163BD760C786EB15CCC580FBF9C2C7743F64 -49125EEFBA077A8AD0FF5DC31F4F65A94CC602BD91A74132E6E0F89D82F495AD -23845400393647A0F1D4F273676C7E170F9F28D8D12162E3223EAFBFCADE1E90 -93995943A8C336C4801ADAE0DB92A0B3E87B1E41AE0C115334B08E012E579B18 -8A98F9E6AD882E583CA472CF897C02BCA4FC61375A43764C789C7AA00736F298 -66B06C03C320FC4B44498A5796FA3310B32B1FD27263B94A0245669C957EAF36 -A0F30AE9B51DC17CD09B38A9B900B1A025F60031DB8F977A4CB7EB839766D386 -3858277A0B17D420480135B3D89B1A16AAC382D6CDDC87F4D1E9CBD3318340C8 -32C7C490979AEB89CDB17CAD70A3DE99509D805F111D30EBF930EC10C96A2E3D -AAEFCA3965639286B9EBB64E0DC726BD2E26C4ED7325EB88379143616041AB25 -E25C62C8742F251CA44E5B6F4839BEA1331F03214CF4864D36069437EB3AA858 -10814A5C57FD5801CE7457E53930172E82066AC137289D5116147BDF2B753782 -A41043EC5F974B9270D86E15BF0C603C0E15985AE27500B670745694E56A1CD0 -9825379BD6B7632CE002941313B09F2C6055560E01CF42C1F054A10A3AD7570F -67EF2732D06FE2C103EF862F27EBA62D0E8A5819DF6BC4710FB39E1B79E13F59 -C6BE535F004B2867C115D7B8E9AF2DDB6DDF006DB74E28E476AA335A820F9FD7 -3F90D70B0B5B1A6EAEC2C43C595CCD6C3634CD752E63222ED01F333E425F844D -8D255DEA3BE7B59A53913E717A33C1C4BFA4D8953C946B42CA64773F9F37512A -7C723F7A2CCCFEF5C2C57329E57632A08AE6B741078F668E850823A836B4FE7C -463CD9EB28FC1AC2FC7F03DE655F4469A22CDEDEEB0ACB740957326708154463 -1C6A97E16B2075638C7A73AB17DCFAA8B8AEEACABE979F627E624A79311C42DB -7A3F715CD588F83258C0D67060AA3103F7B494A649AD4082920838C90A078073 -21AE851DAD4E92BF1A6EE6B32AEA9756C671D9F3489D9A7E5EA328315C85F5E0 -62B586D30249F65F08881A1138520917FF9894F1D2E1698599340F8B00229A31 -9A573287E8FFF0A44C79569D0569A83E382F14CFA1FB5C43E71FE8393611E309 -3F5A50AFA2128034D570474CD6F2DEBC7829CCB56AD12DA9043C169D27B2B5CB -5078436CF7B7DFEEA0E98583B93B5253E75E8C024EEDF02B943F5D41B2239C43 -08F86E288A3C02CE031BDF40022FB847D6179F4C3914727B9E5D4B9023474C23 -47D47BC2F24260EC083A81758F93A26E927558C08E67B67563553CE490385A54 -725004737275BB126696CF75A517516B8DBBFF0AABD30D896E3B5CD8052CD53D -4D3C1743C76F46F4CD6F8F33204AC348BF5D630BAC8815D1D41A43332361DF49 -2C06F6DB3734B50BA7D005D534144149A44ECF7AF59014384D6157E768EE18F1 -A4BCE13C577064E5787E5FEAC85EEC6703928633C66D74FD91BF7C6972C8A1E5 -CE580013BFF060CE16CDAEEDA2028E4D7660C11590261BA62E29721E949D9686 -976776F04ED2490C9FE72C499335A677DB4A7E7A486E4187B6DC505C9A6201BF -B38DDB8E55EBB171C0231E6EBE7AF21ACCD93570502F75CE2D681227A3F1410F -E06D00BB6DF1CD2C36600B910CDB68786C16DFADE53209EB276792E1B61B853F -AB3717723BA3AEB5AF855EAF7FB4AF5A90B798810C3700073B60C5F19907A145 -88371C85FC8F9B978FC54813953813D515AED12ED533A2E2F0A73F9E13DFAA3D -A268CEC7BBFB31FCC33FE4326FFE64AC31AE8C6155B724BE080699F4B38B1551 -271F6538B81C112F34A7518F1A82AD330E1CE319495B9DBD6C99486A4595C15E -262A30D36996D6B8F5924AD9FC03CE692FC929DA69A7597B4051A6DD4AC2BFA1 -1E49CF5AF9E7038B42AE02F0922A10227BEAEC3C8FEA31A9F96CADA5B774580B -AFFED18B7A7FF2E260247129DAEFF99ADBB15974075DABC0B990E4E1F7529732 -9567F9D7C19F84BB2B0ABDF29CB53C96BCBCBB12F7C9037B1DE14F4974D6A9C4 -6917D239081B61441ED3518061873464597427893005265CC04E82CEE92077FA -A541700FADAED41521B463F08B1646A2EF996C4D99A89AF88EAB1FAA778F79A2 -B655A7AD104E7BEBF374E9D46C9D3713A12EA69BD728373269CAABC20F467A96 -C54DBF88FCA974072774925F55C0D51C8764BD66BE520246A58F642A91F16AF4 -58874E8C0BB9C9D8845D204C4ABEB206C271E3AF270ACEF79186C2B47E6980E8 -C9393FBF83983BC069A767C86F27C9396A26A3E77FA2E937EAB043153869CE11 -5D8DB242CC146C31609809CFE57CE48967E5BBB19821C4DF8E5FAE84BEA37167 -C1C20C93EE3C524674DB78E133749AF0C0C22EDFBB9652BD37B49B7003CC2A47 -A80E9DDCF12CA911F1111255A93A689D217CF8D48BDB99D0EAF4F9CAC51B99B3 -F1F0B1EF86CD0BC6F9BB220FCFD659370DBC37B1634D47F99C29C7975458ABAB -47AEBB2E47FD7108C482CC3D6FBDEE6551AF08CC2BEC88BAA2B56738AAB41A62 -47F8EB1E08B24583285B0F174CE8F92685547A1D8DE25BC8 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMBX9 -%!PS-AdobeFont-1.1: CMBX9 1.0 -%%CreationDate: 1991 Aug 20 16:36:25 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMBX9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Bold) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMBX9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-58 -250 1195 750}readonly def -/UniqueID 5000767 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 -B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 -AEBE70DAAED49EA45AF94F081934AA47894A370D635D93B1823EC35EB8316AA1 -86031FCC99F57CB21E8400E54AA474B57112F0D4754A16BEC19117E9D3638986 -0777A71B135CC18E20E193AE6C2BCD89F4A27516DBD2BFE69FF9920D547796F9 -89E0825B6BD5F492B36AF136EA91B826501ADB1979A4204B2CB5C0517F2B9494 -9B2077F316D2B3DA256C99F7549E6BC4B04FE12072B09B4F5D482A126AE351F3 -97DB85F3026A793B51E6B28B54661FEB087F011F0BFF67272DD1E8825C180723 -22AE77CD6166D2605D0C0F131537417CB60086F08E7197AA916D590944BD801B -DEE8F29FFC516E11396CCB8395CFEC9262E22521882DC0316B0A129DBFA5FB57 -E656890C2471675E0566FE461028FB05532E274E6DF77E7D320D09B2203BBB5A -8B185B66B2F8A18A49589C4EE27596DD56260D0D759D2A12CEF7FC3010BA1B36 -85A2FD45129DC01A0C7570423305C25D957DFF9215102FFF35F428C823D549E5 -014E7F99ACA6C10B3C92805376D0F3F280D65852CEA54F5CC9DEF9EC1347824B -0733D3341B34937316E77E952AD9366D3B2ED045165565F07CB636385E5A5911 -2620E185B105EF6C93890833054E05B6301137338A3F1D6AB2F80095E57AE60D -6E5EE2764624849978C811EC38E014AE4A5823734C5CEB2BC22DDA46BB408D00 -4F25CA8ED287D35E26A4CACA77D2D4B986ED2ADD3BC0C3405741CAD56DE28C7C -68E8944967C022CC55907B3DFACC1EFAFD38D3EDDA1AADB6E2C006ECBEFAC8D7 -18ED3C46C331623D8FAACC6CF9292B8F1B407806A0D4808F51A5BC97FFF26F21 -21E0FDE42A20F23CD9373E8F7FA0752EE0E7291DAD52D234FEA3A97F61BF5E99 -6C3255150CEE3896C0B2F15631B17BE9CD8B8607BD49C9EFE65FBBF886516DC6 -47EB50736A1BD3C745EC6BE36E7062A37124BF850C915181BA540E4DF23042B6 -C98000A1B1AAFADD66D2989ADF17A08A8093FBA5C5D1AFD9115E62028DB93F6C -ADD558FD8A0770FABB5222209529B5067980D9A93B5A4D04D24C2C5C64443F0F -20989CDD7318C8417EC6C001A853923C66E0FDA5CA648B4290DA139688E11539 -A9B8B0923ED968548CBC6EB7226AB370AAED93E36E6A5B6E19A6F52024C23B27 -1DB588081630392A516842BE36D555311B38681234CD62DD08E308F5AF43B5DE -61F8202E3A8593AEC5E0F6762A5D995F388FFAEB70B04981D89826333F22F681 -5F4004D3299979C0F3B2D4EA25A5E28DAB0292F56441906689B9665A0806D529 -6445B3C0386A07926C88F480249CDBF443AAE0E1D51DBF23B5EAD0CF9C726158 -5A64B270905E3EEA15B95CC098F7F91CC9A6DA34AE6C5B2E26D3B0F3184198D2 -1A10105221A103D2FDEDFA3CFA248C82550CD7CA7F1163774E09C3B3CC328D99 -382B001C0FE9B60D3B05681DAAB14E26EFCCBDBFCA5D3E05A18D95E40F2CCA4A -94B6622BC08860A1B9E7680F5F8EB0500833FBF27AD60B60F2833A27F7D4264D -8F1F5E4CF0A5E508878A094C937259061423B962F65DE1F821D6CB3D2F3F1BB2 -E3FA5F148DD0D68DCE1527F09ACE5C574DDDB84A012D1344C2196F43A76B20B7 -B1818479A3E8001208FFB25948AC26EC61209F4BC5A90C999E4246803860A6EB -3BA17B8F79DA88F1392B383A4970F9CA2E1E3671126A52A6566BE8A7E9EDEC69 -03EFD6FC531E5C107459AAB67C2FE4D34CA16F65B8FC01AD4CC55C8C2C6CFAD4 -7AB72FB1B49D35828634DD53AFBDE27B04868664B5F7EECF574AF8C0C961D89E -2EA2806ED99A787FFCED7A4780BE3BC4785395D006B1C975B7D919877C8ACE2D -130BBD923699462138BB3C795A10D9151882A44F6D7174A820EA40BD646629AE -E01E3DD7C23B657E67E9972A1A20D47ACFB37E7213A5CC89C48F5F58D8DA18AE -B67BFCFBE75603C8E49C0E8DEBA732562DE018E079702A06E474AE6FB9BCE596 -88B8EA87D77273210C6A4B6D77D1457A6C66D42EE23C7C158811C82E268BFFB9 -D569C4D21F18326F7C3A9014DD2FFF7194B7A0C25D36D0F2998CC521D0EDCEE6 -D73EA30306D4FD11F3F64C821E29C21E75E0BF024D65B4B54144E07E2236C04E -0C5FE1FE3F3338C916A8C1A5B7E607D59C03C17CB8737F353B06963CC51D789F -B2D7DDC7C7D7A5B8FCBF754A19D05413C00BADACFDE8D21156414F9A9E0C828C -575F62E824BF2F04A5D1C7DD35CAA1EA203D941F049CCDCA2A928A4E4F998209 -5B6D5189DB296E54459EF4A9AAF06F31BF3E853432285AD1FDB457BEDEE27EC1 -B8C714216C06D3C585FE2D8285C8CD45F584B1400BE410DE92D4FACCB4B9F57F -A99378FCE50B90E6E41E920FFF9D54CBDD4EF4C6FE054A843E94CF3CC03A1EA0 -F85B9BF7F3B123059647CE71BDDF0B634E20F54D3C235E0086006465BB26C0DD -37CFE42BD6F88378564C9BF82184C4692FC01574411708FE41009628DCE2DDF6 -91EA438C3A373AB314E7A71C96C7868DFDCC36295586BD5814B532286DC0290C -014C1659349EB90AFFCBD54547D6FF34E4181A5CB1549B07C5266E9DE9001711 -20EE6A979A3844DA6C9A74F5FD706A65EAC707BD80D532A2B198BCF989AF705A -0457064B6DF5FD6319C13F2D2E6086B647D7A95FDC7DFFB849BB7892ED66BE30 -E69D96A5F83CEF994DF3ABB701833F05F70D2813F466A26DE5A8C90F8D3E9192 -60E405D78274EFBB97361F2E0BA8C13E19BBD924AEFAF89EC17C0044053F6587 -7FF3F273AA56567B4277308D1DE072E62F8F04F4A9F50326CB4FBD291FD649DB -DBD0E1C982DA141E8C4BEDE277B54F3A4F406E4F216EAF59A00CB812C0C310B1 -8C650EF0C2351AC162A6BF4B9894BACC9F0B5E7B789D4FB1D262B30B5FB1576E -67DC7B1ED458E16D11218FAD423D656D1DD2D54074708C0709AF54DD4A65CABB -0D15B3836A947A750AFC4F33204A1EF19316DBBBF48D691D2B7825EE89D4F9B6 -8329759DA875987C9EFA2F654ED36503912D849EC5474049ACC6EA88DF6CD619 -86BA8D8FBF4EDA9083FFBE900943F1EB4BA5C28E0D2AD18A373CE778EE7421AB -A3DEE584CAB56137F2F9FF2160356E184C72C21EAC24C02DB8A8B841EA1D7E8A -CF0D2BAB7633437F1FD0FAAC6E28F3663AD24232DB42238ECD8F8A2ECBC03E4F -6DA62068BC394123CCF7C1DD3390FA41CBC7C7F481EAF19D806FEB2D2336F02B -A69456E0BE66403007C4E18A4537AD0EF37F4C4908FDB4D1C395C1C51A2C9C80 -ABFD09C880876E495A0D6883673EEF5E190DF94F8B25FCDF9EB3622E142303DA -ECDF20994CF2906BAF612BF8D20ED5CCF63340DB9B7E83ECF041970A2F68233D -50238F950914CAB7D572BD00D2ED522E73F67DCB7AB41E852F1EE79F5BEEA40D -4D676A2617BEB77D0AE3ADD695BF3E2133C8297E2ED65AF539D5763C4201E5F0 -DF3B1AE8A22846BCD83BDF73DFC7B7AD09DCFD99076CB5BC530E81DF0B510F18 -5EE42358F3D5465141FD1302D659A3B863DEA1AAA9C6B4F66F61A5A44774F93E -0EC448A7FF1113CAB3F2FD232B186511D68F287F89A249D8F87D403EBD107092 -C53B8FC5D3F68FA8FE5A2FA611EB5EB17A18EC81D4AE6281A9354415EAE2AA88 -BF012B1E54EDF0910667DF7BD2990FEE7B18BD58944A803884901F84C75DD305 -D2546C51F003B98CF0F1BAD35BADE1B15B3D3D1BEC250C304DE0EA771207C8EA -3D50A7FEAB513116A61A051F2AB3DB189C1E280385149F3055A7C8499E931E56 -C9D5D37E44FC050CA26AA39757F96E1EE5855F66DFBB08497B3426A94025947B -43314CEEEE2D0987785886D07B9840A54603754672975E33A2151563E5E5CAC6 -60AA47CC573F282113FB353D22FF4FA42A99953F2649B16F54D60CDE4BA706EF -6E4EE4FD10105B18E1C0EA71131BC5C45F859AE92405EA7B997F0FE3DC575877 -2134919847C248FA5A00454B16250CBFD0AD498E8A1990BA78AAD596958FE6AC -AD56BCD9ABAC3C7E2250B87B991FFCC1680C1CA885A08C5B82BA03AA14ECD68F -456EB83901E5274E90414045B7562C3850D6C035A4A6ADB1E2D41B3BDA05A4EC -58ED264E4CED4693AD9D61A82821CA6357F313737D988B0DBEEF80E3385BDE68 -2EA4309D8EFD0D7E11856C200C53FF56B2CC2FAF398693658040CCA2A327E480 -04225835CFAD9C07D145E9F681E581AA27B9A79ABED0092A6DB43293F477C0A2 -653D938FA000357AF62FAACF7D06DFAF3D4D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI5 -%!PS-AdobeFont-1.1: CMMI5 1.100 -%%CreationDate: 1996 Aug 02 08:21:10 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI5) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI5 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{37 -250 1349 750}readonly def -/UniqueID 5087380 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 -89DE8BB201D5DB4627484A80A431B6AFDBBBF23D4157D4AFE17E6B1C853DD417 -25F84CD55402AB88AB7EEFDEDBF2C2C731BD25567C53B474CCF739188A930039 -098A197F9C4BE7594D79442B2C8A67447DE44698321145D7689B91EF235EA80E -B600AA8E238064F154284096C4C2554EFE8DDF13AFF8D3CE30E0999375C0FEE6 -F992DEA5FC3897E2CC8B7A90238E61E41622DE80F438DD994C73275CC52249D9 -F6686F87F394FB7BB668138B210BEC9E46415A1B58C990B81E7D7DD301143517 -4C2A259D2A0A1E200F8101469C10D7D537B0D4D39296A9AB3F132DA9A3B459B0 -F850E2B3A03BDCB35AEF82285D19C38F474FB414F8EC971B994D1C7DD753B271 -2B71549DF497C665DF0F266988209D9EB616E4D9BA229FF984E7A886DB01FD21 -48ED2E4859FD6416C2CE52537464EA884C8C9C2D1083E2B83BE4B766474C23B6 -6E8EC5003200AB10514BB44D14CA700416AB6B2683E80862E7D5B49A05526A32 -554BB23AB8B0824BBA198E3825CE82380CC0FECF46651E3E5D77F09465E73164 -20342822F29572BC7F73F2C3BF95ED3BB6FDEADC20C6AC866C4F2C679594D7E8 -8D944704A3C5D771DC39503BECAB89F34D8CDB8FDB91AFE21F3F0260D05E90C5 -73E2C13DFA022C4522E5918EE25038A0498FBB530DA33B0AE238B1C6ED03FC04 -2BFED8236E07820C5BAB411EAE1B31D93A2FA7C374B1725FEC359ABCB88E2C89 -214529A263D795AACB0B95A3AB2F4E08EF350C282CE521716DBB06E5B8291B3F -5D4ACA230FA192F64BC902A4C8842C0F916F92FBD002ADD408BF0401D0284FBB -F05D4C6DB631420747CC902C5E1617E6573612FB26C8378DF41FFB5048D3CF06 -4893DBA48EF4B043D760F60C75712169D16C83EE020C45369E443E853E1809DD -F395B812067D6FDBD26111B34F42C21036AF952D0D767FD17F6959D9FDD46005 -D64FFF54772B50BB9B173AE79702981F58F9F235C591F476A31852174DF0619C -A470359153DC32610E782B204E7945515464DACE9099B81EEECC7EBD4B5126AF -C3FD9DDFB329AF1C95C41FA4A5F6958869509A23BD7210386329771FA46FF926 -0E54AC35106253EE140449425A8670E1F92B178A02A58EB57540F4BD8110E548 -BB584EA6D625C5F5FE0124A98E49915F1A1B95D2125874360EED1C4379FEF3C6 -90E5780C20309F11F2F23FAD635C44BA030B39EFF083A3ECCDD2641DCF820240 -BE19375F366EDEA784F707C68D5A74389B3E7BB466AA299FAECF467CEE6AF2A1 -5A2471790BA9CF13E8F091B05431BFA01843E14640AE0F3F474341241D6C5C9C -51B89CF16DE102120703ECD96A1D0B98C90582A5CC2075C9CAFB34D26E252457 -5A491AFBF7F7490B50ACDD62B8CD73F9D14279F2202FF733BAA51CCB56B6E954 -9380D9EC3D514B837D7E27CBE6974FB18CB2C075486C17E615EBF9E39B439E49 -4B508B625085E4CE326798D26D27FCA7F61EB93711D173F2DFB428C6AE2ABF94 -9EDCD2F857899B976F21B1F3934D21C0C891D1A3FE9DF5980F3554A9F8FDDA71 -DAF4BC15D82351C40F0A8562EEAE0CD90AB79ACE3A6068C54367E2C0187B15F3 -E79CB492A6022C1FA04057F65EDEBECD09297A0E67B184593817865979AF204F -525307AB090F857BFC995644167BE01C255EC2DFEA0AEE45FFA4799E7E935A82 -4C704E63556D54F9F541C0DC4A60010C478C5589660166459C1C8AD04E2D910E -84D1B1BE841E95EEF85ADA425BDF9C5F8C5EED4332338054923160CF5ED87E9B -2C62D80B55A42DD252EA48BC7C3D939FA135743D7311A28E935EBE5F78A23F6C -00D6F19307891F1AA9878DE85D0DFBB24D48B1D6D536D388DAFFB7F1F47A270B -BE9BFEDCB021FEC4DF7F0F9BC7057705EC6AB3F43BA0A06133E6F09FBE524D45 -516BA481EC4C52DAB75D37063DA0229E840A5753AE0CB7CF45EB5389CA7ED5C6 -0739DB56E67035C8E0B9F54109502EC1CDAD7BBF79872EBB8089B84AAFCEE993 -78EFD17754587EDFDE66E7CE2CA3491BBAFD95A46D294ED33EF52F0B6E70E627 -F35BF7FD54E1AAC1B96C940C206C731EC65D0AF14E7405BC2B5F7B813F7C370E -92D6C82434633BC81873F844F12D729882F3680EF050BEDC77AF87953E1BB271 -6AD5FD761441A9494CFD8A19A56B71D64E5CC47398FE96E150D2E48A3ED66EF5 -B5E0090747BC6AF2117806E9B0247DDB08A8A41BC2558FBF2D5161933AE78071 -2F2FDCCAF38857C4CDB59FB5317F5F439F2C28CB57A351CDE1A641F9572694D0 -04808D6DA85AFE96F406AEBFB4639B3A8F417C92B7A530ABF271542E9E741C96 -C1F6181E414CB9B6CE8ED775F9A5BD5088404F9AEF59774F10698F8986D0BC98 -716C1BDD5E17270FD9FFF1FAACB3EC0FD0862823ED21136EEE43D8B8D5664390 -06974F6E5F0E6B6212F5EEA0CCC89C66D18DD8D38224D3C03B568494BFD67876 -78925EA1EEEB320E4135BA503CBC25922A3A36F64C668B1F0C2D083EC6F3EC7F -6A447C152A3BE9A263B42E89DCCEAD5E9B96D38F8667CB544CB587BB4670B644 -625DD35964D21E5496D61291FE5E33C776E1B92EB0C168D290FDA1AF45133920 -8EA3925B22D86D36A9C523F77B067D8BB233DE87E7D545CFC67D500700B915DB -EF997E1987EE291C5FAEC08508F1F181AB27DA60CB1A5DF87179C4262547B0EE -150C30442B7C0F1DED08F9A1B73F35447529249B34874A3643C44B3442907F1D -CA257DD1EC69A636554A35CC931B60F14B7288BD1C9233B96E3CE2F136E81238 -5DF7333D74B0FA5429FFCCCCFF9FB643C9AF7ABF1C6CF2BF60EDD59BEFA1F786 -C7A691252B0313F92C68AC8542372A62885CB9C0AE6DF2F2DB91DDC7E2735B77 -CDABEF138B9D927E364B9158D2D8982E7C44D3B1B8698487AE81B2031325753A -FC2DFE12A7228CDC8A25B14A2B77088DE701032F8493C20C4FAF1B193E9F22E3 -F29DF0016FB0EC7880AB49AD8EDE81DF134427E9FDC5368311C5992483EBFFDA -217863D595DF2887E6320F23D47388805EE65C8825E3EA174D1E987C0E2773D3 -9C0ACA9C3EA92D74C9A65AD1F52163F6D3F0B3471BFAD437ABE694835BE76F8E -D8A63DFA1076BA9A5C4E3BC0D0B508FAFDA0185E84A5410DB8DB48AF3B6FA417 -801FA1B8C4EBCB213DF05EAC13C060596EA385542EEE1AE1B9E6F962069A7A7B -A2A85811DD097E89991F1FD83E1FFAE142D3F04CEC7174BE4754BE8FF41D231F -B463B4FEF6D74AC600F1973D00695B7FA143AE2D77BDA68840844ADB98141B6F -65A815C7C818946136B2957B7F1CEA49B9D0EED1B6AFCDD991B296DB1C6D1012 -EE4423C654D6B0F3AAB1A3129A8EE1D91B10DF6507B52621324CB226F980DC1A -9B30B5B4A4043394A46FF10F4509FCA0D1FDC3E0570A4692BE5DA54420398583 -D477895488F03DF873306533A5EC5E4858DCFB33725C523A5943EB6C48ECD6B5 -1D386863AC130B1C2EB4133D169FC2398E0AD91C32C79B9E886091A934B2DCA1 -4D9E39B214D3D023B5D624119DE5907D347FAFC687489BDC0BBD862BF265B29E -2D316529A74C296B9C29B889FD9BFC9FCC162B1C814A5BCC14B165B37901D00D -6AB039097827880A51814BE7F417998FDDC608B56626AEEB2799F7A1E8BBC90B -41D552A2A3853CA9E539062A1ED5CA4F4A8F2EBA6D63579AC6B6883C38537A4B -3093AB3E8663FDE942ADD9D728652DBB100CF19C54298865C26C4BE0AB7755E1 -9A6F6BB7F681BDB61D940CFE880D0FA204DDBCD5A5FDEB22A42318A0029B260C -B22345276F1DD71E027D0F52DFC608AA14E3597A90E7AE2512C1DE3373D84CDB -E354DF3E603C0AB244D7BEBEC8E7C3A8C281F88957B70AD0A0DC -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR7 -%!PS-AdobeFont-1.1: CMR7 1.0 -%%CreationDate: 1991 Aug 20 16:39:21 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-27 -250 1122 750}readonly def -/UniqueID 5000790 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D -E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 -47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C -8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 -78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 -1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E -01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B -C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 -F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 -8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF -A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 -455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 -9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 -EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B -52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 -563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F -0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB -7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 -0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 -1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A49A93DBF6953 -27E62C03870E8063F974AF7FB9F20117BF0E922CE0966D5DBD66CE52123FC6B4 -E5397866DD5563A89DBD757FE042218B3A74665985437C3CAB39905788E57390 -3750AF97580C6CE41954D87F2C0022AE28C60F9DEB8F0882959F8770BF8C220A -9268084D4602E0D38E553AAADE627186468B758C7084017FF51E7DACE683E1B6 -C3335A82B952BF0A70C7AAF1FF0FCB8E111263549A74467147E34837A8C60D2B -5602F58D9DF038621E815A6DF17957100B4651FD95F97B1FA12E02E928BCE4DD -767EE4735F66682EF29BF5D90DB2045B7D776F5A35BD7059DF3409854BD33364 -CB8EC57472BE43DFC219F00CDEF813A11248A1B82C46ABD9026A9F1223B326CD -85CD4E2558977E29E074D91D4ED0D7A47B15D31195254FA90994D3512469A466 -51D105EDC1C4AE3A04F35510E20D2E813FDFE5A212DAFBEB07AEDA2A3362E2D9 -8673B24B12264819842E0952278E3EBC0B733275CC5BB752A0D94225D07C28AF -1E1DB6C854AA6183608466239F694E15E517224E0AF9D5DA26A282129964FA5F -E21EE86C3F8DE76394F1188D530DE372762BEF44EBCCA61734F332BDBF42660B -928786F82C1F059186A9EA88BCA8611BD7C0E44801711CE68F594E6642CE5070 -133DB7E1225673C4470E181425F2FFAF8BAC1D9B6295ED2A124CB1C39812456B -C7E423F6C4C8B1F6DEA9C3C7B7A5D5369D53546B02BF13851378F4016B6F9548 -7307BB7C99A272536FA335AD94179FAB6D079B3CC48F06EEEA66209437410174 -A86940F7E41A0F240531393E2DFBC397EABE210F2632D497B36F358C76C72E69 -A6E29CB142FD2B7EB5F18B7F3C3B13A2D2B2174B8EDFDE734D6D00A11897673E -F50257AEA77AA93E02BF7BF58D9249868C51F741DFEB9F2CD92AFC384C8C5B5F -1149E2686FF7F450501E5777A8783E9490DB101115702D995269902E6E6C8E65 -BA9D9EBB48644BCFD7F4AE786A59114AE2F72D11CC9ABEB789CEFCC4C8DB5670 -28BE6D5CE63C170698B6E6A64C9CC3723DDA33BEFEC8F9A59884AAA4009F45AE -06920D16BE4F2DDA184AABA9FADD7E522CC0AEAA02D4718A896648F3E286C6D3 -1120B1B5C5BB696A96E9AAB87825A5E5DFC5646CC8E109E16234694CFD34A9FB -F0B99A1A24304A5B2585966531EFD3B7AE62904EE4B32072A7BC75FB9C756F85 -0A0D901036DF3D19E6C9A71DE576FA7CB9517BBE34FD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY7 -%!PS-AdobeFont-1.1: CMSY7 1.0 -%%CreationDate: 1991 Aug 15 07:21:52 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-15 -951 1252 782}readonly def -/UniqueID 5000817 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 -8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D -F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 -E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 -424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 -E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C -C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 -868AEA25DA3D5413467B76D2F02F8097D2841AE1598196877011AB8455EFC5DD -7C30F66F27FBD4038D1859A07CD65AA57FA9B48D430647619EF4B575C1C21310 -97F78C821D430D69EC5C7E548AE3E7E75ABFC24370F314AA568E293EC4473C82 -11E7EDFA96F0DFEAA4DBEAA502A414A36FABED01261EAE41F95FB85A22B96989 -9129C602CC9BA1165DC528E4AD8B160B601E6A43103B0284E4B0EE1BFD7BCACE -6AF68BD281AAC1218EF825B5247BEE54268C815113E5E5C8C9B87ACFB3D9A398 -0E6E7A20B2FE5A88417893DA9E6ECCCF78BC587E6EEB9618CA67208E181E5706 -499F4A50B90096E345579FCE56BA57E55619387EF4288ED13E33BFB7B80CA66A -A705D1726C5C86FA3009BDB87737B26AD49A9718A709635B2FE39D06ADC17C49 -336D4C49CEDA90C69E1CA649189B27EA425E8D580072E582317B4228213072C0 -A4CA5A70B500B2873D7050D13DEC20BFDF483E63A8E15FC91C886ACB1D255623 -5ED359A63398B73200008E2DBF15EF61286FCE57C3CDADA9992B847D45CB7114 -B939E09984843F4FF24A10900469A269B403A899D8646969926B1D9BF2D933A2 -0B077396D422A114E746C131E327AEE792CDC981BF206DDB337FFD8C45D25E8E -40FC8FC8BE3F16ADFF5D45D295981A0424B016DACB3E7A2E3446B39122D52C42 -6AB952A212F60E38926E88A562B5376A8A2A001F7C7B9AAE9C0A77F14D534204 -E498E8C1867AB741B1DAA8CDD64A479431A8EC0A7AC4F3B1BDE8D9741EB028BB -5C6AA5F0B827D06A1CCB0A7BE2E32DB063F41535C6FA0ADEB4943D2BC98CFE1C -874EB27F33D8DC92592B360354A03E715AF431086920B6C65D1D43CEBB2A27C5 -94CC62D87FDE0578E414AA42E6C6A2DC7528B16AE79BA34AC3C7B6186C40EECF -0C690CE7CB7161F75BCF881C18017526651852F3B009451300CAF45A37F5AB86 -A1BB129E0DE41763CBA47F49F3F3E630B70665E706AC9E461964665B6B679D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMEX10 -%!PS-AdobeFont-1.1: CMEX10 1.00 -%%CreationDate: 1992 Jul 23 21:22:48 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMEX10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMEX10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /parenleftbig put -dup 1 /parenrightbig put -dup 18 /parenleftbigg put -dup 19 /parenrightbigg put -dup 48 /parenlefttp put -dup 49 /parenrighttp put -dup 64 /parenleftbt put -dup 65 /parenrightbt put -dup 80 /summationtext put -dup 88 /summationdisplay put -dup 89 /productdisplay put -dup 114 /radicalbigg put -readonly def -/FontBBox{-24 -2960 1454 772}readonly def -/UniqueID 5000774 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF5B8CAC6A7BEB5D02276E511FFAF2AE11910 -DE076F24311D94D07CACC323F360887F1EA11BDDA7927FF3325986FDB0ABDFC8 -8E4B40E7988921D551EC0867EBCA44C05657F0DC913E7B3004A5F3E1337B6987 -FEBC45F989C8DC6DC0AD577E903F05D0D54208A0AE7F28C734F130C133B48422 -BED48639A2B74E4C08F2E710E24A99F347E0F4394CE64EACB549576E89044E52 -EABE595BC964156D9D8C2BAB0F49664E951D7C1A3D1789C47F03C7051A63D5E8 -DF04FAAC47351E82CAE0794AA9692C6452688A74A7A6A7AD09B8A9783C235EC1 -EA2156261B8FB331827145DE315B6EC1B3D8B67B3323F761EAF4C223BB214C4C -6B062D1B281F5041D068319F4911058376D8EFBA59884BA3318C5BC95684F281 -E0591BC0D1B2A4592A137FF301610019B8AC46AE6E48BC091E888E4487688350 -E9AD5074EE4848271CE4ACC38D8CBC8F3DB32813DDD5B341AF9A6601281ABA38 -4A978B98483A63FCC458D0E3BCE6FD830E7E09B0DB987A6B63B74638FC9F21A5 -8C68479E1A85225670D79CDDE5AC0B77F5A994CA700B5F0FF1F97FC63EFDE023 -8135F04A9D20C31998B12AE06676C362141AAAA395CDEF0A49E0141D335965F2 -FB4198499799CECCC8AA5D255264784CD30A3E8295888EFBC2060ADDD7BAC45A -EEEECDFF7A47A88E69D84C9E572616C1AC69A34B5F0D0DE8EE4EDF9F4ADE0387 -680924D8D5B73EF04EAD7F45977CA8AD73D4DD45DE1966A3B8251C0386164C35 -5880DD2609C80E96D1AB861C9259748E98F6711D4E241A269ED51FF328344664 -3AF9F18DCE671611DB2F5D3EA77EE734D2BED623F973E6840B8DAD1E2C3C2666 -DD4DD1C1CBB09EA0E12CF7E353D25984D0F6B782B023F64AC505BBE2CB2DF986 -DFC4B6512FB2E9EFB2E34817A9DE05AED32B1755183E4DEF0B53D69F71CD2AE8 -6738205D6FFB0AF80E3EDC6D423D27B4111D8B825697FAAD2E56747AA090747C -6D0C241778A517869D5EDE599AE0BA00938958D2CB2186CBE5436524307EE999 -B6E4107AE898D2B1437CC7EF9079BF6FAE12E2A757A26D5FF00C12B921F49FA8 -CF9738F65D40DBADACEAF852388FB5730AC58E5567CF1DD71F52AB9EB252D7C7 -B251DDCCC7921D3C16A71950303DD42C1A6B81F66FE9DC690B6142E699684A06 -19C72FCAC15BB6E67C2DB1F6213803AA3C7C638506E220F0F837103D999C6C53 -0FAABF366D5011B301143B6D403D4F7DE5133805D76FD32F62C3E925699B587A -51D0C468A4F119F72FB13255A8FF981EE1870385A53CB4D55EA32494CC988E20 -4D9BE61D4B05B2C5E49E39CF437FEEB177FAE0ADFD99DCF96E118D6AF83CD095 -26D3A7322C1BD0B12546EC5118606352F41DD756C8004CA7ADE6D4ECF53DEF69 -B91F34E20024B332CCA91596C69BED70BCD865193483FDE95BC34792AE1AEB38 -6F5AE2AE248EBDBF456775184EBA96565A9C24BC6A486FE07C340276BCE16456 -5BADD94EE67FE3135F442F8785BEB166E6940D5155D6D88A535BC78AA324B637 -D13D07B9075EC22DFC776B90D8AE5EBBF34284F9BFEB2C351E15D719E515EB91 -B3047DE52DB4446B8F6EE82074B372047C94C358D635C9CF2C42F7DB3A6B48A0 -1639FB954A4A1B7CD49A4DB442BD0C94A9521FB0F02C6A779A6998BC10EBE1CB -D242615453E12CC25F946E25FE2960E672D930B64311D40ABCEDEDB363BDB45F -BDA0BFCA7A5E3FF0DA9F80132CF98185EE81A38F4E3F8A072F0FBBCF52E398DF -72C4D7AEE53B09F304EB5D3047FC12015855D79B5F9580C923625417BDD79240 -5CCDEFA06B3A16A495A17BAE8B809A8098A89F675C815E4D99A9D5FA13B230DE -B27AB5BFC3E15498375186B29C349CAE8A223A4FDCA5406E1310D21EA92B433C -F323354300E91CCA02D61EF7C7CC3839AD949038AAE467C00BB644A413BC9869 -56B8BBB9D089911250688A8E776105E7BB3924C1D35CE1B82B7FABAB84A5D373 -88BA2A9E1C3F533384202F4849E2391799F5A1643AC41F3399F68CCE4495AA61 -DFB581529921299486BCC41691069F3BA84393CC523DCE038632276D0DF3434A -FF82FB529C7CCC73D82B399D45D75DBDB41E248D2860B6CB216E9588DA490234 -3EA2EF1E55FE82BD4341CB384CBF2A7ACD8C629CF278CF74EE0FCA20A59D21E9 -AA4B873D61836A2C9EF48A401DD1ADEFD89AB49DE7B644811360A478D9AD7ACA -B0F4AD7A47C54F8F8FC225DAA26786204A821C5DCBBBDD094C8B2980E9CB25F0 -ED382346020B69E3445882551DAFA71E7469051C707EB1DA856E9B44667B4389 -24A31D8898C4B40F999C54B21690237843C8FBD4765DD1CF36686337F3294DC7 -155528DE7E473D29D73129D85A9D9C48B953C1AD9F929D1591FC01203622DE8B -2E34CADD2CC385BDCC8B0AA7239856236C144F01ACBE60661665699F8D7E7478 -BB00B820E3ECE07EEF59CCB72498F7A35D04B227787B04343942542B108A8A90 -90D70D7E4AADA0FC9C1D47BBF3FEFCD67B8D65A6856BC5C5FC2465E230BDC164 -E741B11AED1CCFEDB558A93617419E907E302889C4D16DFB78869615DDF85A9F -9E84D941C75D49008C687B84FB742604FA2E634EC382F2D25DECFC1C20587191 -E7B913F52D3AEA50AEBD8E9F94EDABD138BB3879C6C3F16B20325170B52F90C3 -3E305062F74B0C3FD067EBB1775643F817B7527F283DD3746CCF5915742D3D51 -C7E7D884F31003D696E4E6BB595B7B5113A3C7E62BBA1E8B132B4DE46AD13385 -186206C774FC0E263CF126E211F9DF343919875DB086BCB7D05645FA3A126A31 -959130854C4C11BC950DE91B73344F50FB6671F5AE85574A1AB015DA5296AE4C -EBE865BB15AE19968CF567E08048E91C0EDB7BA97430D3EC9F483493CA6E769B -E94968D820CB58739B0265DFBB005B57E4B26DE96B50F048B3C011A9765E38D9 -54D793920D45818BD4E8E6BAF625CACE224914EC1373B95681B6AC195D26B375 -381392C5A0DD44A9E3039D8ED8F758E2DC4C755E164683996E1A28674994AB60 -92F6A6B5CB7A23C8C35301277D2AA30ADE74E5CD3DEA1500568386C4FCB5C0AF -2E93A2F88BE9CA5B4730825C284872C962C9C1BF35148E52393FD1613ACDD7B3 -50F602A072752989C273ECB26EE69BD8472FF93649CF4FBB81A54A00810D1FA1 -AA5677AC3FD86D61C053B254843C9F64D6A0F7E09E0C4F63441FABDD4A4175BD -983AFA92889FA5C6593D506C7910B6D743C40F0A2019682C159646BE35CA6E1F -B0EA31D76AD06C44894FD0AD155F92C5077E3B1A370F07B9680D9D0F05DA93E6 -1C188525E9570A7070A9F5B94A6D40A1FC016C1A9EC057EBBBA8C740A9135FE4 -191F7BFC65C0C748448B2C1B7E1E012A27FE6F520E077C449B07E561F9061571 -109CBF0C50D5C0BEC93BE0841176F68B91BF0F7DCEEE5E2D532338C5269BB7AC -6B2E70EBF9B0E9803668BE2AC18A50022672B7B9BD2FE5F34FA2453B2CD5AD93 -A579FE436555AD4006D6620CF1AEBA6CBD608B3DEE576C873F56B62227616267 -1014C066515C791250A1E452ABAB6F79563B60C2BF80B28D4AB66A455C -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMBX10 -%!PS-AdobeFont-1.1: CMBX10 1.00B -%%CreationDate: 1992 Feb 19 19:54:06 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMBX10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Bold) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMBX10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-301 -250 1164 946}readonly def -/UniqueID 5000768 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 -7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 -77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 -2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 -FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F -DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 -7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 -9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 -CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D -6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 -E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E -8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E -3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 -EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 -0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 -4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF -1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 -757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E -0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 -6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED -E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B -61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7 -92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C -EEAF70E3B20C64D4C2B34A084B5770BAB2A974E898F62BFE90F132A37E2DCA4F -43E13DB13C94DFA8ECE2B7374827AE168634FA007F8981ADA046CED3448BF453 -FCD9A4F194FA648F9FC0971734BB69CB73439CB0DD021D44A7C11BF295E81733 -4DFBA460FF3D654F9FB337E99E6D66FBA87A817EB9CA1536C84833870E3626DA -55D48DE850D3E6F6B29DA0E7C9D681283586F208DB8D58042E3A7CE55BE84822 -C98237911453E479EAB65AFEBA3F61A763B40E74535BE56C9D8D06DDF9441741 -5C9D9D917439368736619717FAB4F06E2C329AE0BA411F3FD522D9C33AD8369B -D7DCC9DF993778482F35F965973DE876FA19E109AA198A00658AB3F0D8E3DDD1 -08A573F2D525202AFC57E05D141E6C0BB811E1FE280EEA002B7A45BB363AD06C -318D320D2C81AA5DCC842CEF66E7DF7670588CB39C9F42EE7763A3A17372432A -173BDEF7ECCEA297CCDD76A835C36DCE9DB8F8CB66CC71B4920BD5657F0064D2 -4DDE0E0560100742C0C991B2788E8D2751636084BEC4B57D0AC795E2D79AC4B8 -DF86A3EA8229D855869D123D838389BD7CD0BC3ADCC5E9B6986F574F0E082239 -3262734383E63C474FB5CE9D66912171C1B58B5FE8506C4330DA185CE61BE5B9 -361DF11F62984C5F853516C1419DF929D29EAF4490A018EA2FC133F7F5ED37AF -B3A40ED1F49A747C1D6665F929577DDE1880B17DE3ABDE4996A0D326D478B77B -426DCCF2D7221490784231EA6CF28982A4470A7157A068EB2784F8C64642DBC2 -CF7DFD9F08D745F64490CC93C06BB7E7D0E6EF40A657F3FB69A81F2D36111838 -BF429C8A9FF6BA3F2C1FF78189C2766EAEB09E44E77D419B012FCDF3232B005E -8F62FB9F8B01DC9053F5948B1F5D5EE239DC3AAB3AED2050545EEF171713F796 -CDAEE32B7D028AA1A02CE870710F1A72D8C33186777F5F5CF8A46B2C2ADE3E05 -35688394831444A7FDEB54A2AD610B65CF99C6CED50A71AB7E9A77A1671EEF7E -148374961F6B0F71D58D0FFA3A8CBE563061936A55CC29A6614CE5FD0F95C4B8 -89F3E304C34BA027810A365AF3DB88094E96FE57E96DE886F9096D03652D9FD4 -23F1BFE22280C0533BEEE066651BC3426E4DD0A6D87EE94E783D9B3A2F97C830 -25DD7225A47598271621C368BA231B6910EBF58052E37EB53FCF803565574F18 -EF9A760ECE2EFC3BDD16A69CE12762E3687A74A744863FF8E39DE3B504EA377F -25F63CADF19626DFF49CEA529A3AEDC52E192282EC8A3761708CB11EB806DD88 -7DAB2F7B657F828E6A2B1AAA84017B077E59118B1716A4567FE859EBDFE76766 -9C1ADFD821E84706606D82771975AB24DFF6BC7BEF6C835D658779E1878EE3B6 -77C6DEF31C0B0B53DEF3F6EB018F175FEA6DDE3F4C9C56E6C9F6A760833784AB -BD62C96A79AFFAF5CDD42E1391DF6F2DCD2E5C742352FB46B465E68F0753110D -846283A898B0A7F63C60D01F3D803FDE9205BC3FD05249BCC0032572F082726C -693D8BAC00C359B86E36D462321484129F7ED23C06B1C43748F83465D0C55547 -D2A1F35E986BAA7B376B99199B2813D585E6AE25F1227EAAC57896D1251EF212 -C8CDD45A88AEA0E0745AF40E2F46AA65E2A5758906270BB8DC9F62C1864672CA -8254EFD626EE41024DB7EC8238AE91DFB169E382AFB3988A3C52CBA8F0B466AB -32204633E56CCAB6F18B0B4BDC30D7DAD53FB151C323F9FFDB07FC41D8938ED6 -74B3FFF460ECA96FA8AFC240B50F278FB16B43456AFE526DBFDED7FD14687E7E -926D060283145DC1502201DD9D9AD32A17697A2FB6BF9E78BFEF59471F1B500A -79C8259C900DD48D29866F502C3CC5931A3040C8E03CC20FE5DDFCD8C65EB0BA -8EF5829E3C17EC9FE772661A25FE8CB57DC268D51961192B21BC3CFF661C25E1 -7349FC100DFB6C29481257988320D0FCD96FBCD0D8D7628B7DE34810646E1D41 -59CEB78DC3D78E4D911FF534389DF898F0D5DFB7F24C0055C6E53B057E489093 -2F7FB5BD4BEC25E57B87024BF73FDBADA3D5D54FBC30366541AC4F87213AD60B -50A5AB18E6FB236A395F8B75FCE992D05B8117BDAE71CC990302DB3C571C108C -F0D58DBCF4447774CCC8F30F6D2089E2836B44589CB6F1BA455B29198238C7B1 -23B5291484C030FA8ED2DCDC8FC11BFBCA670E60864E026DDA427025ED8A11DC -1E4CBFE86B1125EEBE77DFC258E2394B65630EE053B0AE7580AF42924D001EB3 -5D3E6819F5810390D411DE8797B616694081F3316634D6BF8B14DC201598EA2B -BDCBF61E1B14F5C0FCC53ACDF6FF4D2C790D952BB14772F463F696F3AB0A4409 -831A8B176A1015E7F9A5F5C3197CE2804D4138D17D59B8F4EDC3D54CFD509943 -CF5F3EA7C1EFFC69D302699C4B4D2EA77D31693865BEF8A92A1F8396C11D4906 -3CB4F0DEEE1A6F8655C48BDEF977B74A8B7936C133C6E313EA18CC3D3EBBF67A -D88FB860F80122FD3FAADE84D182CB79C777510EB8B0F95970EC1F7F11C244CB -F6E7B802363A5999705943BFEECF44B1DEAD1623905C809738FFA7FB859AC618 -97889C34C4D3ED9265D3989FBAA98234CAE150DCCB0B20180D48EF733731AA77 -FE9223CF1309DD3E2730424EE836975D4789F7BBFF8BBCDCC4573A5DF65BFEEA -DD185456B2E715A3D0EDD12D7C81FF1B54D56316600D9D608C7CB3ECB71BE2EF -337AE3C88B3603CF97644A8B7D0B94DC4C44A6C6B6621394EDFB924C64D02874 -E05CEC04AD977D9F64F78054644CAFAB07DDCE62D1DC994685189FF59A88D8B5 -684E070FB0E5F131B907B4FED41DE6012EFDD7F8E21BFDC20D63BE9004CFD6B7 -47089F5C265E6993693F75DADC42F0C618A74B308C86E46C3C39A2A66A585832 -C720D35C340730AEC5B630B70AED087BDA2CE5789EAEC440AF6B471460DFA34E -D08540E9A4173DDD2FE2297208F0CA087EAB469587F11B77AA9816F665E363AC -4737340912110441309EA6F0767F8EB9B094AF57F286698AD7494A942D34083E -66E5079CDBB7F3289735FA2FF5F5587E74A960269A0A1843EBE7FEAAD9BE11E8 -F28E4C78206692AF69D15299E2AB0787B4946CD79EC4ED8251EBE112C779F1FE -B02CC64B6648928EA6426AD2C6FFEF37FD388DD98A4755ADEF232B171FF519B8 -48948797458ED6902531F55A3D6E0A69E352E851E8998EF1B70DD095E5EE854A -38CF4433A9A971962927E81AC0D46DF6CA6A997496F5466419D51A17F33857C6 -79B373E7D1712F1ED063BC12A26158919B81359E9F01439B4EB6676392482B79 -09F16F351CC8F777461ECC265E861DC9041E991D8D3303CFC89E406FD0DE5F9B -4FB712248098FE71081A2F499C590F4FFB0C458600C6145EAB806B9A17E1D397 -460C892B9EB62FA388C2DDA386D885868E8FDBBDA14796E359886C7CB3CEEFA6 -69841CE6970088E390532252E75B39638FB61F2D4956F5366BE84CA26158C29A -720D100B25F36226E17B597A9E346319034FC89763C5D34250C41119B25332C3 -E7D08A62413FAC07FE4D43F31098EDB02C36A8E3905DCB5224C90B8E81B58F9C -6390D12FE03D4729449FBB6BF75B3C60481A981EFEF8E60CA74DEFE3C1A7EF2C -F267C66C6040C2E384361624E811166EB5D12C22F670893133EABCA3C31B1D4E -197C6CDBEFAE5B107BA346712053CC52557333E2A0ADFD90A039CD9C15A3EEE4 -DCCD5687ABED97370CBFB65DB4E6F196B4B4A7D23FA2D5BEC8A9CD4FF37EAEE5 -A5652389D95156D86E6EE72656A79F133AAF562E58904BD623E0D5F52B80A052 -FA9CE1F7FF5A42DD8BAB08288C947500320021A8A1F02F81298274183548E51D -938A4DA2390C0AF23F404892F977840A05A9DE6DAD7F701C3926D30B6085813A -777EE3F19533C24092D0F9B3F66B19B0EF6C77FB988B698F4CDBFA347B8FA2E5 -E4DB69DA3ED7E57D9BEC994B9E0CB8DB7C7159BEE5C080C99F72F38D2F3091B4 -DA8A6D72E6DE8F547E1DB841FD434A35A78C00A8EC6D3C4F4BDEEA7E0B044541 -3455E1A78B864B03868116D143946772209E5FBB3C4088CE2CDBC1CDF8F871F4 -1C7F23513BF1A0A8B98BBD8F9C46F5A07AAD9F8671C4217945F89010D3E4241A -832283C0785F3F388849032378C7DA81DDF6C93C0B1D34CD8DA0851BE734ACB1 -394C485511BAED3216B16A59DB645747810E097223A7CF7D90F67644A479D378 -3D3CDAFBEDE39EB5CBE69B335AF50F81F0CB9806676E777F5E57CE83AE5A6C20 -29615720D2A38643C1EC8DBE41B2329A421EAA73119B42088D10C669E75DB8F3 -FBB2625FD8A74A4B033D186B83957EDA223684240ACE06C03E036A22F1771DEF -5CC08C5490BF87E7BF7F603DA38638FA5ACD90CED53BD80DB5A44C88DD99A16C -92705D7554DED6DF1B5E34F6969693123DF4814D37BA7ECE562400AD9AB7C8F8 -F624CB39942249EE16DD500B6F06C11367B8907CFDD0416CB415EBBF231BFDCC -7A40D2DDDC8D424968138828E60D307897554F83250DA49CDBB48B20EA6AFD0D -59FBE93806A1C24A2CE9808255D3C245AAB4B6BB92CE458A06DE67BFC7162EF3 -B6E63737D14C076A3AFBFF7838A4ED67D054E9B8D8C10E7F6163AEAFD19FEC8E -6A4F54DE31A0360CAE6725C4A15A3D09A7514F039D322280AD168A32A23575AC -6C0DFE29590C1E9DC8CDC06758034EB1908419AF3FAC18DB22879DDA82173A01 -5793B4CD1561FFB26876731297B2485EE392251568AAF9499CA27893679AE6A6 -9CF232894458C65D55F3004D032EB00EF89DCB3328D622DEC8D877FDF4E545AA -D942BFB8F59FF6F49EBD6586481B79851F4C730B2EEBAF5BA709A4FB83460BF6 -D1B629B83746CD195CB81FFB728CE6FA1CDC8FC770A8E61878065D555C92040D -511CB16CE3865083AA993A461C2B069331CD30D24B295622A53135BBFB7FA05A -7537F2F93B14E7EFD28A80108CE316464E271F494B3645997EAEEDCA9033F623 -C3505E828493D52D70BCAB523D38704BE3124FF92DA6DE182DE7908DD972D3A3 -5118D59E441920C330A61F6E22D3C0680239296AC741C263C4604D4C3545FA7A -3892974DBD6AED20F8B20298AA84D780C99A5449818EAF8AE1EEB9911DFAC305 -4B279B1A18A7119C0C6C6F8FAA0D030CBA9BCD65415B2FA833755B2519F19F70 -75B949554DFE5367B0B89E851381317D8835B0BF67986AFDF326444131C457F9 -8F5ADE62CFCC0046D2F703E34AE442081D6E1FEA1051877BFB8C9FD62C9B079E -D3E17A6E226998F5825923473343D1CD911104136A3B4A4816BB0A2714F3C8F0 -07A195878F55303465AFC6B03209D3748BE8B0D4B0C51F757B0D109D1FAFA656 -EEE52DAD0AA85D42CF3BA8955FC61EAFA302213DCF44E5403AF80E9F566F4674 -F603FAC6488AA0A0DED259163F3B94948813DAEBD8033159E0532D4A85BACFC9 -6B22A14C2655D1CDB603D1E2F9A4BB9B08287433E47E297F72140276A6D98021 -EA867DAA3571BCB7A4FDC75857B5C663A7A3F9EAC32C58AF0BFFA4AF28F3D5A5 -C10E929ADF54961B6506C3ADFFC3C0C604A07AA3FD8FB6AB08EAAC6723B68976 -5E202DC630896BC1370FFA92B03B5DF05F6F0B47BD23EA4BF79AB511CBE3F6A1 -F4F5DDF79F82B1399612E7D7314C5A6AF4BEBCB2C51F91F909B33CD172EB11B5 -49FD37570CD3BF248BAEA9E057FF19F39EA0F5C22B09328BA90F7DBDC7E80FD9 -BE628B9817E1EECE9891B0B7A138CDB4E45FDA31FBD2BE0F5D20628BC588F415 -1038C95511672A5F4FD1E2251699536B1EB05C9D6466A31C4CD7EC3680475E1D -95B5A683EDD9A869F7960A9EE4879C144FE95159FEEE5E2A9F215899726833EA -30AA29760393A2D8AE6E598866E620EF7F2F923641FD8AEA7E536DEC695BA413 -BE4A8396938642640F7960948FAC7AE53677A3C48084D43CD216129B8F40146C -1F0681C77D5B1C58B51507B9561931FB3968B9991EDD19EC8EB6E40CFB4EC4C5 -64B4C91A7A5B1741619A126EAE926F4954420747A04CF998A6CF98688D481660 -2202E3D9754371F19AA57B4AD616DE7A88D34577DFBE76D1F5271E79A3CA497F -F588F5A470809CD6CF7BA01E4D3E1FA222B671E6FF43CF1C5B4D3DD54A066A96 -C4DEB8881DE33E5A4992853D0685084909556C9F8714E1E511C66E3CC9A08A0B -C2A2BDDAE9C3C0BD4A6D9F4ADDD9405B62640296D68E47C49833FB1B33BD220D -88226B3C9AC08A2D196D0005B6AC71B1C822AC03B063BCA021110361C1C51225 -3A3FA24BEAAD7377A826B32314E79D74CD7BE6C2316EB6187C984DC885F6083C -1153E253B9943E57521DEF76AB2CD285AB5125F3689C1FD271631ABBCB53A0AF -FF434B6D424ECDD29F4C8BB7C26A3B92BD049424B4DBE184D5BBCEEB4763E127 -019DA397041EB1110891B9DBF43D274D735D1367C271A7B55F5A04D1B36ABD07 -D03EBE96C28A7D92231D058189892E5A9802485B901DA63D915F1DDFB50AC3B0 -75DF513A5CD00B3912DE40470C8C12D9C91204F6ABB35A845CF8B475FE4308C6 -304781B5D91AA0D0DFEC522EDAD779F25AAA110CA80D22AA6C982AC6FB8B06C2 -46EF9A42DAC3999C75C98FF701CBA1F4CD98EEF4E403A24AF1A3A2B8835E731E -FD81BF1409452B9250634F37C765D3EDFC4BDE67D4FA8CC25C881A82661CD102 -665379905209D87AB250E4525AEBD0925503CB459F1175432768D4230CD015F4 -A00A999408C3EBFB68B45F360F3A75A6D7336F42EB0B5C9E36533FC935EAA999 -0860D3ED069E773632C155FFFD1E7C51ABB372209C850F37EA2E78EA86ED95D3 -B897631D2BD45142B7BA7756BF57FA5B330A350FD1CAA78C96B32B5818940D9C -B74943EF39E9B928A77087E5A60B66E1126FA52152D80615B30ADAA1EB7C5A95 -1B4FDA5DD169D76F4BD2D2E1DBA21D79A9E6F641C53A1334EFA21F3702EC4DB3 -C39871BDAD0FB04F2E089B14ED87FB1262B8B3742F3E9F10A7A5EA67AF33AB39 -B55688D008AC4D4D75AC330AECE8E1FB680A4A37C27CECC839C6913557C8D8FF -6661CE76250EE5D3EEDD17D2DAFB7AFE64C4038EAB25E385FE385EC69C749027 -E3F9251EDA9F0B5928BA1CC4B8481E47E1D8D056DCE4C53FE105A430BD6AA414 -73A9EE99E88162A82DB11A9A6897D350946C2ED95768515A9DEA856033D8D6C3 -D7BE3038118EE88BB01A2DEBEFA22275DA47C7CA73A85BA4E57AD8305561DD92 -5EF596292AFA44E3CCB1FEA3B1F5208FC3D3C6366FBC21C717BB5F9A95203820 -1B47CAEEC0B3AB106600DC5F36F176B493EF5384BF2F50587790AE3FAA6BD49D -1E73A0B8A0B092D24F71EE758A4FB6FA4C4F14ABBCCB6CEBB9D099665F733DE4 -DA28E08FE3DD09B354A69846FA710978FC68A7E01D4009527CC36F8F651B85C1 -C7170E67C7AE9ACF0D7C4286AC200D6A455B559A3E2DFD56230AFA11FC88E81F -35CF6E4E06D9C6352A9F0107F8721A8971040FE78AB5992F9BC5BB1FC9D25BCE -7ED361B1428F03532CF63B5A5DD41483F7B9D6BC8C1346E6BEE09AA2F9194602 -C531E1A12B449CB613B3CA196D6A4B0DA959F84284314B1D2444A19A1B5D1139 -7F3A9033B83B8CEDFC3EB07B91E9DB6A7726DEB3941FC3339135A0174D409AF5 -B7D6BDACC1C2BE1ECF4A3B18F2ACE3E265C54AAB1979E8385CE1A00EAC2DF463 -74116D2866EEF2B6305925227686BBE72A5CC4B174147342B45E76CF9683F1BC -13B878B06D64928B1AC3EF1185D2845DA30CCE7527A6B0CAB819CB57BF4985BA -A3C1CF68E5FC7FE4779FD805F7755A722A2BF6776C52142EA3FEE3F2809689FB -80ED4EBE0FA87B490F7D9BF71796D566CF172F6FFDF79FE3177538EA2CD906C7 -5C332F14B70BC0083EC3CE269092188EC4A631CBA7EF35A3400D9D1B077F4CAF -99908013E4CE9955CF1D05B723EA105F85B041AA1E507768BDC81E42EBEF55FA -33191EB9D96D9DC460188C5253AB43F4064F220A50D37BC0FA46402D3CF859A9 -63CC12A4EEACDAAC875AE4007E7F9F14D13E36D8084EF46854C01666649AAD9F -6EE3F8CD9A2FB7CF84032156F79D987F17FC2D72410E449A4C5BF692F245EABE -E086CA4FC639941EB264927E5506E38E3A5ED7B072285533B6473AE8BB243D12 -E6CA20A20D2F2C80359F8611B3AAD444BA3F3F7AD2D49919373BE69A5E0FCCFE -CF8B8D2D7FF9C63876B2A19EA9EC574A700BE24BB1AF9D6A0773CB348EF7ABC4 -D3D6CF081DE76B1839B4D4DE0E14EA40DB1B190B4CEC3F4F3B04C0433D270221 -72BB2DB7506445CC8FDE8AA764B6AEE422802F831171A8773729F81745A3B74C -BC27CB5438601F6E8D4D20C44E64270272D8B63B94DA190AA79D019C6712D632 -3E3CF723FAF388854F87C53E4FBDFAFC591E282181EAECB30923E14C0B28AD14 -6ED39E1606FA11B8F0B6D2BB789263A32F193DD0FEA007D1B409B569FF4BE4B3 -C5F812A24464DA42CE2419482EF6E2EA83711A40E33538EEB8178F6F5D99231C -E451F416F14DCD2FB69D0CA443AF4323D272235E96198B285004218F3ED3A76D -53F032109F9F3CF99DF82DDE1E235E14469755002BB3CFFB94790B7733D4DF2E -1F0637B09080708FA296516F4667907292ADE0179C9C6A306069AD820C63AB5B -27BAFFCC57276DF216F518CBF86949D10ED7A5AF53C5B84A28C813545AC9C750 -9B63350E3F9E14129314ABE533B403102CDEE54AC4E33412DD0CAC0B5C66C07B -C6D8D8C97F3CF83DF4D6D6A1A4F5DA9F77B4CC426C14BAA9FA2384179E6CF038 -F363E61CE9218A2E1194573097ACEF3159538035A20D5D741073E94D8BA1F875 -C573AB17686A1FFDB6AF26CCD561362DFD7AD663B09A1AA45E765C7124F062F9 -972692FF16DEE599AF4E18D98D7C47CD8A3FBAA5FCE1CED1426D62EEDBE5B5FE -0FF5FD3F0E8BBC33A9135D2433808CA82D5EF21DB4BFABDC0858CE088C0F636B -8A182F13466420BF2AD04DB613C4CBAD45056118CBF15F845004AA6C1024DD1C -8F7E6D59BAD522EBB9DD1C56416AAD9BE0DCA7DE23A34ABCE5ACCD6D08221519 -D9E351411EF3963AAAB7A999E11B532B011FFE879A52B0F71F1275E2D45C324C -2EDBC487D9FC75259E880179B9E22BEC604F55CC79EA92FCAF520950007873AE -A820B966A57C9B4FCBD360B864F03B6459CE0FFB589DA91840E600AB84107ABD -A5CA55A81643AE8AC938AFF7F0794DE49BE1BEBCCCF185D0CBDDE995AEDCB7BE -D5A7A6588FEBAFE1B6E6ED6CEB1F8F2FCA32BAABB2F16B3E7A4DCF97ACEBECF1 -5FB8F2F12B646BD2141BA42165AE6CAA9D2061FCC4F72B0D854CCB221E728465 -FF4BF236B2787F1ECF27FDCD2FB9FE432C97B1381E5C0B760AD15C459C823203 -B3BEB8B57B99327EAEA8168FE39EC841A413DF2D5D95EBF992EF7A85853A4C6F -EA624002002B37A469675438FA44BBDF18A58C08EE079B55AF5BF36EE5BD8483 -F6560E4B6A2F5EBC822EC752718664FBB975D22F62D5C7207CE54381CF16636F -0C239CDC26532C1ED5FD882F703E5E11B9B15EA4A95EF5444BE3AA4B9A6F18AC -7903262EBEC07D0E14E666BDA0F85F60C516224EB762C10C394FB9E1F6B872A5 -CEDD526F9936429A70B8DF207AACB2A478E18B21024DC811C8AE940CCA62C70D -4DA0DE2594EA0755AA582F25A67B5ABA058119BA9B08FD6F853EA724A04D88DB -EDC1756ED29C58846F68CF19182DDAC39A79B5F8E2416CEA90CE928494BABC13 -0E1DFE55CBE9DCBE81B9EF699B81BF722CE56EFD9A23402F7281EF4026F94750 -F74B913F8BC9B213CA9C2C8DD373ED018E1F1EB5FDE038294E7A509566E589A0 -0A1701C96E9D7D1613DA993AA5BB30B86E71C43AA43D82215435FACAC845EA19 -980D43E90EA54B62553F9A05EF284ACA8E6176A59B09903FFAC69DE57D8F1502 -D819203BCDDC47EC0AE3AF4E17900EF48BEA8F96C5327F803ED2066878B0B931 -E736AF0341B523BC5BB8A5925E8531C21BE073A159E9F23D269C18477B188459 -ABFB083EFC7C10BC9597C51768FD88677C33BCBA9C3A0F916BE7BBF38DDFC853 -F4211ACBEEEA33A298D9B830AFA71467F9BE62498478265BDD95DB808E940305 -F992A27D6F655CA95A22C856BC303F0EA6983961658B8F1F926E048C643BA57E -0B7572C0331C897AB14CA92DFE0018974856095B2BFC1538F275FEB3B0120BB3 -3EAA56CBCFF5C9CC0D9E3FBD7AE8B6C8AC8D1A18DF8835170029B24638692BF3 -4FC5DB6F6C62C05DEFFCDB379D0E0FC878BEE3C3081756B5B235C48D660B6B3F -7100724DC5BC830341E64DBB6E79E71BE9676E509BDDC3EFD546AA7618BB35B4 -727CF0A23949AF4CE7C17E78BEA6179A95253DC7EC60A5D78CC1FC423933E1B0 -5C9B1B79717C3C0977E91014BE72C4A54EBF8F3C1A0C29478903799DEADCE0A5 -9175F11E23C531955644CEEB7FB569E3D56DA001373ED676DB4AAB56AE191AF7 -89A06AF46C0AAF8675620B7FC0774C20208104F2B156762B030FC94531B5F50A -984D974195788F2D935DF2FECAF1FD2D585689A86A7199AD352FB57C61A99CA3 -FD31E14D5EAFDD2D4B6289694498681EB8B5051127F00ECE6D209FF10A93A4CA -FBABC55DE5DD96F5DA7B43C8BE8CF6E8073E3A85769FA89DC5E2E2A190806706 -D0ECBA46B8F78FE75AC189B2746B11BBA8EEC5F5745EAD6224E206A2F73958B9 -4CA08B16E8CE1028B319D190206A5F86427AAF1F81814F875D81BC89D18AAE3F -47342DE686D7BBDAA2C7A869ACFE6BD5C33C6D14CC409C6A9A9641C2F54A02FD -A1A9CAABB4EED09415AA43C23F6ABF6373C65ACA5A48D93B809EE0FC27F7D42C -A36EF5FB1C8613F9FEEC4AC0D00C0A4904D014012D72DFF8EFB69115D1A611DE -B0CA3A05C93437EA4CD98235F7ED693747405D0299809EE65BD8044798F5 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI7 -%!PS-AdobeFont-1.1: CMMI7 1.100 -%%CreationDate: 1996 Jul 23 07:53:53 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{0 -250 1171 750}readonly def -/UniqueID 5087382 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F -C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B -B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 -DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 -4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 -FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB -76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 -123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 -012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 -A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 -44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC -4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 -01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 -D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 -914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 -261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 -24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 -A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 -9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C -889787CDC1855B709E01E7D0400DB657D057D0F1FA9733F3FE87282A9244B31C -FDCD517C912E7C85E04E911A29D345884BD565567F38E5F8388424AD21D6B2FC -6C727705CD042B1415EF850DC47A31F9F866D3C6BCF7932230F794863FE840F0 -DE8B12CE607AAF017260377D8AB837AC5BF43A944259648FF2E66DE4830B39F4 -493074E15D8D15E9A0D1D748FE740FCC5C7172436360DA5E779A9F39805C71A3 -EC7D4173D9B325E848C56CBADF67F80D54476357C56A6A3B0B5E1F7C57C6F5AE -51B23FDD5B66A1C434ABCE03BF7E800C46A10AB40BC3F8AB4AFB945DD29729EA -800B1F5C592A96A603290398ED5EF70D99B520C4D3584CE66A03DA62194135AB -527F0890546C94634B0D13C8D29720199E58392D825D3FA8C811EFC5F595DBEF -1BF365BD050873A5D4045036D61D35C2CE2ACF2D71A2387BD36DAB7A43C39EAD -62BDCB4DD35B24946FD44DB28CB18EDCCC77974823BF8705B27D7F4BAB0490AD -D682724F672FFB2524BCE682BAB490B53D08E00385E9AB6E0653B042A3235FDB -8D63365B40A7C12C24844AEA21EA57D82A21607E52C0CE347D86E4BA763734A3 -EC3153748F74B8A169A748C731F98942BCBDB2176FC3403680BD0A429EB1766F -03EE106708EBCC2A9CB2055EA821F7A7E9AA605DDA88770242058B7C70CC5316 -6436543EB2A4EEE997CB706E96E2FAE782896F9301BF5F16FF46B304BFEB2AF8 -9EE9199F239141DFD9F183F231EAF299E39A356E1378F3234EA5A2CD651FAD59 -5503E7B857FD504D151490581045C6A28B85324C0F1E658397EFF2FEE0D86608 -2E9A77D48647ECCE5A74D68E92BE50A6CFECCE343EDBF430F492779A6DE58E2D -82E063462DAFF3B9386439F308144322BAEB209B1B8650553934A108F4245BE5 -5AC14B1FE421891FEEDDAB70F9B99832A29E30B9FA5C4FE504A91DD3FA7BBD07 -5F6621AD7A60B29043B23C8D1547E36A77C0F0E1D885677ACB514862D2C5D9BD -2A3B1DEF43F85265C649616F3A046C7F61C21AAA82BFC8548766AC632609D6B0 -916F9F1A4FE4D9FD46B3D126509ACC964439613381C057A06A5B038F1220357D -3703679678464AEB1D88E78DBFD23508EBB8B8369FFFF7B0EF48DCE61F7CA768 -DAE41F8E086BE9B1503E11B8D24C723E4952EA9574D672E7E1FCD2CC5FF4BBE8 -8DA3AB4BEB8D6BAD3020F381304D00310711E90D88E9FAFFA29BB3DC289B2C85 -069EBC4CD5933A31B635A78FC391062505C71603814EFBF6AB6F62C690DF59F1 -287ED31D607E0C36046971DACFEFEE2CEA5512AA38F5352A7E911ED33568AD3A -E4F98A3A2BB0AF3D1AF49431353D3F5B1B63625D211E65F08CF1CF4977C19BAD -94AB4B6675AA0D1283FBFB82A0A8176441856CF74D97387FD8D6B92FE3359377 -2A76842964412BAC540753532752FC12F482228646CAB99D7302F941061BEB95 -2F2EE7699D1203B5DC346A0BF53321A2258C664E8629071850D7A86E292DBB9F -6A725ADACA07A0E94B33945866CEEE84B9FC8D7DDCD1DA52F56101D220E314EC -13017648EC53D0AF8B983D5B18C290EA714C46F64732AC4F1312633073DE3861 -3D7662F8E7E999B1B6EC8713AE9363ACFDE073139DB5E6EEDF677C9FF3FA25F4 -52E44A77331C789FD9B492E1D76EFF747489690075C0096150E337889DC053B9 -8E8630B8A296991EC82FA0990C66D5E301A6399DE2D02EDB0869A1B2F647B1A8 -35122B0C2EE679A79767226282CB24397EC40E65A8A0086C342C4E6F7CD5D7B9 -872679D5F36CCDA9288D5383663C1DB1653BBF3FDE5A6DA523F5D161F029FF8B -72ECD7FB8EC33ECBF7C882529911702D06EEBC95692E30FAAE6FE6E3F7D68884 -8A1B1F2AF28C3BBC12F69AE281EE2BA840C0410784EB4C6A6FD86DF80FD1E699 -1ED34F56C056D10145B3F9D4EF77A8943B692595929FFB1C77E8088BC39B8724 -D84891912B9730B451A3D94D50BF95397FEC6E807F57B2EC17FDC6E90C8FF04E -DE571D07F53BEAFE2707ECB90F27BF506A8571F9D419367EA190189C0C64AB5F -9BC526A44C9412535D488661CA79573104346D88A2AB9DCF51D46209869847C9 -28A5C2FE6DF64A99E493D79C8ED8F4ECEFECAE8E384BA91BF3F869F5C26F5AE4 -C4321D5AF98817D2E5C26EE584723FDE5573B917D2A3BA41B35E6F8BDC7FC006 -7A0E57634751F88B7FE0C0590109C70AA86ADE0BFC5DEEE147DDC57DF72DC62C -95EA8881EA18E3C0ABEA424C43794E62D257984FC9DDADF1CC56E657131E7AC5 -BC64A108D97ABEA0A10CC7B5E00AFBFE8339D402D4DE060F800D2F8B8A1DAC42 -B3925290A676C49F6DF6A7B8EBD618C7EB04AECB4D653278397962EB0691947D -D9FEF8F02DADB485474A76329BEBDDB6D85CE1D3B1D78AA177E025DA4B771A37 -CDC181A5F7DF19F4A47B692C54B76B724D32E04A0C7EB9F096ABDD7DCD93A4AA -65056457486226E3A9602BE703511E3898A07007344064256A7949BEFA32DC43 -497507D320CF68AE13932099D6C95C1675A05980C64ED7A911695C1C6E28C742 -DE8B7D662397CFC04AFB3C1543878BD741DAF5055B51AD133488A858D6715E7C -6C02D4DB10677EABADFFC34248213A97E5023D59715B1C08FF8E610F977F7099 -9683E29FB0CF4FD1426EFBD6740B3AEE99A37EBA5FA6C4D68117B7FD0445A711 -F1BD90FD9C62CC41C952171F83296B41CBB2C5883C2AEC750AC0A89CC6DB5E2B -A5D1C3ACBA615F43CA9E675648597F320A3A1B122416614830CE84DE50F6E76E -4C2E216C3D9826EBCF4FDFAC4608280617D9009EAAA445D87B885941614BD2F0 -E7CBFC5EEBFE590410C0BE889B654D8A4D6D0185D417967AF1385ED906BD130B -19FD5A1B1E8BDA0F8FF30EFD67C41E46BA6C87D343965DCC93571B4CEA10F60A -8A5052EA5AD4527943AD600D8498093B3F9579CA8C1FE9E9AE841728B199A49D -533A0C5F3CE0E1F1203F72F931875FD1B950C1B2BA850EC26410468333F0A0A2 -3BC1CD4575B526AAB9983931D2C8BED4109498528BD8CF0879D230EF7BD482EB -6FD083C39AFEC62ECC38F58AEA73DD8AECFF3A336159973BAF1213D14830CF1A -758F38740858A4C64D7F4E8FAB8C16B4B0BBDE720A16F0AF205D351AE0462066 -B94F25C0CB83DCE6CF67605E7B9C6D8BF15CD2FC3B1499F05C1ECC0E2617F32D -28750F6C127ADFA30A661F6462BF8E211C0DFAD458C6E181D63280A5D4D8F580 -FDC76460C86655BB2A06037AE80492C6D23EC1A33BAF7DE1602994531E6AC15A -9749DC91F1B8C7B772321AFF685B8148F1B5FDE91F40C692CDD50DEE4D2BC54D -D0282B3B472F0985BF6D071396AE99B444E43F5E8A581B6093EB014EC450A4DB -222C1F6E5A1B20D1776EAFF1E0BABAE61E6B23BEC504788D3EF779BD19EE4E02 -B925F584DB65BF773967F10FD773F4FE2DC35186BB1B2787DCA8C6581C9E08A7 -9C32E4F2DCDA73B4BBD2F5705220B40005C8FA5867155153C787AF23FBBF6FBF -30681588AB0E7C578AD4271B755DE0182FD881BFF03BCB462F1D9414B437793D -2B9D4163C187EF234730F62DF07851527ED13F95658ABF07D97007641E66C160 -A10AD7AAB891FD35F16231C56C9F337182F3845A0202047AFFF98AD1AA259484 -4F9083238E0A66C9E31634652AACE21CDEAA3436D28EE09CBB2AA5191EB650C5 -1BB6CCBAF64AD2640CA68B95390EB80F934B295F7528B997B83ABC4F9F4364BE -B49672FD7D98E53D382E6E2D79129A00ECA05F2DA03FB42A1A7786999357ABB2 -BC69BC41FFA4025D6FF349CF64FCAD863CEB7D02FD406B12B5E6AC494F6F90EC -F28340DF5BA0761BEB2A2E19B348DE866C5FB9C8AF6515C0BBFAEB48E34812BB -62CA1915A76FBBB62260DF4E090AF01233C12B6608782E1AF5F2C3FDB4E1FD3E -40BEE5E1E3F122C6155313C641A96B685211C074CBFEFD50B8BB654E9E37D8D6 -0A8E6652250F33B6323FA5677444FB6F18111AF060F91248ACFF5A236855A22D -3A803F46E639EF7A52F99F6FE7C782D2BC0D6362D12D6D9945C39F0CA7CDAB02 -EF3BE3C38337E1CAA3601F7903920FA2D2CB15082DAC0B5CC6E240FCEA12BD5B -924641BE2261CBFD2A8644ED709DC9EF9279358EB530F2AA56EB4754220322DA -D19D359391292D0B810708D0CA5D48CDE4E5F29D25BCD23C7667F52F868EBCC5 -2C793C3361ABAAABC12AEA15B54A8981202E633FB9DAE8C03D2861D2B2C62CF5 -116FDCEC0C4C2D99862DED4EEEEDFD760A698DC7EC57DE0F9AA96F16747B8057 -64523D79BD9D7C2B136ECF8E743C8EC063A9BF26C9112E5D109E08FB5AA4A80A -58E5FE038B670F593F3381FAF5A0949E8C45C0725EE8C6CD63CEC500295E0DC7 -5A727224692FD83534F259A3FA989287EB65CE7D5535F9919B216F1E4AF6382D -030696C8B7617B3D3592B6F0400BA136E6D75DC18C446FD365BAA10EEF429E64 -6FA26EE83ECEF282E9965E8FF8A2C9AF8681270E37B37047469AF2A9B40A04FB -FFC344792A8B4699ADD818AC30741F16CE54B2975A42E9E89F1BDCD9AE0CD3FB -378FBF13A23FCC52760BAF265EF78676A669E14C5E109D53003B259A164EDC54 -85C437CA500F18F187E918074451AF2F5ACD4B799FBB5AC725B4050F3451B807 -3882743D65E92EF9D94AEBD41F4BB7A826BD6CB89E8DCB8FF0A38D6C8CA5B0A7 -EE9D24A79D933882B4639714FE47DC14FD52E08883B163CC938AFBB8195E409C -4FE3CF2CFDD23B3F2787C8F4B211DD9167DE1A39CFC348C331DCD587400A9859 -5ED9E3BADD912E93341BC9CC6D414A250D2946B5F15295EBD4F19182F1F620FF -B3510C129E5F5F649F4BE2E02E841C1753A6517F913D654A8DF0AC458C56405D -12A4EC374920D5659FCA295B07A30DC8DD5FECE3B1CD9E4B79E64363ED63B7DE -35400C014B2C73FA6FEE829A99E7E7218FC9B2DF7D277775F1A8C8DBE2BD8D55 -1C77C2C3E243878176F8491022C846F36AE1D32FD489DB267D72897564F9C7D2 -ED833DD0DC07CFB264DBC1DDE5CFE149477057796C282F4F23D932FDD85AC017 -9A7BFA15788CA21FE49D9A31A4FA672BCF09DCA715ADB2476F4EC0D1DBA60043 -DC592B6540FBE8EFE643DA03C1402AC38EED8E17B553116AFD303B71445F9572 -00179934904B9AD3B650DA529601B2214425F4D2A1D8B7902B16E4087B741254 -48BDF02B8248A5ECBABB1D8DA3AE0989C1CDF241C4D89A6FD3CC802E10231A7B -CB2F67C9230732F39DFA4FA20716E0804B2154D4DEDFFA8EBAAD0A877215F294 -1F96C3772523C05E80658F3EC8BCCDAABBDBA56D0F4DD269BBF3271D6DA3F210 -17313CE43F94933826EFC571D47F260E6EABE34BFA99E884914B59D469EEF8C5 -B66A51C2B62A9591FA27E1E011842A3D1B0E8CE0F1972B69AA8696BBE7F4014C -CBCF4BB873D34EA88F8FA45C6B18B4661EB5FD1A5A868B15AAB8F29DCBBF5AB9 -6C0E623C7CEE579D939625F0F5732E8E6ECA205265426BCB35FC2BA6B70B75B3 -9D68B32BB034B13BB5445A26936D56C3453D922A1BDFEC94316E7BCE750E26CE -1FE387D3BB044B44DF955225C0D19F75355F89A4C516CB4E1261F0DB37E4226F -DD8F55091A7F0EA0767B2EE919BBEE312C97C225C33638689B078FF9C5D0E293 -837A065BA0509B469C5F7F751EA79F5E30417D19E785F69174776E4084D5F242 -AF51595FA898758BB7F07CED1B1E6169A80F9093780A9181D818A5FD1AA41112 -B63AE96A0FFE02A7358423BE357D2B5AD99F2DA900C148BD1EEC0C32F1FEB3DA -86B05EBF42953FED409F5EC98AAB0ABF8B55E26FC0B1779C7A816305E0438724 -C76AC64EB5EED040E5F17A2F85C7F4F341B4BB74CD7D3C3A64669936B1117E32 -FB38996CF74B9317D1CBA65C39CC536DEF166A29520DC3B196FECF7D2315724A -E4CB8BE2446CACF869C7C0A21FC668B513D1A55B7805FBD9726CC7502F6E52EA -D5C46F96E5713C5E3EB76A10DA4CCDE7B0BB5B6848F82D8EC7CB78616A22A41E -CF63014362D5E6212C39B2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTI10 -%!PS-AdobeFont-1.1: CMTI10 1.00B -%%CreationDate: 1992 Feb 19 19:56:16 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTI10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMTI10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-163 -250 1146 969}readonly def -/UniqueID 5000828 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F -21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 -06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF -55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 -B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 -0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 -1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 -7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A -7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 -356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B -19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 -C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F -244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B -AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 -5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC -D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D -993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 -2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B -E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 -309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 -F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7 -E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66 -AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9 -17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3 -05965AA02B8A67AEB04D915DADC1B84A531A1D672AAA06E9F720BA88419A3183 -63D1F9A3BEF8CB2E23CD1F9C003BD7849F093D3B4C83C153A5A790C1F9E37948 -5799C02F004C61A6FFDEAA1F9AE884DDD40DEB1539CFE3C3BE03C7C33CB54D56 -2C2A0F467049797B56D407AA43EE6B8C3F978A7D945A80BF711C12D6BFFA3DED -35FA8B22E68BBE4FEC59E4C56D3C57E14995A8ADFA51CC6C3A84D3D775CAFA87 -A1A0F45C0283139FB485B8FB0BEF5232494C0CB564F966DFE0D0566031392619 -3FE8F0BB6747BDA591DFB26132947872D3B209FFD838A17EB1D5047FFD889EA0 -A5A255EC13BC7E18992E5B4F1FAFAA8F995DE7E92A738026BEDF2685A7E72B17 -6C7907BDD49D0AF9F92EB24996C2BBDB7FEDB0B519988EB2D9725472C31D65C6 -8D891D973765C8B1BD6BB1908CB0702E3C345B925E4C032DA9AFA2823EF9F3FD -50EDA959805A09C5C20A68CCAEA78376ABA7401E0CBFBA2B1257807FB3910215 -541C8EC1B84D520FE8577E6A8724C4E5E1BF1F85C5FCCA5AAB1EE204ECE38230 -1A0E8B5797F1C1F3C89BDA9A45857AFC33F8ACF19FB436A3639948D67ECDC588 -226234078AFC80AAC8C7BE86E765C573EE42BD0BDCA07156E22FB022128555FC -22D339858A9534972CF296024B149656BFEE1F4E128682DC840FC5718D16976F -54183791C86D21AD9DBF9179001098EB0DCBB1D0B247D9D9A1CF8A35A52FE0A7 -FB6ECBC34BDA5C1FDE5049D559C90BB87DB5CBE571E0A72AA29E926D3DF1F36A -0AB985E39C5FDBA7F83BD22139F75E834D532ADDAC48E60ECB20055562C6FDDC -E3DC66C62B095852B5CFF9798F0F22A85DAD916F1F34EB243FD62EB632282DA2 -A29223A5CD822767E01F04BB433E2DB4F01F6EF53DD7F89DDE1003C3D330CBD7 -5CF26725E43E3FE583E4A77FF64CBCF534A10B78E628EBF1F11D82B6B0A8D9CD -E860169EAAD9C17EA4F8E2B6C6B166CF0380375A466C462B7C8D92323482364A -4F3CCAF98675E9F9C7B7A2531551728E18DD09DDD26D2EDCAA14118FD04E778D -61608C72E1E2BE338B34593E66D2A8F01D0B3B89DFAFB95EA27846B0AE2EE97F -786DAFCC7CF4107958B4048AD19DDD17C83CB971D57FC6CD322E0D0F8A6719B1 -81E92F540C111D0F9452A83CA8898EC098EF67FABCE2534C1FB2858116FABCD0 -497C30AAFDC7DF5AB2FC4FB68FAB3A4DC450678CAC82125374D9F22DBAF12D86 -5A88C341C410D380C5BE39F9333F343F27BE960BAE93B7F1A836CE6D3CEC7110 -A8B79B5CC86E2D9260B25C6B55216625C6ED740301A9823C1B267CD4C9630B54 -77FC037A36C05C27848AB7DDF489CCCF3B77A9179B83E42D517A94760D648B20 -C79C8EADC1BF4A2B66F7C396CC0919995CADDDC435B3372A669B36A3FB560631 -E25F33B45156064F5371D892134AA682067B5A78F9BAA07FDB7AA03E8F718120 -4E7E671872A72F1562890B94E47C400FDD789B3D1D29734A828D471528A69B45 -72AF66673C88A986FBD2EB3893F9893778089594DB1B0315C5EE84663D4D5530 -6F06483F58BBE5A35F174218751B860C0882267A2B3DA6D9200C0C215290C5B1 -3498528C14DDE8D37FB9877EC5BD62EA21F6CFFCB3BAA237BCADB5348C28C98B -4D6581762F95CEDA544DDF225D252D8D298976D0246393E046E4F324351153B2 -E1B0BBE8554B15B9DD5E28301FD5B254AAB344C72938FDD0E21569FD458E4567 -73E892E087B2C2D0DE479431CFB2B77A8F18A9D07EC864AF10A6AA25391000E0 -E95E1CDE3C88EEB8C9991CA3A10C1478421CE9FF748CB07AA75E15C1385DA4FF -6A2C4FE272F78E2138B674FFD2452A64B3AB2DB03150FC44E252177D6DBF42F7 -D3263C64ADB1420E0B07D3683E003B137E613F1D963D0FCEA9051306CF95D72F -558ED61D970534E9AB71BBF9306E199CC7CD78EA09B349F16C07D16BE23E2D83 -4CBDBE9C7EE455BDCDBAE75EB3C9C4C6A1594D5F72E3612FE0FA12133DF77892 -FBDB4574069839E1C356C54C015C95760B516DDEFDFEA19F7E51B826D4E14FD4 -961ABD55C0A5C6113C0FC289FCB9EC1B4EF9C081F102A9DA24286E05FB06697D -16990F87EE0ECDE9E772CD60B0F4B5CA938731C323F8A2894EA1F9EE7E874184 -01B44B9709FAD2E7A355416F3CF1C93693FE49B8B954D1481C825D4B9CDE03FB -361797C93397EB8DD50E11DD75251B7BB52FBAF2F299983F565688188DECA195 -5A6D453B866EB172F840DB59E129C05BAB0E61D8FD865083E24C4E097938EA46 -00E613DF3480A82F2FAFFE17B9222A8981B82ECD8620B1DAC9F64FFCF0C54BDE -579348193C28A5D2FCDD0240ABA89C607AF56420C116B78FC2B43FDBE4F2073A -BF70E9177A17C46EDD9C46DC53163B4DB361A85072EACCBB840C2910D16DE90B -3A6B93433237029C9D68A97F11E464535BF94954066AF2601263C98B39D8B250 -890BFC3E60F6067B00F4B288EA976DC0D565593FD4F14758F9D03DACB477AE02 -D107CECF487DE52344E28AA262D38C508DB24A6018B51ED105609BD89DC3B72C -43A182835B1BA36670BAEBB50F5A78A4E2857901E8519B56DAFAF40F76375F1D -DD5C523505F25BC00F354EFF8479A72EF8DFC65A5A0944E0E57EDF7BC1280C84 -67C936A7FFB10F2FEC91668EBE53B2F3F05FE2D056BFA327D662720576C2E2EA -2F1C619B13C8223135A85E920C46185A935A35475E1C4614B6BF481545968C94 -5892F3CCCD80796FC5B91F191354C5845AA323CE61A2F63D3FD278AB8770B8D0 -06BAF5D4502AFB7B49481617ED3D50EBDC8AF16F974E3A203ECEE3B459A44925 -8C8AA8D82E413115EC9488563EBCB4743866B00B21F048996A1FF1A871FE9E54 -9E6461C9310CD2D218B5B5DCCFCC77376C9381EC0DFA020122FF0DE0F3F9C8C6 -934DD7734138C6CF77BD0F9FDE3369F9E59C19C3EF52E8A4E51557F87F8BC311 -BEA2BC1EEE2E5A5193F22D0DBA0B11B7A2EBB4BBD0134AD5D0441F8D91D8DAF4 -F25C51FB6EFFDE4431AD9F5341827357355168BB1A77F45A3C4FA12FCF1C21EB -BA8E8268B551D5EF6765C0161E062A207F644FDD77FDDF298EBE4777D0D50F1B -FE5E68801C36F2E72EE8FE9204AA91C8AE922B7DA837480BDEFD585827FE8DBE -7DF1F887BADD53B3BE0B3EF2AF0968207F510DA4EACE41F73FC82625761CBBA2 -22F8ACE7DD6EE6DD0E6F53FDAA9464F7DD0EFEC48E3B7C59732DE77BEF2A3E31 -FA7BDE19A468BEADB9DEAAC4AF060CCD6BF9F1CDBC3BBE5A7DE5B09E4FF3C906 -57ED88D8A2CABF98B99BA190711D12581EF1037DA608F7180E06C9F2582298F8 -203C22E863F42974EC5A6070788854B5556B4EDBBF79DFB7FDF71ABF4AB2DA53 -9C684666F1182941A141F6640891341290FAF537902AE5D1F8DD4383DD98E213 -23ED04D2335D1021B012F9BBE4C9D42C643A59C9F525D46DD8D0D39AB192121B -5A986EF8CB179FE71228A7C170EA86B7FDC1428BD332917C71D56C870B87CA56 -D1ACECC77BB8BA221BC9AEF537902A14710FDD0ADED690A5B59606DCB04A99F7 -C798C276F11B71C209E04897FBD0A335EA440B770D46193A7E19F3214DE5FBD7 -C90F19F5F2072F582442B155B691324A855AD61CC470A32C8FA6F1FC505BA5FE -5606E59EC5BF51A52C832C70835077A9EE1ACF44054CDB0BB68A9F03483DA51F -14C47362B7150BEE151669DECDF1C7643EBC171AA10AC122DDC1AF733D488180 -664F54FF79750EE4469001A04BD08F70452EAAD25491E0548940DA1B3BA41DDA -889A67D3920BA893D699297A493793264116E76DF02E440E62483BED7C0FEE88 -66E9333D8924F20C112BBFAC37CC1FDD378EAC1D7181D64E053A9A0BF3E4FFBF -DCA22597D4958671AA6A7FC09849F64792E7783F0DB66ECD4D06BCDD60DDFDB5 -1BFFFF5CE3681D2678B613D7AD80A7E58D4C883DC8C5141DE43EA567BB7E4CBC -377BD12F731B000D38B61E27735B528DE49AAD7F5CE05836CDA70471F4CA009F -84714F4ABE79CB7F6BA0372F6B1F53B74F310163BCFED72EFFF2882F2B1CB8D6 -842F96CB9640DA4011385879B3DCFD7A6D9EA18B7C2A204034DEB189B6DA95C7 -77F54D6B0060D91E8B284ABEC73630AB06E906B5E1A0672719275E6421D95F6A -BF4055ECB42E71B121524C23CCDBEE5899974AE03530F45D7126111D84836253 -9285029C4E790B66887D685783DE39222CCC8940D65477AC8DF0B0FCCACE18FD -75F7B311398640068B990463CDA5210BE411029535E7C9E4FD8337DBD37152A9 -B332606A459987E8804CB8623EA5EF726BC350E0E29B244C950C7758EC4617C5 -C886CFC129C4228E72BDAD2A4B6170900AC79789BFBAD92A5B73A3306C46F8BE -FBA7C0EF61CB5D8697F333D9E86E755A4EEB15FF5AD2D4807E7C40A3AEDAFFA4 -0E1BEED6B1FA3E95F3FB882029E2F44E4994F46790BF650DFCC50B853BF48CBF -06BF0C13B8D182308EB91E369325E8DC250FA2288417B88A491366C559746B73 -00CB56CAEF032E897BA668E58DF73C4E78D06B120BEBAA0F10DDDFBECE6F62A8 -3AD27DDFB1A2066B891B74EBDCF78FF7998F387F037085E5F1C053756124D673 -EFB37FFC346F34D31E7CD900397A168B708EEC2B2B109CE7EAE25AAB22F4A1A3 -C134593DC219F38869E3D4AC88073835E054DAD3D740D0943882495F00876D99 -4D1114C547832A09539EDED1FA7B027F6A588F038CCF9D52A0DE7523C141C0CB -66AB385C54B521CB22A437CD7971C5C4938FE2275DC3F0975E474A6F3AB772FD -96A6F3B9C910D6C659AD3D5929006E517D5818DE41EDC075A17825EF5686846B -A2E33C67016E845E07AC9537BC7644E58C70C829E2807B84C390176E3F472CFA -02A010BD24B276462EEA3257643FD31CFF108108C9F9D136CD335FDDD0440F43 -BA3413331F09048ED8170219CA544B35F03E3FBD0974F2D43778E01B0C09F82A -2FF01FBAD0E8E3E45087830F2457EFBEA55D27330B5BB6061AE9E5E4B2444E39 -0AC912AEE3E9C7D6EBF498C397D041599A2257A1870270E53F9615D820EA661C -FA63CC372CDA8DA2C0875514F8ACB1E4F1569FA8E30668249F0EE811C0A1D937 -E104447866AE7CE7F0D14A8A00A39D9FC96432BED1867F67D5C221575961D06E -AC5D40D71007896A7443D2C37D462497920C4F3EAD2BF8F3430288CF8A5F7170 -B17CDBD0A2AA493D2181EFE3834C2547B1012D0A0DC2717FC0DC6BB9D510EED9 -E967E61A3A1E83BB0E96B4E86468DB70B88C443C1BF37921AC356E93CB53F32C -60728A45F5C508F7C08FDBE767C48C4E053B241C3866FDD984A0C0A4C8F61750 -17360DC7BDC1C7528E8DA10EED4A7CF24A525DE471FC25360BF02591308E63F7 -27A0202D44E94B6704B46AEF15178275B41DEB3AC3C201442051D5332E3BC167 -45E1D23FFAD4949FB92D633797B5DCEE2AACB1BF4760435DF013DEDEDD87280C -59253ADA5A2E50529387B3924AC9CDFABAAEC57C5E7E95DC379B5C8F6CDCCE02 -8C52BF780EA3089BEE4698036613066ECB7A305822AF8E26106E7FE0E61EDBDE -EA6E6C151CDB7E5488E49A26AA93FE631F5ACEFCF1595BAC613BCC3CC61E2D3D -84C3EFF03242E13D3673671A8C8A7E5723CE6F2336AA5735EB35453A6C679AF0 -6B295476EB2D833510C57E3AD839DD232BDD7A753C40754ADF2FFB1D640B13D6 -59172F2182D8CD24B46E1CDF46180276D9484806A34596A0382D69AF7478003C -1515918A02DE5A0C78640EB1A734E941933A14F4A2272C0DD547F1EEBC47491B -0EC65E0B32369D1FBE8D069720612D589AADA46830E0D0A09EB402DC5A8BAC40 -498481F31D15CE80F557E9B347E254EC47B8082C0AA4DE9DC9AAA4D0E4115F82 -B345BAAFAB6AFAF406D4857E52FAB5698029810BFDF814325D2060E6677ECD4A -5A3BBFB0DB8B633832D1A6150D78579750628FF4089017353F1D09617A5A6519 -B262B51220E1B6303228CFB5BC37FD0649095AA8779B0A1633B82B0D5A4694A1 -39A6E77DD5C606AFE2B4F2BC929532BB88E1A05ECD281441930591561793444C -79349A81148491ACC616D7E952064596A8BD7768D123D26402D110A5E6188628 -DAFB863BF5CD4CC54458CB090D5BF44A4D54309AFAA38AE3A9C370467EA6DAC1 -12E32BDA45E360EC5C814B4844F0312C88DE6F12C7002E9B83315B61F8357134 -E2D3088FF4B5ADB0F025C1B3311A9DE992CBDBE5641DF94CA0F21E6DF81200BC -9443958E91B5306FE19495760583252BFC09E934C863375B98484F63FD67460D -AA454305A0F73CBC7C6C220A855476734632D39DEF3E3EA36866AF050FCC8D6E -DD33FCD8F868CFB4B5D826084CC8EAF4C4030D615F1CDA6B823D37C52E33E58E -1663E4707DB231707BA1E5FD9F5FC1EA98AE67C336245720B84C6E8A48EAE024 -AE6C781DA3D7E80966F3E2897857142B0477C2770FC416924CB8AEFCBD0E824A -79A2EDC41A35A4950F01F825BFB73A375218395D8C830C36112302DF7DDB1CC8 -93417871F40AA376E003E3F7963D9420AF5D04D1D0914C5362092E153DDABC09 -9D2D43C2D538866C97AAD9169DE83A4589559C6441D9C6B1CBFE0B977DC15882 -5ACDC486F849ECAC634CC8DAA1D90CD28C68C78A00C29B12B6DA20EC21260177 -A2D1011686FA320D02C951169FAC7EE2AECBDD468C4565DBED1ACAC98A8904F3 -0EC939F1DBC81CEC68FEBFE352989D735D97BD396FB456A76D8FE82420354DDA -035A0AA80F09649948B03E80FA2C18FA3947C9248002DAF3788B1293105D519E -55068A831C2EDE719F851BD7D4C66B730EB467F2EC1953F45E4956ADB97F5462 -889E7F32F8DA27AAA7AC19EAD3C462AFB004A99C789B0C87A81CE6B4B8A06FE6 -B904917ABF612424E764CA7A15C31046C7C748A835334F4C81501716F560D9E5 -437893E55EB30AF9476372D715D3944508E83A040E25F6458F98D8A783309ADB -C96259182EDBCC5B282FA177F27FE97ABD783A1CAAC622B91CCFF435E738B325 -1E0267B21FBBA8EA04DBEC84E30BA0EB99B2A659CBEFF90869A4B6C81E0824AD -385A2DDF876B699CE22AA400710161A91C46A9751F5E09B33591CE80301CC932 -09A95535CA8226405D499AD6EC739779CB5E976CBA4C12D22408EE40F34D244C -4A2E1D81AED6B43CE82C88983BCA008AA3E184F8CB106DE20D6366199A13EC1C -F2FD519F527823D8386567F27713A3CEB16DA7FAFD330C2394BCF75E6771612C -43DDFD8BA59DF86D00DA722A502BE2D207959D754CF165D40997977698B93447 -44C1BCDFC6FF3EC5EDBA8A10A7697433055D2EDE08D2B1D09869980BB61A9558 -BFA86604B5D01C129901EFAECD8B383B7685EA0315AE8548D31F1791788FAF35 -6A6C6F32910972EF1026617302ECB9D31C47134E565401B225341C096A47DCB1 -F28743C3FEA47EBDCF0191AEB7C65E2DDF6154CF895B9760814F87EE4025AD0B -D4C76D157A82BC92870C8B6C79D21156F351FFAADC545F5EDD28B09D937D65E1 -203EF376A0BF717D65CF9338F607DE864153B1CC381022F7712821BAE3979F9B -D5247C235ED6444A2F2F3F0B14CDCB5AD84A71ABBEA7AF100B7D92A78FEBC13E -2A44CD692EE1FC52B0A15762B2BD1151BC6A1B0FB20446F4C5D0DBF6A8858CF6 -5BE1843514951AB760E3215C9FEC1C8A4D04E84D5AE3C37A1AA6B3914F3E1FE0 -032573CAA1B7716746CD88A671680C7FB82CC5ABDD89B633F9FEEE933E1FBDCD -5449285569C078D1B0B85E25D03388EE3FDF20602AAD358DD57BB033437748FE -6B1687DC9380D12B87AF00B242471627375FD238C6C86977FD4F33D3BFA1A6D2 -5EAEB6253679EBCDF399407C4808142850AC06D0456AA316449A711DCDCCDC46 -6C00DB7F8C4573AE265913197BE9293B23BACCC5433BBC0C28A639266F0A8CF7 -21AC89682326188D6C615CED2759BD80B21D3009C177ED77F12BC47BAD111A0B -D86BA8327937010C65086404247694DE5FCD81E1780DEF0349232B34CE2CD07A -FE0D47AC36E482EB51B9140FE26952CC6888D8CD2AA6A496F20636216851D7C6 -3D1D13F7003F21974D79D36065532A03129FD641A509E2F1955A3D5BBE0696D3 -8037B446C585970AB5259800AB9387B80988E94E9EE510305E4D45DC214AE984 -C8F3D674BCE6417ACBEADFE5757DFFBA71150E8631943DB937B5403D13C5A5DF -F774AD386AACB8505427B11E8B84BACC25577F7A88F9CB14D6271C3E4365BED3 -0669041CD262AF560CB664AC2BB451F974EC69EA23854104032AE9B3E3314C91 -EC65B9ABC86D0B27A0378C83DE9CCB0ED1A39B4DB9DCF8D9A2F03DAAE79C902A -DD13E3D504886B423DBA62ACA4021A66BBAEF4AD040DB7C9F9B25C1AB89257EE -30B59B90E8FDBF46BB2EA32C04CF8A7D4FA8EB676A631BB46C7F2118B402700D -D814AB0AECAD83EAEF2A36243FC9EECA4303BB5EBB49A12DA6E684A112977A78 -32D2455CF664795BA0F4CF1BEF4A4161CB5B25CCDF14E83941164C31201F326C -2F5F3D846CC518938FBAC3A95A50C87FD24FD5A4A16645EBC56733A1A63CA00B -921260FBFE818490BB6911F437CE15E920204479E04EDF5C8FA7D8FD47EEB28B -8C6FFA61A16BF2A7E5E46979967D7DA22B3C93980346F87F14F16C09B3414C02 -274B3326CF8480B908299D35A89A6247D6465AE5FD2AD0E382C004A4ED82B344 -A7160B275CED303FB968B5B6A0998C9E9BD6BC108DA861C7CC547D13877C82FA -0D36902981F28C3CF0D984422583F4FB5F459DA95DC17B987A8C8F87C2F03888 -14D26BBB3B15A4DB2D66DA769177B445809FB00A6278BB6BF5FBFDFA634F5A38 -FA24DDC5FF3909F7D35FFB2A42710D6CBBFDA4514DB8426CBF8A9ACB907EF3DF -8FA1192EB4351E1200CCC25EB88B16B2F01785AF603903BB12C8AEAE612528C5 -FC28276E51DC834C8F91C7A7CBC4060953A0C81C23E1E3F5F220E207F621D941 -762CF1C9DCC633F134AFD2269575E5FD76618769C7E9EA07432A4EBBE2523A6A -F8D79720F895C03010F1825AEFBCEBDDEBC3C873498D5936EE7A4E09D7562107 -43A126E8FBD096FE9BDC2E14F16671B59E43A2E9363AF368A8FAF56A1505A4AA -C9F99267FCC91D985B66F9E11F657210DE5D77FD92025912D54155C6F3B78057 -7D9708E0A1A215C539A66E936EA345101537702F5467CB350B212AA252F1B1A7 -6CA6F237A6A1AB251D9491C73A98978A80A9D331C63DB3562732986DDCFD5B02 -8EAB722A63FCA2331AED1B0D711DF909CBDFF2ED72A14326967E70D5B0EB9099 -0F0C787F0E75AD58D806C28327682DAB75818E1B13D591092A40EFD731BD8511 -E353D571791E49BA6156C3372E98F0CB6E4615B51DBFA244426473033AB3E5C5 -9A8C03B34FA30F67EA65C1280B5AE8BF9A64EF79FA77CEBFAD3D8E94C333483B -60B935614AC220FE4591DA9702B61E3DFE6074566FE9920F1DA1A95BFC9CEE7D -42CA58F9A460968F13858C29981A1CD420D35775DC4ED0BCCB5109F5F60103DA -31F8E4673886C2E85C595BEE6468C9CF716C90DFA0E3D23DBA00FD4FB7AC9025 -CE2CF3D057E1DACA7B272695854AC41FF79E9DE47B5A82FC56AA33E4E33832BA -0A72ED8424E8BC2843E270AE40B8AE912E491FDE0D04439AE98C186DCB4B97E5 -15890A545ACC2C32630096B2FB68192BD7041540CC3DADE9F74AF9F481ED0349 -3EE366ED133EEEB1B2C46E75FC08385CB6829858311F69187ED29992A4AB089D -DD3541CCDA57A0310F59CA55E959561BDE9618F802043B37C75F826241013CD7 -09B974239D8CE589656395A024E11B163ED192433630308E2ABD35D9279B1E4A -AC2D841151FF07279342CAAED52422DBD863CBE4C057213BFBBACB25CCA40ABB -DA53F6E8100E6F7B8FBF676CAA2AF15F065D1272C622E62A7FBA10D299B5A694 -084C904B67FA89D73607E2D11F0899828AB7F7CB2415CC19EA63B0454339DC1C -3FB30B903F2734310BCF00D3289CECFB427F867242AA628874A698C5CFFC6205 -3391DE6C899800C1A59C82DC71493378520D63B234D7B2EDDC153B341454BC7D -EBFD84330A88A2F719EAE92C195A890CAB15A56E5FA99518E35B7F93D6CA3713 -3C25D836942BB4DAAC949B1E93B152FFB46718A4B971052C61F27DB86D0E4436 -B00A78932AB55883C87292658D33EB05212366BDD4BD39834AEB4DAFA2AA0892 -3F1A53A80E60D6CC13BCEF643097DA1402E6ED982406EF357160D2CAD52C4F90 -5720D7881B0C718DFE241651598DA51FFC7D81CFEA145FAA0D0FC2194C9C6614 -A027ABF83548FF712FB4D43A40127EC9A097D94E2D4A8C715ECB99624679E33D -0026768CAEBF816D238FE109CFFD483DCB7D9126D8C299EE7BDCB3435EC483F8 -8665B130B80E3F52B87C3259FFF5063FE44926D0E2452477E84D1BE85C556EB7 -370BF4836DBFF1A5DF253F4C476F3CAF889153F9508DFC837CA44667EC61243F -8F63B772A319D444CB6F83D9F715F3B7A0CE49B89A4519A46E2C464FCF3F16AF -3F274C2C2D34A527EE40D0F400D294435335E6032B5B6E2622FB46C61F751AF1 -C243CD3D9FA5979343E6F539D90207E88E3904E5D517B9F11EC060A78B80B7C6 -D495E9042D471BB885269EBA7477677FC382853797AE3F598F3756B82D24F08E -B2B6755AA6F9E7E1EC8616C8F1A5A4620650FE3A07B41D11B05ADFF8A9FFD826 -88F598D3CC625DE11E866083AD9DFAA37DE851AA1886F868C2CCC4ACEA0B1D00 -3ACF25C9BFC4890DDF1F287B6D9805A3527310CCDBE47580EAD1841D670C0E9D -46CC4069B4AE5CF74D618FBE857182E33A015749C7862E1A14FFECD30C0C6950 -33075546733958FCF902DE51E34CBDB6D5D1245B48C0009530ED9779189E7937 -0397391B6821DC7C663ED2BD6FAEAD9A7560B364D2600D3787EBD7B0220D5BAE -F6791DF5D8E0801628E4262C34AE12B927857F521EC6FE8BC0A6B79C7E61A8FF -0FAC5D660B693E9FD65581090A6A363C14F84E65A723A9E7684F8E17DDE13C93 -A6C29CF286F8FF01AEDF0C8473EDAA876EDA82B242265FC9846F971D0310DE45 -E977682537C45354E10C69F77BC09164FEE07AE4AB78AE2D91236D1DD6EC03E3 -CA188752BC07276D3621D2E46F395EC0301075D4F78E76867956E7373D56F6C3 -A4A21AED5C142EE991ADED4EC4D2FB656D71F68EE5C2540C61547D1136EF9E82 -E2A50F73DDD7DFAD30AF6B3B469ECF0D699C8934EDEA5C8F8D9A53EB46A71CBA -A88C3F755E18F4C40D42EB3528BA915F8CF6D54761957C0E356BA358C993AFDA -6DB09ADA02352C3A101ED5EBD31B7D34709F88964A59D55D9E5F0D10C46A5015 -90B38DFA2781AD48A9404B08FE53ED61A20D548F5DF75F8F7C2BCA24EC90B569 -95D61CD65F3C22C270B5C5137ED7FE51DFEADCAAAED20C3FAEB027EB8B936D18 -D830C72DFB4D687659D5DC7B1FDC4BCB917047305833A2361060FD20983D4711 -89B57BA91C51BF8BCC9BF1D631B2C752A9A89C2BFB3A33945A00C42A93EC7CD6 -54C87ADCC454000564C0370422F59F395F80D3EC79EF9A7C6D8BD358DB7A805E -76194489DF3BE09CB76F3A0C5B233AED953E463BD96258DE3C6EB23B09B89645 -281965C3BF532875DFED81182708B34CD240548657A871AA6DE89E45F996C6B8 -A80F2A3DB00BAA60CEAF15D8A7E3249E3366780D6BD45D1A54FB932FA07EF153 -78DD20F94CB02F67BF50E4E1A6A9E311E6695077E7080CBD2810E3FE9814C0EE -53E8A46C324EC77BBA682DF46CEB4C0262455DF4C4FC85B32254E2644D278818 -E36CBFEAC10E7ACC6B8E99B657D63E34600D194429AECD85376446D26EBA53F3 -58E57CA1BDEB0A95FE8C033F0411744EDEFBA5451474063429F6FF22BB48C712 -9962255EED518D3E7F5B313E1881589A8EC70A1558B65A136E8A95AF82D3ECB9 -580A2278C74BAE6B05781C9B88F1D2430CA55A8E277D5E5B2DA5DCA78158D99C -B15F4F6A38E43FBDDE03BC8B4BB2EE01BC0BB6C4D058C7F67A7367EF3D21AB4F -B9276690BA3D8B1CB2761B978208DAD36622C2BDC4C9D417F387B767116885F6 -96972586CF4BE7E4F1A6F0FC171337AC2D7DFF4A5BB92F33CF47912E61A96317 -0C5F31512184632357C42DE1CF79A9FF8A422F12D137E38860CD8F18A89E0E73 -F77AAE2F30B6FAFB425CF863BFF4D46636CD70CC4399B3F85239030FF5D41D0E -35C99BCC6DE0B8799A5EA81B4A8D2BB2DC70154BD31BF9CD65F5B0A163A75A4D -E41833BF31 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI10 -%!PS-AdobeFont-1.1: CMMI10 1.100 -%%CreationDate: 1996 Jul 23 07:53:57 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-32 -250 1048 750}readonly def -/UniqueID 5087385 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 -990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E -6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB -DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 -59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 -D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF -8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 -6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 -1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE -03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 -95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 -74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 -3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 -47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 -AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 -42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 -40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 -B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 -9560176670870D5FCF426198619576A02FC22BED21AD72B530E56AEFE3981541 -B56A7AFDA834C4D4FE4A0E400CB84E56C528B23F0220E890A140E349E01008F1 -15DE5B33D1605D4BD5DB2CC5906DBD241D6A89722C385F841F5A0DC46BF2A778 -8EA7F1F9E0688C97189813A77906BAB9A86795D612165BBDF7392994295A8AE4 -9714C2B0B62F79EA4D5621DBAAAFA9A58B7A0ED8FAA9D4F1779695B329DA4194 -4874E3171CDB37BE1F5C16F8B24BEDA095C3572F3B74BB21614499CA4973D3FA -93099F285941BD774F64042D03F684F1A414AA4511904289D670FA02763D8F02 -7A27F98B78011D46A050F559DE3CC81F9F1F420545354EAC2CF5B72F746267EC -1E07D3BA0FD72A073B4CAFCDC19049D1631611281D256C2904E8F5C99D4F4F47 -8FD4DBB97B3C2E975E3674D4DE206BA8A8C0D155D3F83D83BDFA1EBAE1E2C031 -B750F627D64176B720AAE868A57169C9682F68337CFDF28A52D325CBE0C749F9 -2B7B1CC8A05EB20686D2906C95499C80F0F9B4B48F7FF8A619B245DF7DF100D3 -F70A162DAF913689A586220D85713A4474B41F9EEEC65A8F392664000E62F0A7 -B546DF5801A2D0248056EA5CE80C245F79494D0E9A3A3457006ACE3D334ED451 -84C463DB0C0D27964A19E2F9704B4653E8CA52503FB8749098BC9F8147A9E174 -E3F4CE3876D78D7AE2D40FF1975BFE1361BB35654FBEE7FCA994618A23A80411 -F2667C3CAEA1180145569E2B50163E46B0FF371F7EC77E453A83CF243F850B58 -5AD66B33303D53224EB6B7D7D32304A5248E39A472E93368A88A95BE70589E86 -EB5DA98F3C0175819C569C3448E1AC0BA4C7382C6A9F56CE6252AB424FE60C81 -9668E76E4947F5554EEDBCEC4728238BF6C86219100C776CF95696A32145B350 -68483D375728186460984DE6C5815219160BDCEFB138DC1744A085553A2D1437 -ABA5B6AA3529B62AB2F4C29146ABE0F844F0BF260BA610915EC666708C9B35D3 -FD651C382968F57D7FD76C5CBFF550049DCF28A34F436AA5FED51D4DFF9DDBC9 -4D6CA557CC5FC38399419A1DBA2FED20C7F3476091E1E109E5CD9891AFB7B614 -9E4FD91F616E25F4997A930474BD376410C3A5E391063BB5E228AA422EBFB52A -ABC3D5322A7076E6744CA728490DC6881ADE4251503715C17EEE9770AF40428F -F9D2542BF8D84AF0F9A2D1EB2F470CB45148D59C3F62B08F61663A1EFCFEC5F3 -7BC54E859DCAB2477AB724978BB823EB9DADA79218FB9A58575FFD8C372C3D26 -93DD0FBFFC510BDD19733C93626E99E8DC23090E903BF881339F46DF11AE3BAA -9459362E4E0BC160C7A2EB3C393BB2A22F5978C9DDCE87002B545988F6468E5E -B2C794391F1B8957B6272B2DAD6D62F97FFE50DEC26D23DD41BDFFDEAD4E0A21 -6E4006B81A476D6A1DF289F6609DC9371C86AC2793A86A6E2073C67F2AA92927 -AB3A3D8A63403B6453777408DE2C4BEBC04DDD2384539BCFEC1B73C6123FD277 -E92F3E21FC9027F6854E21A64F3C54C0F51018E918C00C18E2FD71E2CF52D7AD -1801236AA63D55958D0BCA42A1715176A5836C54682C3A6710A0AB2DB3AACC81 -C5DAC4B218897294B78992F3B991EAC15CE77D3600046509D395004BF1289D14 -E7ED209BADB835ABFDB98E512ACEFE7035902C73F95B518AC1FD2DF6D429A425 -90EB7E461541206DD40B1F81ABF1DA70DE2FA15A8A6DABFAA46AA003CE22A349 -0BDBAFCD490E969A97A36AF85888E9592E2EFA1E3E67615CB859ED6458980828 -D13505FA9EC4A7842947024573836607818A64B27460051D938F9DECFF8A3C4D -DC76452B8312D3B4C6E358329279BF62E11C63D4A316E9B3C9694A62A0EC9A95 -1DDCF18849E1BF578E4F1C3D59B3A7B42E59ADB092015D9E1215D5B078FC5DEB -BEF6B4A06689B14EDCEEC7DC74026185A2B69A2F4F759A72AB28C664DD0F0175 -00D241089464BC6BCCBEEE55D3F2EE1A0140F53E33028D47C571D3FC71EF4040 -D7D0719311C3A368537526D7980FE35485BFA49A4C158C1140BDA79F078A141A -FCCD0615CA2C947AB8B66626EB5FD45A47A68419AD494CA494ED9EFD694132AF -C668ADF3C1B7579F38515E1EFD187260884E3CD45AB45D960E37A434F305ED97 -3DA41B786CE24F8DFF4B55FB541BEE3D5EE1B5D3EA18CD4ABE0E0228F09D8C09 -57EA99CF48D60FE29B88B2C40A2F497F467BEA98643DE17BFA84EEBCDCD6729E -FD5F3C294995D012CA0B73EDCB5F7D8F06E0DDA0732451E97E7DC9C80A1DD485 -AAED71664AC63697E01E56994B33A98EAC36CE78A083E1C972AD786F4C071763 -C2EFCDC405CF8CEADD609F16D5B4EC617B38033B5020E27929DA82917B7D1797 -A687BFF84157ED51DEB274ABB8B21DE7BA5340FA574D288FC003F50B5E32872E -84314D3281BCA7D31365C7020B868CF882E642127D3F9217243BF59941EBD4ED -FD52BB39904D6CAE1441D6AA5F2181DB92224308C3EA38F835F29A81EA0CAB42 -C306EBCC86E8B4B3B35BA19C34DC80807DD415B8EA6C4019E0A2EE2AAF61FCB1 -CFB2F52BC7151E06F5944B4D6D45F8B1C4913203A37B8C56AA74BC12445EEFD1 -8A8A66327F248ADCEBBE3F872CEED62C3F817B163684FAC93FF246CF46FFA203 -65058324B0FC300F260CC6ABB32324A66CD10450FE3D79082711C66984D5EB51 -39E960D149C1170976532193A303F5545E453B02803B5F1B74607DC9FE685AEC -245492A6743D393598039AC438C2A887F8C39C466F98A7E1889322554993538B -A3E13CB31C6AEB789200A576FBA36E1000DB0761441BC18236919A422A65DC44 -9E577B32AFA6422AC022A11E7F48F20F5BF583450AA0CCED105E2226D394EBDE -CF43EF54A752F421B8DF9FF8ABD215ADDAC3E7C8D49BA4C49568D9CC8B09D9ED -7EE58713B8619FAD2D6124D25BB3AFAA0A38EE9110DAE0631D678C88C3DBCF27 -13727A8EB49C50C2B3113729B3D014EC9DA1814EE10CC8F88CFE0D57F5F5F080 -11055057E1462DC52A98ED26EED7FF074FE2DDB809AB8163002E632306DCF9B3 -6246A5F49D0B3E2F10106759F9FC0A8679AB9019C9FE3DD351B3333D0EDC1637 -9C4F3038D34EEF890599E13D1D86AF5732758319F29DC7479A1AE0AE9A9C2287 -2B36828AE5A72718F22277F744417AF3E3F5FA25A43ED623894AAB4DDE815335 -FE2CC11B69BFA840987FAE37F90F50372EE509A684992C94EAC8F1C8294F000E -EB637DAD78E9716357463033CA2AD55B3A7139928D339B5C8D83744E7D717D86 -E693E04317784EFDEC87CDAA4E65974D62E236A043D9130A97702AE9841B0045 -8543FC300079741278AA8E8F9B6493C9E7CD8D88AA3E2D2053D4D9029AF566E0 -E19BA9833F53777E0191166AB336527011BA0314F776239FEDAA140F3DB2FE70 -8456EEA5FAA5E81BE80E31BB11F71E0EEF97298427CFD896B3148923ED969C41 -557995E09A625B958C7EE2861AB898433338021AA96CBB9C60991FA603127260 -E10416EFA0440E54A4BB9062229CD7602A96EFF192C728F9F091A6507EA80FEC -5C5B6597222DD4A5B0B59BA495D76B0359B240FAF9E592BF1428306D1BA809EB -16567BD9FA13CFD5BFCA4F12C9C27C4EC28D7417495CD18B76489BC74D6588F5 -1274FE753DF73FA1F34CF5EC2AE5CBC80816236CDC2784E2E1160E21E340928C -F187573C804A9FA4BA0C8E5FE7A7540D1DA5D47A945BDB76506057FF60CE4D82 -D022C3037A9425E91FAB811BC40CCD6914BA249BC33CF482CE02C79C7D14038F -8AFFE145465EB826425AD8899C89F81BC0DF13F2F793D707534394C9433CA5F3 -9AC6E09A935FD16868CB4CB753B6C142855E649BEF845D155BF55BD83F640E57 -6714B18CAB4C71A3B141B2931CE0C32C589EA98606CD92778C1F241755B0747E -9C962CA4E279B5EDF592A42C7AF9E82A6ED1D49F372A16902C360AC541880402 -E9C4AAB18F4F426334E608B2780E134F83A084544151F09543AABF7B20EC8359 -7CA2BCF318ECB247704D1EE124D094153143F68D88D3F6354C794FBDF713BC3B -6188C3B3F4CFBA88F6CD2E6CC8BC63B8042175D7687C3968CE8E523416552B3C -F72D34E799902B2A3F8067A1207A51C1AF6D20C15484F1955B0DED0B83CCE3B6 -4E6C2939BF11F5AB3AAA3E236630E2CD005BEABAA225A714D644B7F765924E66 -9485D9038F32555B8E67623C828A04222D4C734C890E388E72399595450D4E1C -348D90ED960B18C6ED4722AC42B6B3301CA9C735C655E90BAB4CC2D4662E9204 -5A6A0B193B34DA81EAD441212E975C925A2AB4BBE3576CF54022F59CD19D1B22 -85ADD4CA9B3FBFCF6407180DEBD6675FC78F9AA344BFE43F5F13B99D73120BD9 -305F2127417B2E7E9523D07CBF1C171EF6080F41949E1BD0CD716F210302E01F -D1983017C1808A0D762C54BA251BC4096DFE3E00AB21F20419C0717C73BFDD46 -770A24AE731F354D74785EE5E9EBFF0A5150ACADAC2F4267CE591CA8F35EFB7E -06D5E846EB9923379D9CE8A05C862EAB317F784B41A1893EE4311BC053D44E1C -BFB5FF2272EBC343904E647575CD1CB535F545CCA337D8D7A740458512F09FBA -6E8A64725C5165A4382D1263CE7970897A187E22DCFA9955782BEAE13C46399A -4F086B558F603B17A7586061224ECB0DB25CF9A3DF19DCC07AEBC9F0E0FC0342 -2208B7B9893BA333A251DC22106D2CA9B4B0D918DDC883CB377F0D4244A96915 -4FAD99AD5B101A39A507E6FDD450A04925E94264B1E647DA2F1752C1A22E3C76 -1E5A398C39F1ACCF3A02207461CA563382D722A9618CC794344ADCF1A9BDF85C -99C77A0312EA7D37ABC3DB0CFE72D97E78DB3E566706C90196554AF984783DA9 -8D5E280A8B6010FBA07EF56E39C47DAA4E1AED088E7F7160F4D1CD45E15F0A51 -A19FA7182AB179636C31F9761335A4A3148091974294F226810283461D24FE63 -29D5EEA2744E11632027CD5C27246DA97419F49C86CE4B5AA18CA4AE2EBE186E -79C49453ECFAEE965AAD7F174C0355CB94E7C4C903374794EEB8FCC4E8FB5C8C -D17713392C4A3321D162546B10FC4F76C01E5F0DD9A0B3EBA66C798EDB41DFCB -03D958C0E99BBFB96AE8C9ECFBB9FAD4C5F822E03A15126337B22AADEEFB7095 -1033CF0CF73BFAC705585DECE9BE9A4BF217FBB6A9002B7B947EF1D345C29320 -6AC94069DBB854CED49F90879547352243928FB0FF39841699F200A2DD68D286 -9E13EB6E45400788AFFC394B2550C2C6B100B5AEB15280A294133E2B5483423C -B5E0D7E1A7F4A218C95937838F1DF21052251F1BD00698AA01D24DE8DF5FC561 -2D728954BF27FBA6A89C04080FE56040A9DF017270811E2D6D553D2B53D1822F -8A8E7A8093B9A8741B0F94332B18273255E6EC6B4953BC1E336D48A19FB1CB9F -097812C08AB9CFF63285838A44172902F0A7E97DCF6223BC698079F718DE6B63 -F1D96BA7FB7EC83581D14642D132A97CE9B3B7502BB7189FCD3DFB9050AEEAB6 -2CCB20F3C988FB1FF0360080E3BB371E79638402D5AC8623BD92998C481DB0BA -24BBBDB6DB8EB06556B435A8D712E41EB12B4C304223ACC2E1D7C5864BC770E8 -C998989DD6FF6CE11422159CB47A7D186EA9C5E4D98E3731A07DF39537982C22 -347B62047F2424B468B2947C8515BB9C2C480712D8D6B551A2ABF699B1C622D6 -F8E4EF64159294FB5677A1F307AA74C81C1FBD2C03627FD851709A8A03C3DC34 -2D25D523A95B585DE296390964B7C94E1947B73D3EB8759B6CDE6CBC4FAFDE91 -9A1DC2FD2EC007626C97CAE19BFD14A75C56FFE9A1296B44BB150C4746188D87 -A8282775DF9518946E158920DD3AD37AC1EBC6BDD73D4D77F0A1A9044B275770 -6DB04C0214967D22D688B6AFBB39F4CFED9D3AE4433CDF3F18B9BA4DA2100952 -D83CDE98E3C92F4EE32AEFDB9748B10A725F130058A90107C55579576B8F8AC8 -7117C69CBB8BB714CF1840733DA3C07A8B14D4F488FB8923CED8EE4637B583D1 -C2B9FB8E329DB31668B4DD193F36EA04B79BD8A750FB3CFBB09AEA296AF0F9CD -56A1A296A5523DB3E3310E648CE18C61B0C46F3917CB50ECDC74BCE675080C78 -105F57F657BFB56D3EF31BC04346553E3A8709EA5C2C9879B7B2C300F2A3C7F5 -E58970D023AE63ACAD5878D9AF44E0B06ED8C252995536317169C8E877CEEDB6 -A7656A3542C0834EC303FD10E245EE3E0EA85E28E77D937B49A14AD8FEC6647D -CDE9CAFB0A1165EC1E61BABB9CBDC3C51F24BCA52ED0F8DAF289CEBA5E1D4C5F -E40454C55123178077865C72D589513AE81520B027B3D2F3B71636D26593626E -B93EB1A769ED6AFE4C3F4C93AC151E8EB21873E722E1A3624C3C245AD0E29EE5 -8164D69C96635CEAF72AD5C47C3D30BABE122D83CA02B935CD915973F10673BA -FA3F3E5C4A06C6C014EC77ECCEBF8FF5991F964EDF528CA32F67AB9342FBFA98 -303385A0010D8A6A551490A7C08F835783585A29B42D52CC520839CB579B3D19 -7D308F4F8D609682549F7D916EE5956477E0A3ED601F0BE859410CC163D1791A -EF5DBCB87C186CC061788C431E89436C70213A82D477CC7C111A4B95E5D1870A -8CF813EBD5870A756C44C53FBC38D8D18FCB395142F633A5725B956C5B0544E5 -D284AEA0A2D67E558A74F279006419187A17EF83C0D470B2AB34B05B4010FC28 -7D5C6BFACB8991B22C0FCEC17D31833AB59C88113BC81BFE63539C3B77138C15 -38C3EBDCCA1EDE47411F51B9DF13E90159FE2A8D6A9EE0A19739349265C22A0B -88AEF4EB3F52B2B0B8402E9AF33AAFEA42BC0D8AAC813C23419F090E34102FC3 -1C5349FA362B0B9A6D68F1F4C9C41C6D969F4D4624B79083887B8E4BBBC17ABE -9C62BACE3306E97095321A2B3C1A11715F169ED0F6EBDE21AC3E6AE5F44EDA6B -E36AFA05C03E445BF655D0897D83A736B918BECFB9CDA2D120FE66F2399DD57E -64A5BC433327395A592AB25DEE11BA1F7560928337F755A9F8B4D62B61EFC937 -E1C4C7DA52099765B6688975F6E0D1E0823A1E00061EF7324E10976B28B2EA71 -1230558BB8D5AAEEC1A4FB458EC0B0F66664438C73D3F5B1EFE3406D3E51670C -0DAB0BFD5C5E7274CE024674C457792FD64F885B22F3A66847082BC777D0272F -2104AF1F8E23DBE1BC3938EDEB472358E2FBCB04EAB7898DD5FE91746EC29CA8 -D77C30FB3D04EF9EFE4B9A53FB07D69C385CFA81B2E34139B0CC1F6967EBDA91 -BA520BAD3582A5CEC836009681BE7D2741233E0CC14E1BB2E5D1FF657D258A83 -DB0B0FB84AAAE38296AC5F7302DE93B34DE8496F804C8ACB6A7F7A768DE9255E -4353CB860F529C0DE58CE47BB243B490598248B75A2C82C3F742BCE80E475DE8 -87F7470219836324B4964157FCA619F1019B8314377C0C3D389AE31F0357DCAD -007387078F89D6FCF4ACFCA38EBC1B5F1640833A1D8DE3CB5A810FA89A2BE42D -67D729CB3368858828B37F04E9A689EBC3F7E7B133BECC6315E17077F2C3896D -5EF0405362C66AE93EDDDFABEBAD7A3647FC99C2C107BFF7DFA275FDD9DCE2BA -3B1C3619BA2F729CB214D6D00E1247869F989CCAED0296B8CF403B6AFB542EDB -4A8DDE67F0556887A0F29F68EAF70CB342AB0458BA9A4F0FC9AB1104731BEBD9 -E98C3DF592DDC6D8A45E67E0019783532122EE4910795D9BBD0463F630AE1182 -08807AEF2842282CA77D91234FE44F94C9F0384EF61B9A71DE4BC06FC994D0A2 -044015B9D37292B4739EC4AF85EB69073EC42336D2DCAE22CB56EB9B449CA586 -D3C6A711C27427A87E4A98B6380B1C89933DA94829EF58B30D286E84E305E94C -757736BE78AB47D70D7BEAE03C92072E525701524051C98D65D05DA2AA8EA595 -BFEFA220B372651945E5B455117A685CAF789C4965AF5F08125822C202D031B3 -98123566F7FE09EC71E301D21A03678B657C785CBDEE9B2604FB5B926E33DE74 -21FC2F3300CC9D908CAB2E75B6BA12D6450E04B274F97948B6555C97A0E44461 -AD89230E28177602370A9BD63B445E09BC9BD8E21184F7FE176670F341BBCF8F -91BA8E8270EAC90C6EB049F858FE01600D0C35173EB85739B4632B4BE7399F46 -DD0E19A6DDFB4C892E31F91D395132802DC643C987E4A4D7A66E741016CAF88E -47B7478F5957B8AF8BB0D37B5D516DF4274FC9A84D642B4D3C9B8D4950B155D7 -A4E5934F3AED589A432C94753A19DFDF72B9BD8458271C33079D9FFCE5D1EBE8 -958305D69B47AD5806C86B3D203DDBFEAFCFC789BA72D6B2E2607DAB4B22DFB1 -8166930022ED4CC9CDD1534F15655BE31EA1A6A57AD28941954521BAACC9DF3E -30462010B341817806BADEDC13CBA7D8EADF409BB6CF6875DBE7918ED27CC844 -3EE71E473E5A12E1E1F1145776548CDFD677B5FD95AA9DE72174789ADDA7288B -6AFEFAD947A23003804CB06E1E78F5F878FD6483F621A75E490E16402519048E -6DFD1F2853D18615E4C923CC3412C0FC761DA6A0D592A4AE67922619DBF7880A -FB603B88464201DEA5986E96A40B842E80C0BF9F900D961806571FA6DE8F8134 -996EFC03DBFAE37454A352A32D1CF147490905883CD6CB8BE5390D4C431F5FE1 -6C2517FD33FE3028E90B46E255729E4A9571C3B74E96BED6889E364C05A9DEE7 -C9FA45FECBF49DA60822681B3A5EF4CB8C47DEB44BA6E0B552277C0E7491229E -DBADDB445E51B39CF0BA0F1C919C451ACFEDB36CA3B591696F8385716DBA03B2 -49B3CF04A7A903825B2E1022BEEDC7F35D9A067B4201C6D90B1200987E29FD29 -494007175077CDF0164571FBB0A7DD198D17E05F192AF2C4B3C2F770771EE35B -324ECF74E9C9C5ECDECB100859CB9DFD8DAB6A90FAD4F3CC5A98FACCDBE05411 -7E94F29C09EE1B8D0F8CADD46198D98DE5BE91D99A3F56ABA08DEA0E6185605D -A07A5769B36E286D8BE271B95029853A1C859BF36BC52EA46D0FB0149BEFE1FD -DC9384AC90D70A53B60265F697648C3A60E269DD674E80B749DF14A856E003EC -1BD4A02DD3880239D74513DA4AD0EE076E091095D70B6F3DA8A6DE40503A3C86 -BC08F650348879C95E5B187CA2F98525669DC2B88AC2478977706B36FD9F24D2 -A17B9C3ABAB65E10C5A23E2651B5973FCB5F2C8A910FA48C86116FD801FAA8F8 -4BCFF59525B940D4A941B092EF1A670F18FB61D578B7F4F1AB6D4F73738FA393 -86C8D91BE8878907485D296F13668E50B4EB9753E467453820BE64784144CE12 -8D33176DDD849F374055D61868D3A85425E802F53BBB1B4B3BCB7EDB8EF67C35 -3BC0FCEDE87C9E5B84FA63554C4695D5D018C33DEAD2DE407C675D5FA8BF95A4 -F463E478A39E373CB7EF24CF425D6352C295EA02C5B311562D70B2462B0F6478 -CC1C2B2795E9EAC29E6EF1C5E305C5D46B43102E6051F54608AC1123298EA5E5 -2A6364E74471471997CB6A4B90BD985D379A50D7CF61E7BF26BE6694483B8371 -48273C1DC50F0A36A0A6CF0A8ECDC48B644D0A1BABD981A1B67E2A0C09757B4B -2887D919158D3CA7FA2D359B41CF118E597CE58F8783656D63F937F9AE1D64CA -EBA8E21A5862588F12CE9DFCFCA91A3D6A3BE2FBE2969779DA8459F2AFC5DA5C -DCB97EAA298FE749F1F1C9A4F0A191970E40E800B78AE64D9ABA5593561CEC0E -82CD20A83DA085CE20516936FFA18C98FE7ED94500388C9AF51C352239BDA135 -0E56C1B8B87A6EE2C53FBC5AF5F504AB12A543E9D31D268809A977EC5C71C623 -5D99A6E980AB755B19462A3082080280F5277A537957238CF3669D4D4637701E -F08A68E552E797ACD9C4252FF04E7C1391CA7D3BBB420A62489F17BDB2B7992B -4B5E1C808A567C203D7D2C462B6922210A30BBC448C299309C14864E74B4C3B0 -8FFEA42F2B674077D7EF0DCBE81A461B35290270709DE0DB8EF3F84B7FF5BB34 -7825866FE77313311F8E33BF64C8FAB06C74D5695ACFE13044FE1B3B20B85D59 -13912CB31DECE966B1389A2E2204E085B0D1CF8A4723269C2121100DF953CABB -F2D87038CA951C95EC0933A340902E1339455349CEBC9366508D27D8E63AD178 -95A4A268D9FD3584E62541AFED1D34F79D44626AE68133861573BFD8FF90E27F -57D2E0BD07BE03EAA548B765E3C333653B2E405A5A97B60E64B0BE5F3F2A4E5C -7CACA26D4C81644CE2600EBB33AADCFDCA972D8BEAFE6B2462A547A9005D54A6 -4826C48767BDCF1F2800B080A29C37EAB0194148976EE3E7630164E1B34B9600 -A5C3E84302895D6B8EEE6CD49E65FACD6E4830B872BBFA8B3A001B651B7AC768 -4D029FEEA75E57AB50FFD94AB1BB7F5B0BACA3D8F58C7A9137B228657F706936 -A80391935591E5482FC827C8E4CD3C0E273F7EE8AEEA700BF8CBE2AC90047A86 -9C84517A63A6B2035813B48D57844580F4399B0EE433B9471085CBD065E15BF1 -C19C182717EA8448341C193D178BD2C38E9BB07925E7B1B5737BA3AF5287142F -35AA5B6EFDC290355B03F631FDC8E44AA34E2A3E26F1FDA5851C5C2F70B9A6DA -478BDB7F309ABE6CEE845ABDA0CD123C23A606A2972A863115C59984BF18831B -9819C5F552940FA1FF4D2CF6EA3FC2DAD319C3B107C8355E9463EBF3D3FD8B42 -3AFD0B9AD44DC978161D4E4898E066C29F6D2CDE96080A9605F04BAB4E577595 -2B96610D87255F64F623E7876C50AD686A65AEF453FC6B9FA44AB2CC6EF75C5F -0413A5268139B1929519A51467BC53E69BF22CD80F053FDB7FC02B8FF7F224AC -97487F3DC2B6C846F68294BF5F5AF641F5872F996C9ACACD1533D38F7ECF4E35 -DE9674DD99F357AD6AE682994C2CD4612053C0D37B0BD129B60A7A009BFA1186 -079ED8764D45B0E21AC2C5638A627BE610CD89AF22F7F99A06DD925B74D27B8E -AE87B751FE9A6A755CC52B2272B306E30FD8D34444C8AED60E58D44684469988 -B0302E7A127811F68FAC96541C183956062154A92F303501A4D708D3FC120D86 -8AF16D9F6F26B9AF5245B5D8DA3107110FB8367188A7EAD84E2ED22747D3BE0E -D59F23B88966D5330016D92F38F6BFF7C390D27A4D260C8ED0DAF81AB0A22950 -81EA7AF4A6931EE0CCFADEEDCB94228796829F5EE1C83D147E489B754103C966 -7A7D302D30D4128A642A5DFE1D092DC469218696060FFCB10CF019669BD04BC7 -CAF7AAAFB05121DF1BB301C30998610BE0F7A8F2595BF683C20A86E56E584319 -50E0598AC89F5F76D5866E8DBBF728FAA33FED7CFB88194869B33AE4D6858A77 -1B09ED43CDF293872FDC4DCCC9B9FD60B968BB898D934F43897442EAC0BB4D8F -DFF153428AAF01617E6F3267A7D6DB9689F39E45A71B2BE30D58F6FB731686C3 -67157F4713C298A322E980D28BC788FA0D46E8C769292BBF33E171FCBE6A7CC8 -4ADF3D112D72C9489A31C338925E3764BE2ADF0EF4864B01E8B26F4AA7544568 -C235A141036F9800B58AD25DBE1C2985D7573ECCCB8A1A324EA4A325494D540A -6C0E3CC17B4C3F02AD3794D861BC7FD56EC535A276B0D6C5E644EA045BD60A64 -F2404A0972B3935128854D219779F0CB86F3DB8B9B97B5B51B25B4E83BD26166 -E1A99306E846D2A0B2FAD0927B7EFF41A2BCAACC7E4260AD0D84DA464F187E2E -CB58E5D48348B0084AB5EEC13CB990FD7926655E4B3214F4E4B057C34E7BD9E6 -663E9D860EA453FF5BAD1FF114F5E70B6C41CF21C0F13774B56619138F5B1832 -3F8BAD34EE6B1D924A87DD4F1E5432AE1B318521CB2B1C62DC85DB73EABF4C34 -6AE4A8928A5DB21AEBA2A7CF8CA2E0CA002AD06FBA74A9DAB5EE420B4D737610 -CD23386147F2726955D169FD2A22797B84B4276C29F8E51023C8541EF2AEFDA5 -EF624628E7DB4A1EED59AA599C497E2A089925C30530C8BA4FBBB4536861DA58 -8760D9D07128F7B4AACA3A4567E49570F08FE1B294B03F1BF9CC0120E28BD79D -4DA594083578C4BD8B7EC32594BCD7C9A8A1DCF993F5E56B4F3754D34063D816 -C353AAEF4F93B052AFD0C9BC01018373151CF134619B12DF930A93AEF3E46375 -B84173E1AC539245F18042B286480A394825CEFA3794AA10265C648B613DFCAF -6FF8F827DECEA472AE8C2518797A69C25FC5A8B9DAC022ECC5D3EFF49DF121C5 -842C08FCBA076D96A79999975961E7C6F7E68E773EA86D578746620145E11D64 -6A9A20610046290417EAB647A7ECAE57B0D0E2510C1ED03634896EFB118D2278 -EAC5F7D1E869FBD6B598DAF58939651D993D6A234D6D6FA8A01FA61A6A0E6CAB -5F43ADDD873A2B7B28C286690A278B17E132097CA902BE365ED9840704BCA66F -FCD2 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR9 -%!PS-AdobeFont-1.1: CMR9 1.0 -%%CreationDate: 1991 Aug 20 16:39:59 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-39 -250 1036 750}readonly def -/UniqueID 5000792 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 -87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F -D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 -92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 -3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 -046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E -C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A -A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 -A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D -731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B -09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 -49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B -5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B -54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C -C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F -11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AC46268691C741B2D4 -48A840F1128D9B2F9CF07D0709FE796B23A836417BF7B5B12D67F74453C82F5F -25F7B30701D6F6D4F4DC623C0C27D6A6FBECC7312A3CD10932FC7C10851C3C52 -24B75DEA8A648B7F34F5711DB0E843C914E25663C510185BC37BDB7593C1C259 -21D8DDAD33982C336BF272BAB2F48E68217403FE9F54877B243614A87E64784D -2796EE4179FBF96123D1BEE3EF89D682B427BA4F12A1318A57F18BE5DD903815 -2617B3FF62C4887452FC2323938BE58C4FA7C7851E65E5D020CB67C268BAEAA5 -20CB29475CAC2B8E70D070BD399A4834E602173A14351134245EFE99F24267EE -8750A889AD6B6A64807C39A21F5E8831318F1D4DAD1D8AC9089F76B4E9AEBD2A -E16FC4BF71AA27B4DB64AFF17C65AC3702C20AE645F08CF30B74B55739B21B9F -50654A521E51F658A4D838B2FCAED4D08A201EC0FFD63E4487ADCF7147A186F2 -2B7CB20A445B7DF54074BCF171CB470353E545937506531D06AC17FD50A397F9 -439345CDFEFD2864C4C756D5C75AC0158D598303B30B897C6A2D4B658D835260 -5E84D9558442F6EBD62CA5E2D8897377735C68B18B42797B339851EFE7DF4FB7 -CE7730F6A36A40CE9D33E49753CF77F35E91EF6C459EEB663D4F19BD1E2487B5 -8EC117378C46F40C617D1D4E36E9C72F38FC9C1736C213CC4860E3B5FDE7B1BC -96CA98BC3F6DE9724E38157329A2685E931725F48A945D1E9EF20EF1A8B25B62 -BB2D1938CE27300DA5A26FECB42E0F592BDFDFEED89A8FAA9B7EFBB3987D3353 -8B1F2DFE4D3D0F22BFA4E2AAF17E1A39694D04AF9CAE71679DF5E89F9EC2380B -70402A79C12193900DAD9DB22D44C569832BA1FFAA7846CE5160B0AC94A6D50F -A8039BF2119679A5373FFC93DC7D46C39B84E6206EF0FA78E7DB202561726E86 -BF7B27D145E93B73D230F37F7FAB90E7B1663351CC0CEC28DCDDD65ABA1451A5 -2F943278566A1C3EC89DD11606D72C8D8E6AC2AE8654622D37D3CD87D308C970 -CD24BFFED59850F447230AA88A92BF88D962DFC93DF91FEAACBA5705D459F843 -FD130F034127179D11D34EF63276AA3964510332FBC8CB55A35737623BCCFA85 -7B0238BE29A5A1961C36102BAE52F4DB52F69AA3FD94E0EBA9916D0C961C3BC0 -F5034ED8D78B7608933DB36B6B8170E8300293745A2C49B398D31930FC03222E -5F1776D34C6ECA4232EF56C39DB89E05571A971A323AC14FDCFDF142AC9CB75F -1283BA9687F1CAD2ACBE378F1971B310ECAE8E0CCDD662A0381CA8422E87AB31 -0B0DBF41226F5C9616A994D56D6EBA342109678B5B4CBED5F4BDEEFC1E063071 -1A20363FF755BEE070D7F7FE64B33BFCDF6D50C3AC6977DAD599F721315EAD89 -FB79B32CAE10FE84E5F185577A84533A9652064C2E4BF54DA63E35F020792BD2 -CB5F8244C6D10ACBB2334F37F9A2E185FDF7806B27B59656515FE91E14572510 -04641D287BD293836359455563165D0EC02ECBC08B7644DD2D06176B1B407543 -600E7088CA5A8578F0E48011BA5877EA9B451A32B8F7BC994AE6A8BCE519C872 -E87E7FDB31DDAEE0B673391D12047CAB9BD326761F36C050E3F045C1E59EEC8D -44B4D959F70D444E7D824C8FD53514B56CC022140140CEB025A4EA2EF3F2A290 -CF0236F679E91C4D541083E8015CBD6DB43ED0863F78B6202CE6E89E30DA6C6C -3BFEF51C62ACDA81249FE234C66D4D3D0AA30C4E5CE2BE18296083A9EFCD913F -ADE1F814FDB0F382805A59FF4E8210679215AF12E875C3D526F761E70931D318 -3796A463A5550C9777E79EBFD16F8DC2B73C3A254E02F0B75B85F1795E8595C6 -B30A3F9D4D3C89A067CEC522E5D948E4B03D38B426D4DC3496D9666E45C7E1C6 -99DA0841B4FACD27CA3B86AB1560623795FD273604529E20C7FB8ED3D7C179EC -D5ACD58CEBCD201AC7C0C9A32883813AA75DDB868E3B5A2AE1CFA9955C1E7ACB -21E4800BF9D0F9DE9A73A0F406ECB38D26D1D4EFF5322ED870049696B016CF67 -796D4165FC0172BBDB4588E2E889E8E9A43CE99EDDCB176DBF80D0D4CC8A3DEA -C4288161DCC6313DEF830B52107FA0006899B4E6AADA386BEB591073ED83371E -170099479C77D5D310C4C89D30C65C7B5162528AD27DFAE8F64343E2E370B212 -47CBE2DF37F7B88F3FCA00FE775749D94353046679B90775E2B56E539767C848 -13500AF20BB8985F6D76D43FFCB7F2BF29524AEBDD23C7486294F76BB5C322BF -88ED45110D0FEC738458EB95A9E011501D075B7CC06D78FEC8CC9417DF935038 -164CA63DA71A33C11C892671AF9CF8BCFEB61738871FE2E50A6630B529A27F12 -22AEE2A7EF42B67476F25C543E705ABCC9AF08516E6A01FB0B42E4EE73A2B56F -2294B40AFB840B90833A0262C270DA6AC13B4C061B1BCE572C4FD6F21AB5DEEC -FB0FBD8D6A83C9377A3456A6A315C1F061A0C458E7F98C6798981A193F46E1DA -9FA18C38B13495FC0B7437753C7FA90141777D9F0D3036A413C320DDAFBE0650 -CF3DC47C63A16224149443DFAE69ED4493A84F8455E67D9A3056A5B0E621448B -7A3C5151FAD19DD9F7497965EF494B24041702F4F9D0125B9FAFB67EE3768DEE -BDCA445B1FB68D5791237FF26C3D8949F65D37F1D1E10D8258632728E494B1D6 -C9125447F1E9CA93F0D816D935D511DEB10657F9867B2C81B939CFCA268343BE -37DCE3521E939D3DA01641E9448EAF3FF3038545377719BB4760EE3F2DB81FDF -5FD7B4BCE3B6E2957CDF31FADB679D98A5EBF4079075121793B98F34F0E05DB9 -AD12D6B962CED45F1ED9F8C200C264734FA47ABEB8014BD507208E2D85067C4B -663ABF5E977E8CD478C0C0018E75E76CE8FF2FC07D6AA1325C8B6F4C59877A0B -B622ADEF16359F0D88DB7FC3D951E2C29A8C7EE2BD33758CE160D3BC8C519742 -045936D3BD334513C09D85B97A6B5B73FF1F4AA66D8C0D82873C996B3D50C1FF -A7EE65AB699A22C70A84229E9BC180EBA34890D435AFBBC92328B90E43D3D38E -C3EF90923F6EDE99EC6BBB3EDCC74E6334ED36AFDB1A176E5111565A2B5CB2F2 -9F5FC35F5379EF703D2E7D7442A2A7DD3437C3B5BAC12F6902225EA2961B37D5 -D6F2A1D963A26D8893AF5757CC3F3113F5AB6F509CF9BAA58BD89ABEB1B91334 -8ED5A1CD5613F86ABA1C0AE108AEBADBB075EE4737AF1BAF1175EC86CAC68D9A -4FED2AFFBA954FBE23F4DB317B9AE2C432415E256AB470299430505254947C3B -CB51F56C8A6044B1A79887F12DF8D6D921105A2625423BE96CF8C3C85F08E1A5 -CBD498D3CDB3A3C1EA475ADBE2D01B565AA5358220FF39DE3F2F149D42CDCDD6 -04F4CBE7306D7D335C5889AB52F390D46711C9FD4C913F48AA12DCA522B0B695 -683FE6DAFCD66CB17285C7749048645290478FBB14B812C7B9443DAAABB6C6E9 -14BBC9CB3676ED48789A766CEFF8BF10F99C4397DBCDF3CEB3004F1D9C62E930 -0E03381B6875E9B6CDF298229464AD0444C9F4303D82926A732E6FEF1D23EBC4 -AB6DFB6275294067EACA5EF89A248390590F1AB5D712CDCBDEF05B22A0075B5E -A7D104091260E09944A35472810D16B53AA46AC66592965A2E0BE1BEEA0B23B8 -CDCC9F09D428C5A4CC4261A01460A2D69AA8C5B8D7FEE6CC7963B5B85B2358FD -C8E80B804E2A63F05E589400B13FAE1032D381C872FDB1747104614713ECAE09 -3AE6790DF5D847A03C22EA6A7777B2862E7BD96EB2D49E7F3523263E1649F66E -74B131539110EE22CB65EB374D191A6930215641689B7F3397B6D1D55951FD93 -7BAE1ED96FFF8530F20270953A758E8A3E87FAC032BB4EF87028842D602B1A49 -89D62121A33DF8B05642A6AA0B502A0CA7370C6ACDEE2118742DF7A9174D20AC -93E40D931379419AFD9AB096DE6B60E038642E6B6E50FB0C0D396B595ED0FAF4 -CE6A801505E837A56711721FF4DB90CF0F511D820F07411270E6B3AC236A6933 -5587768B7609CFCDD91579F67C751EB6D55AC23BE4323039D7FB3A2E47A68848 -93C9AFD62E822D8362B4F802DF452F826B70B30F1FC7BF3EA2F8AD765EC77340 -8ABDF5AE2920209934B34BAF9C232BED65CB83E5DB64EA433C2EAE2CB2DB0B1E -5BC93BBC5709A8433CC85B456884CD704C57BE5CF69C482694874B576D19FEE9 -91A9EBF3422F78416E8A8D84255844381F178F036BFDA9238C40124DF2BAB1EB -3B0534F810E116EF8A24CC429E9A3F0706A8D007CA11F68C7DC45C0801C54186 -FEC1AF1B8D80600D9A003DBBC1EACBF5341C7C64844E2083D654924FF4DD9BE9 -D4C1DD098A4923A3440CD4918101BDF065D22BD7422D015A5BECA671EFAE10D8 -20D7E8687C90E44B4FDDDD0137DD9B5FFCACE655E9BE891230BE1E8AD1DE8DBF -40D763481E2CAC3EE473579CEF96BEFF8407AA3E4146E8D8BF8CC5667EB19C81 -644F708FEB683BE7BE427BFF267E5D82C1FC2B793B744524D0F62C1091D27033 -B0CDFA7EC318074C4FD3C8502DA61AC16F6B61B5841BFC655CA441C67C4CEF11 -A2A0FDC6A67E10421E3EBD03316F96388464F34ED346BCBF3F225E66BFF60A71 -6ADFB696BD4FDE39A159417C268D405FC6AEC21DD265A56FAD9DBB64250186E1 -7303447FD495B16C29B8E36BF3E7DD039AD9517FC03B7504F83B82C71B8EAE0B -6EA51F0A61AB9D6E4D1C4E2527E006BB8977E89432B8DF7D3C5C846CDE67C225 -1C979425D6FF2C6E7DFDD7CD438EB8D6164782BBF217D3CA295B122BA654789B -D0A0FDDC30A88AFDA878EFB4CD6D828343884490C8F74939E0B4DE8D12867823 -C295EA5F9C83065A781EFB83657C9EBDC2FE84A3B59F6EFF26C80B65E39C5F81 -78D54D3EB1CBB22EBE13717630E3AB4E5C3579E2E414F11E6FAF3E5F899029D1 -A9154C15126F4940CD6C8E20FB36F87C85A4D45409BBFA1109257098C4005742 -34EB58795E3824FE7A16586DC679C55A5D46B5C5E652990BC212A36505B51AC8 -A1274940C926C37CD0E776D9DF3C9BCEA7FCBD60DC7E61B45E43C03F9DF41C72 -B2591F914A98FC55E4714996C31818840EC520FAE30F51CA3AA9DD42F0A9F8B1 -E9C98566552A9FC01BCA710315564F944CEB333012BD6E324C07BFDB4A90198E -EB4E8D306D0C713CFA7B0EE0BF725A9402AE368788465B46ABE30C90C6DC6953 -8F826E099811D35DDA305155C7597A59FE4938775CD8FD9C77EE88C7A1F4714D -0D3411E71FB18F736EA70355E26422211EFED8FC39489E6F7B2018A6D46E84B0 -ECCC5D43F53B2E34D6E81E05EE27F5CE9598534AA186984083C746C0AC0EA995 -AE2987C21438F28D34D4CA1B796928E0821505673970D813AAEA4D0FAE69FE3F -623F47021904E17A6D64559EE845E2A20811BCDD844F5FF221C9C4CA4943342A -651D8EA4F9F5DA939E4F502BD366D7CD96A64707F402F6A4EA559726E4F7426B -08C0104DD687D18CD84115BC5AB003985F2415245A850F4154F14313E6AABE35 -B0119A8004FD5D626B741441B2361FE7E400F91BF4F76D6E78893DE9940AEEE1 -F830077EA3EBB1107DCAD73D50513CA36323CD7542F404C355D27AB679118063 -7929A0F61D130D8D819F663F5FE28EEA966A23EEB4CFDF7C3214ED1892D23FD3 -94230DFA1997EC819B6DB410B81B86A72531F77C8E961B975DCB26688E4F6593 -81D1F6F7564D1F275E543A75AFD9E3D0428A51353F495A679F698311AEE413F5 -1739D4CE6417339A71F8BE8A7869F66CB1A32138150AFC538BB35CD7868BDC4C -8240BD7E4D768C7B34B5E38BE9147ED4C37D572C5BC88864051A23871A378DE9 -0E8C343919B9396424EACCE5820F0056116325760D5C013DBED1371FF5331EE7 -E26AE2C3C87BA61B5B8F4968D8D54BD99928DECC04E1D87C43E1CE3949A1DE30 -98BD5142BDB7DCBDF70EC5C7F53D19236723F48DBE2E248AC027864B586BC889 -62DCE35D2BED91F5BF0E61D57AF327E56E52C7A961089BA9665992FECC772B77 -CAC17F68EC5A19428E9E3C0D3637F95E22A17B93865F18AA5CA034EEF2D838A6 -8FDDB1A55DE0162D75E32309EDB9BD50F7B5B9C54E7489315D865B1EA22E183B -18A40A6E7EF82D3604B1010930148EE0C98749C696CF4874B66F5C2303E9FC18 -A8474E429A512794F79AC86FB85665F7214EE6D0764EDECC63CA4C588D7E237D -548380EF951D59E9FF34E55C11F6E253DE88A1E11D3BE849A0757D5B17D5ADCD -9A995A4AF8C49D836B45D0293ABCEEF10F13FF16801FF4B5C347D60EEFB1A00B -4808EAD5E3A8BD521C56512E87BD0902C16D836AAB9ABFE0A24488DD955C518F -C03E13A8C37DE44A791E2D5507EBFE58929C135C04D6E8E7D060F9E875ADF2AA -0873BA79499ACA25CDBEB5A22B4790B1DDEDF1BA9D28F84122FB12A9B69228F0 -3962FE09716943C5C043C52C56284F10DE37F51D89ED25D6F9959068C3589555 -F35B35043900AB7D24ECB3C6AEA70A2438FFED3B1F74B72AED7E0D320A5AC92E -AB1AB7C88D693005671FD23DD4841C5161C066CA5FA0271C9CBB78B3F7EE486F -7D04B1F6FBB1E5FA6B4B1AA46E682E1D34B949E3E3EECC0946ED149F4FDE5BF5 -1DD86F0A7C65E4E564E749F82E2CD2DC4747968094B51212C67FB1666EE3C1E4 -DE8E2624E787C234B0D555D90D112C0F11A8CE0EF3F3008702487CDB423D1DB8 -6FFEEF3157343854827E24E61DBAD3DC435D7D8DF6AE36ECAFCF4E38E75B2532 -36FD34E33B35400FF86FB6CB1D6F57A8B7887F6A5D32EF764A3043C43C01176B -821EB3A913778C475DEE03D5B30BBED1ADD27096CC1B96327BEEE7E6A2FA8B56 -D4728508A069D99A3E0B64A59D9A255EFC1BFA33EA637CEF5A10E7A37A4DF0DC -0DE7159A65185140EC3BA086EFA1E0D579047FB9466796984036ED11F8EFA400 -5930EA0CBF7FD3A0B43F9B72E4131E639800B0674B816DE8A0A84BE448053A14 -59F62810FF02DE51A176672F437D9677A55791F92DDDE5381D914FE6D6390223 -1FBBECA54AB7B1F9CA5B6919EBFC48F0BF3CE8A0CA01FA7B2C7D3015DA7EBE79 -3C97143947ABCF4A66FCE9619DD4CD85B7689CFEF13ABE66C531BC6DB855C83A -FB348BC9B3A879712F38D532591793D7D9CBB295B688BC0B9A19B5BB780ED0EC -A4C1BFD972487322590EAC3DCA44001E0C7C54BEC2B057C00B43435A7F58D72E -E063EC1E3A797E43D7E034F99521C2C5064416D284D0C5BFF6FC1D6B7004818D -5EDEAC5BD3DA390D6F6A5EC77E5993872EE94F28EFEF4A07C55640168BFDDAC3 -D26B047AACD752FB3FD9AD8BE5057EC9B903BDE9C8F67DE3B2E767B017DAE949 -3CFE62ADCAD5561CB286799423DBE7C09304371AD5A82CCA9D645366DFBABC45 -992F88BB02F6F24CF08ED9294D6A07449BE4776C8AA43292044F5871E00B1040 -3EA32BD3B65C417C16047D3DB637C264D7AC63F3925C10FA5F31C6E63A612651 -464D0A20961E8AE7AE10FF6CA4F6109857EC43AC431E46D028014EFA80FDEC62 -C02C5E14019912D9A35BF4943DD56EFAD7F79CAF183A178CC235EA02A1265765 -50B5AB5E441C7BCE845EF333233694802A4FD1AE8DB72DCE22E95F8877A50569 -0C6A3392454826B0C0F96E372CC4B4BCED449CF64B49933E8BC5732DF9118ABE -5A4A48E968B9E90EEEAC5B567EADFEE8BDBD950E73E9514CD2C766AAA0B517D5 -EB699EC3469A2297DEB868FB6A83EC4C968584E65001C8ADD9B874F5320E1ACD -E933110ECE93C9846B5692C74656D29A0CA121F3C55EFFB618469D5DF0458CAB -B37A71D84DB0740DB34B11418E7CE2078CFB92895934FA113ECB0E340035CF36 -6C72017AE14788FAC6BED4099AF351B2F77E79014BF7CE9C7DFB96B5112CA497 -6BFBEEA5E41AE2F9DBC1222B97657881A5FEF6CD480FA33269E933CAB45CA066 -EDB113E02E417DB33C7BFF1C22C85ECE8AAF3B50FEF6C7EA7E1F60E78DACF1E3 -0F887BCFBB33618BFCB0D059BCDCD5B5DFDB1106A3A603E0E7FF211D19D368B7 -AD5EBAA416B41AE183A060523A19089B46C60A86D9E6B7865FDD75442A370B5E -C591CA3BDB49796E6D7CBF1EA4C3A3C637018D3DB0A47E398BFD675CB960AD97 -5D0232C8D88D3E010A278F10E1860B1FB6996106D4C1EBDB126920BD52A06B26 -41C109A997008F643DDF62458AFDB764CD91C61CFAE8EBF1077F8AB111F83196 -77DDA47A77B36DE210C8FD781C0887C4F418C21D7FB05E372F233AE647E42210 -A0BDBEE8E73B5F33393C13FB97A5A1DC139FC3A8E6C9956EC3AE1BB47708F7EF -76C464190738E16F939BF4F1B7028EE763A5419ABBAB658730F542D1CF61E946 -55102269B5195B0FA30C083DD6225AE63897DE05F415346855A3F79286289F1C -C5A9716C3D0DF3EBB29A608971E91E4728374C0EEEEDBF4A1AFE94B91B640A02 -D25C46683A5EB03314524873FA8CEA401548630E916007556B87F6DC7DB30964 -ED66EDDF56E64471463F56C22DACDB0DFEB841E35D26B7E65E20238F37A65D48 -577C5ED324873A15638A8B284F3EFA88F0EF627A2A3D45ACBEAE948A3866D8BE -BF2066D7A98A787ABEDAA24CEF161ADD45887DBB06FECFED84C427B04A86741B -5E887A92488BE7EC2824595E33DC8FDE1518638CBCBDEA016D7A6E95CEE9CB15 -6BB224A8F059686A64E0DA3007B55DF3780936D279135C0A2A030E7096987556 -6B776F0C6D5A4D07ABBBB6115877B5C0F989F321110A2ADBF433A635B87CD6D5 -45C710F64AFA43E976CB3E0036DE80509DF688377E59DBDDA29CF570D6FE4435 -EC20867D1140CB649A410C367381A03F8AE6134AE2C2BC84B1AF67B60A598970 -04C860AA82B17C76F0A804C9CFF52E86591CEE5F5C2BB7A0DF58C15F5D499EBC -62C21F501EB2AF3D99F77283583064DC4A56D1EE4B87A7E92D4DB9553930CEC9 -E17C0774684F080171E1390589046D5A7C0D4106F42DFB71219C64A0965FD5A2 -CB829378F617F014EF845918685311F2C617BFA8721C15EA9FF431461969C887 -A6DD208F8A75385AD18F0BE1D6EFC9BA18D08E127C54B11F7B55824F685E04BE -1CCD930E27957105CB26A362C9D52E7C02E22D274E1D67FBABD3A0084583A750 -55D760E08C4B13977F07CFFD0B2EE78BD247CB881027355B79EC907F25E85675 -251F9ED848D6A7F389ECF7DC55D4980030449F5326C818DB4F319B3FA23E4F4F -2C603D456BB54941F29C9D221336797FA18C8F76A62648F0CDBC56C82E0960BB -4343D42AF313C3C6D9319F173A658AE701E956D854384A84EE524C984B280567 -84792499C1810FABFD9FFDC8B12572F6885525C338EB04E7A1DE9E89000AF0C8 -5CB8E4C763D09B55C3613852B52E0304BD1B2CBC8DCD4A2479BB5F11C7929047 -38AD94EA31BC9126B4AC715AAA3F2B7EDBEFCAD62B89A3133BD459D50F71AEDC -95AA7EDC3A75F4E2E56B6FFC89DE1C8878DBB3B8327EC3E9921B0968A19C9644 -16F531238615311431F6281627A01481CCB6BA0BD299EF51435744ACC386E03C -253113523AB37B43A8D18E605B80B32D2702570CA436951D35F36786F009F995 -63A172E30CA9AE4235B6A533AD9C9D5996ED311061F12DA793F2401187F0C9A0 -3F5E83C292B6B19E4A282FC84849AB8E36A3D181D2CC0311B5C3C00028195140 -3B947595C0BE35326AD501B14CB629691E68D8072AE317E9F0269AFA255215E0 -E3CE95BE46B426A38FDB7FFEB3D4FE32101B24C1BED6828640068F0BF6153FB9 -09F19CFCECC992320B92D3FBD3BE57DBD7D525A9AB871C4B94252774ADB990DA -4F495083F479E7885BAA23B6C94DB00C3AD25E5C5A4FA0789B40F9ED049CCD65 -98583EA5DC97CB743CC8623AB1AEBEAF12650EC69B97E54DE766E0051F3050BB -B9ABF9867C40ECB37EEBD415FB87D90A9E28E794A067AC4EF3073A03101D2CB8 -AA21FDD4BDD201F48787D276BC600B3E33E25104A9F4DAC840AAF482CAA72E45 -507467ADF32C8688B0B0CD558EBF3111C16E1724726FCD45AC12955373378E1E -602ED45BDE5D2180120F28343E6A1ADACBAB74AD3849B32166799BD20E10C6BD -06D45304ECB3DFF7B44A6239BD7DAAB2A48E4F78619AF72AAAA08D4A4A72D98A -3429FD366B1A1BBDC23110874DA1A209047340C253B381E0FE2BDD5F9EF3A592 -48C055EA879F6C929A9D90B50AC96B64224B79B0A9446B78A7B26D48EC4F976F -0AF9053F27CD2A6974297DFB4893BCC085218B2589F9909381A2C30D87566D8E -DF8C1CF7F46EE69C2683660521F79EE40824FFA4D920830ED05E5FC31ED81408 -0C07A1069542624C0240FEC70531324FA49D2A322FAB6EAC240EDFD54AAC0560 -C32C082033BF96773E8FA41343230979E2A0EFAF4BAB8632CB69C68D6D3F9EDA -B21808BF0B169AB8FB78175D9BFC3EE3CDBF6D40FCFFF0ADB0E524542E6F1503 -EC947159B849D55859BD07C75F825F2C1791BF779E81B722E7301FC03F8369B9 -979AB5424659D21CC567A368297E461DDF0B2DAAFA4190264F85C81A07623EA0 -BDC4A34463EC8E3627934B0E0AF04B934DCF6F0B20780F1C03B910E677FA1FF3 -F961004BF45FDE410D0836D512E942D928ED6FB9A053B199A8009B970D22B74C -48622E6F905FA624D827F29E8EE6D084504C261C6DA39A8CDBD09392778C7868 -4E9CBC5238E4B7881C13C01D257B3538F90ED75A87E5CD792315FDA149F57FB1 -ACD38431A6AEA2B95DF08DB0C55454708A371CB03A33AABC1801C63C4DC3AE35 -2719417FAA25B0E591D019BFB0BC8787B2A91A57A31732AF70D4AACC68BB09E4 -5B75EB328A3E41E5403003A73F7C57BBCA43CE24A620BFA808D343C618518075 -955A111B0484C4D9A3A0119D247C7F27F4F5FF31BF7F1F690036B711D193CD09 -7F0B51FBE4ADDCFF7D216EEF2CAB356661F00864961CEF4A162725C313BDE449 -B01AFE1F57DD23188A5B2E87E92C4E5C34C0194822A57690534D64D174A38D66 -BBF58C9D2E9CAEBF00CAF86B906F06FF52F6D7C89CB5C412D8F44636C3B633E2 -8696540BBAF869C51D78541D0F61A56C187C43C0B46C840C80388DA4004B0E6F -778C9D7F6F057804470140734D685007632109766211ED1FD67C357E788BFD4C -727CD3B369412B1F9278346C3D939879AA78B99AEE9DEFEFE82898005285A064 -A18323965B6CEE1E52F707BE930BAC7B988E89D75C2C3497CDEAD77B50B8E2E5 -494821D963337F6E4C794938637E5DEF67DA1708F69546B86DC9B811A4E62B6A -7F2EBF7B726AA7A45E201317D29403B9B2446FA7B7A36F7B94964BA6424B3462 -6CD013CDDB6DCED37B1BA19F66BE82B27A224161AFA1C8AB46D966F744A9A712 -51E8AEB2A88C622584CEA232122A13AD59A8DB6E3CB15B0546EDF670777BF5E1 -8E02B9609740F694C26B673FF18C1078F35F17B1422C4480CFE095F727A98EDD -806567831194AAE07CF1B95ABD72E469306972919F43D804A6E77D8DFC198869 -70198ECA2545F34F1717E47AAE8447BFD94D6AD3DCF094666526708859D933DF -EABA0DC59C197E3F317E4E1E2CB56629CE53FBD230729330BCE18AB75B4FC438 -59075E3CEAB1747F9524DA998A8A2200591D430AFD1AD7C77A04AF54442B2A8D -0FB59D6F2D2C8CD693AA9ACF3FDF74AECF6CCF7C83AFBB2DF87243F38CB06C8A -836B71B0C994D1CF5A396362ACD79E9C904372895F6DFF90FD57A84C1AAD6FC7 -3E4B975C39CD69F974C70EA4793EEDC96446F0121AD97B8CA7EEA2683EE892BD -05F03C4B700F8C9C86DA769F81AF093B265D401180083BB25C83AA5431D06F63 -B3FFB5FB5480B346E718847013F5AAF7EA9A7C2EEA9B9D097792590D5105F0C7 -663E50FD7139B70A8115A20D54233E60C98FDEF21F70B0EE8F9D5A390D8750F0 -014A01E9E2F5A1D705EFA183E446B5E4F2DC0475A296AC1F41868E02F4E90852 -7A09F9BCCA3F3CE19E7A603EE69DCD915C0508DCEC5BEB3DBE2DE891A5F6F664 -DA14E2BDC137AD40DEC105A20167CFA9D4B92DC3A910B5DD5D4500612609E5C3 -A9C7719218290B86C1F2F78482D103A74BAD660370A51FBED225856B1EE3C467 -D91ADCB807F6378C09350575E67BABA6F9845763943F3BD06B354C6321AC27AC -A1206CE8844D59FA60AA6B134A9D34DC37BC99A7C2BCF711FD74563D6869D2B9 -A8F6E06A1CE58CB6A19A65A6F87B408E941729DCDD06A95B4F836FFE50BCE577 -E181E14B8385D1E349952DD0A531533D04376EDAD8FFF35BF95DC2EE74272768 -CCAB85B3404E831A10A59B89F2CD86CD7F679E7F1531F798429420B05E1F789B -5DD53BB3E786AC92009C8FB0E384ABACEEF6EB07B074C1A762414193C38B12AC -115A18410CB7858E47C1301AC403D17279A2DE2BB1DF7A9959EF0F07CC354002 -6106B73E021AB2AF613368F6E613BEC66D496DF2991399F96810F0AA258687E3 -91AFCC01C4E9F66EC71203D553D3E27145AB4533B9F9A0B40920431A8457F5D0 -B33C6097014B2BA7C1625CAFFD76555663437D5575A47043AA6B370D0563F608 -56CCD891522934607D2BDE105F72B060A9CE253087B7E352E96ED1CE8A5045B5 -D3E312FC94E07637BA0A220D58AE357C53B8CD442DEBE059E68D8F52E78FB089 -5816056F4B272CFE6147F0D3AB2EFC1D34CA0DC6AAF07959D5D4E9DE4A8808AC -853DD340500897E05458F8D6DA89D3A4418E2212EC9ED55209787A81219DAA0A -8647382BE1D9B40C172682C4CA0277E45B3C3F18E29FCA777AD791A085409F9F -8F6D7638CADACD40624A11C5C674F82E234BB25C103F024207D6F5AE3DD7371E -3F4AD49C6A00E8A8E3EA69238FF23A4B95A0B5CE0603C0F0BF298ACC94FA0A5F -EB2B0EB43AD29A996D769876AE8F2634952324EC96773088F553C9E14BBC47CE -4AE466752F6CF7071C624CC31B33F0B00C8FF85355976C4D42EABB4A59DFF9F1 -211941147851D6260424FEA6D1849ACAC8467AEC83BDFDF9229A00CE3B435B2F -86AD5D2355363C63150FE6F70022054246461861A8044586BFC15DC4A66E1EFD -DD4D65416D2DA6FA27AD60BF65C70C6E870470168E7808A6600EE13FACEF52BF -BF472191DDCA9F3ED69B12FAE825D40CCDE55105912AB2A9EB3D33F2A44B07B0 -B8BF5A6B12EDD39E3C34F79991CB257980A50FD5F51D6F2B89C6D78B56AB5441 -DC0A057D09A77FCE92DE4A395137BE6A1BF1DF9A80F64BD05ED8244724C734D0 -DAD75E391887CAFF7B439C477BAFE15FBB70557047EA7CD67C199B90B17EC0C7 -F8069CB9D7C1CB037BA177C13009242FCBF91E38D00F490AD9DC155B05B4E363 -DE146E8A947544F18723659A17A3840FB5FBB468FC7AF2DFF99D30BCB45A32B6 -AF073181C09D15173572E890E11C6D0D6FDFFD2EC48790179695938C6A031D4F -97417CEC9F48487E0FA41871F3F4AD043832D0B354DCA183C3E9E9D3DB1AA88C -83B0AD74DB406236A3127FEB381AF9E9F4CF2002366307CD91816C5C589FC641 -A546105B8C0F1AA1CD85BA30BF7C6B52DB53382F5544D006D50C72E69C618E8B -C07C578BE8FF6E55404E7FFCC5F8E8D4F8357546235CFEAEA640776AC883F7D0 -75DFF18443E41E3F5C5C45E79E6E6753C287FC7F02581F6EA1AC8E58E9538CC6 -C59F50748476065A83CB867CA52CF7DC2952728AF06CA1AD34B3FB261C7B47B9 -F58938A52EC78368E1B5E5B68F160E0D40117A4C589FFE46581BE9A3D8E36F0D -C2304878EAD6270A036C73F954B83C6F192840ECCB869CEB480914F8DE2CDA26 -4E24D0919B33CE404B015BEAB8C14A38B8C6F14F34A6527CAA9F0578AA75003B -B9B211640E94724B3306D8F7B6508B7D83CD21EB074FCA4B6BBCEB24C0F21126 -3A0AC00D5CB26E8674C335157EDB4ACC1885D129EBCA1FD5566D597BEB16CCF2 -FAF47CB3DBE1A6E183FDF8D2C13ED34BD9DE044EF4F85A10A3549945F03D8B55 -B011572E9EB47388066E043F314969B0E6D69458DC339D230901EC402B1CCCC8 -13BEB070FFFC5BD5ADC798A48BAEC6A0A78EA58176F8A47BBFFA17A9E664D43B -3CB5204384856EA3DD03D84337CDDC1012B3FAB5777AD7D319B4C40751FEFAD1 -3260F48B7D0A908C0E8F87EB3FE31996009711F513FC2307AA4B0CB1C69C7295 -5A87E3D415595A97059995614B76E4B1117AF3CB6EB67D37E6A4F358E733B606 -10B22B54C287C0C08AAD2D84EE49D8FF09C3DB83F142A8551F9A835497393B32 -27EFD228D7F41AEC275E97FE40278BF575122C8D39D27A575219ED204F5DB6BD -1B4392AB9BCF5C443BC135ACB34757DA249006CE3C736C17A3447E5DEFBDD8D6 -FBACAFB87B8401A5862C9BAFE4DB4849D41B085A953F389710205396D8C6AE9B -952506810B6095A4328D95C91256DDBAF6CDCACDEF31D33FD5737DE73A396324 -A7931360B5191F898B0DC88E9BFC9595B6B5E673E39AC73136F5378A01FABE38 -A5315BB7A575B13F3EDD25DBDD048EDAE255FA85306D95E0F514B0429D7B1A0E -A264256851D7C607DEE94C039F86164F46B2A580DAACF266E8C90CFBE615F5E3 -B95F384379410E70D5A0918E8537CAE63B1E72B5E4A6EB6015CEB241488231A2 -9B795A794ABCB2DA29F571CBF9CB567EC2020997612CE5AD0BA23A1A78F8DCE7 -A974FED12B5D767FF2D6ED92454953E4C56B319D23CA9BB95D842CD4B14C66AB -16DCBC7C6287E91585843BA7AB9AC563399D4A4E9318967E73A45C8BEB435FAB -EF85FDADE59069FC632B27AAC665B1B97C33E22ADFBB93FE7302CA8E733329DC -EA899424ED5BCB044C5BE1E406BEDD8B71095DE4BB1679374902C668A366647D -7BFAF1EDEE7995D5E0955DEE8B9781642A43CBC59F596B51453FA781B66A1F0B -2DF490F0EB08486E4A7714766972EC74BBA47D6370A10993C81E03EC9028517B -DC1BCA80E6C915537CEA99804050C9793DE5DB949842FC92E5D61474F0973F90 -E7384CEE695EDBFD40ED77FC3E4AEE548408D6F558F48BD585063526E8F8B7F2 -7EF36D3FFBAB245F531CF02396848F1045DB7CB9AD769C21A6A4E2E42DDC82EA -49F8B767EFEC87DBCE99A4C08E20F7FA02290D2EAB63A1D0D1658CD45C88AB71 -0FB2203892CDEE9FE8097925568F858F4026832F56987535D29BF61F02DFCC8D -B56E7242346D9F7CB00809B9425DE12CA1929E0578D64EA7D5FFACD89F7BA359 -C1CA9984444D2DECB138C32657DB7050A70CA8A53CA655EE4204ABBC03DAE89C -14839AADBCE84FADC0D457E84D7F0F6360CC76D45E7E5572F7FE5C12EADC9925 -2E8625B858BC74887FDD958C9D7ADAE031563073A8CF6203419F66C56B833355 -6170F2530CB76AD64D3C4154D7EA9CCFACA214D03C01C1711CCD73250C1B73C1 -056E55A36934ADF21BCDB577F20622A16B8D119D56C47CD239067E0F3CD86AA2 -8026C2321D77A7F8630D6F576CA1E2E403584B99BB7C7FC69E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTT10 -%!PS-AdobeFont-1.1: CMTT10 1.00B -%%CreationDate: 1992 Apr 26 10:42:42 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTT10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch true def -end readonly def -/FontName /CMTT10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-4 -235 731 800}readonly def -/UniqueID 5000832 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 -38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF -D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 -EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 -A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 -F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 -4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA -6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E -A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B -E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F -1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 -452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF -8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 -5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA -DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 -BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 -741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 -E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 -E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 -D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE -C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DC -FF798F2ABFC4F3539392985C4CB324B0007229586D1E0321559F67C057FD7902 -194490A4C133DA790FF3BF23A13C2B1B69EEB75950F9106F2BA1E3CA65C90FF5 -931DADF03DA48AFB8561FC2E710087251BFC42B80B297A3DB0DA138A7622A931 -DA293B0C740987ACE9F2A8EC2DB98F85783C01623FD3612C7E4A84FD93446770 -C3DD7431F955A5F3734F6931BD790F0A45B8D17CB74BDAA4BFF6DAB5380CBF61 -72F37CB67A909E2842E0AC5D9D07D01A4BABBDE2AC70FE5753460D7E1A708B7D -0EFB2B5FF55F9E4571C466AF1F91E545585845B09D855C3A01F713C1BF081EB2 -7E2A0E5980B63AC736D73305BE7C76A6D637A543047CB1FEA0D26CBCB617A9A3 -1E7A4F586C39D8A66560C4ADD7D8CB82D8EE1DF399EAECB75AC97158A7C9007F -DBB6D28AD94D0D8318257206CD8C8AF7CD2503686489BAD989E2A2DBA7823DF3 -B23FC7BFEDA3E20D8FE5433D2EAC2FB5D4141FDD540E10EEB5434D4361E3DCFE -48E98B657DD7191533943A8D34F80D91B2E0D2B8482F61A5FE7BA1FC47E0F61E -A5171537EF1C449ED2D1EEA799B4E7D293745136286FC74158421FBB1107F28C -5A80F4BD3C2C515EB5BE01853F7F1EA8A4B0CB91419E3B149F7A0B628B14B062 -7998D7C6108FF4311964F48AC3F4A86F8AAF0C6F283205750982B963E8AB24C3 -B98381689FEF61B3B0862A8D9B0DFF7F6DA2D297D69FF9B3AD38AF0D1CD15A5B -F828FA3BA2E3A39502476ADBAE3D9D97B7E8EC0DC87BB8E568431D7D0F644B27 -B1F7C321DDF08F4E56A1765F02944B8E689BFD5B5BA2F0E744ACCF23EAB3C9E0 -437A2F11AADC402E67A4F30F2E068ED563B488DFAFB8D4CC3CCD7A723CFC2D4D -5E14BE10E438F8C8F58BECB1B8E8B5E7634FEB38525A0FA6628668B883045628 -41F349A029D55F93E3AD4217DB695AD9488D4D3696ED1ED6FA23F038EEDEB275 -E99495B28C59A96A6C0FD368CD324AD1E4AF39F3DB3A0D6B0C7D0DB5F2A6773D -C2C0EE9A54DA936FFB669944D6AA25844F0B0FF00C55442FB4CF2E907134984E -A165BA48F0CBBC243E9F2DB3290E91002D058CE899BDC2E91040BD16FE4687E4 -11495AC93FF323C5D61A93964BC9A9F416E19D6B8007A299EF2F25DB3C2C5B08 -C57D84B8057A71B83DC38DAE0D1DE21AF1495B397F5806AD71598FBC50CB7802 -73683F271000FD7C6584B000D2660EB892D11E4190C6C031CA358347FD3AD86D -3669FC16CDC0A775F4D49E053C9D36BAABBB8ECDCB917F020EA70980310A5F2E -2A8C03CF89F5566DF9D56E3A0A7C6725006B3032892EF8D76FEA83EB3D735B18 -37C1651E2FFE5C9FCE3C2D168BB3E49852120E246A3CD1AACECD3C92F0A30E83 -98CF798F810DAA1F84F58461949BCAAF30917778CCEA4C8F4BD123C6AD5BEBAA -DBF134FBD104F69D4AFD02A0972092983759DFD73A65E236441D05FDEC2F9FC9 -8C175342EDFFDCB4D65828D8F4232D277FFAE23903FCA2A07348F03A667AC455 -2290ED1C49BF6444A464C634A836E1AB270347D82A501997CD14F3FF675DD302 -160715EAD6ECA8D7E1F8956E327A054A1CC46FB2730597966286920DC3FAAA29 -9F8463FBB7CBF1CB66953DC6EFB06725C6FCD583877699FE64A7A1336FA8DDBC -4B9BAD82A174BEA8A2CCBDF717A7CA8AE818468AF171113C64905B2D6361566D -AFCACA63626339F51183B81EFCA62C0E73B5FEBB963AB20F8ADF826ED141B7E4 -C599A0D1563987035DF6AE587D444B38F571857A57FFA00E6FB2655D782CDEF5 -D631B37E3D53F14D9BC6DF1890E1807D9F5FF02593F376AF4AD92A52D8DC0046 -8D5F4CD8B701E0FA4F3146DC1DAB163EBDA9A72E1168EAA7FBFE2B10C138B934 -C02A51AA02B0B4A1563C5A686BBBF59349134E9D12337E514A6502E3E7FFEFA7 -EEA007F91304A58C294A7E75CCC58F8C776AF383F7ACAA40D4B6D81A37DECBA7 -3295D8963E03D2A646A0EA616AEC4D8B7EAD05E142C7C783559AF876731E04EB -BCE6DF986C594E5F224C3A1A2E5838935B30E74A38C74BC5F33A7FEC70E20730 -1BF29BB786CB5929A7BF48E9CBC7395C3389DAF1ADD073934569EF8E830B6D17 -CDFB303AF58C669D3FCCC86ADB495CFBE35C503030472CF71AC75FD0473B578F -3DFAECE33E2B2A94C9E39C50DCFC30B0D39FE6C86098D9D52B8B3FE0FAF6699D -23B4D16EF579AB9234768432C75B129C693295BED01045E5A07695DA3948C68D -682D8802B076344364E13430BC2D112EC3FB306D8378C78DF9916D6F405D5081 -F998483BB80993525F7D8C7F03809A1D41E36016CD6F4174910AD886B59537E8 -028AE2EDC7DC88C78DF54D265654837FDC00EC239E405F7CABDAB9FB9E9E5138 -F4225B2AFE59D237F286F5B660A4BC1EE67332134730295E3BA826C391FC77A5 -F3B411948D80AF73C6042E85E2AF3A0745C1AE23703F46F1BE9E5CBF658B033B -704B9FA9308EAA4C900E0297AEBA80163BFFF4EE1667E8A9A8E0F4DA97505B2E -00A39D7B67828726FA7DBCFE5A3471ECB4A61478155943F7E49693C7158212B4 -9292D987B0661B4BE2161FFAA3679F318BB9E9AB7A7EA702F617ED4D9023570F -1EA14FA83C2E850953C2AC0682355925DF46894187C87C0720F0274C5056AF3F -D6E0DFD09C377B78F7DA17EE76399CB172A340570B6EF06F01F639F387D6BF10 -B675B98B134FDAC6A05241769EE94586CB9F88337D46862C8EC9EDA1A0E5CE92 -AE3FF4633D38DC9E507446041E657771E22B8C1DFF3226CD6A17343921B342E9 -1FEA13EB668F98990F3A246026123CA001549DB9242D24D5E4D983691EF5FD05 -8146B3F73C09B92C1DC9D44043E0AD7CCA84DB2C769ACF8D8DA2DC00D8140020 -5DA2B67A63E3AB18895509A4C60B77EAA98DD0544A1A8AA76FD1E49862E2692E -2935A11787B5A980118B1EB1E1BD528CC9C28C310F62ABA2A69DBBDD13B47BE0 -BF19C6F965437B1E8DDC83C8D5FDA17FF58F81460FAC5A5E26AB41119627B2D8 -21B6C2AD5AC69ACBCC77FDE349179EB5E649319DDDB791B3000A27006CB61D0C -39F07EE22FAFB9BC18CE28C4682B73169F7722C36A310F83E7B31296AAF22D76 -382C8AA3EB370BBF35111735BA7E1B0F12397C689A8BCD5D4E0756FBD35C98C0 -47F2F1A2EBAE4600F2A00D2FE33A9068DE2F0805A092B21341DF1EBA66E43DD0 -09CE23180B8D7254708E48232B5A1A4EF38FDABABBE30DA8131CF0B57C31F416 -6B2575B5B4A9E9B3DA27604AB7785275E5CF4F47D39FB9DEDCEEF38E2B0A32A9 -0C78115CF3EBB16F05F871BC0636EE952BDB78CBA02DF352922CE3920D193EC1 -75C28D0F95C79EFB8363472E1B4610A0BF51B387F54DC5070AF12126139CE29B -330406C168C39CB8F7C6ABFB1C5508CC890DDDAF6B0EBAE16EC0B9F859CA4575 -4AF16431EDB81C7F0B1F34AC9C1E36A6FAF93D52009685CC837019DCD2729C6D -4451F05002D33A72261D364F61753913892244DA6EF45C97F678B831096921BB -9840C52EECB8A3E66BD5D467136BE95FDB1971DCC7EA31099E66C82AF9245EEE -FD572EC4945C6E53A8094279B687934BF7CFAC3E27CD311A781C8FEFC0F7E181 -9A54B4913FBB12A1DF5621C6916061B30CB4AFE9303C4E1E4AC81D41D922992F -85B6D05148EE83C3C86F9D204A229C64230DE219252FC0B7EFBCDC3BBA7B5DDF -3A13CAF57583B05E5319C345850AA3F7DA679E505D21E3FF41E8440F9A54BD6C -D796601292DBD575BCEAF3DD3DD69016C1CE735F366FF4F6F2DC6985C1FBB8FC -785440E33632411FA1BF68F2A2D915251E7E41E0B3CAFEF1ACCE5F4ED6E700E2 -D2DE9EC44D1EB0F79D54CB1A1C5708DCE4FE1480010C33F2CEBF65AF617EEC3E -C5870E6D24057650B1294A171DB802796F3EBD7CB23E5AB5CD695960CE7C6438 -35CE9AAE9BBB10A66B16E4D36509432EB3F7FA889DCCC9F69E9554418DD66EAE -AC624A6DDCB26FE8B5F84DC552661962FBD11B723585A74B695B387B471561EE -CF20A2F9C08C298D830BF555C984F63D9592DCA0CE228E7B6A34D856BCF8F7B7 -682E4DC6D4211D882CD2F9D8446EA733FBFE7FE323C8B07263583B02165711BD -7145D9979808AF12D5FC84BD95CFC65679394C4FDD6BDD558CAE3C5DF0CA8103 -7D7D743096DD18EEBC2E8DABE4666AFDB56625424F696CE0DEE12759D642D3CA -52DD423B9B66E5367B8EC821EFB7286A505B12B52A1C7CE60592D07CB85D5D10 -31A5BBEAA364B90733AB362D65B4A7C66EE95A7EC0BA2D78355A810D978E1D52 -B21DF3D8DCEE275F2C56CE6FB928DDBA8D0DEE3187CF88788DEEC0D7D900E257 -2055224AA10032137799442AE8AA9DBB505EBA158D9C54EC8081472C62523695 -0D95494F72E86D76595052D936C1C5ED78682529A2779E1AF3EAC5EE6A9004B0 -281C2D47E4ECF5E5B94D39480883F25AA8A642C63F668B193C74645C16AAE380 -F407986E25BC548A8F6309FFFD59D13B13CC87E1908AC7BCED313B5E341443A3 -79B783842231874CC02941378B0F92B2AA3C562C95F64AF1BD3D77AC8C57AD9F -FEA45852724FDF1F5699E98A95713D974B41D0C331B11B36EBD33CC4008CB707 -3AD28BEF19EF655B1C61120B1550802335C8F614E59B566A3C218DD78BC66F19 -AAC2154B384217A55C0D6D84F2E28A00854BA4BE338CAC258D4521A560B66E52 -084152E9B65A20AA8F01B34E41B5470EDEE2BDDA42D4080A34997BE9A752984B -942547DD46219DF3B03D553BCD89F76699B706480C465C834237037E719D027A -F2972152A6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY10 -%!PS-AdobeFont-1.1: CMSY10 1.0 -%%CreationDate: 1991 Aug 15 07:20:57 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-29 -960 1116 775}readonly def -/UniqueID 5000820 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A -27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF -5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 -0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 -DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A -71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 -4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C -515DB70A8D4F6146FE068DC1E5DE8BC57034FE2AD655DBC911C76FD991B91DF5 -2DAB3701C2F3703809AA4D01CE2FB5823DBF3DCB8FB55EA6C677A115BFA7781F -B87B1DA2ADEC303DDD1B4FD1CDE506AE380F938245AADF44DCD3DFA5D86EDDF4 -F696ECB1962420A310ED9B46DDB2DD552F37E726A01A80E393D739DE6FD5ED60 -DFD8CFDF4FD3CA8C09CD8083FA3A37825717FF1E4427ECD8EBD6715A99A00A14 -0E84602FC23179DAF351835659A696B15732FF946B4F30E2822E64502575E7DA -1FAE4C2C21497FABE2431E70E8D63F41B2BEB5351A655BCB7D35B80D08C29A0B -4718C78847D0C64B213BAC1FFFAF2AC7C7A4A53BCEDD22C3CEAFF5D453F5EA30 -2457FD0752BC74229641E0963A3454900F0F6FB2724A38163759099BC8F7C730 -11B22DCCFDBBC251CEAF138443AEB0ABB6B43D9D4B844ADE5D6085EC5399FD39 -D0736CB6ACD3DAE713991F6694DA258EFDB4FDBA458CB5CE8D1A6A656B0BBBE1 -5F9E99463DFBB8A63862D67AF78DF8A708DBCCC15FC30E92209C6E78246A6CCA -C3097A98C805132B7316F08DDA87689EB9B4857A7CFE77968E2B41CCEA82B3E4 -C25F2F90FE06C8402CB5E519CC264BE114F332AB11D4661F23CCDC48A71099C9 -3917B8D0A13064FD0A59E3477EC6B557DAD057249AFA88EBC97DE8F19F026CA0 -FA63B1CECC15B46C1B0888BAB90370AD8CDF9C4EBA4CE10177BAB70880BD8483 -B546750DEB3BA50D7DBE4818D7819C64B76CBD8185BCC33BB9987F2EA6786A41 -89C2FEA15E2933F9A354C1ADBBFB9848429199890D83FA49BEC5B0EA59FCAD7E -C37E8FC24966C6D548F0A65AC4ED7323F1B1B7963882DDA8135DA6DF8CFCD935 -61283714088CAD08C8F64FC2F4A4C8E16D04E2A70B0A0DED0ACFC04155486017 -505EE0081A33AB299108C3959FEACD11F3A29C3224EED58C9D857A3161C13927 -3E2AB0E2EF719F08E0435532C6C1475CC25DFC5C7BCBC5719B020B009CC87BBA -ACB32D66C2D787BA72450148CADBCD46FC5A42689E918DDF2E6CA83C21C9E5E6 -CDE1E324A9005214E79487D124035574F03BB6604E8FB08C88DE11A9D237A87A -CA62BCFFAD900276C9E9BBF15353F9C49563F1FC0359BB3B9ED9986766B3EF5C -23FC567675571E2825BF1308A0C7212936E59BFFF305548CECD9F1A019D9F10B -F73A8D8DC8C5F9D04C96F1974DB8681EFED45266515A15ABBCFA7CF1B7495834 -1B592FAA77973BCB0D0061CF1073004B11F203B82A4CBE2602801B97D551F716 -3988230660AFFA1548B9AF718DE8BF637B49A26AD2506620EB414B703CB962BD -DAA53B8E0D4A73A75A9E7A79E91DA9990565F6ADCB4631A1095FC5B0772F3BC7 -70E8F267A21977752F53DAE79D9AAD31A63CD6F330A159E7E4B1F58BA6CBED55 -55900C3E27C3D88EC942586F040F97660792B95C0062BB5FD07A6A609EB7C7BF -D81BF6160302C13B205E0E423017633E25E1DFBF868F3AE66F4F1810CF1C6B7D -0F0D6A5C191CE575D92BE241508ECE6E98BDFDD4E8198F8A50FB83F1D82453DA -4C070CA0D026D06E3963587735127B4A9B36452259F16631EE73CABBF8114591 -28F45CCF11FF0E8F9A150516BB0E4696E7A6628CB89D091D7312031E150D2684 -1E09A617E597BBDC329F6615925B56FE13F09B5DE654883219B4E4EBD91C6FA1 -2D00D3ED5D3B73AB325B98C51B3901C1A8BA575ADE96ABAFA56157CE817F228A -4EC0824285AB40D145E6555C63919F363F211BAD94765F6D9EDF2162A4FE27C4 -DF10E99D614A6F97F18E14025E4D7CFD97CE310861CCEFEBD3A0F771B584B81E -B061BE2F25C4CC42928AA2740D58045C4223A87AD3C20BAFD00A0E1750081FBA -3E1D463BCDD1D818EA13B75B3BDAE5EF85BA62A8EB7192AEB854CBEC77998EFF -8ECD2C38F1D15AA720E4828BCBFCCF8F51D29E4DD0F6B738CE2862EECF8EFBB7 -37DAFA2604053C3DC7EFAEE7A8662A242373DAC6452D218E1B35C95F850ADB4A -5DF05A1B04B2E22EE7F5B19D9265BDC448FC9455A2E0C2286BD39F87F0899B0D -D9E4F92A8DC4F2FFA316D6B2EF67FB01E715099A9BF629BCA12574B645EA7316 -6895803B8611C5729A44D6B8F7D3C90F6EFD0D32AFB744427B804CA7888DB140 -4D0C41F473DB22D336DA125619875568F83A3E3B5D3CD74EACF810B23F27367B -4986DF358FEE59121ECA94A3AF277E01EFD84F9C58E90F3C95A30A8EE409F33C -73A4C9522C1440B2E670BB887B0061DAF615FF7304225ABFD24A919B640F8E29 -E4D5AC3B6A1712857A7CF26EED03CEC99BC92B514085DFAFB6817C6CCA5378F0 -2FF1D25CCFC773A4652E608262BA2C9E43835F9A533159E14B78D7E9CBB113BD -D9153D41FC17F0EC12813BC4937F544EA1DE1A1AC4E095F7522A5BAFC5EBABBA -0B6EB08A7F6F93C6166E75EB2267D751FF9ADD95E6B7FBFD4CBC4ECA5A5F4899 -319D5D95684986755E5D45BFA6E81D46A8FE54C9C219ADDC86FFA6768E7FE8BE -C89764142C889F7B882829C00F4181B957495A408107190A8C713D83AA627856 -79A71D7C4D1C65734270209876F96C154348D02E85561A24813B0CAC5E3B6822 -5B3C8D21886E05D5AF0026A7CAD76D0ADE9531D2AF11FCD45FDF092B808F5A1D -F2C0ABCFD7F7ADEA078FC79D6928AA868C215B293F4ADBEA5A6C6259511E2C3E -6495EE82C20482789BEFE1E8C122EE53B6AFF2728B020EE898DAA8C738C104C5 -A401C9B38A46E15DB888AC0108891FD473E86E013D453F7AA125134C5383F2D7 -CD2D6708A53A486D92E5939B77F0128621C11E3AFE3D58D34D7DD8848D451D1E -FFFCE5C6478FB3575787B4E49171D452367A32F4EF6DB8907E0C460F5EE9E2C7 -05D205E3A10B043E506A18214C5716407A9F123631CDD7A7C3B942327FA5CE96 -F3FDCC72FCC8D3F6B2EE835D6BF95DAA739B29CD16903981CF14685C98EDABD4 -3DF45E99C9EADD144B2A73BE71C2E9DE2EEF03CF6F26DEE41869493B4A71CACE -6E86BD2BFCED81306F6B058A70895CE8D4DCACACE8C9A046508269C0737927BA -D76DE661E1AA5533B31BDC07BE83B53EE594F8575877FD296D75B9E3FC8D1060 -638BC40014625BBB5C1034A7ED2C88BA7529490E5383B2A38765A849AF406063 -DF0B00B84E4DAB16CB195BB0A44955514EB8E3F61F8D635C7E7D61AFCD3CAEC7 -052CF68F012E3F7BA77F9F7ECD362C1CF6AAD8AE897CA28B4679978B6682D133 -E2FDB183990FB20CACA59B62C8035BD5CD707E2680FD4773D0913756CADF4569 -E6FA27168285AD2588CAE24E9A03CFE58D8927F92E2E0CD04AC792C388C95465 -4C96056CE408251159E70E1C3C90D805AA6029A5389EC30A464483D0B47DFDFE -BB6E83438586197BE23EAD6D5C6B6F02FD8B1E4373DDA969AFE04C9F67498C56 -835E8288A7708FAB98EDB9C23A5606FDAA6FC05A00F110B7721A17D93D8AE076 -43F16094236B8960ECED22069D10A941EAE363ED2C4B67F20F3CB06FD1FC0227 -2D721911BA3C80A9D53B71AC04C80E03FB65CAE44349B31BB70DB607DEEDD3F2 -92756B9B0690AE7BC05BDB3B55DE728A4DE32C54DC0D450B49616CB31A077B98 -D92EEBEF83A40C68C92BD1D5F9F7D97EA673BB437B929F4696F827105CD867AD -96B7782FAB75D7FA7859E850D65216D812F2DBC52EDC61BCED288178788B3FDD -E87C2608CF5F979FED1BD77BEEE5F36D9E305B126326DF2EC291AE3305EBB3E1 -D43D700040098D5FAB1A03AED1B865FBF6116118581E616D5B37AF67A7027D1F -16FC40F9235F063EB3C1F1A6A190B26DEDDC56E5ECB3BEE4D11D2BD83EB09C5F -3C882744705C15A58CFECB39AE27F95A31702BB5F0854BE0659AD3F5BE7F2780 -0166703DC65432680CEFCB76C0BAEC8E6F9F0AC35CF8A34F2473D788E97DE044 -5382D5A4845DC28B4AA557BE992C7D1BF238A3D18F3033EA9A3F84 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR10 -%!PS-AdobeFont-1.1: CMR10 1.00B -%%CreationDate: 1992 Feb 19 19:54:52 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-251 -250 1009 969}readonly def -/UniqueID 5000793 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 -87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F -D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 -92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C -295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 -409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C -4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF -2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E -0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E -B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 -24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B -43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF -D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 -5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC -96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 -7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 -0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 -B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D -AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 -97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 -FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 -20759B6A4C4466E2D80EF7C7866BAD06E2A1040FAF2DE1FD6AFD5FD97EAAB614 -956897A7BA8B194E613047BF469C7B4261CACC1DF1648E8A86E926F8702B5ACA -6CEB4E3E85EF23EF5C9C53097F3BF17243B8D4BF0E6B0C5982FD14E4E916D363 -E265322DF0823E9990F966A842ED69BADFAC2CD1754FC84C0FF6750D2373F997 -362DDA16A0D73B178FB7B67307204AF174AB871C254B8E7CD77058113B702B2C -13F341A972B67756D65C6A9F553C365E20F0BA59F8537C88E0C139E4DBFB279B -5EB06158D9CCE7670C8D6195BDEE16F430F73A91F7171B4C8064DEEAC7D38B5F -0DA94B3E97116E1C3FDB669AEBBDEA3A777A9AFA92550909AA9D0858311E56C4 -61D372BC556317957B1127F260CD64377D11125ABFD379CFEE11E4F1CD99B2CD -17DA577F2F277ADD3791FC8AB9E11AAA1BF898AE21338948D37202E017214D33 -FA245ADA5C1DF1281B0D03CCD7BF989A8A5EC887349676D2DEF9F727ACF41712 -C4A4B0A58FB3407F3CF897C932FD35A827F3CC2B737C65D95E0A27F020174B1C -362BD2F9764042394792B01DA5D041F124707E3DE6C99E7B22C06E621A6B3345 -263F95B8CABA907FD4313202BC899BFE22E93661C69156123182A8C9355D5C83 -61FFF6B017AB7BDE11288190F34414839ACBD8E8B07B14208269ECC85CE7942E -126723698234387F8DC6B1C926563979CAD433B91341797AC8D4E9842A2021D2 -B10C931C8D48A357518AE4B9309B6B5FE9CAD21C226A781867EC9C9697AA0991 -1C89233240A676D5BD336DB321F63A4D67C6BC8C9B9034EB7994D97F7D0A76E9 -EE8CBE9D635AA4F737D5CBC29E7C52BC7B203A53EDCF2AC17C97DAA643EB311F -9C71D07F43EC8F49CD697F6170323D9CF494B3359F533BE48D38907D6A2E5B98 -73301286E2542B278DE567FB37E8F7085831A8FF2AE0088A25FE2F0A934F5178 -67DD5BB165A516D5F2EF9ECD69EE2BF5469670256638DC6B7A1363DB3A6143A1 -DDE149C7549F0FE9039907AE326AAA7812331A17081247A62BD9A7E2FB8EBBA3 -0BA2F91C6499EE1CBF77E16D7EC4F94FB96595FC66CE9FCEED3076C006AD5FF6 -77E0C7F856A40BA5B30278217A3BD475A187BDAE24AAAE8510725A2D244664E3 -B20ACDEC911547897C7C451218068C3AFCE0E7AFBFB99A8A29643C9844717D32 -E88761DB6F94BF760A09692FFADB23C398BA5E9F1A5EE01F6781D44DC2D13885 -279E750C8528BA5F974CD5042775BD45E35B0E556D8015DAB8EF9808C6FB887E -79634230CF61AB7AD05D15473560AD5BA8E9C22745BFF150D402D02439F6104E -12C829031910663583604BCB1609A79265A100042B9A685A4C2E7A452356647C -36B6680C44BB1D89DB60C38E2894F97C0442ED380125D05A21701AC58D600D84 -59B82B38A30373D7362A0504CE71C22387371D4322CC22362D93433ED26D4585 -1ADA61B17006B016219253A1667463A7734DCDBA217A458B9D0C8FEE6262CA04 -23E5B042AC025B0D58A83FBCE8786C934404C23ACB098FE1B44F223889D7B524 -2201EF7936C6997E133DC99F39FFEF7398417606652FE19A54B6D1CA8B44C8CE -4D4E5ED7C18A67F8A4F85BDEBB9FE4122FBC4D37C448B437C00CB8F6EE99D2B6 -9830F0CED88569445352874F07D9F56C7B80ECAB15885DA1DAD07A44E26AF0D7 -07AC50CF3FB851A9825594C4DD0945A958B14B99EEC5C2B64C904EED648B4B4D -F0E89222E7EBCD6312FC96C09D6C89FA77D0D01A3BD35F17717064AE123937D5 -AB01AED83BF7F7651A6FF8FDB0935816789CA31A93D6169728185B3DE40272CB -E273DA6169CC875CBE7F4627A605A7066FF31573E96230A6B048F63E10A87C65 -16593187DD6B87E608A6B267A9AEE307526DB7FA2150911EDBBB5269AB043C27 -BBDBDB71A1F0BC85FEB8CD4A1ACFEA4F3108567C3042292DC13BB6DD8472261D -6B20F123BA23C49754E5280673E10462B4ED6634AFC0FB61D9A5A96FAC1287F6 -93524683903DFEADC4EEB690507005EBFAA80B46B5A0721A746A7BEF05497C95 -7E24E77325B89112D9C52D9EBA29ABDBC273BA5587CB640FEEA1B4D391F682C3 -A9AC57CB134B1E8DC526573B68D5A0C4BCE666D5770F697491B27420436716B6 -6AC0E36DE07ADBAF00E45632939B06E7E5FCF43A586AA7875E9CA36CC60A4299 -EFDEDEBA7FFC71677FF78CB509DC2270034710E4B276BF67A3CF4B74099509D8 -21AC925B52864D0F30C0B88C7443B6DCCA45B1252D938949D68879C51EEE9F8A -3DF2AF59E88BBA52CF933F0D5BB88311820D30BA9E74CE536E75A81E221242B3 -25EFB4DD30E26D4C773BF1CC2A5A52401AD1692C21292418949AE0A2EDD08BBA -35554B1BFB8DB5978333D9FAB98F7F5AD1F9A77E5207CE87CDBF9FF9C0EBFCA5 -C888286EA3653638A0A5A3BA36D3B48D1D5DCCF4D01D6A70BCCA45C0501B1E6F -97AC34A1574686332C1CE80624A767E9A04227DC95236AB7C28A8C02DF3C2CF2 -0DDA389F23348B3B51330F81680064DA80EFB933A13E3D8FC402A0269C026C98 -2213262B7D545A9A1E67427174C5373041A73F78032B719A97A22C55FDDB67FE -9E18CD04B9FF7D4D6188EB4054023575C60CD13D4F5619072831916C3C816D6A -277EC10477061C5ACE828EF4E780BADFD35AFB3A7DEF40A6DD411DF2DEFE6627 -FA84A5859E031E9274BFF04AA06987DA125EF4488425F63450F75F729C0DAE7B -3FD0FE061957A0DEE6348D470BFA3717ABF608C4075BEBEA8287C8603E64686C -A43D7C22E82E8ABF6E15496BD94AF17F6E37DAFBC5567571F9B9DED194F9CA3D -C1F6D3F44DBA29B7EFCCFA0B05D69C34959F7F21A250FD793045B1C7482A55AC -64356BB037C08198631BC3FC4C05EFC181A9C422FE4843AFE9C15F3670453704 -49440AF248E63A7A8665FEDD3B51049ADA707FE126D7824992DB8571F9EC4E65 -76FA683497A614987FA7FE74AEC134E0108DDB7769D5FF8428ACCB1F1B98D27D -884B0A57FD401F3A5E6017D4B01883EC04C47B8164F9AD4A1FC6A70E5F8B0EDC -0F776F7E2EA37FD17C90998664182C3DB0019EF3839F18836D6715867B3F11BA -EE2F1A38CF63589B00B774D5635003F9B20BEA2BD3B3C867AFF11752C82416CB -A27640835CFDC7E91E3E390713685828AD50DC2BCE623FD3179A1B5AEB0BBDC8 -323F490364C09000E2B0141A002BD0750C440E26019DABEE09310ACAD46F2CDB -C1C9C389271C0DFB4393121C6BDB98FEF7D9C089C55CF5FA358C3D58BC7A5AED -EF31174A55B8B41624902E597D478EA1D760C6B79F27F0D5F13B830DA9866B9B -4CFED9C1BF917FEAB7119BEDA068246F583EF6BAE3BF55EE43438185C418613E -AB71D5262E1DCC5330D04E65998DD5C56EF3FB48FEDEDD9ABDF7AA8B33CEF7B9 -1F5D228C977F7F0F4BD80EB0DB6E68416AB3D9E48767CE4BDCAB24408810806A -04FB4933C3173035B24C6A00249D5CACA940517C7C86140639F6025534B2DF50 -7EA1B9ECA8B3D6CFAF282314977B08DD07EF14C3163129497BCCCF026E3B2143 -1CFE1CD973BE61990D8D1D2FAD75911C281F98846CD0B47AFDB24F56963A9A69 -25F3261CE0E5CE5A240B61D4DF945C1B93C595C1DEC801318C9876C846E8296D -E49A8C68C834451142254BA0834F01AD55E98E0CD741AAA4BD481CF23942FBDA -EF04BA6E5B6E699DE787DF80AC44A83888EEED0A0ACC2BF72FB546B3482C81DE -1EA85C9BD0BEE3A69CEDC00AA8330E9E958F846130B407E838FAD227CED835F8 -551D70E77841F92FBA6A334ACB10EB1BB9CAFA7A7F6478A940C38F26ED374DA2 -FFF67C6B14762A1CD318211011231AB89BF14CE3C5C575129AFDD3278DEBCE2E -030BFD4A4A931827E6FBC26F99AA6F86D6011450E67977526B9E6E94DF4473E2 -40AE390DAD0C0785493562F9CA54704D0572ABE2F823FCE3B6E1AB6EC1D8A801 -B5B8DD322F8D247952392739CBFAB964807C2868B9BE6C1B5E5B039ECFFC3F58 -E70F99A4F87FB88403093EB36C5AF5F5D1E3DCB62BBCFF36C99D1115AE463E20 -DE98FE0B610DB3C5622D074F34C9CDCDB17F6F9240F4F6D7D3F1B9317C7AA77F -FB2422522F4D0308F617887B59E52D6576BBC0C20E8133E05F4EB31D4256F2AB -816BBBFDE0A84107FDB031AC22C8DC45311699C41BBD8319C63556A04FDCA299 -38EB63A9FFD1DC020A42E586AA5CB57F80E95B74DD81239ADEFE781D4B9BC443 -3A8136D154763AFC2EDBE75AD4B03D928D131687A5579DE342807CDA37BB4B1D -AD7D94CF63902A094ACD1F450B57BA62F93B28130577856D002F2F83808CECFA -CED22EDA02FAC0E19084D4A1FDC4C8C81C9784DB910A06519761A700728F5218 -BF4D28892D917DF2FA5CB6BC3CFF661C25E549CE013C7CB9A5ECB653A1787DD5 -7398DEFFA97E80924A503887F41523CDB70786FFA720BD88EA5A87BDCEF9A668 -34CE05FCC8651ED92215F277E69D0CD0BF71BBFDA0E868690DFA3C8672E01072 -6CCB10A6C62B31A9B49398413C0520D2A25F3F50400203AC650D925C24CC5D8A -864568FAF47B9959E6D02F549A2D82652EC6CCBDC2CBD4A7FAAEEC07F572C809 -9C9F97B01AD246FF274A4EEB49E9EF16924B2940B1D66F7D5B3EB639FE656BFB -EBB205A0AECCC2075681CD55C3824BA73502930E09AF52B4B8608D92D4326868 -40C38B6845042DF3DBE3605FB1F9634C02FBE32B100929AEB0D554A9E36526FD -B9A1C85B663CDEF59EBD5ECF579125B0CB9C05031A54B20FC09072ADC9CFA4EB -267B158EC6309CCB8115AA41FD4DAB49EF52A1370E9103558D76B55AD4972827 -B2BAA45CFD1809C917322D3C28A7A7C187B95458FE0EDD845B937FD4CA032D8B -C4D7DB3D697A43B5EE5FDBECDE01AFD89D5A87922284108B5646A8BCB1DC9379 -F69CF3C414FCE6D813F7E95B29EAEAD09225202FB44AC48724FEFBAEA980A342 -7AE979012BF790867A6D1A73DD8B080B6A3ED5257CA3460A3FC223D32D3F6645 -85144A01B473613E654B5373E005B7C561CD0B3BFD56DC35CE74202507BF1A75 -D732842757A1EFBA87682C87C7D4BC1E50EB6EDA06B797124EC7D4E71F4B48F7 -A64EE6CAF59DA89C3554C5044C6C15AC38A4C62DCD26E4C3FAD42634E255D178 -99EAD64038349D2CB73D44BFF7C164C9E9E5D7A88096014004FB39D589616DD9 -ED34BE2FC40FBCC9FE0F0A7E6411E0604B7F5298B7B5482A72591D7C69916897 -4A300A76EAF80FE3AD1B3C69D9DC335BB92405813DCC6C4CEBBA99C9E877F41F -078818D8DBED228351C6F05008ED13722167FA460EAD3E93A751A0762CC70823 -06C2FAD4C574B8432E07E7FC62D3EE19E8FBE7E513F5DB377249A51E54D54695 -C055D5E722FB8DCA051FE5BAB83EB9120273D8919018F39526A5B4B7FC545D63 -CA17E3196F2ABA3ABCA64D094717B5F9D88A1A2ECA461A96CF3AC21DE08F8F50 -EC075B7D93F986AD110CCFE74BC8AC4FAC585AFC6197E6B3E6B22DB726C9BE5C -CD0E5BCCB4DE3E7C23928FA6AC6764EA5ECF54EF0ADB3B76831D79E28D5B8016 -BABC16E63460E1EF7644C180D246A6C3A9FFD79783A21EC37B3158C00D425FCF -93606CD758D8A817219A91DF80A8DED0632DA87F74E9872ED6509E2EA2D60434 -C4072F593970EE8AEF6AED7EDC42E80B3DBF345DFEC5AD5964F117BB05B8B345 -8E429BFADB4E9ED78B47536E2B7A44639490F1A9985BFA674F64ACAA36A00109 -496663467A73DFF747E5823CCF54BF25B8BE4BD75B7C259171E9B379F0A23B7E -63693166F8F9F8C982EE2B331FF87F7941ACF36C546003689008F8C5FFD685EA -E10591F80F9CE8020458142904EDABAD482F38510773C8E07B9A06ADD2244415 -302BB653A4B31F0A13C58795FF121129A90694C6A2E90E9C292C3BFEA9E151D4 -75152F02D354476C4D7A9074F09D3A354E9B5BC14D378E524EAD2B2224313BED -DF3D5D9A2A6169512287B7E87C2CB869122ACD215E8B1FDA3E87743B3A887D98 -539207236AD201F887AAA89908A2DCE69853376D6768F324E8CA774DC02FD1F4 -E3A040567D70E883AC3B7FBF88C098C5DEF22725E0FD14D89F517C1E65427208 -FA832A20FAB30BB8D50AAAE25B58BBDA3E809C385ECA502A03A4F84EB39C76AA -533E88FF83337E6683BC1036211C36EAE1AC22BA59C80831F29286516B20780B -13F57424EA3D83631A6DF45DC206AE3DB39741BE6EF2EDAD0F509DB6A4C75E5C -C5DBE6B27C622E8F04A1C48E74E79E46BC3865DE7C6449EF8C7A37A06BC16EA2 -56471EBA5C5A64D52F17256692C344619690142747311EECC20451CE21BE908A -68582065F9F7FB834A7E493D5D22FAA55729E429F4FC3BE78D2136AE44C5A82E -98DA400FC92D44895C069B6058A47151D8BAE5A73435708C01FD973A430019AB -5A466CDD0D615C3732DED6D7FD080D6625CDC74B144F2825AA85475477C546EA -987394A8E9ACB412BB0B5EFC9CF7171C8069DC2063F4F396A3DEA909CA9B518E -D3740B7AFF0B27F4FFF14DE715EF507EB2D34B58A034887848A0BFE70CEBE8D4 -1573C685118776AA70B2A21EE2235ECA177E94F5EFD7A7A71843AF14F533A7F6 -5C33E17765A2D6385DFC3D5EB4C38BA5E47E0F310927C9A580BDDCF6D087BF4F -5F90C57F14C40FF9033A73A4D99F49965DF16EB80A13301D7C0F03D4159F31EE -2E6662C375C08C36C64AC0E5F14D818C9113FAE8C9B255613AF50361E1E680BB -16973241490009A78FC1DB3F9A1335A72BED9E5F7772B4C253FF9F5AE725FB1C -123A5BCBB875B24204BCD936F4AB94FB252F883B384F032B5B95879B776161D3 -36288A32BDA98C6B7CFDC71F370331D0595CAAE2499AE6BE3B7A45A6311E66E3 -7E1F18AD7C64068D526B23F7DE9E455D1485A4D7D6B22B83997454D190E3E98C -D3DF132BC1AEA10E79184BB49AA75C288206AE1CD0DBF153BEEA3F19A92B67B2 -3C4592A0C5571FD9933501BAB1626A01DA725DA6A344CA1C33430B09BC79F9D1 -4D05E74D81BD12B753459985469A3BE22C9A087FD9B7CEFDAB5316B0E423D4B9 -B7FCE021C1649152FE9977261D35A0EBF076324CB4FB6388BB78EE901B13C4F0 -3C919398E8D41A07EB89A29B22DC8B958FE56C723AD0115724BA606AEA545913 -3D0379FB3E4247AC94E84C099B2DC62FA4C64FE75154F8CBFA936BC20787A0F5 -026E19E660F1997030414F884DEBEA47418A1DCC512B0324EC71F1BE83E27FC0 -2163BE625C62BD938CAE53CEF041AA277E7DC1C5ADC429571E9E04113E332644 -23B3F419F19F22CFFCCB12CD3B471F2DB0A8B4FE0852FA59BDCFDBF5F4218820 -F37EF495513E03B5CF912DDE7156CDC584E9BF4FAFDBDC0804D60DDC7DC86622 -8D5E655EB612E8E6F1EEB0A21C58FB815BEB2C799D2303DA9A40DAE0196C4D97 -7F467AF7199462B2080C9E596CD35580BE8C53D56705EC4BDE5D4EF91A28C15F -DAED77E62AEB4FFDB18865DD0B80482EA7242751260BDF5C945DD01916438548 -381D8304EA3AC2C67BCD6C58B995A5D0182C1A7D522A52AAF61E8595ED9C0394 -AE21B3D1CF037A8EBDA90771CAEC12B0CB5A61275DA746F5FC4DD8F9CBC97AA1 -88EB1424564C4FC682EEF197DA8E454BF987479E241004F9C22AF8315F9C53BF -4262CA79D5229B1FB296CCEAE98443D11B0A62D2F9FE671AEF8BAB77C82435C0 -953F5A26E618D667C6DDC889C09F7DCCE7BFF776C0CE835D24E7C7B94F74FC56 -EB1CD0FEC04E0F361C69429B3B495AD10D6B5F5F968F6C05622FFDEBBC318C49 -64F9EB007025B674083B5766B84C21EB1F2CCB5C876E69E968AB4E3C9DFF2D81 -CF8751BC40A3CB5EB1AED2771B9A3AF8EB3AEF38E273C2B386DBBCBBA8DD7202 -07A5547D7F5EC4FF1E530DAF82F9D8121A65446B720D64444CA8EF177906A9B7 -41732292B1721C2688124A5D7DF0738E52ED4EAF35F805633CFF6C3797A806EB -2FFD32DCA349AF9C1302A5064612307558CCE92F00B10AF4B5867F3D1E5222EB -498768AC3DB44A4BDBDAF5B7D6235825EAA3C2CB7C17978E527365260F709425 -7DA436B9273A760342324CB5B7DCE5D014A3FA3872C67AACFF15E3C761B987DA -E072C71ADAF83B30A76347D2A98A79F60BC5F9E75CE00195B52E11B1B4F5CB11 -30CC5E56C45D8B1CED41ABBEFB8A1D3FF53CC794AD8F8734CB37A3B4AD6BDD36 -6B93C58A25B84F8BE8581B9998A55B8BBCD3FF11F87101614FCCCC979A34E1FF -15DD7C6D6CEE2E55D1B5F59CB18B6E64A97015F39E6234FFBBC7E6128022E323 -E289696EF9344B16D2E9E3A84BBC46065CAD1EF497CBA8E72D9A8F99CA478675 -1D62A9926B4E75345A0351371A50A62024ACF359D384958C1C1AD1B05C0AA201 -1082E700BD62BE64416491ABBC9C50595F894ADB2E16511442D3ABA66994C15D -2335362F3F75220FFD0AC5D39299C8A69D0F5C31EC1791692D68950306E56516 -47534D8A298A170E07C244586822495A759A4CB80C66C0D399B8489D5B67CBD5 -5E3800E02A2AD550F6AC66188C748FFBA717079B1C8C60AC5CCCBB9D496A1D14 -5336F5506C147FAFDB832406872086A6B4AC9C1DCEF20BE3E8CC62D5B7AEF440 -5BD38AF381AF38161D6B6B4E467CCDECCE7FC0786DDF16D52CE0A47D867CFFE1 -487F470E97DCC86D2D98597030F14F109F37703E292093896683BFD6902472C8 -A5BE0615C2A469792A28129E53C835D2DC13BA69EE5D4ECC53FD0E54C8EA0931 -0D0E3AEC46E58D69427111C32931D67354B31F4A88200CEFBC0A750DDACEBF1E -4D7E00827698B69664F6D62F4B62F76BADA67B5E1B2D7FB19F34CD11B0023188 -D3106881C33CCC507DE08ECE7455CD590C688835CA318F06CA63BB063A70E96F -75595DFF60D7BF5C2D2DC2742CEE2416DBB2794A529065E6EFD77A8008F82930 -6F7B7BE30D3A5EEDEF84EBB09379C5623B2AD92289ED257E5086C869DA121C81 -4C37B8E8C60BEC96C7F4012453527C1D218E2D1596B0EEFCDA7C7ECBC3FF4C90 -972186AB19CF6EC1EF8665D91C8FD9F23E49A05C6E01C4BE9B135E1BF7411382 -2C4DA39EF9C99577CED1020B54F70EEB2652782510899D5586A9699254F30264 -B0758CF7A439B3D2BC3CD022FB61524A617A2A64B03597C36C33290B75BFB5E6 -504A1D6E77FAE14A8F1F48C133F63D61E3D1B8E15F2D6177819946F0192132C5 -5807DFA7777F63A90B01EAABE9173AC5B54F1813EA70E140B59DD139B7800917 -F6B19388A82F84DB54B665016DC2D07A0B837D9144E67AEE6987279F91CC7E28 -1556D0FF195232AB8B401CDC937A61844894E3C2AC27C8E06F8159F18260341D -7B1C6CB1544905A2EBC9D423F2AF26D41953EAB3E148B19EEF9ECD2DEF7385ED -88842EEA28996FB8FBA44A5A69F0336AA74BDC8CE0BCF0606F6ED89C4DD66062 -B17638D3724A2A88A61AF2F8F637298CC2F4EF3565D6BFFEBE4DBEE805B9AF16 -7EF2F510F7CBE79D03073B6D17BB205F902E7215968477775E7ECAE79B1AD5D0 -ACF436CB53EE1F2A5DBAE70D7E71F8593FC7FAD13D0EAC13AEF7CC5A41A5CA3A -8DAFBA56DBD8F77777CB13F86934FF9843B26D002FC9F2A60AE1E8BB187A9DA8 -874635EDE69309B52A853296454709785A240FD2972E2CECFC4D44678B9FDE90 -BF29FCA802EA09E38FFAEF59B7C38B71147D8D977BC32322C1FCB8B9856BC21F -F8F0D440C12A79463D7159AABF27F8A2EA3D0630D7314D409284602E420664AD -E3A97B9DE9E1FB26677CCC778AF7402B358C53EE8025C5141163B5AE54BE1D81 -B59F119E947EB56C6B13AC30720D7FC62AE6C0214DA2FF1307144E32265162E8 -87D251ACDB4E62FDE57EAE7FBFE4C814FA5C095B112BF32012FA12F4467B947F -3D3D4C11411DF3A6D046972ACE03BF943E0ED777BEF76056DE331839ECD9434D -93A6A84DA3E7F16D5EF4298F52E6D6378FDBDEEAEDF65B2CD50AEE38A023EABF -EB44E268F60F691D37F20B5F87FB7E84C43B58DE6AF948770E8EA704ED26972D -8E33A14C06051E83B7F256333EC09A192FA63EBBDD1920ED499B8DC7C1678B17 -48711D1E980CC91A694E6AF9DC13857C6A0878DD9979552561502EC47221D9DE -110DEF3640E7D325FC6B231F0652232B66122C2884B38E6F42C306097250CB09 -F4D474A3CBBAE55A3D7204C02A1732B1FA6FDB68EBCD1360A0686A2559628B90 -E0366E21E50945922C77EC65260FE781F0106A0531D642413638192F5847FD8B -6A7B99292F7758976E8C29C3489BB9021BFB3310DCC14FAF330B47D52F1DE4CF -8A31221E2B26E5B51444F4C644DBB9E91DA0BB013510B1D790103A7ECFE7CFD5 -D1C5C696B65A449C3AD78B31F430D656D7919559F97D5BB3F727D4FC1977372C -F400299E3C2CA0B020B4CDFF04F936EEA045334190A763E1D58AEB3A4D884C43 -9733372CEEB5EFC2F53EEA541F8E750F8211C9D70130889A587EA122E37E74D6 -0DC1BB7B82A6280334F12087A4EB516EE2962A4309A287E66BF77CE762B8FDF3 -5FFEE3282D1CDA203B862F1DC42778EAA13C84C0A148F1FFD0AD04227F8C63C9 -84A3AF9D1590D3B3257C7CB3A1432CC98646E9BE7C29FDAB85B671CE1A306D9D -A3289C486F5804BF9B8E8F660BB2EBE88F3906A30457B6F0F0BDB775A7C8BB3D -2577217048D7B7FA9ADBDBB7FD05FF194CC8075BA5B1C8F6FD7125C4C6065FB6 -F2D858426F00199722391C42EE333FE6E1BE911A0493734505A3A88C730E1F0F -42EDDF3A0B438A036F10B0C55CEA64D0EC3CACAC8147E8544A71B8B3644E6138 -554D33D75033D49698BDE2710609C47BFE99C2B534BDD028C3853038F7A6E2EB -4245D6FB929AC1BB25978CBF1F4788FDD282CC1C6A70DB70B534A3C6B0575A3A -5966E2CE6196DA1870F9181CEE0D4189FB731D7A919C068E405E2DF001A8DDF1 -85EB76B370A4440C5118164C7543B08DC1F80EF629455497D9C926B9CE0AD448 -DA86B97113A2B0333668982D1BD9428A4625D36107ADA8A1174A2DBCE7A6C97E -BA2BF2436E3FEE222B4F23BCE347C131ACEB5227D0FC13D09434AF0398086C0E -A39E37B6CCF3357CC0CACBB3B422F322CDF42E93ABD414EBAC8C355BF6612A60 -177AF2BAA3A20B2618440D8A7DDBF7D990E134F5611E1750BBB113B8383B9024 -8A39C73A77F7A6DD3F04E8576D9AA7BD36143D488461689307E9FC762345A735 -ED1F2CF8C2C34B97E797B879AD43EE6B4242B917E431C3391BBE3D8FA1639773 -87B303084DC76CA338EDD67DC2C8970427E0EEC75CB269849527A7C16721ECE0 -DAB08668915952F9FA935A4D636C53120AE57E7573B560E8F4D29B863C074455 -B63921F39CABA501D46EF777E8164B20C3D0F023027F6F5DA96D155D764FDE2B -4658A3728A6BCE3CA89A5AFAB76B755BB0AFCF743C42D5169BEFABA0BC5DF2A0 -4CE1E58DAA6F62CE473FDCB408FB7A1905864454BB69DFF619179F631056E45D -1D59A30F245DA6C412088C53C428E5C501AC0789B73E1E9E74D1183586278BEA -548307183522D9C316CBED61E87E33DEECF8B356168F4601A6D4FDD1E2F912E7 -254543E9C67A0AE22CB9980D215660D95BE5FCCEEFD16FACAEB5E473F5516C42 -2B64D5E316E5AF7EB7D9976B3B2A0A19D464168BA452E72A6BD9A3BA8D4D8F40 -63206F81C548126736C887ACFC19CE3FABD3E2F7E720D21D1E17AA344F366E89 -D6AF1DFB643DE9703ABF2A587CE0579D42B639AFB0E205EEBB6715635F8FF024 -E6F64BA9734000AF9C62D2D2F986C97B41CA0E7C83B053D12DBBD0BDE512141D -5F6BA9542E949661F5EBB8D3D5008C406EC9C49EDA8ACF9E72979A4BFD2F9B95 -F8F9F891BA094C8C2D09565DCB7D8917D9F75760AD777CE86141A552DE998F10 -556305C4E5B744A443D7149EC5078D8AEA1D5CA1D848143D81D793414FA91DAD -EBA7F678ACA6CF74C5A59FFF8B7D8126183B0253CC53EC29114806F760BC99E2 -FBBA755F1C32B1F57826528753308D4949D9C18CF8C730F4238AE2A9B07A5F67 -B8C6A8ECD2FADC9F674D0E28FAEE5FE15FE7F486010221817B057439FB49331A -AAFB5F91743B22731D09E639A31BB714DD2D1DD9575CB552A8D331262498821B -DC3A019A7F3136A57BB932FB3678A4AFE233EB453607856C28559F70887A82AA -5DF337918D8C5B9529861FF6970989CC7553CAD162D967992DF168C789871492 -911F431681F134B4301F2BCBB77F063FC98E96F5A861BD6FF8B1F760A67ACB7C -02E9D74C45A5CAC6102B37DDC1C19C6F3A9E24F366C3AE2781248C39EF091F49 -E496A2188AA151C95A64AA76BE16DA1EFB464111859E7501CD4D40B1C6C086D9 -B64CB6E1C273C030CDBD8902909DD6877E39A9CF29BB20F9D7E1DE1B27062325 -C749320D7CB266A30A0513BAEA3DB0FC81163BD8C7A18B19D2103056809F56F7 -75F7DB82D0378AAA5041B20C3458B617BF99EC48DA5D3382AC769AFE40034F9D -563DCFCF653647271CE0CDAE6DD4F1476938065F7E6C995B0D82BA94EC62AC02 -41BDA8CA0FCF25F482CF26CFC462B7A57CDD513ED063F7A96DA496CBCB07DF41 -13B31186ACA0DE516DFC7370AEA9420D0532FD7F5C132717EDAA2A736CAC0B60 -F9E76A32464C4E709A90497E022EB8BD97915F6AFFD47436687084027D36282F -5C5FC5EEFAB2C385218D090D6DDB38446D915260E8032D30853E384175F167CD -6733B3632A2E567A5D62F0B0BC557704AD42993348BDC918656D44B5D6616D97 -AF866A131273D83010A0348F64007EEA87A1030B67D411F53E04B9A2C3FA605D -4D7108DA76743B63620F21829FE9AA5749EB7DA18245C461DAA1ECB21DD7B899 -437EC55FCE12679697968FBF58E6F83F04B1D1FC87DE5F63E3914258284E14ED -B63FB6AF526C5044299F79DF144586727554564B5C1B8C96BE0E502F8716D05B -9A82B784673E4FE17850EF6746324DFA92F54A701EE96E85B047E9885D05F0C5 -4589B377F0014E64D80B953326B72C39AF1A7A8C644941DEA032D8268C8C8232 -6ACAFE9074EF2445C4F8DC3885610F3366DAD02F732F74ECC89C55F0AA1A69E8 -764860339781466F69F5C681CDB8ED5BFA5A271212EF2C72430F56FE2644F1E3 -1DEE653F86632842487BE539A35F10F34560DBC955B814CB3A16309D6ABC83E2 -B8A8166D91DAAC6AA26BA5FB5992C2C98CAF1863ECC3849C227E9AEC5CC3868D -554A908A5DEE2FB0F8274E99349A922D5FD06B7D6661AB9096FA34407563F196 -56D40F2EBB7C6FBD1E59CEEE7EA9BA92826A6902540E31FF2562E954B8E0471B -C9E7F5A5CD52E857CB3CDAC522542E9E0A607E2DCBE4512E9680B9F0D2A63A7B -5F2093347E5894E7D04104FB1D956E06FA8F65F4138B95219CCC089CBD70A4A2 -DBA0B116A768376E0351AE7B904B81457B7E590F596428EBC5816702CAF79698 -D4D8DD094E3FFF977976F7863461130F84960F045C5657B330B0E6BD211B4B6E -7EC1F91AC74376BEB869484F53CBD61953ACF9B8E0CB2213B551EA5143A58850 -CFB91147A97BAD137C17613022137DCE7DFEBCCFCDA41FD124392547896269CB -1233B6A64DB4A1A1F78550E216FD6BEBAA6D6721009069F4856BCE430ADAC18E -37A012D30CAE6BC825B1B00B1A22EFD07BF6D7F8D37148CD588AF87AA4FD5EFC -709B46CE8E55EF02FF2F162524ED9C52B1E14C756A7A791942BDDEC4232560A3 -3BB57C2222D78C39CADE0431BD6A879ABA37C58A087C93A9E5961E0692DEF28D -D211A9BE4516F75B47886E33D64C7C7B34A533F432F273DD3C5E485A4461C2A0 -FFF970791012536CD35960124832FB065F5E7C02ADD643DCF20DDB58A227962E -A051571989C17A3665A205DC0E472F21D6F60F4C66A43B281E0B9FEA22DCC110 -11128101ADC9FF53B6082D836DA5A32E42F1C6DB8FAEE84F798DC00E3485F350 -670077D1498B88F478E48C3CE882DE507D4CFD74551EE1DF953E77D5B808FDA1 -BD40E154B8E923FA41B36A724EA28BA387383DC575FDD6E7B38E9DE346E211D1 -C13EBA81F32E8EE87E56D11D041FD9E47FE326AC7CD5B013F3F58260C5B4354D -1697A1505F3B9BFA5471FB4B4121184E4CD2A29B5A5157B00BB107F0A777F1B5 -947304D1855FEA793AF50C1482FB48F10D142D142EF3EDD104C6AEDDC03DBA70 -2615DF1D35A9D5F7FF2AFDE1B377F45402CB8209581DD298541B600A61F16B2F -E47AB5DDFC351C872D4E1223318720D32DD542D4A81EFE7063656D70FF612F50 -D12F95EE1E2EFCC68150CCD9C860B5AB010D102D26A90C79E1C49CA7F917D2B1 -641603DD51DB8023B295FD586CBAB2516CC4CDF4692D09706DA8973DA035AD35 -01E612E17868E6947C3639261FA138EFAB33246DFE0A2BD78C8EEE307A0CE78E -F678C4811B3D814A76736714D96AAC886DE5A57B8ED4ABFB21E1AAA1C552368D -F8F574C3BAFF2EE011FC3870441139D5D0E38A255390EC1B323052A6CA88FA00 -013A71ED5B6C87931A612CFDB8488AB130108AF1F501449AC432DEC0700C3EBE -5B5368F1D523C43188B77A02F5115BD851ACF5054083469D8CFFB5EBDDF607F3 -9A91616E39E6DFA081E9BABB22505E0D4531BA511323FFAFD98C43B7C08EBDBF -7ECA2BECD5DBA56F80CC2AFFFD90662B842E67090097186C0974300EC8063E9A -481B7A3714D4B2EFD55FFEFB23EBA5C0DDA7D420DFCD803CD2ED9A41D86A873D -BAB441E547E09BCCD270F0923A31412246CC3F0C5144B2DAC804AB0D3A0D9D13 -7DA5DBD0099FC3DF4956D51359C7E6406F8BB13B8398D7C4C83E679A1B606D63 -CC91AD8AD5BFBF160BA9E03911A028D85FD1A945FDDF866AEBF9392BF484E0A5 -4299B1D74C8AA450ACFE0F8B314FF7AA15189E96043785D7BD9760E67A01C455 -459B175520E0BDC4508A584C30ECC412776F471D2236DC01E8405BD49C1892CB -05F86098ABE2E66FAF57F58BDDB2DEB55AF3587AD73C32B451409F3814ED5FD3 -24D690C91B28194EB8F45B02B06E6EC456A88B1B52A9C77FABD595FFDB97BBDF -7AD68FF749FEADD5DD1EDFB68964E3E0DA3A7C5A3888A0FC7FEADB04B2FC247D -D43895B3F075FA91A0897AA439E80DD9DE6CE0D305764DC234CD48F3D2A87E82 -60749C4D4BB0ED886442F670A2FA8EC3DB81CE9619F150278FD42DEB11E2E078 -AC49D626A0B817B3B0BFBCF90E928605C071E07341D316A19F8FBB82528A2B8D -B550D70DEDBD7193DC827954626DD75848B80BC44A057CD7B97B073CD662B9B2 -0D787F5281A43D4FB9665ED0BB062B224B54F32CF92276AA362ECA85A827F587 -CCE67A2BE82EB8FC4B8FBB603F03567F174A853BC5E378FB0B41250E39819E69 -38A200B3939FDA32B5BE6CB2919C9026933C36A812D38A53F20FA04EC63637E6 -160100EB14D268147CF931EFF99A37E985DC75CB85EE25AFEA0E983EC509F253 -F205A87817D877B8A5163E6D4D16928FD214CAB910A40CE1F22F0701E9E0935A -4CE9ECDE8485625D6F32B17BA4A8A26957E967AD283A1075AC5C845C36367E70 -4BFA973BB071F92480D7DF4CF47533830B1B66C9D62B3CFC9F0AF8940F38D5B7 -0BAF58C5DEC9C9FE320BD28FC0B32394D2A816F44A03D186F0D5BBFCE6EFA290 -9D3848CEC031F5DBD2B907D99E7DF81C382B02297780CF4E115F7B136109EFD9 -F8CD8FF50733C267CC1860036551142A0A9207AE9BDCE461BA00980FA3AC48C3 -160C3DB61B2DCC57F511B5A627501D351489AE6C6BC5AC6526722C5C0A574888 -E5E2FD78E56253D837275A53CB995D38A01849553E0AE2ECAAB69FEB20E4DEBC -28FE76F3D4BC6F4177A5362A0A8AA701BB973459986450B19AD9D963610957CD -F2F4D435FA18B84F7180BC18F204826CE9F5416D10A3F20AA2C8BF140BF2CD07 -B6F6C9707BBD7828E9DDA03FDB5DCD7DBF6A0F381981A169EFC780BCFACF35DB -9AF76308B7DFBF12C751ADEC235DF5B60EB2ADF210BB63B873AD3F472F0C6396 -91A0AAE143AE1EA4468FF239BF78181A4450187DA8146F58001567ED00F8427F -159541D90E691F71CB0353D9735D2682767FE6FEE1D1473AD19645EA6247A0A0 -1252132A59E08C94A218B53DAAF2FCC46D5CDAAC4FBE06A6284A2F7E0C9F53FD -EC2A7BB4F553A3D260CDF44FAC208A3091ACD0437BAC8B4CA9FC8A56A1238CF5 -34A2A9F3CD5C22C8D9628A620BE04052EB06A1E215A3F50A38EEF5E7A4B7B4A5 -54D52B2E1FBAE9710D68B7F47997284C9E83D455AD5DED31A29765AB316B200D -BCD0F3F0E5EB55648A6E255E6A770DAA57B92DAFBF1EE93595362D31BE7C14D6 -C172A642587925B5D463ED21482BD434FCFD97BFD3880953F4384E439976D4EC -E074988E077243FC6A939B5878C93BB347F8EAA1DD81EF112284B17A0AA46DEB -BAA0FF7F2A0CE23588709070EBEF07597ACF90864ED92908CD0DA916B06DA769 -487921148387ADAFF81FAAFD6460E12167C836ADC363666F183F6D655D7B6E4E -E7BF22B0389039DECCD68659157371A5E0A191EED17E1D54B61C425024BAAF2C -90A12FA2444E991E46EEF48684A9E17F981282C93C56F0602C948C8A17DAD3C7 -DEBA2A740ADEBAF01169F0651053ADBD88CE1185E1896A6FCD8D77BE95EB3F13 -BA2DF066D4931D2C670CD4180B25412C4A3CD71E7FA2151C3DC138DEFF76B840 -CDEA3E9C60A4460D2151FE81400947968E686E1B9E3D7DE13AC13C8394A74F5E -EABF4EEB565719F073C1562E2892101341FB9CE0AFB53B0287917F842CE26E67 -916872B8863BF4B9648DF0D35BCA46E9B61F7899FE80267F0C25442AC4074AAC -DD282108577176F089EB35A1410264946117C74F7E4E7BEF15B1962EF883CC6A -E888607EA525DF4BE1A082B200C7AA07E9452FF2BDA60898424ED73DFB07E0E5 -C37214CA7FCCC5BB331E517BB886EBD72F2F74E6C7149C424C26581C96419513 -1A8FE6336AF445651F758A4742162EADA21867B731C8991B4D3DFFA415CDDD47 -A2F0FFB2D4BB6ED66FEB57D3450E97E7666F5E8AC23E80029595D6401E14ED12 -3057F472E667AF5D68AE61616FF122573E30869557134D28CD0F0210E0225440 -F3DAA03847BBB39232AE638800FF120F85B7E990936D6B1D4DDB30DE9BFA7E5D -363BBADADD9B87724692E8403631E7D999F7A68359A6D9B2E9CB750ECA2091F2 -9DDE9C740592C7F9D25661E4E304BF9CAC9E2008EB1CE90CA1F06D79CA35B279 -AF7E5A8394E70E9CD8A0A16B39724C5C82C9339B8BC3ED44D232F13B23432BFA -9F78639119FCE8CACEBA8704898B32D26CA65AA7EAFCAFE40A259642872010C8 -EAD437D287672944397CA5B0A9BBC83157AD00394B66E9C31E317D8E93F32DC4 -BBDBF3022EB0D18F8CA3775981A4D756ACC12AECAC7CA07051F093D3E7A6CC98 -A341DB319D861CE12CC17F00AE2DE7D56EF81410AD1F192EA05DBCC3FCE0216A -84F69B01ACFE7291DFDBF0262F54B9CA21409B042F2C3104ED11801CBDB31385 -11D5213E9D56F98F54E78C82330DB463B039B50101BAC35B4790B2D1BCF66A79 -E269665EDEFBC2724D9E6495D25C048B21652DD2C50734039BE7190645CAB30B -ECC3408E007A95A05DE2F9730A18904D230643B555E2B5AEBB26B953F8E8D926 -32210820BE1B210F7ED89EC25FC1FEA1708CAE0484B390B0906F0E61817EBC90 -54260718F310715BD79D74AD4102641E15C49EEC3F55B8791EC30508AD92E287 -B864D076580B215D0FDC24DD79BA842F4C83D6E0909F95E080B84F5B96A701AF -BCF39F9D779C07492C356D7887D2DD2785AA57F51D133B68A2EC598E2430924E -0362FEBEAB74509D871340E4EEA290E898CD05AC03C84FCFD24F17AB8CACACC7 -D2F2907B091566D2F78EBF0D374F1BB96A1EE83B08E41CEAB74D1A67D4ED4CFF -24C9E7E7B93463108AA4EC69DCEB0AB25E7915AA7990D65DA4467DD9BC2C6F03 -78DFDCBF5A1E768CF518C38F73F09BADE44960027F7859A00222818CF9543632 -5AB9981A137908B0269663B39720FEEFF796FF7B6792A5EEAEAF414CFEA2456A -873B178BBEEA66D751DD167706984B1BC3B4BC7864FB5BE548E63C6143AE0591 -B3E57335B7C989B7CB2552069F63C095F29A575872C02B80668A79953A0692D3 -BA8623ECEAFB7F4647943EF157F0F93077FB2013C4A22B5AD65BD3FF2B674653 -3F5C27B77F55C44414FF090B8075E80C4680A5A90F11125F9E24D704CFC8F0A9 -4BA363C6373FF782DFC485596E341CDA79E987CB7D1BD8D07005EFB629540744 -0F307E8B52A78EB0B4EE6AB1CA5D9E9AD4C3D5308D16CA43425ADE5FCA21ACEC -851BB69BC8E6335655404DFE23E1C87A0F5DA1DB19E179BB999FC010F881CC90 -ECC0CF1C4526A5DCF10FC1F78EF5F38A04633255FDBBE36C9D08B8D9BB1A2DEC -C88A5ED57DEBC54305C391E3F8EAFF937ED8A3C1E8D3D92269A30F5F64EA85E9 -BB1BD40F350103833377A5822724A40D573BDCE50A04979B13A2D05EA4C28142 -FCE44737122915974EC7D9D51E0D32C59CAA6E9F8360CF7A6FBAF86B473C9673 -B746DB2C5F0F1670D3F4B19AF173C3FFDFAE2C5D50E35057E9865698303A0197 -90E729D6137759FF7D251837BA76F4864EF6858FCAA86A3B84741099F704902F -8D0C71ED8FE1F7F64B4780460B9A0532197610280200E285C5B83D6C4970EF7F -867E2BE1EA6545A1238785548742C6AB92D25D7FBCB60DBEA45DEF2D172113FB -4F0ACA6E1ECA861B539FBC89A4491D09E9559C968B0E5AF8B7059F163685B90F -27CCABDB52D835358C5FB1F822F7A7437258D201EAE5A8543C2C4BF3F64CAA56 -5425A580FE59400982D5DEF0BA0B6BA08FCA78729D85957221F71BB1B3CD0BE0 -AA50593D11C87392E4EA29BE0839CCBD93A6126B45BAA9ADA7EE2D45D2A6A37B -E00F649011E484B64F0B83955EA1F56CC4B503FDF2D9779421BB0019730F0326 -C63C95974151BA2E1A06977C8A54B5DD276CEA7A69756A51CD0ED0DB2F923AB7 -DDF25B381E81CA3BE917A6E618C6ABD4502173DDAFD7672F79E82023CA680F65 -E0B467DD5C3FB3A168572E2C18A51F124DC8DF4BCE5B2D9B44E40E2D15848056 -E736744E17472351C7A82DC2491EBA215D95178F5F6D5A734D312580205F4526 -1D656F10AE930DEAA1FBF89266B9D926FF1B72B946F349791CF65FEFF38C3907 -108B3050217783C3841B4578772D779EB5C03F49878DB72E2F0EDF02D438CB9B -4F4E7A5CD989CC9EE8DD6F969CB155745127412B2342DA0AFCD55EC925D2D22D -8B608F8F0F70CA5B1ED1CF9CE0ECB14DB64BF79AFFE79E4692745AAF70625C76 -10D04952941D84FFFFBD9008048119191117BB4CF6A398B55F852D23C1029453 -0C3986D80AD9101DED9C8124859089A768D6A85C2D22EE26D73C187695843FB6 -1344F41F693A1D9082EA716B0531E3F1A33F2F2C7A748DC3C9179247F000E2CC -14E3C75725A706819BF17ECCDF6EB757F83A3CF2099FB2EDA6BD38038327EF71 -2CAFF19A58574FA93BD9E83A615C8FF8C76EE7477FF92FE89563926039520CD1 -E9692D8820AF33C693E3405146FB1B9505549E6C0DB43871653B40A3A1298B2F -B73385EA72363FD8DEC07A0B9DC2E66E429E6C2635F7FE042231C4315329B110 -F31CBB5D9769C28CF6C44B00EC8AB95E51983527446F8C045BC1AF2210347253 -969AE44BCB9A04CE5443F62A8CFBD4C3611094DBCC9DF6DE867F31E676008DDD -81BBA666622EDFA888D46382FE1DD589B3976D3BFA3AA42D3F5A74F71F281787 -72E00D1E7CA10C83E908A1A7D717C23E05E672E9C348B84E5BE8F797E7F8D83B -1DF804D9194832BC36413BCA7C9F3324DED0182E6AA9C68893B94A5603D8ABE0 -FC4FE886651CF45EE0732A4BA7F09023A7024DCAFF52916BFE5F674824D03F67 -71CF49B288E8754CC13CAAC4385365F9CE413FDC0265CE0C8C6C7202BCF6E399 -C22FFCE468BBFFC84D25268F2645F42E0D8E34BF80762215B0D62E65AA30CFDE -769DED1519C656030A3CB602A64DD25FA638DFC08ABA1638A5C6587747896932 -BBA6A42B343F760F2E0C841800338C2CA91D7C86E71EA3989153F2A4E5FFBD14 -7AB87BCB2DE877B8BF4F9C9D15CA19F453565938B84AFC862D97419321083E95 -23A721D126BC127629E78E4CAFF95D3B88AA153F9EF263F9DE91AA8EF1F5C5CE -5A639400F14E5E47DD07C492D90B66FBE7F00B5D455EB82EE301B33E4A688809 -7427F93C78F525652DFF11AF7D0A145EC6F103C94EF8A3274AD28496250EA831 -0674917F5954AE285E58DC8264C1567B47283685E124E8643AA72256D6E2B18C -79BEAFD2CE726B67B3C35F035F4B87648A7DD86D3A7077BAE70DB7B029BB9BD4 -9962A38BDD223F7BC35BCD68DAFC4E0152F24D78833BEB1DE8AF7B7546F4A4FD -89F2741B3E5D6FBFD7867A8304D7DB9D7A14569A8D3F2087646807E86BE5788E -F10DF484FF40BD47495F6C15638768474AE3E1B921725BA4D9A00BF43FEFC2A5 -56144FA3891E113D6ABA7C40428FFB42CA56CDB0E879C9FCD225F88831EC0623 -4AABE50F8D8CCBB8197ACEB9FD41FCF466B95F3A0D58E815751C1C8AA7B26B86 -52DB18FA9E380E90C8CF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR12 -%!PS-AdobeFont-1.1: CMR12 1.0 -%%CreationDate: 1991 Aug 20 16:38:05 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR12) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR12 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-34 -251 988 750}readonly def -/UniqueID 5000794 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C -68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 -3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E -59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 -51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 -DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A -AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F -45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 -821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE -96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D -9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 -26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 -140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 -1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 -1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB -377D3061A20B1EB98796B8607EECBC699445EAA866C38E02DF59F5EDD378303A -0733B90E7835C0AAF32BA04F1566D8161EA89CD4D14DDB953F8B910BFC8A7F03 -5020F55EF8FC2640ADADA156F6CF8F2EB6610F7EE8874A26CBE7CD154469B9F4 -ED76886B3FB679FFDEB59BB6C55AF7087BA48B75EE2FB374B19BCC421A963E15 -FE05ECAAF9EECDF4B2715010A320102E6F8CCAA342FA11532671CD88DBFBAC1D -2C0969A0D6D489525BDABC9BA435B2A3E8878C2FBF07F0ED98F3FF9653CCB7D1 -A192D3FE87CF0860F3E3ECC6CA6563B3D03762EA6A6021418228D1664B90D143 -8AC859EF5319D44162F6B4BB7722378236C87818322FBE741F6B771831FA4C30 -A6771388D18680D41CC6437A155CB60933515AA709FE3E07E1F8D53D00131104 -F46A63AE6F522FDB79E267E1B98A190BCD8250B08CE6A9926400C9BB7DE4FF95 -D8D0147BD61D3400F922D1BC8FA8A6CC7D488B03FC94BFAE67C8E1C5DA51EB80 -CCCDF4CFB5B6CAB261A12C05CD6F537CD742275A486DE9FF0033CDA7780E9911 -DE455DEBF2445483EAC64F9878135CE4C0EDF46765CAC3A65E869122FDD75927 -9990D70261268D707DE59E85EE63BB300DFB8399B8028DC9510B8B910CB851F1 -8F2CD85B462BD0EADC60F9FADE93FC958225DFCC0A49B3D56C0FC06149F443FD -ED006B1051377653FE0C6D0130517519ED0D8AB8FB4F8DE21E3209601E385FCF -AEFEEC47A955847A5103C85111A930520313F059F73C347C981FCA2822DC73F3 -3FFF08889A98A09535D0EB2E3F2DFDAFD2DE48A03AE481E2BE4AD323DE4ADD89 -7F39C7A94D90CBE7F098F015C199746370E8AA541DCA7BAE4AA8EAEAC9BC49EC -412B926A2431D707414DE332317D1154E3BDCE46CCB7FAEF3E3050FAE14163E5 -5CB25898F7562B9FE47BAD865B2DFECA2741A48223589BBD54696C30670926DE -B72BBC9AEC6CA60D12AA239059B73AC6DBF19005CBBE542FD37B3F99612C2912 -71DD30C4AA06F90B97A2BD7D52478D813BB1913F87F13745400E6C497CD2BEB1 -B3C2C39759AEFD5274492BE679002CA68B79485B9B154E829DB589A618DF2440 -9BAE0CBFB726EFC763D191BC8EC97A0F754164401D2E41AC54ADB0A52DADCC63 -0CC6F47765D05AD35C9273F92717F707F5D54C83A9F18C3E1115629711DB648E -A07C0F1D0E08915008FCF3E9EDD024EBE7AC3BD1F15BB906AF82C20436E73FE9 -706EB4AA9E44035BCBA10D3174926A1D67C180A9E13149ACC1081BD60278EA3B -EEDC1965D50EF38F56C55CD0F71D30CF697499A5B2B50679226E46DBD089333C -FDD11A3852E4B4CAED493AE37B91C50E2E4E413D915976D07428BDEEA0E0C157 -502DEA9C49E7CBB052FE32FE92EAE090FCB39C90BC7714FD5206C45D39548835 -40BC6B420A695346E06354D002CABEB0AE64D72216CD36CFB06657E6B21E009A -4D5E09FFE00000AB18606DFCA1400D763A878EDF2AAB0CCB93247EC67E933B34 -7EC6C00741825FA24710ED9B106F96B9E12E12B91162799553DE7754D0F70226 -A32ED6475DEED82133E84D93E3F59BAE747AE750510C253B61F120C315E0329E -64408FB804441CC97CD34DC888A2C006E2680DD1A1FD7C0E2D6078D2F37B60D7 -D5DB3FB8B75E8DA7A4C2FE30FFBB8276D5E191B36A3EDAE212AEB5CD1882E57B -97C26B05EEF8ACCD440E855D057576605AF84EB5838F1D8B268F041AD45B559F -7717E614AAB7159234D98498A6F2AF6983076F3D12A4B0B072C8948F08386651 -735E6B99DCEB0183EF988454709277B9A271998B11C43E53DF0A251644E17FB7 -2ECD84E26454335EFDADA7006C936B802AED15B85952CDF5C6E10AEED9C02706 -9DF7025BD67BE0790B8E0400EDF37B0087A05348A0A9EAD48C8A03B7DB41D9F7 -8AF48E773396576FE6456B4CCBB4247A126553DB6ABDDDD88DBAAE1ACFCB30E0 -BF317EDCCAF4026FC3270B8DB91DAA9C5535CF237BB6D1D951C90C9ABEF4361B -9161E8A471BD06EDCBD04ECE4F547B610A695780709E77BF7ECD0DAA1F72514C -09F365442020737AC98F5F458682572F00A2410B8CBDA541C78E7936E144FFF6 -77B083D3632A69F3697237642BCD4D1984DBC5FD1A2E5C43BC2E2CD47179114F -C8CD8C57857BEFBFB54E276BC592D0A41BE955ED1E223659FA7E9D00B10E7439 -BCDC75B1498628349FB84322868356A0C70001C09C021DCD936DE602D5B2D186 -22004D2DB32012B63F15B3843EDB1F1F8905155E6A855E6A5BEF57FE1449045B -206BCEC2F3CBC9F8207050AED7F153167463368C1BDE2BB045E458D189D182B7 -D9C4D408B45C97C25525D708F9A464DD307417B3B5EBCC988E204D892367C391 -F0DB3473403968D53A9EBC006F0CF9F28684DD7A131875C6C5D512B16DC64B62 -5EA146BFF7F61DFFDA9A7678CC0D42B034AC28E4EE9B901B69E0C4C7528C58C3 -F4EAB6EC8AA1201FF1BB5161BC219E54EFAC9CFC5C43319EBA2C3239922E1BF2 -3C8A59F560FDFA7EB2624818C0BAD2EBFDD70E9F12493865A3B461D20DAF1805 -4672BB90489221F0FE29C9098C528AD97064A389638983389811665758FD0299 -603C0AF6CF4B612D0CEE5E487340B876D4C2905A5F727056CEE9418AD73827DC -B46A30E1C7A4451DD47112C54F841C46B8B2C4FAF9078761DC91B994F32FF22F -A1EACEF52E3066168D3BE8AFC0F2D5638846724065A82774B8AACFD8D86E7063 -BF84AB419444723237C72062CC9DAB848D6D4AFCB50D97B2D86DB475BA065246 -62CA9B454108EF4FC83DB222DEE606994831193986C38BFE0EDA5E251849EEE1 -10028AD2183D78FD04D7BE15B779C6B937F979FC2F76C3853922CBACBFE7F5BF -3E8C5C09B0E4DC7F166A1AD46F4FD7C1F375CA8F23B5A022DD312D86BC01085F -2AB41EC9BC3A886DA7DD08B620E5770B4EA8D9ED5DE1374DE321F17668589411 -115C158669594D1F652C7D1A215CFC0ED4455F97F1316B4949138C720C0BDE36 -6A6AF3F13877171A50843F1D73F97B95EBA2B159A15B057B128F1B006BC6CED2 -EBAD85BAF0F3329566B893A599556C2766F89ECD25ADD54983F71C9C2DC4C557 -DBA21E58DD1F8293EFA2E807CCCB61FA4010D8FE71B0E4A52DDE57AE88B4274C -CB68605103DA54CC640339A0DEF38A51619AEF63FC64BFAF1FCBBB1FC8D4BC51 -1C28E9AD8CD34F810102EAC106FA246863BA4723CE6AEF5563B675CF634691D8 -66042C69BDBE2C004064AA53258D5090E9DD6FB0E35F5267D612D83E807C3F70 -E05E614FFFB42CE3EC771E757F9D70C66FF1D79DE637EBE325F0BC4510987994 -27692B426A30E558AE5C518D839A1D4894A622801E87831DBB841472DF482EFA -6D09BF1211A744929CD53E7E57CE0E318C6B8BE38018AEE318A874B756BA24BE -9BA55CF4FD9049B800CB065FE70A729FE8814FF6DDF45F54B1B06D4E642F5937 -4A361A6F91AC1AAAAB4C202D9DD39E83CEE24E611CC65E1C299C06F9D181D402 -545BA3A91F4A4A991D810B091CEB64F3F9F5558EEE5E7161CC80570A70F4059A -F0E6BE13E434D39D43D1E54F2197521996C46F7E15A702BEED25D36C72CA748F -E2BFC523B11C61BFF724FC52A557969B08FD484C7916BA9734AEDA19A39D9770 -143CB0049AF0F852EA69989403FB2C2A8C5A3B794988F23EAB73ECCA8950EDF7 -374718B98CB1FB1BE2BFAA01637C8C15E82E9E5BBDE881C492ED1546A004D133 -A6CD11274044902B6BB21E6B18493A22F9173C98E90FBF87C1192CCFD41BBBA8 -685CC5C212E7C7F5F566AE92694F2960EA87E21922D1CC0FB9F6FA47B538A73C -25179F0E9F0582401A2F644674D4560F16BF74C3D327C9F8D7CB6040C96A09B8 -6339C0C15812B5A0C4ED3DE645B6BE1616DDFC68FA75045A792F21857B81CDF4 -80B9BDEF82605B6D2165A78E1F7AC4661B97C3A427B291D25600EB87D3C32E92 -0A8EF591F4F0DBF07940B0F9DBA450D78BA9AA5A4E7083BA64E6C87B11CE0D29 -1CC06954607705805E6A4BEBCAD4F9E44D9CBFD4A00762DD50117F20727220E3 -6F186D6A8BCE2D24E984CF1BD1232242F050B30E165D951CF849840ADF756644 -DC47D1ABDB35BE6D828E6F51E9790EDCF7C8A836EC816C6A8FE9C4FCDD51B9CA -AF1E739993D8AAFF47082FC128C17B1A2B1FB00E5B5851DF1DAABB457512DEF2 -711AB0134078ED6B53A9CC0CD25C3FCB6A9F1D1299D769A04FD3D552BEAB0CD2 -E844622F10D407EF61AD8A95D069E9C32E263DF73BACC74B4ACDD3E9894096BC -94058A82E95D5D6E5CB89C7F45C04A6BC2F5A9B308C96A0B9D0DCD500D8E7180 -5036BBDF96F26E918FF03C225102CC854AA5926608AB30C667E0B206D691BEC2 -0A4A15789B841A842AC05C7A52A63D39192E4EB6E6C310CC2B02F5930178E553 -D4380E88A88DEA73824751327F0E4643FE24B3D8B38E950C27F4558226A310A4 -621C63B113AA48D80CC6657A95813C97149B73052AD62424FAF202918F2B29B0 -415EC913D9EE471946F1B9A74C29C29C5C214F4A7459B1E65337354789CF69C1 -E7E5BF69E30A809E40EEBF3C91DC12ED179366ADCB993EFE71D75BEDF220FECF -A417B71CEE7BF5A64B9A81D56D569213B1DA06A8AD508769EE380DDE52AC3A9A -59F1860EE1C1EDF6B1377121826D5CC4F587434429321E31BAF792FE4DE99E7E -8A3864359BE52B901D71046D8E124D1A0F215EC1C5ED4469D2BD589C85E4E0A6 -FC038F23F3BE603186EA84CE59D046DB5FC688B783D857377C49F165D3A92DDB -FD471239B7D00D286A5CF07F42131E1210A6055168284313958F57706B0576ED -EE79A675A9B90E609A41121A8C2732FF7B25347DDDD7EBB7A9E654D7674A7633 -3F5E876DEA64E3BA4E1D60A57B88181F8A275E7C8DDF1D61DF88A401D9D53443 -229055A39E5509F18B8BBCE37F7BD4E0C4A3EEDA4705A06F0399298B06DB8628 -F9EDCC2565DE150B98B6CA16E4A62411B2D6223E0447F15C330AF3A32BEC2997 -D77FA69D2A38AA87E3FAF36FFC9864973FC7BFEDAC54464F1C96905259E37B91 -2BABBC9CA8A39A14F2CB78281A06E768B461AE3F965C7E20492A8FB0F434852F -F0166B594137030900B0EE39BB51C0110E -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -TeXDict begin 40258431 52099146 1000 1200 1200 (paper.dvi) -@start /Fa 205[61 61 49[{ TeXf7b6d320Encoding ReEncodeFont }2 -99.6264 /CMR6 rf /Fb 139[46 1[58 3[77 4[43 5[63 99[{ - TeX74afc74cEncoding ReEncodeFont }5 116.231 /CMTI7 rf -/Fc 149[38 106[{ TeXbbad153fEncoding ReEncodeFont }1 -99.6264 /CMSY6 rf /Fd 205[124 50[{}1 166.044 /wasy10 -rf /Fe 135[71 1[71 82 51 63 65 2[78 86 125 39 3[78 71 -47 71 78 71 1[78 18[114 78[{ TeX74afc74cEncoding ReEncodeFont }18 -149.44 /CMTI9 rf /Ff 149[43 2[77 77 10[102 31[77 4[0 -3[102 154 27[119 20[119{ TeXbbad153fEncoding ReEncodeFont }10 -149.44 /CMSY9 rf /Fg 255[90{ TeXbbad153fEncoding ReEncodeFont }1 -83.022 /CMSY5 rf /Fh 205[57 57 49[{ TeX0ef0afcaEncoding ReEncodeFont }2 -83.022 /CMR5 rf /Fi 139[87 1[92 1[125 1[125 4[62 125 -112 1[102 125 100 1[109 13[125 3[168 1[213 23[112 1[112 -112 112 2[62 46[{ TeXf7b6d320Encoding ReEncodeFont }19 -199.253 /CMBX12 rf /Fj 139[48 58 58 3[77 4[44 5[56 12[73 -86[{ TeXaae443f0Encoding ReEncodeFont }7 99.6264 /CMMI6 -rf /Fk 135[87 110 75 88 6[93 135 4[88 73 3[66 12[90 2[94 -1[121 98 1[123 6[120 1[113 9[43 43 58[{ - TeXaae443f0Encoding ReEncodeFont }18 149.44 /CMMI9 rf -/Fl 136[128 1[98 69 70 73 1[98 88 98 1[49 2[49 98 1[54 -81 98 79 1[86 97[{ TeXf7b6d320Encoding ReEncodeFont }16 -149.44 /CMBX9 rf /Fm 137[60 1[47 1[56 3[73 3[49 44 1[58 -3[54 1[64 97[{ TeXaae443f0Encoding ReEncodeFont }9 83.022 -/CMMI5 rf /Fn 194[102 9[66 66 66 66 48[{ - TeXf7b6d320Encoding ReEncodeFont }5 116.231 /CMR7 rf -/Fo 149[39 56[132 38 14[132 32[104{ TeXbbad153fEncoding ReEncodeFont }5 -116.231 /CMSY7 rf /Fp 141[166 24[212 240 7[175 14[145 -145 14[145 145 28[122 122 16[76 76{}12 166.044 /CMEX10 -rf /Fq 134[101 101 2[106 74 75 79 1[106 95 106 159 53 -1[58 53 106 95 58 88 106 85 1[93 10[144 1[133 3[131 1[149 -181 7[125 146 138 1[144 6[53 95 95 95 95 95 95 95 95 -95 95 1[53 64 32[106 12[{ TeXf7b6d320Encoding ReEncodeFont }43 -166.044 /CMBX10 rf /Fr 135[75 1[66 79 50 63 62 3[82 118 -1[71 55 47 1[65 1[63 69 59 58 72 10[78 16[97 7[68 61[{ - TeXaae443f0Encoding ReEncodeFont }20 116.231 /CMMI7 -rf /Fs 134[81 2[76 89 55 68 70 1[85 85 93 136 42 76 1[51 -85 76 51 76 85 76 76 85 9[166 2[119 93 121 1[113 2[149 -104 1[87 64 123 128 1[113 125 119 1[123 6[51 85 3[85 -3[85 2[51 59 45[{ TeX74afc74cEncoding ReEncodeFont }42 -166.044 /CMTI10 rf /Ft 134[81 95 119 80 95 60 1[75 1[84 -1[100 146 50 86 68 57 96 79 81 77 86 72 71 88 8[138 1[97 -113 1[102 1[131 107 127 133 161 3[73 1[131 1[123 1[119 -1[125 2[129 83 129 46 46 33[73 24[{ TeXaae443f0Encoding ReEncodeFont } -42 166.044 /CMMI10 rf /Fu 133[68 81 81 111 81 85 60 61 -60 1[85 77 85 128 43 81 47 43 85 77 47 68 85 68 85 77 -3[43 1[43 3[158 115 115 111 85 113 119 105 119 115 141 -96 119 2[115 2[105 117 111 109 115 3[119 1[43 43 77 77 -77 77 77 77 77 77 77 77 1[43 51 43 119 1[60 60 27[85 -90 11[{ TeXf7b6d320Encoding ReEncodeFont }67 149.44 /CMR9 -rf /Fv 135[142 194 142 149 105 106 110 1[149 134 149 -224 75 142 1[75 149 134 82 123 149 120 149 131 9[278 -2[187 1[201 1[184 1[210 255 3[100 210 1[169 177 1[194 -191 203 8[134 134 134 134 134 134 134 134 49[{ - TeXf7b6d320Encoding ReEncodeFont }43 239.103 /CMBX12 -rf /Fw 137[87 87 87 1[87 2[87 87 87 87 2[87 87 87 87 -87 87 87 87 33[87 17[87 1[87 44[{ TeX09fbbfacEncoding ReEncodeFont }19 -166.044 /CMTT10 rf /Fx 149[46 2[83 83 10[111 30[120 3[92 -1[0 3[111 166 9[129 5[166 11[129 129 1[129 15[129 46 -129{ TeXbbad153fEncoding ReEncodeFont }17 166.044 /CMSY10 -rf /Fy 128[83 2[166 83 74 88 88 120 88 92 65 65 65 88 -92 83 92 138 46 88 51 46 92 83 51 74 92 74 92 83 3[46 -1[46 101 125 1[171 125 125 120 92 122 129 113 129 125 -152 104 129 85 60 125 130 108 113 127 120 118 125 3[129 -1[46 46 83 83 83 83 83 83 83 83 83 83 83 46 55 46 129 -1[65 65 1[129 138 17[83 4[138 1[92 97 120 3[120 6[{ - TeXf7b6d320Encoding ReEncodeFont }84 166.044 /CMR10 -rf /Fz 137[103 1[76 77 3[98 108 163 54 2[54 108 2[87 -108 1[108 98 6[119 11[146 179 5[153 127 1[149 141 138 -19[54 46[{ TeXf7b6d320Encoding ReEncodeFont }22 199.253 -/CMR12 rf /FA 136[233 1[179 126 127 132 2[161 179 269 -90 2[90 179 161 99 147 1[143 1[157 16[221 1[252 306 4[252 -1[203 2[233 1[244 65[{ TeXf7b6d320Encoding ReEncodeFont }23 -286.924 /CMBX12 rf end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 1200dpi -TeXDict begin -%%BeginPaperSize: Letter -letter -%%EndPaperSize - end -%%EndSetup -%%Page: 1 1 -TeXDict begin 1 0 bop 1453 1151 a FA(A)108 b(New)g(Algorithm)f(for)h -(Constructing)1654 1611 y(Minimal)f(P)-9 b(erfect)107 -b(Hash)i(F)-27 b(unctions)1384 2187 y Fz(F)-16 b(abiano)65 -b(C.)g(Botelho)455 b(Da)-5 b(vid)64 b(M.)h(Gomes)454 -b(Nivio)66 b(Ziviani)2735 2608 y Fy(Departmen)-5 b(t)55 -b(of)g(Computer)h(Science)2682 2841 y(F)-14 b(ederal)56 -b(Univ)-5 b(ersit)g(y)55 b(of)g(Minas)i(Gerais)3142 3073 -y(Belo)e(Horizon)-5 b(te,)55 b(Brazil)2426 3306 y Fx(f)p -Fw(fbotelho,menoti,nivio)p Fx(g)p Fw(@dcc.ufmg.br)-161 -3957 y Fv(Abstract)-161 4321 y Fu(W)-13 b(e)58 b(presen)l(t)f(a)g -(three-step)h(algorithm)e(for)h(generating)g(minimal)-161 -4520 y(p)t(erfect)39 b(hash)f(functions)f(whic)l(h)h(runs)g(v)l(ery)g -(fast)e(in)i(practice.)64 b(The)-161 4719 y(\014rst)40 -b(step)h(is)e(probabilistic)h(and)g(in)l(v)l(olv)l(es)g(the)g -(generation)h(of)f(ran-)-161 4918 y(dom)c(graphs.)63 -b(The)37 b(second)f(step)g(determines)h(the)f(order)h(in)f(whic)l(h) --161 5118 y(hash)67 b(v)-9 b(alues)66 b(are)g(assigned)g(to)f(k)l(eys.) -113 b(The)67 b(third)f(step)g(assigns)-161 5317 y(hash)43 -b(v)-9 b(alues)44 b(to)e(the)i(k)l(eys.)65 b(W)-13 b(e)43 -b(giv)l(e)f(strong)h(evidences)h(that)f(\014rst)-161 -5516 y(step)70 b(tak)l(es)g(linear)f(random)i(time)e(and)i(the)f -(second)h(and)f(third)-161 5715 y(steps)50 b(tak)l(e)f(deterministic)h -(linear)f(time.)67 b(W)-13 b(e)51 b(impro)l(v)l(e)e(up)t(on)i(the)-161 -5915 y(fastest)d(kno)l(wn)h(metho)t(d)h(for)f(generating)h(minimal)e(p) -t(erfect)i(hash)-161 6114 y(functions.)102 b(The)63 b(total)e(time)h -(to)g(\014nd)i(a)e(minimal)g(p)t(erfect)h(hash)-161 6313 -y(function)73 b(in)f(a)h(PC)e(computer)i(to)t(ok)f(appro)l(ximately)g -(175)g(sec-)-161 6512 y(onds)55 b(for)g(a)f(collection)h(of)f(20)h -(million)e(k)l(eys.)79 b(The)55 b(time)g(to)f(com-)-161 -6712 y(pute)60 b(a)g(table)f(en)l(try)h(for)f(an)l(y)g(k)l(ey)h(is)e -(also)h(fast)f(b)t(ecause)j(it)d(uses)-161 6911 y(only)66 -b(t)l(w)l(o)f(di\013eren)l(t)i(hash)f(functions)g(that)f(are)i -(computable)f(in)-161 7110 y(time)g(prop)t(ortional)g(to)g(the)g(size)g -(of)g(the)h(k)l(ey)-13 b(.)113 b(The)67 b(amoun)l(t)f(of)-161 -7309 y(space)49 b(necessary)g(to)f(store)h(the)g(minimal)e(p)t(erfect)j -(hash)f(function)-161 7509 y(is)54 b(appro)l(ximately)f(half)h(the)h -(space)f(used)h(b)l(y)g(the)f(fastest)f(kno)l(wn)-161 -7708 y(algorithm.)-161 8258 y Fv(1)270 b(In)-7 b(tro)7 -b(duction)-161 8622 y Fy(Let)60 b Ft(S)69 b Fy(b)5 b(e)60 -b(a)h(set)f(of)g Ft(n)g Fy(distinct)g(k)-5 b(eys)60 b(b)5 -b(elonging)61 b(to)f(a)g(\014nite)-161 8821 y(univ)-5 -b(erse)65 b Ft(U)83 b Fy(of)64 b(k)-5 b(eys.)100 b(The)64 -b(k)-5 b(eys)64 b(in)g Ft(S)74 b Fy(are)64 b(stored)g(so)h(that)-161 -9020 y(mem)-5 b(b)5 b(ership)55 b(queries)e(asking)g(if)g(k)-5 -b(ey)52 b Ft(x)46 b Fx(2)g Ft(U)71 b Fy(is)53 b(in)h -Ft(S)62 b Fy(can)53 b(b)5 b(e)-161 9220 y(answ)-5 b(ered.)73 -b(This)49 b(searc)-5 b(h)48 b(problem)h(is)g(called)f(the)f -Fs(dictionary)-161 9419 y(pr)-8 b(oblem)p Fy(.)118 b(V)-14 -b(arious)70 b(approac)-5 b(hes)71 b(to)e(the)h(dictionary)f(prob-)-161 -9618 y(lem)g(ha)-5 b(v)g(e)69 b(b)5 b(een)68 b(explored.)114 -b(One)68 b(of)h(them)f(is)h(to)f(compute)-161 9817 y(a)d(function)g -Ft(h)p Fy(\()p Ft(x)p Fy(\))e(to)h(determine)h(the)f(lo)5 -b(cation)65 b(of)f(a)h(k)-5 b(ey)64 b(in)-161 10017 y(a)75 -b(table,)80 b(leading)75 b(to)f(a)h(class)h(of)e(v)-5 -b(ery)74 b(e\016cien)-5 b(t)75 b(searc)-5 b(hing)-161 -10216 y(metho)5 b(ds)56 b(kno)-5 b(wn)56 b(as)g Fs(hashing)f -Fy(metho)5 b(ds.)5 10415 y(Hashing)60 b(metho)5 b(ds)59 -b(for)f Fs(non)63 b(static)g(sets)c Fy(of)g(k)-5 b(eys)59 -b(in)-5 b(v)g(olv)g(e)4136 3957 y(a)58 b(certain)f(amoun)-5 -b(t)58 b(of)f(w)-5 b(asted)58 b(space)g(due)f(to)g(un)-5 -b(used)59 b(lo)5 b(ca-)4136 4156 y(tions)69 b(in)g(a)f(table)h(and)g(w) --5 b(asted)68 b(time)h(to)f(resolv)-5 b(e)69 b(collisions)4136 -4355 y(when)59 b(t)-5 b(w)g(o)60 b(k)-5 b(eys)58 b(are)h(hashed)h(to)f -(the)f(same)i(table)e(lo)5 b(cation.)4136 4554 y(If)64 -b(the)f(set)h(of)g(k)-5 b(eys)64 b(is)g Fs(static)p Fy(,)j(then)d(it)f -(is)i(p)5 b(ossible)65 b(to)f(com-)4136 4754 y(pute)73 -b(a)g(function)g Ft(h)p Fy(\()p Ft(x)p Fy(\))f(to)h(\014nd)h(an)-5 -b(y)73 b(k)-5 b(ey)73 b(in)g(the)g(table)g(in)4136 4953 -y(one)57 b(prob)5 b(e)56 b(\(no)g(collisions)i(in)f(this)f(case\).)77 -b(This)57 b(function)f(is)4136 5152 y(called)51 b(a)f -Fs(p)-8 b(erfe)g(ct)55 b(hash)f(function)p Fy(.)74 b(A)50 -b(p)5 b(erfect)49 b(hash)i(function)4136 5351 y(that)57 -b(can)g(preserv)-5 b(e)57 b(an)g(a)g(priori)h(k)-5 b(ey)56 -b(ordering)i(is)g(called)f(an)4136 5551 y(order)39 b(preserving)g -(function.)68 b(A)38 b(p)5 b(erfect)37 b(hash)i(function)g(that)4136 -5750 y(stores)47 b(a)e(set)h(of)g(records)g(in)g(a)g(table)g(of)g(the)f -(size)h(equal)g(to)g(the)4136 5949 y(n)-5 b(um)g(b)5 -b(er)62 b(of)f(k)-5 b(eys)60 b(is)i(called)f(a)f Fs(minimal)65 -b(p)-8 b(erfe)g(ct)64 b(hash)g(func-)4136 6148 y(tion)p -Fy(.)114 b(A)68 b(minimal)h(p)5 b(erfect)67 b(hash)j(function)e -(totally)g(a)-5 b(v)g(oids)4136 6348 y(the)55 b(common)h(problem)h(of)e -(w)-5 b(asted)55 b(space)h(and)g(time.)4302 6588 y(Minimal)74 -b(p)5 b(erfect)71 b(hash)i(functions)g(are)f(used)h(for)f(mem-)4136 -6787 y(ory)47 b(e\016cien)-5 b(t)48 b(and)f(fast)g(retriev)-9 -b(al)47 b(of)g(items)g(from)h(static)f(sets,)4136 6987 -y(suc)-5 b(h)60 b(as)e(w)-5 b(ords)59 b(in)g(natural)f(languages,)i -(reserv)-5 b(ed)59 b(w)-5 b(ords)59 b(in)4136 7186 y(programming)46 -b(languages)f(or)f(in)-5 b(teractiv)g(e)44 b(systems,)j(univ)-5 -b(er-)4136 7385 y(sal)68 b(resource)e(lo)5 b(cations)67 -b(in)g(W)-14 b(eb)67 b(searc)-5 b(h)67 b(engines,)k(or)66 -b(item)4136 7584 y(sets)72 b(in)f(data)g(mining)h(tec)-5 -b(hniques.)122 b(Therefore,)75 b(there)70 b(are)4136 -7784 y(applications)64 b(for)e(minimal)i(p)5 b(erfect)61 -b(hash)j(functions)f(in)f(in-)4136 7983 y(formation)e(retriev)-9 -b(al)58 b(systems,)k(database)d(systems,)j(h)-5 b(yp)5 -b(er-)4136 8182 y(text,)68 b(h)-5 b(yp)5 b(ermedia,)70 -b(language)c(translation)h(systems,)j(elec-)4136 8381 -y(tronic)91 b(commerce)h(systems,)101 b(compilers,)h(op)5 -b(erating)91 b(sys-)4136 8581 y(tems,)56 b(among)g(others.)4302 -8821 y(Finding)70 b(p)5 b(erfect)66 b(hash)k(functions,)h(esp)5 -b(ecially)68 b(for)g(large)4136 9020 y(sets,)79 b(ma)-5 -b(y)73 b(not)h(b)5 b(e)73 b(easy)g(since)h(these)f(functions)h(are)g(v) --5 b(ery)4136 9220 y(rare.)138 b(According)76 b(to)g(Kn)-5 -b(uth)78 b([12],)k(the)76 b(total)g(n)-5 b(um)g(b)5 b(er)78 -b(of)4136 9419 y(p)5 b(ossible)48 b(hash)g(functions)f(from)g -Ft(S)56 b Fy(\()p Fx(j)p Ft(S)10 b Fx(j)45 b Fy(=)h Ft(n)p -Fy(\))g(in)-5 b(to)47 b([0)p Ft(;)28 b(m)19 b Fx(\000)g -Fy(1])4136 9618 y(\()p Ft(m)87 b Fx(\025)g Ft(n)p Fy(\))79 -b(is)h Ft(m)5231 9558 y Fr(n)5401 9618 y Fy(and)h(only)f -Ft(m)p Fy(\()p Ft(m)52 b Fx(\000)i Fy(1\))28 b Ft(:)g(:)g(:)e -Fy(\()p Ft(m)53 b Fx(\000)g Ft(n)g Fy(+)h(1\))4136 9817 -y(are)75 b(p)5 b(erfect.)132 b(Th)-5 b(us,)82 b(the)75 -b(probabilit)-5 b(y)76 b(that)e(no)i(collisions)4136 -10017 y(o)5 b(ccur)48 b(is)h(the)f(ratio)g(\()p Ft(m)p -Fy(\()p Ft(m)23 b Fx(\000)g Fy(1\))28 b Ft(:)g(:)g(:)c -Fy(\()p Ft(m)f Fx(\000)g Ft(n)g Fy(+)g(1\)\))p Ft(=m)7500 -9956 y Fr(n)7635 10017 y Fy(whic)-5 b(h)4136 10216 y(tends)64 -b(to)f(zero)g(v)-5 b(ery)63 b(fast.)98 b(F)-14 b(or)64 -b Ft(m)59 b Fy(=)h(13)j(and)h Ft(n)59 b Fy(=)h(10,)66 -b(the)4136 10415 y(probabilit)-5 b(y)56 b(that)f(no)h(collisions)h(o)5 -b(ccur)55 b(is)g(only)h(0)p Ft(:)p Fy(0074.)p eop end -%%Page: 2 2 -TeXDict begin 2 1 bop 5 620 a Fy(Man)-5 b(y)59 b(metho)5 -b(ds)59 b(for)f(generating)h(minimal)g(p)5 b(erfect)57 -b(hash)-161 819 y(functions)124 b(use)g(a)f Fs(mapping)p -Fy(,)141 b Fs(or)-8 b(dering)123 b Fy(and)h Fs(se)-8 -b(ar)g(ching)-161 1018 y Fy(\(MOS\))72 b(approac)-5 b(h,)77 -b(a)72 b(description)g(coined)g(b)-5 b(y)72 b(F)-14 b(o)-5 -b(x,)77 b(Chen)-161 1218 y(and)48 b(Heath)e([8].)72 b(In)47 -b(the)g(MOS)g(approac)-5 b(h,)50 b(the)d(construction)-161 -1417 y(of)59 b(a)h(minimal)h(p)5 b(erfect)58 b(hash)i(function)f(is)h -(accomplished)h(in)-161 1616 y(three)75 b(steps.)134 -b(First,)80 b(the)75 b(mapping)h(step)g(transforms)g(the)-161 -1815 y(k)-5 b(ey)68 b(set)g(from)g(the)f(original)i(univ)-5 -b(erse)69 b(to)e(a)h(new)g(univ)-5 b(erse.)-161 2015 -y(Second,)57 b(the)e(ordering)h(step)g(places)g(the)f(k)-5 -b(eys)56 b(in)g(a)g(sequen-)-161 2214 y(tial)50 b(order)g(that)f -(determines)h(the)f(order)h(in)f(whic)-5 b(h)51 b(hash)f(v)-9 -b(al-)-161 2413 y(ues)80 b(are)e(assigned)j(to)d(k)-5 -b(eys.)144 b(Third,)86 b(the)78 b(searc)-5 b(hing)80 -b(step)-161 2612 y(attempts)55 b(to)g(assign)i(hash)f(v)-9 -b(alues)56 b(to)f(the)g(k)-5 b(eys.)5 2823 y(In)55 b(this)g(pap)5 -b(er)54 b(w)-5 b(e)54 b(presen)-5 b(t)55 b(a)g(practical)f(and)g -(e\016cien)-5 b(t)55 b(al-)-161 3022 y(gorithm)42 b(to)f(\014nd)h -(minimal)h(p)5 b(erfect)40 b(hash)j(functions)f(for)f(v)-5 -b(ery)-161 3221 y(large)58 b(k)-5 b(ey)56 b(collections)i(where)f(no)g -(a)g(priori)h(k)-5 b(ey)57 b(order)g(m)-5 b(ust)-161 -3421 y(b)5 b(e)50 b(main)-5 b(tained)51 b(\(e.g.,)g(for)e(applications) -i(where)f(ordered)g(se-)-161 3620 y(quen)-5 b(tial)52 -b(access)h(is)f(not)g(needed\).)73 b(The)51 b(algorithm)i(is)f(based) --161 3819 y(on)46 b(the)g(MOS)g(approac)-5 b(h)47 b(and)f(ha)-5 -b(v)g(e)47 b(linear)f(time)g(complexit)-5 b(y)-161 4018 -y(with)69 b(a)g(small)i(constan)-5 b(t.)115 b(F)-14 b(or)70 -b(a)f(collection)f(of)h(20)g(million)-161 4218 y(k)-5 -b(eys,)88 b(the)81 b(total)g(time)g(to)g(\014nd)h(a)g(minimal)g(p)5 -b(erfect)80 b(hash)-161 4417 y(function)j(in)f(a)h(PC)f(computer)g(to)5 -b(ok)82 b(appro)-5 b(ximately)82 b(175)-161 4616 y(seconds.)136 -b(The)76 b(time)f(to)g(compute)h(the)f(table)g(en)-5 -b(try)76 b Ft(h)p Fy(\()p Ft(x)p Fy(\))-161 4815 y(for)54 -b(k)-5 b(ey)54 b Ft(x)g Fy(is)g(also)h(v)-5 b(ery)53 -b(fast,)i(as)f(it)g(uses)h(only)f(t)-5 b(w)g(o)54 b(di\013eren)-5 -b(t)-161 5015 y(univ)g(ersal)53 b(hash)g(functions,)h(eac)-5 -b(h)52 b(one)g(computable)g(in)g(time)-161 5214 y(prop)5 -b(ortional)64 b(to)e(the)g(size)h(of)g(the)g(k)-5 b(ey)62 -b Ft(x)p Fy(.)96 b(The)63 b(space)g(nec-)-161 5413 y(essary)51 -b(to)e(store)h(the)g(minimal)h(p)5 b(erfect)49 b(hash)i(function)f(for) -f(a)-161 5612 y(set)56 b(of)f Ft(n)g Fy(k)-5 b(eys)55 -b(is)h Ft(O)5 b Fy(\(log)29 b Ft(n)p Fy(\))55 b(bits)g(p)5 -b(er)55 b(k)-5 b(ey)-14 b(.)-161 6222 y Fv(2)270 b(Related)88 -b(W)-22 b(ork)-161 6607 y Fy(Czec)-5 b(h,)62 b(Ha)-5 -b(v)c(as)61 b(and)g(Ma)9 b(jewski)60 b([2])h(pro)-5 b(vide)61 -b(a)f(comprehen-)-161 6806 y(siv)-5 b(e)81 b(surv)-5 -b(ey)81 b(and)g(review)f(some)h(of)f(the)g(most)h(imp)5 -b(ortan)-5 b(t)-161 7005 y(theoretical)67 b(results)i(on)f(p)5 -b(erfect)66 b(hashing.)113 b(Mehlhorn)69 b([14])-161 -7204 y(sho)-5 b(ws)81 b(that)e(the)g(lo)-5 b(w)g(er)79 -b(b)5 b(ound)80 b(to)f(store)g(a)g(p)5 b(erfect)78 b(hash)-161 -7404 y(function)49 b(is)h(\012\()p Ft(n=)28 b Fy(log)h -Ft(n)p Fy(\))49 b(computer)g(w)-5 b(ords,)51 b(where)e -Ft(n)g Fy(is)h(the)-161 7603 y(size)62 b(of)g(the)f(k)-5 -b(ey)61 b(set.)93 b(F)-14 b(o)-5 b(x)63 b(et)e(al.)h([7])g(sho)-5 -b(w)62 b(that)g(the)f(space)-161 7802 y(lo)-5 b(w)g(er)58 -b(b)5 b(ound)57 b(to)f(store)h(an)g(order)g(preserving)g(p)5 -b(erfect)55 b(hash)-161 8001 y(function)h(is)g(\012\()p -Ft(n)28 b Fy(log)h Ft(n)p Fy(\))54 b(bits.)5 8212 y(Using)e(the)f(MOS)h -(approac)-5 b(h,)54 b(F)-14 b(o)-5 b(x)52 b(et)f(al.)g([8,)h(9])g -(presen)-5 b(ted)-161 8411 y(algorithms)63 b(for)f(\014nding)i(minimal) -f(p)5 b(erfect)61 b(hash)i(functions)-161 8611 y(in)76 -b(whic)-5 b(h)75 b(the)g(space)g(to)g(store)g(the)f(functions)i(is)f -(close)h(to)-161 8810 y(the)54 b(lo)-5 b(w)g(er)54 b(b)5 -b(ound)55 b(to)e(store)h(a)g(minimal)h(p)5 b(erfect)52 -b(hash)j(func-)-161 9009 y(tion.)72 b(Ho)-5 b(w)g(ev)g(er,)50 -b(in)f([2,)h(Section)f(6.7])g(it)f(is)h(sho)-5 b(wn)50 -b(that)e(their)-161 9208 y(algorithms)57 b(ha)-5 b(v)g(e)56 -b(exp)5 b(onen)-5 b(tial)55 b(running)h(times.)5 9419 -y(The)65 b(w)-5 b(orks)65 b(in)g([1,)g(2,)g(13])f(presen)-5 -b(t)66 b(a)e(family)h(of)f(e\016cien)-5 b(t)-161 9618 -y(and)58 b(practical)f(algorithms)h(for)f(generating)h(order)f -(preserv-)-161 9817 y(ing)96 b(minimal)h(p)5 b(erfect)95 -b(hash)h(functions.)195 b(They)96 b(presen)-5 b(t)-161 -10017 y(one)91 b(of)f(the)g(b)5 b(est)90 b(kno)-5 b(wn)91 -b(random)h(metho)5 b(ds)91 b(for)f(gener-)-161 10216 -y(ating)83 b(minimal)h(p)5 b(erfect)81 b(hash)i(functions.)156 -b(One)83 b(of)f(their)-161 10415 y(algorithms)72 b(in)-5 -b(v)g(olv)g(es)72 b(the)e(generation)h(of)f(acyclic)g(random)4136 -620 y(graphs)90 b Ft(G)102 b Fy(=)g(\()p Ft(V)9 b(;)28 -b(E)10 b Fy(\),)96 b Fx(j)p Ft(V)37 b Fx(j)102 b Fy(=)g -Ft(cn)89 b Fy(and)g Fx(j)p Ft(E)10 b Fx(j)102 b Fy(=)g -Ft(n)p Fy(,)97 b(with)4136 819 y Ft(c)46 b Fx(\025)g -Fy(2)p Ft(:)p Fy(09.)4302 1018 y(The)72 b(di\013erences)g(b)5 -b(et)-5 b(w)g(een)72 b(our)g(algorithm)h(and)f(the)g(al-)4136 -1218 y(gorithms)78 b(in)e([1)q(,)g(2,)h(13])f(are)h(as)g(follo)-5 -b(ws.)138 b(First,)82 b(w)-5 b(e)77 b(gen-)4136 1417 -y(erate)87 b(cyclic)g(random)i(graphs)g Ft(G)100 b Fy(=)h(\()p -Ft(V)9 b(;)28 b(E)10 b Fy(\),)94 b Fx(j)p Ft(V)37 b Fx(j)100 -b Fy(=)h Ft(cn)4136 1616 y Fy(and)96 b Fx(j)p Ft(E)10 -b Fx(j)111 b Fy(=)h Ft(n)p Fy(,)105 b(with)94 b Ft(c)112 -b Fx(\025)h Fy(1)p Ft(:)p Fy(15)95 b(while)g(they)f(generate)4136 -1815 y(acyclic)65 b(random)i(graphs)f(with)g(a)g(greater)f(n)-5 -b(um)g(b)5 b(er)67 b(of)e(v)-5 b(er-)4136 2015 y(tices)59 -b(\()p Fx(j)p Ft(V)36 b Fx(j)52 b(\025)g Fy(2)p Ft(:)p -Fy(09)p Ft(n)p Fy(\).)83 b(Second,)60 b(their)e(mapping)i(step)f(tak)-5 -b(es)4136 2214 y(longer)93 b(time)g(b)5 b(ecause)93 b(they)f(m)-5 -b(ust)94 b(generate)f(an)g(acyclic)4136 2413 y(graph)53 -b(while)g(w)-5 b(e)53 b(do)g(not)f(need)h(to)f(c)-5 b(hec)g(k)53 -b(for)f(this)h(prop)5 b(ert)-5 b(y)-14 b(.)4136 2612 -y(Third,)70 b(the)65 b(time)h(to)g(compute)g(a)h(table)e(en)-5 -b(try)66 b(is)h(faster)f(in)4136 2812 y(our)54 b(case)g(b)5 -b(ecause)54 b(w)-5 b(e)53 b(sa)-5 b(v)g(e)55 b(a)e(mo)5 -b(dule)54 b(op)5 b(eration.)73 b(F)-14 b(ourth,)4136 -3011 y(they)74 b(generate)f(order)i(preserving)g(minimal)g(p)5 -b(erfect)73 b(hash)4136 3210 y(functions)43 b(while)f(our)g(algorithm)g -(do)5 b(es)42 b(not)g(preserv)-5 b(e)42 b(order.)4136 -3754 y Fv(3)270 b(Basic)89 b(Concepts)4136 4117 y Fy(This)57 -b(section)f(presen)-5 b(ts)57 b(the)f(basic)g(concepts)g(that)g(are)f -(used)4136 4317 y(in)h(the)f(next)g(sections.)4136 4696 -y Fq(De\014nition)65 b(1)83 b Fy(Let)40 b Ft(U)65 b Fy(=)46 -b Fx(f)p Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h(u)8 -b Fx(\000)g Fy(1)p Fx(g)41 b Fy(b)5 b(e)40 b(the)g(univ)-5 -b(erse)4136 4895 y(for)55 b(some)h(arbitrary)f(p)5 b(ositiv)-5 -b(e)56 b(in)-5 b(teger)55 b Ft(u)p Fy(.)4136 5274 y Fq(De\014nition)65 -b(2)83 b Fy(Let)46 b Ft(S)56 b Fy(b)5 b(e)46 b(a)h(set)f(of)g -Ft(n)h Fy(distinct)f(k)-5 b(eys)47 b(b)5 b(elong-)4136 -5473 y(ing)56 b(to)f Ft(U)18 b Fy(,)56 b(i.e.,)f Ft(n)h -Fy(is)f(the)g(size)h(of)f Ft(S)10 b Fy(.)4136 5852 y -Fq(De\014nition)65 b(3)83 b Fy(Let)66 b Ft(h)f Fy(:)g -Ft(U)84 b Fx(!)65 b Ft(M)85 b Fy(b)5 b(e)66 b(a)h Fs(hashing)j -(function)4136 6051 y Fy(that)82 b(maps)i(the)e(k)-5 -b(eys)82 b(from)h Ft(S)92 b Fy(in)-5 b(to)83 b(a)f(giv)-5 -b(en)83 b(in)-5 b(terv)c(al)82 b(of)4136 6251 y(in)-5 -b(tegers)38 b([0)p Ft(;)28 b(m)r Fx(\000)r Fy(1].)68 -b(Giv)-5 b(en)38 b(a)g(k)-5 b(ey)37 b Ft(x)46 b Fx(2)g -Ft(S)10 b Fy(,)41 b(the)c(hash)i(function)4136 6450 y(computes)78 -b(an)g(in)-5 b(teger)78 b(in)g([0)p Ft(;)28 b(m)52 b -Fx(\000)g Fy(1])78 b(for)f(the)g(storage)h(or)4136 6649 -y(retriev)-9 b(al)71 b(of)h Ft(x)g Fy(in)g(a)g Fs(hash)i(table)p -Fy(,)k(i.e.,)e Ft(m)c Fy(is)h(the)e(size)h(of)g(a)4136 -6848 y(hash)57 b(table.)4136 7227 y Fq(De\014nition)65 -b(4)83 b Fy(Let)55 b Ft(G)46 b Fy(=)h(\()p Ft(V)9 b(;)28 -b(E)10 b Fy(\))53 b(b)5 b(e)56 b(a)f Fs(r)-8 b(andom)59 -b(undir)-8 b(e)g(cte)g(d)4136 7427 y(gr)g(aph)94 b Fy(without)g -(self-lo)5 b(ops)96 b(and)e(m)-5 b(ultiple)96 b(edges,)104 -b(where)4136 7626 y Fx(j)p Ft(E)10 b Fx(j)95 b Fy(=)h -Ft(n)p Fy(,)c Fx(j)p Ft(V)37 b Fx(j)96 b Fy(=)g Ft(cn)p -Fy(,)c(generated)84 b(using)j(a)e(v)-9 b(ariation)84 -b(of)4136 7825 y(the)d Fs(uniform)i(mo)-8 b(del)81 b -Fy([6].)152 b(In)81 b(this)h(mo)5 b(del,)88 b(at)81 b(eac)-5 -b(h)81 b(step)4136 8024 y(w)-5 b(e)80 b(generate)f(an)g(unordered)i -(pair)f Ft(e)86 b Fy(=)h Fx(f)p Ft(u;)28 b(v)6 b Fx(g)p -Fy(,)86 b(where)79 b Ft(u)4136 8243 y Fy(and)87 b Ft(v)104 -b Fx(2)98 b Ft(V)36 b Fy(,)95 b(from)5580 8109 y Fp(\000)5656 -8170 y Fo(j)p Fr(V)30 b Fo(j)5716 8301 y Fn(2)5842 8109 -y Fp(\001)6005 8243 y Fy(pairs)87 b(equally)f(lik)-5 -b(ely)-14 b(.)166 b(If)87 b(the)4136 8443 y(undirected)59 -b(edge)g Ft(e)h Fy(is)f(neither)g(a)g(self-lo)5 b(op)60 -b(nor)f(a)g(m)-5 b(ultiple)4136 8642 y(edge)69 b(then)f(it)h(is)g -(added)g(to)f Ft(G)p Fy(.)114 b(A)68 b(self-lo)5 b(op)69 -b(o)5 b(ccurs)69 b(when)4136 8841 y Ft(u)81 b Fy(=)f -Ft(v)6 b Fy(.)137 b(F)-14 b(or)76 b(an)h(edge)f Ft(e)5836 -8866 y Fn(1)5991 8841 y Fy(=)81 b Fx(f)p Ft(u)6379 8781 -y Fo(0)6425 8841 y Ft(;)28 b(v)6585 8781 y Fo(0)6632 -8841 y Fx(g)76 b Fy(already)g(added)h(to)4136 9040 y -Ft(G)p Fy(,)63 b(a)e(m)-5 b(ultiple)62 b(edge)f(o)5 b(ccurs)62 -b(when)f(one)g(of)g(the)g(conditions)4136 9240 y(\()p -Ft(u)46 b Fy(=)g Ft(u)4612 9179 y Fo(0)4696 9240 y Fy(and)37 -b Ft(v)53 b Fy(=)46 b Ft(v)5394 9179 y Fo(0)5441 9240 -y Fy(\))37 b(or)f(\()p Ft(u)46 b Fy(=)g Ft(v)6194 9179 -y Fo(0)6278 9240 y Fy(and)38 b Ft(v)52 b Fy(=)47 b Ft(u)6986 -9179 y Fo(0)7032 9240 y Fy(\))55 b(is)h(true.)4136 9619 -y Fq(De\014nition)65 b(5)83 b Fy(Let)49 b(Adj\()p Ft(v)6 -b Fy(\))49 b(b)5 b(e)49 b(the)g(adjacen)-5 b(t)50 b(list)g(of)f(a)h(v) --5 b(er-)4136 9818 y(tex)55 b Ft(v)d Fx(2)46 b Ft(V)37 -b Fy(.)4136 10197 y Fq(De\014nition)65 b(6)83 b Fy(Let)46 -b Ft(d)5581 10222 y Fr(av)t(g)5847 10197 y Fy(=)6043 -10116 y Fn(2)p Fo(j)p Fr(E)6 b Fo(j)p 6043 10159 249 -7 v 6074 10254 a(j)p Fr(V)30 b Fo(j)6358 10197 y Fy(b)5 -b(e)46 b(the)g Fs(aver)-8 b(age)52 b(de)-8 b(gr)g(e)g(e)46 -b Fy(of)4136 10415 y(the)55 b(v)-5 b(ertices)55 b Ft(V)92 -b Fy(of)55 b Ft(G)p Fy(.)3906 10913 y(2)p eop end -%%Page: 3 3 -TeXDict begin 3 2 bop -161 620 a Fq(De\014nition)65 b(7)84 -b Fy(Let)70 b Ft(V)1320 645 y Fr(cr)t(it)1622 620 y Fx(\022)i -Ft(V)108 b Fy(b)5 b(e)71 b(a)g(set)g(of)g Fs(critic)-8 -b(al)74 b(ver-)-161 819 y(tic)-8 b(es)p Fy(.)133 b(Subset)75 -b Ft(V)988 844 y Fr(cr)t(it)1293 819 y Fy(con)-5 b(tains)75 -b(all)g(v)-5 b(ertices)75 b(from)f Ft(V)112 b Fy(that)-161 -1018 y(are)62 b(part)g(of)g(cycles)g(or)g(are)g(in)g(a)g(c)-5 -b(hain)63 b(connecting)f(t)-5 b(w)g(o)62 b(or)-161 1218 -y(more)56 b(cycles,)f(as)h(the)f(v)-5 b(ertex)54 b(5)h(in)h(Figure)g -(4.)-161 1630 y Fq(De\014nition)65 b(8)84 b Fy(Let)54 -b Ft(E)1330 1655 y Fr(cr)t(it)1606 1630 y Fx(\022)46 -b Ft(E)64 b Fy(b)5 b(e)55 b(a)h(set)f(of)g Fs(critic)-8 -b(al)60 b(e)-8 b(dges)p Fy(.)-161 1829 y(Subset)48 b -Ft(E)490 1854 y Fr(cr)t(it)767 1829 y Fy(con)-5 b(tains)48 -b(all)f(edges)h(from)f Ft(E)56 b Fy(connecting)47 b(crit-)-161 -2029 y(ical)56 b(v)-5 b(ertices.)-161 2441 y Fq(De\014nition)65 -b(9)84 b Fy(Let)65 b Ft(V)1315 2466 y Fr(ncr)t(it)1692 -2441 y Fy(=)f Ft(V)81 b Fx(\000)45 b Ft(V)2334 2466 y -Fr(cr)t(it)2630 2441 y Fy(b)5 b(e)66 b(a)g(set)h(of)f -Fs(non)-161 2641 y(critic)-8 b(al)92 b(vertic)-8 b(es)p -Fy(.)178 b(Subset)90 b Ft(V)1860 2666 y Fr(ncr)t(it)2262 -2641 y Fy(con)-5 b(tains)91 b(all)f(v)-5 b(ertices)-161 -2840 y(from)56 b Ft(V)92 b Fy(that)55 b(are)g(not)g(part)g(of)g -(cycles.)-161 3252 y Fq(De\014nition)65 b(10)84 b Fy(Let)43 -b Ft(V)1388 3277 y Fr(scr)t(it)1727 3252 y Fx(\022)j -Ft(V)1999 3277 y Fr(cr)t(it)2273 3252 y Fy(b)5 b(e)44 -b(a)g(set)g(of)f(all)i(critical)-161 3452 y(v)-5 b(ertices)72 -b(that)g(ha)-5 b(v)g(e)72 b(at)g(least)g(one)g(non)h(critical)f(v)-5 -b(ertex)71 b(as)-161 3651 y(adjacen)-5 b(t,)56 b(as)g(the)e(v)-5 -b(ertex)55 b(5)g(in)h(Figure)g(4.)-161 4063 y Fq(De\014nition)65 -b(11)84 b Fy(Let)52 b Ft(E)1423 4088 y Fr(ncr)t(it)1781 -4063 y Fy(=)46 b Ft(E)40 b Fx(\000)32 b Ft(E)2403 4088 -y Fr(cr)t(it)2685 4063 y Fy(b)5 b(e)52 b(a)h(set)f(of)h -Fs(non)-161 4263 y(critic)-8 b(al)60 b(e)-8 b(dges)p -Fy(.)-161 4675 y Fq(De\014nition)65 b(12)84 b Fy(Let)64 -b Ft(G)1443 4700 y Fr(cr)t(it)1736 4675 y Fy(=)f(\()p -Ft(V)2090 4700 y Fr(cr)t(it)2319 4675 y Ft(;)28 b(E)2516 -4700 y Fr(cr)t(it)2745 4675 y Fy(\))65 b(b)5 b(e)65 b(a)h -Fs(critic)-8 b(al)-161 4875 y(gr)g(aph)82 b Fy(and)h(let)e -Ft(G)1061 4900 y Fr(ncr)t(it)1464 4875 y Fy(=)91 b(\()p -Ft(V)1846 4900 y Fr(ncr)t(it)2212 4875 y Fx([)55 b Ft(V)2475 -4900 y Fr(scr)t(it)2767 4875 y Ft(;)28 b(E)2964 4900 -y Fr(ncr)t(it)3276 4875 y Fy(\))81 b(b)5 b(e)82 b(a)-161 -5074 y Fs(non)c(critic)-8 b(al)77 b(gr)-8 b(aph)p Fy(,)79 -b(where)74 b(the)g(critical)g(subgraph)i Ft(G)3529 5099 -y Fr(cr)t(it)-161 5273 y Fy(corresp)5 b(onds)46 b(to)f(the)g(cyclic)f -(part)h(of)f Ft(G)h Fy(and)h(the)e(non)i(critical)-161 -5472 y(subgraph)62 b Ft(G)696 5497 y Fr(ncr)t(it)1067 -5472 y Fy(corresp)5 b(onds)60 b(to)g(the)f(acyclic)g(part)g(of)h -Ft(G)p Fy(.)-161 5672 y(Th)-5 b(us,)57 b Ft(G)46 b Fy(=)g -Ft(G)789 5697 y Fr(cr)t(it)1056 5672 y Fx([)36 b Ft(G)1334 -5697 y Fr(ncr)t(it)1646 5672 y Fy(.)-161 6084 y Fq(De\014nition)65 -b(13)84 b Fy(Let)62 b Ft(P)1417 6114 y Fo(j)p Fr(E)1553 -6131 y Fm(cr)s(it)1766 6114 y Fo(j)1876 6084 y Fy(b)5 -b(e)63 b(the)g(probabilit)-5 b(y)63 b(that)g Ft(G)-161 -6283 y Fy(has)56 b(at)f(most)h Fx(j)p Ft(E)914 6308 y -Fr(cr)t(it)1144 6283 y Fx(j)f Fy(critical)g(edges.)-161 -6696 y Fq(De\014nition)65 b(14)84 b Fy(Let)65 b Ft(P)1420 -6726 y Fo(j)p Fr(V)1537 6743 y Fm(cr)s(it)1750 6726 y -Fo(j)1864 6696 y Fy(b)5 b(e)65 b(the)h(probabilit)-5 -b(y)67 b(that)f Ft(G)-161 6895 y Fy(has)56 b(at)f(most)h -Fx(j)p Ft(V)888 6920 y Fr(cr)t(it)1118 6895 y Fx(j)g -Fy(critical)f(v)-5 b(ertices.)-161 7457 y Fv(4)270 b(Minimal)89 -b(P)-7 b(erfect)88 b(Hashing)-161 7825 y Fy(In)81 b(a)f(hashing)h -(metho)5 b(d,)86 b(di\013eren)-5 b(t)80 b(k)-5 b(eys)80 -b(migh)-5 b(t)81 b(ha)-5 b(v)g(e)81 b(the)-161 8024 y(same)66 -b(address)h(computed)e(b)-5 b(y)66 b(the)e(hash)j(function,)g(a)e -(situ-)-161 8223 y(ation)58 b(called)g Fs(c)-8 b(ol)8 -b(lision)p Fy(.)83 b(In)58 b(this)h(case)f(v)-9 b(arious)58 -b(sc)-5 b(hemes)59 b(for)-161 8423 y(resolving)50 b(collisions)h(are)e -(kno)-5 b(wn.)72 b(A)49 b Fs(p)-8 b(erfe)g(ct)54 b(hash)f(function)-161 -8622 y Fy(is)67 b(an)f(injection)f Ft(h)f Fy(:)f Ft(U)82 -b Fx(!)64 b Fy([0)p Ft(;)28 b(m)44 b Fx(\000)g Fy(1],)69 -b(whic)-5 b(h)66 b(means)h(that)-161 8821 y(for)60 b(all)h -Ft(x;)28 b(y)60 b Fx(2)54 b Ft(S)70 b Fy(suc)-5 b(h)61 -b(that)f Ft(x)54 b Fx(6)p Fy(=)h Ft(y)66 b Fy(w)-5 b(e)61 -b(ha)-5 b(v)g(e)60 b Ft(h)p Fy(\()p Ft(x)p Fy(\))54 b -Fx(6)p Fy(=)g Ft(h)p Fy(\()p Ft(y)6 b Fy(\),)-161 9020 -y(whic)-5 b(h)68 b(implies)f(that)f Ft(m)e Fx(\025)h -Ft(n)p Fy(.)107 b(F)-14 b(or)67 b(b)5 b(eing)67 b(an)f(injection,)j(a) --161 9220 y(p)5 b(erfect)60 b(hash)i(function)e(transforms)i(eac)-5 -b(h)61 b(k)-5 b(ey)60 b(of)h Ft(S)70 b Fy(in)-5 b(to)61 -b(a)-161 9419 y(unique)67 b(address)h(in)f(the)f(hash)h(table,)i(as)e -(depicted)g(in)f(Fig-)-161 9618 y(ure)51 b(1\(a\).)72 -b(Since)51 b(no)g(collisions)h(o)5 b(ccur,)52 b(eac)-5 -b(h)51 b(k)-5 b(ey)50 b(can)h(b)5 b(e)50 b(re-)-161 9817 -y(triev)-5 b(ed)46 b(from)g(the)f(table)h(in)g(one)g(prob)5 -b(e.)71 b(If)45 b Ft(m)h Fy(=)h Ft(n)e Fy(and)i Ft(h)p -Fy(\()p Ft(x)p Fy(\))-161 10017 y(is)h(p)5 b(erfect,)48 -b(then)f Ft(h)p Fy(\()p Ft(x)p Fy(\))f(is)i(a)f Fs(minimal)53 -b(p)-8 b(erfe)g(ct)52 b(hash)f(function)-161 10216 y -Fy(\(MPHF\),)e(as)g(depicted)f(in)i(Figure)f(1\(b\).)71 -b(The)49 b(p)5 b(erfect)47 b(hash)-161 10415 y(function)k -Ft(h)f Fy(is)h(said)g(to)f(b)5 b(e)50 b Fs(or)-8 b(der)55 -b(pr)-8 b(eserving)52 b Fy(if)e(for)g(an)-5 b(y)51 b(pair)4136 -620 y(of)69 b(k)-5 b(eys)70 b Ft(x)4814 645 y Fr(i)4869 -620 y Fy(,)j Ft(x)5083 645 y Fr(j)5222 620 y Fx(2)c Ft(S)79 -b Fy(then)69 b Ft(h)p Fy(\()p Ft(x)6231 645 y Fr(i)6285 -620 y Fy(\))g Ft(<)h(h)p Fy(\()p Ft(x)6874 645 y Fr(j)6943 -620 y Fy(\))f(if)g(and)h(only)f(if)4136 819 y Ft(i)63 -b(<)h(j)10 b Fy(.)104 b(In)66 b(other)f(w)-5 b(ords,)69 -b(the)c(k)-5 b(eys)66 b(in)g Ft(S)74 b Fy(are)66 b(arranged)g(in)4136 -1018 y(some)c(order)f(and)g(the)f(function)h Ft(h)f Fy(preserv)-5 -b(es)62 b(this)f(order)g(in)4136 1218 y(the)55 b(hash)i(table.)4136 -3818 y - currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch -translate - 4136 3818 a 4136 1018 a - 18353111 11051335 0 0 18353111 11051335 startTexFig - 4136 1018 a -%%BeginDocument: figs/minimalperfecthash-ph-mph.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF - -%%EndDocument - - endTexFig - 4136 3818 a - currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg -exch neg exch translate - 4136 3818 a 389 x Fy(Figure)i(1:)79 b(\(a\))57 -b(P)-5 b(erfect)57 b(hash)i(function.)82 b(\(b\))57 b(Minimal)i(p)5 -b(er-)4136 4407 y(fect)54 b(hash)j(function.)4302 4810 -y(In)52 b(the)g(de\014nitions)h(ab)5 b(o)-5 b(v)g(e)51 -b(the)h(k)-5 b(eys)52 b(to)f(b)5 b(e)51 b(placed)h(in)h(the)4136 -5009 y(hash)73 b(table)f(are)g(in)-5 b(tegers)73 b(in)g(the)e(in)-5 -b(terv)c(al)72 b([0)p Ft(;)28 b(m)48 b Fx(\000)g Fy(1].)125 -b(In)4136 5208 y(practice,)76 b(it)c(is)g(often)g(the)f(case)i(that)e -(k)-5 b(eys)72 b(are)g(sequences)4136 5407 y(of)51 b(c)-5 -b(haracters)52 b(o)-5 b(v)g(er)51 b(some)h(\014nite)f(and)h(ordered)f -(alphab)5 b(et)51 b(\006,)4136 5607 y(suc)-5 b(h)67 b(as)g(the)e(ASCI)5 -b(I)66 b(set.)105 b(In)67 b(this)f(case,)j(w)-5 b(e)66 -b(con)-5 b(v)g(ert)66 b(it)g(to)4136 5806 y(a)56 b(random)h(n)-5 -b(um)g(b)5 b(er)57 b(mo)5 b(dulo)57 b Fx(j)p Ft(V)37 -b Fx(j)56 b Fy(for)f(eac)-5 b(h)57 b(k)-5 b(ey)-14 b(.)75 -b(T)-14 b(o)56 b(obtain)4136 6005 y(a)h(random)g(n)-5 -b(um)g(b)5 b(er)58 b(for)e(eac)-5 b(h)56 b(k)-5 b(ey)-14 -b(,)57 b(w)-5 b(e)56 b(generate)g(a)g(table)g(of)4136 -6204 y(random)h(n)-5 b(um)g(b)5 b(ers,)58 b(one)d(for)h(eac)-5 -b(h)56 b(p)5 b(ossible)56 b(c)-5 b(haracter)56 b(of)f(\006)4136 -6404 y(at)60 b(eac)-5 b(h)60 b(p)5 b(osition)60 b Ft(i)g -Fy(in)g(the)g(k)-5 b(ey)-14 b(.)87 b(The)60 b(construction)g(of)g(the) -4136 6603 y(minimal)h(p)5 b(erfect)57 b(hash)j(function)f(presumes)h -(the)f(existence)4136 6802 y(of)49 b(t)-5 b(w)g(o)48 -b(random)i(and)f(indep)5 b(enden)-5 b(t)49 b(hash)h(functions)f -Ft(h)7665 6827 y Fn(1)7788 6802 y Fy(and)4136 7001 y -Ft(h)4232 7026 y Fn(2)4306 7001 y Fy(.)80 b(F)-14 b(or)57 -b(a)g(k)-5 b(ey)57 b Ft(x)g Fy(con)-5 b(taining)58 b -Fx(j)p Ft(x)p Fx(j)f Fy(c)-5 b(haracters)58 b(and)f(t)-5 -b(w)g(o)58 b(dif-)4136 7201 y(feren)-5 b(t)48 b(tables)g(of)g(random)h -(n)-5 b(um)g(b)5 b(ers)50 b Fs(table)6868 7226 y Fn(1)6991 -7201 y Fy(and)f Fs(table)7654 7226 y Fn(2)7729 7201 y -Fy(,)h(the)4136 7400 y(t)-5 b(w)g(o)56 b(hashing)h(functions)e(are:) -4722 7960 y Ft(h)4818 7985 y Fn(1)4892 7960 y Fy(\()p -Ft(x)p Fy(\))45 b(=)5338 7626 y Fp(0)5338 7925 y(@)5526 -7738 y Fo(j)p Fr(x)p Fo(j)5483 7802 y Fp(X)5495 8155 -y Fr(i)p Fn(=1)5750 7960 y Ft(tabl)s(e)6099 7985 y Fn(1)6174 -7960 y Fy([)p Ft(i;)28 b(x)p Fy([)p Ft(i)p Fy(]])6641 -7626 y Fp(1)6641 7925 y(A)6833 7960 y Fy(mo)5 b(d)46 -b Fx(j)p Ft(V)37 b Fx(j)p Ft(;)4722 8751 y(h)4818 8776 -y Fn(2)4892 8751 y Fy(\()p Ft(x)p Fy(\))45 b(=)5338 8417 -y Fp(0)5338 8716 y(@)5526 8529 y Fo(j)p Fr(x)p Fo(j)5483 -8593 y Fp(X)5495 8947 y Fr(i)p Fn(=1)5750 8751 y Ft(tabl)s(e)6099 -8776 y Fn(2)6174 8751 y Fy([)p Ft(i;)28 b(x)p Fy([)p -Ft(i)p Fy(]])6641 8417 y Fp(1)6641 8716 y(A)6833 8751 -y Fy(mo)5 b(d)46 b Fx(j)p Ft(V)37 b Fx(j)p Ft(:)4302 -9249 y Fy(Consider)78 b(no)-5 b(w)77 b(a)g(problem)g(kno)-5 -b(wn)77 b(as)h(the)e Fs(p)-8 b(erfe)g(ct)79 b(as-)4136 -9448 y(signment)67 b(pr)-8 b(oblem)p Fy(:)86 b(F)-14 -b(or)63 b(a)e(giv)-5 b(en)62 b(undirected)g(graph)g Ft(G)56 -b Fy(=)4136 9647 y(\()p Ft(V)9 b(;)28 b(E)10 b Fy(\),)91 -b(where)84 b Fx(j)p Ft(V)37 b Fx(j)95 b Fy(=)h Ft(cn)84 -b Fy(and)h Fx(j)p Ft(E)10 b Fx(j)95 b Fy(=)g Ft(n)p Fy(,)d(\014nd)86 -b(a)f(func-)4136 9846 y(tion)66 b Ft(g)6 b Fy(:)p Ft(V)99 -b Fx(!)63 b(f)p Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h -Fx(j)p Ft(V)37 b Fx(j)44 b(\000)f Fy(1)p Fx(g)66 b Fy(suc)-5 -b(h)66 b(that)f(the)g(function)4136 10046 y Ft(h)46 b -Fy(:)g Ft(E)56 b Fx(!)46 b(f)p Fy(0)p Ft(;)28 b Fy(1)p -Ft(;)g(:)g(:)g(:)f(;)h(n)36 b Fx(\000)h Fy(1)p Fx(g)p -Fy(,)56 b(de\014ned)g(as)4953 10415 y Ft(h)p Fy(\()p -Ft(e)p Fy(\))45 b(=)h(\()p Ft(g)6 b Fy(\()p Ft(a)p Fy(\))36 -b(+)h Ft(g)6 b Fy(\()p Ft(b)p Fy(\)\))45 b(mo)5 b(d)47 -b Ft(n)936 b Fy(\(1\))3906 10913 y(3)p eop end -%%Page: 4 4 -TeXDict begin 4 3 bop -161 620 a Fy(is)41 b(a)g(bijection,)i(where)d -Ft(e)47 b Fy(=)f Fx(f)p Ft(a;)28 b(b)p Fx(g)p Fy(.)69 -b(This)41 b(means)g(that)f(w)-5 b(e)40 b(are)-161 819 -y(lo)5 b(oking)56 b(for)f(an)h(assignmen)-5 b(t)57 b(of)f(v)-9 -b(alues)55 b(to)h(v)-5 b(ertices)55 b(so)h(that)-161 -1018 y(for)68 b(eac)-5 b(h)67 b(edge)h(the)f(sum)i(of)e(v)-9 -b(alues)68 b(asso)5 b(ciated)67 b(with)h(end-)-161 1218 -y(p)5 b(oin)-5 b(ts)63 b(tak)-5 b(en)62 b(mo)5 b(dulo)62 -b(the)g(n)-5 b(um)g(b)5 b(er)63 b(of)f(edges)g(is)h(a)f(unique)-161 -1417 y(in)-5 b(teger)56 b(in)f(the)g(range)h([0)p Ft(;)28 -b(n)36 b Fx(\000)h Fy(1].)5 1616 y(The)75 b(ordering)h(and)f(searc)-5 -b(hing)76 b(steps)f(of)g(the)f(MOS)i(ap-)-161 1815 y(proac)-5 -b(h)80 b(are)f(a)g(v)-5 b(ery)78 b(simple)i(w)-5 b(a)g(y)79 -b(of)g(solving)g(the)g(p)5 b(erfect)-161 2015 y(assignmen)-5 -b(t)69 b(problem.)110 b(Czec)-5 b(h,)70 b(Ha)-5 b(v)c(as)66 -b(and)i(Ma)9 b(jewski)67 b([1])-161 2214 y(sho)-5 b(w)g(ed)82 -b(that)d(the)g(p)5 b(erfect)78 b(assignmen)-5 b(t)81 -b(problem)g(can)f(b)5 b(e)-161 2413 y(solv)-5 b(ed)82 -b(in)e(optimal)h(time)g(if)f Ft(G)g Fy(is)h(acyclic.)148 -b(T)-14 b(o)81 b(generate)-161 2612 y(an)96 b(acyclic)e(graph)i(t)-5 -b(w)g(o)96 b(v)-5 b(ertices)95 b Ft(h)2291 2637 y Fn(1)2365 -2612 y Fy(\()p Ft(x)p Fy(\))f(and)i Ft(h)3143 2637 y -Fn(2)3217 2612 y Fy(\()p Ft(x)p Fy(\))e(are)-161 2812 -y(computed)85 b(for)f(eac)-5 b(h)85 b(k)-5 b(ey)84 b -Ft(x)95 b Fx(2)f Ft(S)10 b Fy(.)161 b(Th)-5 b(us,)93 -b(set)84 b Ft(S)94 b Fy(has)85 b(a)-161 3011 y(corresp)5 -b(onding)84 b(graph)e Ft(G)p Fy(,)89 b(with)82 b Ft(V)128 -b Fy(=)91 b Fx(f)p Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h(v)6 -b Fx(g)83 b Fy(and)-161 3210 y Ft(E)72 b Fy(=)62 b Fx(ff)p -Ft(h)487 3235 y Fn(1)561 3210 y Fy(\()p Ft(x)p Fy(\))p -Ft(;)28 b(h)956 3235 y Fn(2)1029 3210 y Fy(\()p Ft(x)p -Fy(\))p Fx(g)61 b Fy(:)h Ft(x)g Fx(2)g Ft(S)10 b Fx(g)p -Fy(.)102 b(In)65 b(order)g(to)f(guaran)-5 b(tee)-161 -3409 y(acyclicit)g(y)68 b(the)g(algorithm)i(rep)5 b(eatedly)67 -b(selects)i Ft(h)3109 3434 y Fn(1)3252 3409 y Fy(and)g -Ft(h)3684 3434 y Fn(2)-161 3609 y Fy(un)-5 b(til)57 b(the)e(corresp)5 -b(onding)57 b(graph)g(is)f(acyclic.)75 b(F)-14 b(or)57 -b(the)e(solu-)-161 3808 y(tion)60 b(to)f(b)5 b(e)59 b(useful)h(w)-5 -b(e)60 b(m)-5 b(ust)61 b(ha)-5 b(v)g(e)60 b Fx(j)p Ft(S)10 -b Fx(j)53 b Fy(=)g Ft(n)59 b Fy(and)h Fx(j)p Ft(V)37 -b Fx(j)53 b Fy(=)h Ft(cn)p Fy(,)-161 4007 y(for)46 b(some)g(constan)-5 -b(t)45 b Ft(c)p Fy(,)j(suc)-5 b(h)46 b(that)f(acyclic)f(graphs)j -(dominate)-161 4206 y(the)39 b(space)h(of)f(all)h(random)g(graphs.)70 -b(Ha)-5 b(v)c(as)39 b(et)g(al.)h([10])g(pro)-5 b(v)g(ed)-161 -4406 y(that)58 b(if)h Fx(j)p Ft(V)37 b Fx(j)52 b Fy(=)f -Ft(cn)59 b Fy(holds)h(with)e Ft(c)52 b(>)f Fy(2)59 b(the)f(probabilit) --5 b(y)60 b(that)-161 4605 y Ft(G)55 b Fy(is)h(acyclic)f(is)1036 -5049 y Ft(p)45 b Fy(=)i Ft(e)1418 4981 y Fn(1)p Fr(=c)1620 -4789 y Fp(r)p 1786 4789 398 7 v 1806 4937 a Ft(c)37 b -Fx(\000)g Fy(2)p 1806 5011 358 7 v 1949 5163 a Ft(c)2184 -5049 y Fx(\001)1316 b Fy(\(2\))-161 5434 y(F)-14 b(or)60 -b Ft(c)52 b Fy(=)h(2)p Ft(:)p Fy(09)59 b(the)g(probabilit)-5 -b(y)60 b(of)e(a)i(random)g(graph)f(b)5 b(eing)-161 5633 -y(acyclic)40 b(is)h Ft(p)k(>)841 5568 y Fn(1)p 841 5595 -67 7 v 841 5690 a(3)927 5633 y Fy(.)69 b(Consequen)-5 -b(tly)-14 b(,)43 b(for)d(suc)-5 b(h)42 b Ft(c)p Fy(,)h(the)d(exp)5 -b(ected)-161 5832 y(n)-5 b(um)g(b)5 b(er)44 b(of)d(iterations)h(to)g -(obtain)g(an)g(acyclic)g(graph)g(is)h(lo)-5 b(w)g(er)-161 -6032 y(than)48 b(3)f(and)g(the)g Ft(g)53 b Fy(function)48 -b(needs)f(2)p Ft(:)p Fy(09)p Ft(n)g Fy(in)-5 b(teger)47 -b(n)-5 b(um)g(b)5 b(ers)-161 6231 y(to)76 b(b)5 b(e)76 -b(stored,)81 b(since)c(its)f(domain)h(is)f(the)g(set)g -Ft(V)37 b Fy(.)136 b(In)76 b(this)-161 6430 y(pap)5 b(er,)80 -b(the)74 b(algorithm)h(prop)5 b(osed)75 b(b)-5 b(y)74 -b(Czec)-5 b(h,)79 b(Ha)-5 b(v)c(as)75 b(and)-161 6629 -y(Ma)9 b(jewski)53 b([1])g(will)g(b)5 b(e)52 b(referred)g(to)g(as)h -(CHM)f(from)h(no)-5 b(w)53 b(on.)5 6829 y(Giv)-5 b(en)63 -b(an)f(acyclic)g(graph)g Ft(G)p Fy(,)i(for)e(the)f(ordering)i(step)f(w) --5 b(e)-161 7028 y(asso)5 b(ciate)85 b(with)g(eac)-5 -b(h)85 b(edge)g(an)g(unique)h(n)-5 b(um)g(b)5 b(er)86 -b Ft(h)p Fy(\()p Ft(e)p Fy(\))95 b Fx(2)-161 7227 y Fy([0)p -Ft(;)28 b(n)49 b Fx(\000)g Fy(1])74 b(in)g(the)f(order)g(of)h(the)f(k) --5 b(eys)73 b(of)g Ft(S)83 b Fy(to)73 b(obtain)h(an)-161 -7426 y(order)50 b(preserving)g(function.)72 b(Figure)50 -b(2)f(illustrates)h(the)f(p)5 b(er-)-161 7626 y(fect)58 -b(assignmen)-5 b(t)60 b(problem)g(for)e(an)h(acyclic)f(graph)h(with)g -(six)-161 7825 y(v)-5 b(ertices)54 b(and)h(with)f(the)g(\014v)-5 -b(e)54 b(table)g(en)-5 b(tries)54 b(assigned)i(to)e(the)-161 -8024 y(edges.)5 8223 y(The)68 b(searc)-5 b(hing)69 b(step)e(starts)h -(from)g(the)f(w)-5 b(eigh)g(ted)68 b(graph)-161 8423 -y Ft(G)e Fy(obtained)g(in)h(the)f(ordering)g(step.)107 -b(F)-14 b(or)66 b(eac)-5 b(h)67 b(connected)-161 8622 -y(comp)5 b(onen)-5 b(t)66 b(of)g Ft(G)f Fy(c)-5 b(ho)5 -b(ose)67 b(a)e(v)-5 b(ertex)65 b Ft(v)72 b Fy(and)67 -b(set)e Ft(g)6 b Fy(\()p Ft(v)g Fy(\))66 b(to)f(0.)-161 -8821 y(F)-14 b(or)54 b(example,)f(supp)5 b(ose)54 b(that)f(v)-5 -b(ertex)51 b(0)i(in)h(Figure)f(2)g(is)g(c)-5 b(ho-)-161 -9020 y(sen)48 b(and)g(the)f(assignmen)-5 b(t)48 b Ft(g)6 -b Fy(\(0\))46 b(=)g(0)h(is)h(made.)72 b(T)-14 b(ra)-5 -b(v)g(erse)48 b(the)-161 9220 y(graph)c(using)h(a)e(depth-\014rst)h(or) -g(a)f(breadth-\014rst)i(searc)-5 b(h)44 b(algo-)-161 -9419 y(rithm,)62 b(b)5 b(eginning)60 b(with)g(v)-5 b(ertex)59 -b Ft(v)6 b Fy(.)87 b(If)60 b(v)-5 b(ertex)58 b Ft(b)j -Fy(is)f(reac)-5 b(hed)-161 9618 y(from)63 b(v)-5 b(ertex)61 -b Ft(a)i Fy(and)g(the)f(v)-9 b(alue)62 b(asso)5 b(ciated)63 -b(with)f(the)g(edge)-161 9817 y Ft(e)56 b Fy(=)f Fx(f)p -Ft(a;)28 b(b)p Fx(g)60 b Fy(is)i Ft(h)p Fy(\()p Ft(e)p -Fy(\),)f(set)f Ft(g)6 b Fy(\()p Ft(b)p Fy(\))60 b(to)h(\()p -Ft(h)p Fy(\()p Ft(e)p Fy(\))39 b Fx(\000)h Ft(g)6 b Fy(\()p -Ft(a)p Fy(\)\))45 b(mo)5 b(d)47 b Ft(n)p Fy(.)89 b(In)-161 -10017 y(Figure)50 b(2,)h(follo)-5 b(wing)50 b(the)e(adjacen)-5 -b(t)49 b(list)h(of)f(v)-5 b(ertex)48 b(0,)i Ft(g)6 b -Fy(\(2\))49 b(is)-161 10216 y(set)60 b(to)f(3.)86 b(Next,)60 -b(follo)-5 b(wing)60 b(the)f(adjacen)-5 b(t)60 b(list)f(of)h(v)-5 -b(ertex)58 b(2,)-161 10415 y Ft(g)6 b Fy(\(1\))55 b(is)h(set)f(to)g(2)h -(and)f Ft(g)6 b Fy(\(3\))55 b(is)h(set)f(to)g(1,)h(and)g(so)f(on.)5061 -1844 y - currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch -translate - 5061 1844 a 5061 411 a - 5788794 5657231 0 0 5788794 5657231 startTexFig - 5061 411 a -%%BeginDocument: figs/perfectassignmentproblem.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: perfectassignmentproblem.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Aug 11 10:39:00 2004 -%%For: fbotelho@donabenta (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 88 86 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 86 moveto 0 0 lineto 88 0 lineto 88 86 lineto closepath clip newpath -132.3 307.1 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Arc -7.500 slw -0 slc -n -1195.1 4178.4 299.6 -46.7899 67.3996 arc -gs col0 s gr - -% Arc -n -3217.5 4972.5 1720.9 -11.3099 -41.8202 arcn -gs col0 s gr - -% Arc -n -4641.4 5663.6 3746.7 -32.5994 -18.0930 arc -gs col0 s gr - -% Arc -n -1645.3 4362.2 338.1 70.0577 171.8700 arc -gs col0 s gr - -% Arc -n -1353.2 4406.8 288.7 18.8384 127.7632 arc -gs col0 s gr - -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n -1474 3656 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 158.75 scf sf --1508 3704 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n -1069 4466 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 158.75 scf sf --1104 4514 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n -980 3926 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 158.75 scf sf --1016 3974 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n -1519 4646 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 158.75 scf sf --1554 4694 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n -1969 4376 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 158.75 scf sf --2005 4424 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n -1924 3837 124 124 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 158.75 scf sf --1959 3885 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 158.75 scf sf --1260 4860 m -gs 1 -1 sc (4) col0 sh gr -/Times-Roman ff 158.75 scf sf --1935 4815 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 158.75 scf sf --1620 4185 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 158.75 scf sf --1350 4185 m -gs 1 -1 sc (3) col0 sh gr -/Times-Roman ff 158.75 scf sf --810 4320 m -gs 1 -1 sc (0) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF - -%%EndDocument - - endTexFig - 5061 1844 a - currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg -exch neg exch translate - 5061 1844 a 6488 555 786 7 v 6485 746 7 -191 v 6587 689 a Ft(v)p 6770 746 V 206 w(g)6 b Fy(\()p -Ft(v)g Fy(\))p 7270 746 V 6488 752 786 7 v 6485 943 7 -191 v 6589 886 a(0)p 6770 943 V 310 w(0)p 7270 943 V -6485 1134 V 6589 1077 a(1)p 6770 1134 V 310 w(2)p 7270 -1134 V 6485 1325 V 6589 1268 a(2)p 6770 1325 V 310 w(3)p -7270 1325 V 6485 1516 V 6589 1459 a(3)p 6770 1516 V 310 -w(1)p 7270 1516 V 6485 1707 V 6589 1650 a(4)p 6770 1707 -V 310 w(0)p 7270 1707 V 6485 1898 V 6589 1841 a(5)p 6770 -1898 V 310 w(1)p 7270 1898 V 6488 1905 786 7 v 4136 2267 -a(Figure)48 b(2:)70 b(P)-5 b(erfect)46 b(assignmen)-5 -b(t)49 b(problem)f(for)f(a)g(graph)h(with)4136 2466 y(six)56 -b(v)-5 b(ertices)55 b(and)h(\014v)-5 b(e)55 b(edges.)4302 -2996 y(No)-5 b(w)62 b(w)-5 b(e)61 b(sho)-5 b(w)63 b(wh)-5 -b(y)61 b Ft(G)g Fy(m)-5 b(ust)63 b(b)5 b(e)61 b(acyclic.)91 -b(If)61 b(the)h(graph)4136 3195 y Ft(G)52 b Fy(w)-5 b(as)54 -b(not)e(acyclic,)g(the)g(assignmen)-5 b(t)55 b(pro)5 -b(cess)53 b(migh)-5 b(t)53 b(trace)4136 3394 y(around)f(a)f(cycle)f -(and)h(insist)h(on)g(reassigning)g(some)g(already-)4136 -3593 y(pro)5 b(cessed)57 b(v)-5 b(ertex)55 b(with)h(a)g(di\013eren)-5 -b(t)56 b Ft(g)62 b Fy(v)-9 b(alue)56 b(than)g(the)g(one)4136 -3793 y(that)g(has)i(already)e(b)5 b(een)57 b(assigned)h(to)e(it.)78 -b(F)-14 b(or)57 b(example,)h(let)4136 3992 y(us)67 b(supp)5 -b(ose)67 b(that)f(in)g(Figure)h(2)f(the)g(edge)g Fx(f)p -Fy(3)p Ft(;)28 b Fy(4)p Fx(g)66 b Fy(has)g(b)5 b(een)4136 -4191 y(replaced)56 b(b)-5 b(y)55 b(the)g(edge)h Fx(f)p -Fy(0)p Ft(;)28 b Fy(1)p Fx(g)p Fy(.)73 b(In)56 b(this)g(case,)f(t)-5 -b(w)g(o)56 b(di\013eren)-5 b(t)4136 4390 y(v)c(alues)70 -b(are)g(set)g(to)g Ft(g)6 b Fy(\(0\).)117 b(F)-14 b(ollo)-5 -b(wing)72 b(the)d(adjacen)-5 b(t)70 b(list)g(of)4136 -4590 y(v)-5 b(ertex)45 b(1,)j Ft(g)6 b Fy(\(0\))45 b(is)h(set)g(to)f -(4.)71 b(But)45 b Ft(g)6 b Fy(\(0\))46 b(w)-5 b(as)46 -b(set)g(to)f(0)h(b)5 b(efore.)4136 5139 y Fv(5)270 b(The)90 -b(New)g(Algorithm)4136 5502 y Fy(In)80 b(this)f(section)h(w)-5 -b(e)79 b(presen)-5 b(t)80 b(a)f(new)h(algorithm)g(for)f(con-)4136 -5701 y(structing)i(minimal)g(p)5 b(erfect)79 b(hash)i(functions,)87 -b(where)81 b(the)4136 5901 y(order)53 b(of)f(the)g(k)-5 -b(eys)53 b(in)g Ft(S)62 b Fy(is)53 b(not)g(preserv)-5 -b(ed.)73 b(The)53 b(algorithm)4136 6100 y(is)e(based)h(on)f(the)f(MOS)h -(approac)-5 b(h)52 b(and)f(solv)-5 b(es)51 b(the)f(problem)4136 -6299 y(presen)-5 b(ted)49 b(in)g(Figure)g(1\(b\).)71 -b(The)49 b(main)g(no)-5 b(v)g(elt)g(y)49 b(is)g(that)f(the)4136 -6498 y(random)j(graph)g Ft(G)f Fy(migh)-5 b(t)50 b(ha)-5 -b(v)g(e)51 b(cycles)f(and)g(ev)-5 b(en)50 b(so)h(w)-5 -b(e)50 b(are)4136 6698 y(able)56 b(to)f(\014nd)h(a)f(MPHF.)4302 -6897 y(The)79 b(new)f(algorithm)h(lo)5 b(oks)78 b(for)g(a)g(function)h -Ft(g)90 b Fy(:)85 b Ft(V)121 b Fx(!)4136 7096 y(f\000j)p -Ft(V)37 b Fx(j)29 b Fy(+)g(1)p Ft(;)f(:)g(:)g(:)f(;)h -Fy(0)p Ft(;)g Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h Fx(j)p Ft(V)37 -b Fx(j)29 b(\000)g Fy(1)p Fx(g)51 b Fy(suc)-5 b(h)53 -b(that)d(the)h(function)4136 7295 y Ft(h)46 b Fy(:)g -Ft(E)56 b Fx(!)46 b(f)p Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f(;)h -(m)36 b Fx(\000)h Fy(1)p Fx(g)56 b Fy(de\014ned)g(as)5273 -7660 y Ft(h)p Fy(\()p Ft(e)p Fy(\))45 b(=)h Ft(g)6 b -Fy(\()p Ft(a)p Fy(\))36 b(+)h Ft(g)6 b Fy(\()p Ft(b)p -Fy(\))1256 b(\(3\))4136 8024 y(is)68 b(a)e(bijection,)k(where)c -Ft(e)g Fy(=)f Fx(f)p Ft(a;)28 b(b)p Fx(g)p Fy(.)108 b(This)68 -b(means)g(that)e(w)-5 b(e)4136 8223 y(are)65 b(lo)5 b(oking)64 -b(for)h(an)g(assignmen)-5 b(t)66 b(of)f(v)-9 b(alues)65 -b(to)f(v)-5 b(ertices)65 b(so)4136 8423 y(that)j(for)h(eac)-5 -b(h)68 b(edge)h(the)f(sum)i(of)e(v)-9 b(alues)69 b(asso)5 -b(ciated)68 b(with)4136 8622 y(endp)5 b(oin)-5 b(ts)68 -b(is)g(a)f(unique)g(in)-5 b(teger)67 b(in)g(the)g(range)g([0)p -Ft(;)28 b(m)44 b Fx(\000)h Fy(1].)4136 8821 y(Notice)59 -b(that)h(w)-5 b(e)60 b(do)g(not)g(need)g(to)g(tak)-5 -b(e)59 b(the)h(sum)h(of)f(v)-9 b(alues)4136 9020 y(asso)5 -b(ciated)56 b(with)f(endp)5 b(oin)-5 b(ts)56 b(of)f(the)g(edges)h(mo)5 -b(dulo)56 b Ft(n)p Fy(.)4302 9220 y(Figure)72 b(3)f(presen)-5 -b(ts)72 b(a)e(pseudo)i(co)5 b(de)71 b(for)f(the)h(new)g(algo-)4136 -9419 y(rithm.)120 b(The)71 b(pro)5 b(cedure)70 b(NewAlgorithm)g(\()p -Ft(S)10 b Fy(,)74 b Ft(g)6 b Fy(\))70 b(receiv)-5 b(es)4136 -9618 y(as)58 b(input)f(the)f(set)h(of)f(k)-5 b(eys)57 -b(from)g Ft(S)66 b Fy(and)57 b(pro)5 b(duces)58 b(the)e(p)5 -b(er-)4136 9817 y(fect)49 b(assignmen)-5 b(t)51 b(of)f(v)-5 -b(ertices)49 b(represen)-5 b(ted)51 b(b)-5 b(y)50 b(the)f(function)4136 -10017 y Ft(g)6 b Fy(.)106 b(The)66 b(mapping)h(step)f(generates)f(a)h -(random)h(undirected)4136 10216 y(graph)e Ft(G)f Fy(taking)g -Ft(S)74 b Fy(as)64 b(input.)102 b(The)64 b(ordering)h(step)f(deter-) -4136 10415 y(mines)j(the)e(order)h(in)g(whic)-5 b(h)67 -b(hash)g(v)-9 b(alues)66 b(are)f(assigned)j(to)3906 10913 -y(4)p eop end -%%Page: 5 5 -TeXDict begin 5 4 bop -161 620 a Fy(k)-5 b(eys.)86 b(It)59 -b(partitions)h(the)f(graph)h Ft(G)f Fy(in)-5 b(to)60 -b Ft(G)2654 645 y Fr(cr)t(it)2943 620 y Fy(and)g Ft(G)3401 -645 y Fr(ncr)t(it)3712 620 y Fy(.)-161 819 y(The)52 b(searc)-5 -b(hing)53 b(step)f(pro)5 b(duces)52 b(the)f(p)5 b(erfect)50 -b(assignmen)-5 b(t)54 b(of)-161 1018 y(v)-5 b(ertices)63 -b(in)g Ft(G)p Fy(,)h(whic)-5 b(h)64 b(is)f(represen)-5 -b(ted)64 b(b)-5 b(y)63 b(the)f(function)h Ft(g)6 b Fy(.)-161 -1218 y(It)55 b(starts)h(with)f Ft(G)992 1243 y Fr(cr)t(it)1277 -1218 y Fy(and)h(\014nishes)h(with)e Ft(G)2692 1243 y -Fr(ncr)t(it)3004 1218 y Fy(.)p -169 1623 9 103 v -169 -1529 103 9 v -66 1529 3730 9 v 3664 1529 103 9 v 3759 -1623 9 103 v -169 1780 9 150 v 3758 1780 V -72 1735 a -Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)76 b Fu(NewAlgorithm)82 -b(\()16 b Fk(S)40 b Fu(,)83 b Fk(g)15 b Fu(\))p -169 -1937 V 3758 1937 V 166 1892 a(M)-5 b(a)g(p)g(p)g(i)g(n)g(g)79 -b(\()15 b Fk(S)41 b Fu(,)83 b Fk(G)19 b Fu(\))g(;)p -169 -2094 V 3758 2094 V 175 2049 a(O)t(r)t(d)t(e)t(r)t(i)t(n)t(g)87 -b(\()15 b Fk(G)33 b Fu(,)83 b Fk(G)1361 2066 y Fj(cr)s(it)1610 -2049 y Fu(,)g Fk(G)1856 2066 y Fj(ncr)s(it)2168 2049 -y Fu(\))19 b(;)p -169 2251 V 3758 2251 V 177 2206 a(S)6 -b(e)g(a)g(r)g(c)g(h)g(i)g(n)g(g)93 b(\()15 b Fk(G)33 -b Fu(,)83 b Fk(G)1440 2223 y Fj(cr)s(it)1689 2206 y Fu(,)g -Fk(G)1935 2223 y Fj(ncr)s(it)2261 2206 y Fu(,)g Fk(g)24 -b Fu(\))19 b(;)p -169 2354 9 103 v -168 2354 103 9 v --66 2354 3730 9 v 3664 2354 103 9 v 3759 2354 9 103 v -230 2776 a Fy(Figure)56 b(3:)74 b(Main)56 b(steps)g(of)f(the)g(new)h -(algorithm.)-161 3481 y Fi(5.1)225 b(Mapping)73 b(Step)-161 -3796 y Fy(The)67 b(pro)5 b(cedure)67 b(Mapping)h(\()p -Ft(S)10 b Fy(,)68 b Ft(G)p Fy(\))e(receiv)-5 b(es)67 -b(as)g(input)h(the)-161 3996 y(set)53 b(of)g(k)-5 b(eys)53 -b(from)g Ft(S)63 b Fy(and)53 b(generates)g(a)g(random)h(undirected)-161 -4195 y(graph)42 b Ft(G)e Fy(without)g(self-lo)5 b(ops)42 -b(and)f(m)-5 b(ultiple)42 b(edges.)69 b(T)-14 b(o)41 -b(gen-)-161 4394 y(erate)79 b(the)g(MPHF,)h(the)f(n)-5 -b(um)g(b)5 b(er)80 b(of)f(critical)g(edges)h(in)g Ft(G)-161 -4593 y Fy(m)-5 b(ust)63 b(b)5 b(e)61 b Fx(j)p Ft(E)658 -4618 y Fr(cr)t(it)888 4593 y Fx(j)56 b(\024)1196 4528 -y Fn(1)p 1196 4555 67 7 v 1196 4651 a(2)1282 4593 y Fx(j)p -Ft(E)10 b Fx(j)p Fy(.)92 b(The)61 b(reason)i(is)f(that)f(the)g(maxi-) --161 4793 y(mal)44 b(v)-9 b(alue)44 b(of)f Ft(h)p Fy(\()p -Ft(e)p Fy(\))g(assigned)i(to)e(an)h(edge)f Ft(e)k Fx(2)e -Ft(E)53 b Fy(in)44 b(this)g(case)-161 4992 y(is)60 b -Ft(m)38 b Fx(\000)i Fy(1.)83 b(In)59 b(Section)f(5.3.1)h(w)-5 -b(e)59 b(sho)-5 b(w)60 b(that)e(the)g(condition)-161 -5191 y Fx(j)p Ft(E)8 5216 y Fr(cr)t(it)238 5191 y Fx(j)46 -b(\024)526 5126 y Fn(1)p 526 5153 V 526 5248 a(2)612 -5191 y Fx(j)p Ft(E)10 b Fx(j)53 b Fy(is)i(necessary)g(and)g(su\016cien) --5 b(t)56 b(to)e(generate)f(a)-161 5390 y(MPHF.)5 5594 -y(The)73 b(random)h(graph)g Ft(G)e Fy(is)i(generated)e(using)i(t)-5 -b(w)g(o)73 b(hash)-161 5794 y(functions)66 b Ft(h)661 -5819 y Fn(1)800 5794 y Fy(and)g Ft(h)1229 5819 y Fn(2)1303 -5794 y Fy(.)103 b(The)66 b(functions)f Ft(h)2625 5819 -y Fn(1)2765 5794 y Fy(and)g Ft(h)3193 5819 y Fn(2)3333 -5794 y Fy(trans-)-161 5993 y(form)57 b(the)e(k)-5 b(eys)56 -b(from)g Ft(S)66 b Fy(to)55 b(in)-5 b(tegers)57 b(in)f([0)p -Ft(;)28 b Fx(j)p Ft(V)37 b Fx(j)g(\000)h Fy(1],)56 b(so)h(the)-161 -6192 y(set)50 b(of)g(v)-5 b(ertices)50 b Ft(V)87 b Fy(has)51 -b Fx(j)p Ft(V)37 b Fx(j)50 b Fy(v)-5 b(ertices)50 b(and)h(eac)-5 -b(h)50 b(one)g(of)g(them)-161 6391 y(is)63 b(lab)5 b(elled)62 -b(with)g(a)g(distinct)h(v)-9 b(alue)61 b(from)i([0)p -Ft(;)28 b Fx(j)p Ft(V)36 b Fx(j)42 b(\000)f Fy(1].)95 -b(F)-14 b(or)-161 6591 y(eac)-5 b(h)54 b(k)-5 b(ey)54 -b Ft(x)f Fy(from)h Ft(S)64 b Fy(the)53 b(edge)h Fx(f)p -Ft(h)2055 6616 y Fn(1)2129 6591 y Fy(\()p Ft(x)p Fy(\))p -Ft(;)28 b(h)2524 6616 y Fn(2)2597 6591 y Fy(\()p Ft(x)p -Fy(\))p Fx(g)53 b Fy(is)h(added)h(to)-161 6790 y Ft(E)10 -b Fy(.)5 6994 y(A)74 b(self-lo)5 b(op)75 b(o)5 b(ccurs)74 -b(when)g Ft(h)1959 7019 y Fn(1)2033 6994 y Fy(\()p Ft(x)p -Fy(\))j(=)h Ft(h)2638 7019 y Fn(2)2712 6994 y Fy(\()p -Ft(x)p Fy(\).)129 b(T)-14 b(o)74 b(a)-5 b(v)g(oid)-161 -7193 y(self-lo)5 b(ops)41 b(w)-5 b(e)40 b(mo)5 b(dify)39 -b Ft(h)1412 7218 y Fn(2)1486 7193 y Fy(\()p Ft(x)p Fy(\))g(b)-5 -b(y)39 b(adding)i(a)e(random)i(n)-5 b(um)g(b)5 b(er)-161 -7392 y(in)56 b(the)e(range)i([1)p Ft(;)28 b Fx(j)p Ft(V)36 -b Fx(j)h(\000)f Fy(1].)74 b(When)55 b(a)g(m)-5 b(ultiple)56 -b(edge)f(o)5 b(ccurs)-161 7591 y(w)-5 b(e)56 b(ab)5 b(ort)55 -b(and)h(start)f(again)g(a)h(new)f(iteration.)5 7795 y(W)-14 -b(e)42 b(no)-5 b(w)43 b(sho)-5 b(w)43 b(that)f(the)f(exp)5 -b(ected)41 b(n)-5 b(um)g(b)5 b(er)43 b(of)f(iterations)-161 -7995 y(to)70 b(obtain)h Ft(G)f Fy(is)h(constan)-5 b(t.)120 -b(Let)69 b Ft(p)h Fy(b)5 b(e)70 b(the)g(probabilit)-5 -b(y)72 b(of)-161 8194 y(generating)d(a)g(random)h(graph)g -Ft(G)e Fy(without)h(self-lo)5 b(ops)70 b(and)-161 8393 -y(m)-5 b(ultiple)60 b(edges.)86 b(Let)58 b Ft(X)72 b -Fy(b)5 b(e)59 b(a)g(random)h(v)-9 b(ariable)59 b(coun)-5 -b(ting)-161 8592 y(the)56 b(n)-5 b(um)g(b)5 b(er)58 b(of)e(iterations)g -(to)f(generate)h Ft(G)p Fy(.)76 b(V)-14 b(ariable)56 -b Ft(X)69 b Fy(is)-161 8792 y(said)k(to)f(ha)-5 b(v)g(e)72 -b(the)g(geometric)f(distribution)j(with)d Ft(P)23 b Fy(\()p -Ft(X)86 b Fy(=)-161 8991 y Ft(i)p Fy(\))46 b(=)h Ft(p)p -Fy(\(1)19 b Fx(\000)g Ft(p)p Fy(\))731 8931 y Fr(i)p -Fo(\000)p Fn(1)953 8991 y Fy(.)71 b(So,)48 b(the)e(exp)5 -b(ected)45 b(n)-5 b(um)g(b)5 b(er)47 b(of)f(iterations)-161 -9190 y(to)53 b(generate)f Ft(G)g Fy(is)i Ft(N)1183 9215 -y Fr(i)1238 9190 y Fy(\()p Ft(X)13 b Fy(\))45 b(=)1739 -9066 y Fp(P)1915 9107 y Fo(1)1915 9240 y Fr(j)7 b Fn(=1)2180 -9190 y Ft(j)j(P)23 b Fy(\()p Ft(X)58 b Fy(=)47 b Ft(j)10 -b Fy(\))45 b(=)h(1)p Ft(=p)53 b Fy(and)-161 9414 y(its)j(v)-9 -b(ariance)55 b(is)h Ft(V)36 b Fy(\()p Ft(X)13 b Fy(\))45 -b(=)i(\(1)36 b Fx(\000)h Ft(p)p Fy(\))p Ft(=p)2190 9354 -y Fn(2)2263 9414 y Fy(.)5 9618 y(Let)52 b Ft(\030)59 -b Fy(b)5 b(e)52 b(the)g(space)h(of)f(edges)g(in)h Ft(G)f -Fy(that)f(ma)-5 b(y)53 b(b)5 b(e)52 b(gener-)-161 9817 -y(ated)58 b(b)-5 b(y)58 b Ft(h)540 9842 y Fn(1)673 9817 -y Fy(and)g Ft(h)1094 9842 y Fn(2)1168 9817 y Fy(.)82 -b(The)58 b(graphs)i(generated)d(in)i(this)f(step)-161 -10017 y(are)64 b(undirected)g(and)g(the)f(n)-5 b(um)g(b)5 -b(er)65 b(of)f(p)5 b(ossible)65 b(edges)f(in)g Ft(\030)-161 -10216 y Fy(is)f(giv)-5 b(en)62 b(b)-5 b(y)62 b Fx(j)p -Ft(\030)8 b Fx(j)57 b Fy(=)1106 10082 y Fp(\000)1182 -10142 y Fo(j)p Fr(V)30 b Fo(j)1242 10273 y Fn(2)1368 -10082 y Fp(\001)1444 10216 y Fy(.)94 b(The)62 b(n)-5 -b(um)g(b)5 b(er)63 b(of)f(p)5 b(ossible)63 b(edges)-161 -10415 y(that)54 b(migh)-5 b(t)55 b(b)5 b(ecome)54 b(a)g(m)-5 -b(ultiple)55 b(edge)f(when)h(the)e Ft(j)10 b Fy(th)54 -b(edge)4136 620 y(is)43 b(added)h(to)e Ft(G)g Fy(is)h -Ft(j)21 b Fx(\000)11 b Fy(1,)46 b(and)e(the)e(incremen)-5 -b(tal)43 b(construction)4136 819 y(of)55 b Ft(G)g Fy(implies)i(that)e -Ft(p)p Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))55 b(is:)4331 -1313 y Ft(p)p Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))46 -b(=)5065 1106 y Fr(n)5000 1155 y Fp(Y)4991 1509 y Fr(j)7 -b Fn(=1)5268 1056 y Fp(\000)5344 1117 y Fo(j)p Fr(V)30 -b Fo(j)5404 1248 y Fn(2)5530 1056 y Fp(\001)5643 1190 -y Fx(\000)37 b Fy(\()p Ft(j)47 b Fx(\000)37 b Fy(1\))p -5268 1275 1035 7 v 5616 1321 a Fp(\000)5692 1382 y Fo(j)p -Fr(V)30 b Fo(j)5752 1513 y Fn(2)5878 1321 y Fp(\001)6368 -1313 y Fy(=)6544 1106 y Fr(n)p Fo(\000)p Fn(1)6564 1155 -y Fp(Y)6555 1509 y Fr(j)7 b Fn(=0)6843 1056 y Fp(\000)6919 -1117 y Fo(j)p Fr(V)30 b Fo(j)6979 1248 y Fn(2)7105 1056 -y Fp(\001)7218 1190 y Fx(\000)37 b Ft(j)p 6843 1275 619 -7 v 6984 1321 a Fp(\000)7060 1382 y Fo(j)p Fr(V)29 b -Fo(j)7120 1513 y Fn(2)7246 1321 y Fp(\001)7482 1313 y -Fx(\001)4302 1826 y Fy(As)56 b Fx(j)p Ft(V)37 b Fx(j)46 -b Fy(=)g Ft(cn)55 b Fy(w)-5 b(e)55 b(can)h(rewrite)e(the)h(probabilit) --5 b(y)56 b Ft(p)p Fy(\()p Ft(n)p Fy(\))e(as:)5019 2321 -y Ft(p)p Fy(\()p Ft(n)p Fy(\))45 b(=)5553 2113 y Fr(n)p -Fo(\000)p Fn(1)5573 2163 y Fp(Y)5564 2516 y Fr(j)7 b -Fn(=0)5833 2321 y Fy(1)37 b Fx(\000)6119 2086 y Fp(\022)6528 -2208 y Fy(2)p Ft(j)p 6261 2282 695 7 v 6261 2434 a(c)6333 -2386 y Fn(2)6407 2434 y Ft(n)6507 2386 y Fn(2)6618 2434 -y Fx(\000)g Ft(cn)6976 2086 y Fp(\023)7126 2321 y Fx(\001)4302 -2834 y Fy(Using)58 b(an)g(asymptotic)f(estimate)g(from)h(P)-5 -b(almer)58 b([15],)g(for)4136 3033 y(t)-5 b(w)g(o)62 -b(functions)h Ft(f)5260 3058 y Fn(1)5391 3033 y Fy(:)57 -b Fx(<)g(!)g(<)k Fy(and)i Ft(f)6486 3058 y Fn(2)6617 -3033 y Fy(:)57 b Fx(<)g(!)g(<)62 b Fy(de\014ned)g(b)-5 -b(y)4136 3232 y Ft(f)4217 3257 y Fn(1)4292 3232 y Fy(\()p -Ft(k)5 b Fy(\))46 b(=)g(1)36 b Fx(\000)g Ft(k)60 b Fy(and)55 -b Ft(f)5567 3257 y Fn(2)5642 3232 y Fy(\()p Ft(k)5 b -Fy(\))46 b(=)g Ft(e)6161 3172 y Fo(\000)p Fr(k)6347 3232 -y Fy(,)55 b(the)g(inequalit)-5 b(y)54 b Ft(f)7584 3257 -y Fn(1)7659 3232 y Fy(\()p Ft(k)5 b Fy(\))46 b Fx(\024)4136 -3432 y Ft(f)4217 3457 y Fn(2)4292 3432 y Fy(\()p Ft(k)5 -b Fy(\))70 b(is)h(true)f Fx(8)47 b Ft(k)76 b Fx(2)71 -b(<)p Fy(.)118 b(Considering)71 b Ft(k)77 b Fy(=)7404 -3357 y Fn(2)p Fr(j)p 7210 3393 517 7 v 7210 3489 a(c)7269 -3456 y Fh(2)7334 3489 y Fr(n)7416 3456 y Fh(2)7481 3489 -y Fo(\000)p Fr(cn)7746 3432 y Fy(,)d(w)-5 b(e)4136 3631 -y(ha)g(v)g(e)4769 4083 y Ft(p)p Fy(\()p Ft(n)p Fy(\))45 -b Fx(\024)5303 3876 y Fr(n)p Fo(\000)p Fn(1)5323 3926 -y Fp(Y)5314 4279 y Fr(j)7 b Fn(=0)5583 4083 y Ft(e)5660 -3993 y Fo(\000)5764 3871 y Fp(\000)6041 3938 y Fh(2)p -Fm(j)p 5860 3967 474 7 v 5860 4052 a(c)5914 4028 y Fh(2)5978 -4052 y Fm(n)6051 4028 y Fh(2)6116 4052 y Fg(\000)p Fm(cn)6353 -3871 y Fp(\001)6484 4083 y Fy(=)46 b Ft(e)6736 3993 y -Fo(\000)6840 3871 y Fp(\000)6994 3940 y Fm(n)p Fg(\000)p -Fh(1)p 6936 3967 336 7 v 6936 4052 a Fm(c)6990 4028 y -Fh(2)7055 4052 y Fm(n)p Fg(\000)p Fm(c)7292 3871 y Fp(\001)7376 -4083 y Ft(:)4136 4587 y Fy(Th)-5 b(us,)5337 4948 y(lim)5278 -5048 y Fr(n)p Fo(!1)5653 4948 y Ft(p)p Fy(\()p Ft(n)p -Fy(\))44 b Fx(')j Ft(e)6264 4871 y Fo(\000)6419 4827 -y Fh(1)p 6388 4846 119 7 v 6388 4930 a Fm(c)6442 4906 -y Fh(2)6535 4948 y Ft(:)1262 b Fy(\(4\))4302 5393 y(As)59 -b Ft(N)4684 5418 y Fr(i)4740 5393 y Fy(\()p Ft(X)13 b -Fy(\))50 b(=)i(1)p Ft(=p)59 b Fy(then)g Ft(N)6076 5418 -y Fr(i)6131 5393 y Fy(\()p Ft(X)13 b Fy(\))51 b Fx(')h -Ft(e)6772 5271 y Fh(1)p 6741 5290 V 6741 5375 a Fm(c)6795 -5351 y Fh(2)6888 5393 y Fy(.)84 b(After)58 b(that,)h(w)-5 -b(e)4136 5592 y(empirically)60 b(determine)g(the)g Ft(c)f -Fy(v)-9 b(alue)60 b(to)f(obtain)h(a)g(random)4136 5791 -y(graph)f Ft(G)g Fy(with)f Fx(j)p Ft(E)5350 5816 y Fr(cr)t(it)5580 -5791 y Fx(j)51 b(\024)5878 5726 y Fn(1)p 5878 5753 67 -7 v 5878 5849 a(2)5964 5791 y Fx(j)p Ft(E)10 b Fx(j)p -Fy(.)83 b(F)-14 b(or)59 b(this)g(w)-5 b(e)59 b(built)g(10,000)4136 -5991 y(graphs)h(for)e(eac)-5 b(h)59 b Ft(c)f Fy(v)-9 -b(alue)58 b(and)h(n)-5 b(um)g(b)5 b(er)60 b(of)e(k)-5 -b(eys)58 b(presen)-5 b(ted)4136 6190 y(in)41 b(T)-14 -b(able)41 b(1.)69 b(The)40 b(t)-5 b(w)g(o)41 b(collections)f(used)h(in) -g(the)f(exp)5 b(erimen)-5 b(ts)4136 6389 y(\(T)-14 b(o)5 -b(doBR)61 b(and)g(TREC-VLC2\))g(are)g(describ)5 b(ed)61 -b(in)h(T)-14 b(able)61 b(4)4136 6588 y(\(see)55 b(Section)g(7)h(for)f -(more)g(details\).)4302 6788 y(W)-14 b(e)89 b(sho)-5 -b(w)90 b(in)f(T)-14 b(able)89 b(1)g(the)g(probabilit)-5 -b(y)90 b Ft(P)7266 6818 y Fo(j)p Fr(E)7402 6835 y Fm(cr)s(it)7614 -6818 y Fo(j)7751 6788 y Fy(that)4136 7003 y Fx(j)p Ft(E)4305 -7028 y Fr(cr)t(it)4535 7003 y Fx(j)83 b(\024)4896 6938 -y Fn(1)p 4896 6965 V 4896 7061 a(2)4983 7003 y Fx(j)p -Ft(E)10 b Fx(j)p Fy(,)82 b Fx(j)p Ft(E)10 b Fx(j)83 b -Fy(=)g Ft(n)p Fy(,)g(tends)78 b(to)f(0)h(when)g Ft(c)83 -b(<)g Fy(1)p Ft(:)p Fy(15)4136 7203 y(and)55 b Ft(n)g -Fy(increases.)74 b(Ho)-5 b(w)g(ev)g(er,)55 b(it)f(tends)h(to)f(1)h -(when)g Ft(c)46 b Fx(\025)g Fy(1)p Ft(:)p Fy(15)4136 -7402 y(and)76 b Ft(n)g Fy(increases.)135 b(Th)-5 b(us,)82 -b Fx(j)p Ft(V)37 b Fx(j)80 b Fy(=)g(1)p Ft(:)p Fy(15)p -Ft(n)75 b Fy(is)i(considered)f(a)4136 7601 y Fs(thr)-8 -b(eshold)78 b(function)e Fy(\(a)f(de\014nition)h(coined)f(b)-5 -b(y)76 b(Erd\177)-83 b(os)76 b(and)4136 7800 y(R)-5 b(\023)-78 -b(en)-5 b(yi)64 b([3,)f(5]\))g(for)g(generating)g(a)h(random)g(graph)g -Ft(G)e Fy(where)4136 8000 y Fx(j)p Ft(E)4305 8025 y Fr(cr)t(it)4535 -8000 y Fx(j)74 b(\024)4878 7934 y Fn(1)p 4878 7961 V -4878 8057 a(2)4964 8000 y Fx(j)p Ft(E)10 b Fx(j)72 b -Fy(with)g(probabilit)-5 b(y)72 b(tending)h(to)e(1)i(when)f(n)4136 -8199 y(increases.)78 b(Therefore,)56 b(w)-5 b(e)57 b(use)g -Ft(c)48 b Fy(=)g(1)p Ft(:)p Fy(15)56 b(in)h(the)f(new)h(algo-)4136 -8398 y(rithm.)4302 8597 y(The)68 b(MPHF)g(generated)g(b)-5 -b(y)68 b(the)g(new)g(algorithm)h(needs)4136 8797 y(1)p -Ft(:)p Fy(15)p Ft(n)52 b Fy(in)-5 b(teger)53 b(n)-5 b(um)g(b)5 -b(ers)54 b(to)e(b)5 b(e)52 b(stored,)h(since)g Fx(j)p -Ft(V)37 b Fx(j)46 b Fy(=)g(1)p Ft(:)p Fy(15)p Ft(n)p -Fy(.)4136 8996 y(Th)-5 b(us,)113 b(the)101 b(generated)f(function)g(is) -h(stored)g(in)g(55\045)g(|)4136 9195 y(1)p Ft(:)p Fy(15)p -Ft(n=)p Fy(2)p Ft(:)p Fy(09)p Ft(n)52 b Fy(|)g(of)g(the)f(space)i -(necessary)f(to)g(store)f(the)h(one)4136 9395 y(generated)j(b)-5 -b(y)56 b(the)f(CHM)g(algorithm.)4302 9594 y(As)h Ft(P)4655 -9624 y Fo(j)p Fr(E)4791 9641 y Fm(cr)s(it)5003 9624 y -Fo(j)5106 9594 y Fy(tends)f(to)g(1)h(when)f Ft(n)g Fy(increases,)h(w)-5 -b(e)55 b(consider)4136 9793 y(that)42 b(the)g(exp)5 b(ected)41 -b(n)-5 b(um)g(b)5 b(er)44 b(of)e(iterations)g(to)g(generate)g -Ft(G)g Fy(is)4136 10017 y Ft(N)4269 10042 y Fr(i)4325 -10017 y Fy(\()p Ft(X)13 b Fy(\))47 b Fx(')h Ft(e)4958 -9895 y Fh(1)p 4927 9914 119 7 v 4927 9999 a Fm(c)4981 -9975 y Fh(2)5074 10017 y Fy(.)77 b(F)-14 b(or)58 b Ft(c)47 -b Fy(=)i(1)p Ft(:)p Fy(15,)57 b Ft(N)6325 10042 y Fr(i)6380 -10017 y Fy(\()p Ft(X)13 b Fy(\))47 b Fx(')h Fy(2)p Ft(:)p -Fy(13)57 b(on)g(a)-5 b(v)g(erage,)4136 10216 y(whic)g(h)72 -b(is)g(constan)-5 b(t.)121 b(So,)75 b(the)c(mapping)h(step)f(tak)-5 -b(es)71 b Ft(O)5 b Fy(\()p Ft(n)p Fy(\))4136 10415 y(time.)3906 -10913 y(5)p eop end -%%Page: 6 6 -TeXDict begin 6 5 bop -90 460 8074 7 v 1902 635 a Fu(VLC2)51 -b(\()p Fk(n)p Fu(\))3155 b(T)-13 b(o)t(doBR)52 b(\()p -Fk(n)p Fu(\))p 383 727 3702 7 v 4283 727 V 139 895 a -Fk(c)277 b Fu(1)p Fk(;)25 b Fu(000)199 b(10)p Fk(;)25 -b Fu(000)198 b(100)p Fk(;)25 b Fu(000)199 b(1)p Fk(;)25 -b Fu(000)p Fk(;)f Fu(000)199 b(3)p Fk(;)25 b Fu(000)p -Fk(;)g Fu(000)398 b(1)p Fk(;)25 b Fu(000)198 b(10)p Fk(;)25 -b Fu(000)199 b(100)p Fk(;)24 b Fu(000)199 b(1)p Fk(;)25 -b Fu(000)p Fk(;)g Fu(000)198 b(3)p Fk(;)26 b Fu(000)p -Fk(;)e Fu(000)p -90 978 8074 7 v 10 1194 a(1.10)249 b(0.01)340 -b(0.00)415 b(0.00)527 b(0.00)600 b(0.00)649 b(0.02)339 -b(0.00)416 b(0.00)527 b(0.00)599 b(0.00)10 1377 y(1.11)249 -b(0.04)340 b(0.00)415 b(0.00)527 b(0.00)600 b(0.00)649 -b(0.05)339 b(0.00)416 b(0.00)527 b(0.00)599 b(0.00)10 -1559 y(1.12)249 b(0.12)340 b(0.00)415 b(0.00)527 b(0.00)600 -b(0.00)649 b(0.13)339 b(0.00)416 b(0.00)527 b(0.00)599 -b(0.00)10 1742 y(1.13)249 b(0.19)340 b(0.03)415 b(0.00)527 -b(0.00)600 b(0.00)649 b(0.20)339 b(0.02)416 b(0.00)527 -b(0.00)599 b(0.00)10 1925 y(1.14)249 b(0.30)340 b(0.09)415 -b(0.00)527 b(0.00)600 b(0.00)649 b(0.31)339 b(0.11)416 -b(0.00)527 b(0.00)599 b(0.00)10 2107 y(1.15)249 b(0.50)340 -b(0.56)415 b(0.65)527 b(0.89)600 b(1.00)649 b(0.51)339 -b(0.57)416 b(0.65)527 b(0.88)599 b(1.00)10 2290 y(1.16)249 -b(0.68)340 b(0.70)415 b(0.88)527 b(0.95)600 b(1.00)649 -b(0.70)339 b(0.83)416 b(0.95)527 b(0.95)599 b(1.00)10 -2473 y(1.17)249 b(0.77)340 b(0.82)415 b(0.90)527 b(1.00)600 -b(1.00)649 b(0.78)339 b(0.99)416 b(0.98)527 b(1.00)599 -b(1.00)10 2655 y(1.18)249 b(0.91)340 b(0.97)415 b(0.98)527 -b(1.00)600 b(1.00)649 b(0.91)339 b(1.00)416 b(1.00)527 -b(1.00)599 b(1.00)10 2838 y(1.19)249 b(0.94)340 b(1.00)415 -b(1.00)527 b(1.00)600 b(1.00)649 b(0.95)339 b(1.00)416 -b(1.00)527 b(1.00)599 b(1.00)10 3021 y(1.20)249 b(0.98)340 -b(1.00)415 b(1.00)527 b(1.00)600 b(1.00)649 b(0.99)339 -b(1.00)416 b(1.00)527 b(1.00)599 b(1.00)p -90 3129 V --161 3477 a Fy(T)-14 b(able)49 b(1:)70 b(Probabilit)-5 -b(y)49 b Ft(P)1458 3507 y Fo(j)p Fr(E)1594 3524 y Fm(cr)s(it)1807 -3507 y Fo(j)1903 3477 y Fy(that)e Fx(j)p Ft(E)2424 3502 -y Fr(cr)t(it)2654 3477 y Fx(j)f(\024)2942 3411 y Fn(1)p -2942 3438 67 7 v 2942 3534 a(2)3028 3477 y Ft(n)i Fy(for)g(di\013eren) --5 b(t)48 b Ft(c)g Fy(v)-9 b(alues)49 b(and)g(di\013eren)-5 -b(t)48 b(n)-5 b(um)g(b)5 b(er)50 b(of)e(k)-5 b(eys)48 -b(for)g(the)g(collections)-161 3676 y(VLC2)55 b(and)h(T)-14 -b(o)5 b(doBR.)5 4174 y(The)72 b(new)f(algorithm)i(do)5 -b(es)71 b(not)h(v)-5 b(erify)71 b(if)g Ft(G)g Fy(really)h(has)-161 -4373 y(at)63 b(most)g(0)p Ft(:)p Fy(5)p Ft(n)f Fy(critical)g(edges)h -(in)g(the)g(mapping)g(step.)96 b(The)-161 4572 y(rationale)65 -b(is)g(that)f Ft(P)1193 4602 y Fo(j)p Fr(E)1329 4619 -y Fm(cr)s(it)1541 4602 y Fo(j)1654 4572 y Fy(tends)h(to)f(1)g(when)h -Ft(n)f Fy(increases.)-161 4772 y(Ho)-5 b(w)g(ev)g(er,)43 -b(if)c(some)h(addition)g Ft(g)6 b Fy(\()p Ft(u)p Fy(\))f(+)g -Ft(g)h Fy(\()p Ft(w)t Fy(\))38 b(is)i(greater)f(than)g -Ft(m)-161 4971 y Fy(in)52 b(the)f(searc)-5 b(hing)53 -b(step)e(for)g Fx(f)p Ft(u;)28 b(w)t Fx(g)47 b(2)e Ft(E)61 -b Fy(then)51 b(the)g(mapping)-161 5170 y(step)56 b(is)g(restarted,)f -(as)h(sho)-5 b(wn)56 b(in)g(line)g(17)f(of)g(Figure)h(7.)-161 -5694 y Fi(5.2)225 b(Ordering)74 b(Step)-161 6021 y Fy(The)59 -b(pro)5 b(cedure)58 b(Ordering)i(\()p Ft(G)p Fy(,)e Ft(G)2095 -6046 y Fr(cr)t(it)2325 6021 y Fy(,)h Ft(G)2561 6046 y -Fr(ncr)t(it)2873 6021 y Fy(\))f(receiv)-5 b(es)59 b(as)-161 -6220 y(input)43 b(the)g(graph)g Ft(G)f Fy(and)h(partitions)g -Ft(G)f Fy(in)-5 b(to)43 b(t)-5 b(w)g(o)43 b(subgraphs)-161 -6419 y Ft(G)-30 6444 y Fr(cr)t(it)259 6419 y Fy(and)60 -b Ft(G)717 6444 y Fr(ncr)t(it)1028 6419 y Fy(.)85 b(T)-14 -b(o)59 b(partition)g(the)g(graph)h Ft(G)e Fy(in)-5 b(to)60 -b Ft(G)3529 6444 y Fr(cr)t(it)-161 6618 y Fy(and)68 b -Ft(G)305 6643 y Fr(ncr)t(it)683 6618 y Fy(w)-5 b(e)67 -b(use)h(an)f(optimal)g(time)g(algorithm,)k(as)c(fol-)-161 -6818 y(lo)-5 b(ws.)114 b(Figure)69 b(4)f(presen)-5 b(ts)70 -b(a)e(sample)i(graph)f(with)f(16)g(v)-5 b(er-)-161 7017 -y(tices)83 b(and)g(14)g(edges,)90 b(where)82 b(the)h(degree)f(of)g(a)h -(v)-5 b(ertex)82 b(is)-161 7216 y(sho)-5 b(wn)67 b(b)5 -b(esides)66 b(eac)-5 b(h)65 b(v)-5 b(ertex.)102 b(Initially)-14 -b(,)68 b(all)e(v)-5 b(ertices)64 b(with)-161 7415 y(degree)76 -b(1)h(are)f(added)h(to)e(a)i(queue)f Ft(Q)p Fy(.)137 -b(F)-14 b(or)76 b(the)g(example)-161 7615 y(sho)-5 b(wn)82 -b(in)e(Figure)g(4\(a\),)86 b Ft(Q)h Fy(=)g Fx(f)p Fy(14)p -Ft(;)28 b Fy(15)p Ft(;)g Fy(9)p Ft(;)g Fy(10)p Ft(;)g -Fy(0)p Ft(;)g Fy(1)p Ft(;)g Fy(11)p Ft(;)g Fy(12)p Fx(g)-161 -7814 y Fy(after)72 b(the)g(initialization)h(step.)126 -b(This)73 b(initialization)g(tak)-5 b(es)-161 8013 y -Ft(O)5 b Fy(\()p Fx(j)p Ft(V)36 b Fx(j)p Fy(\))68 b(time,)k(b)5 -b(ecause)68 b(w)-5 b(e)68 b(need)h(to)e(c)-5 b(hec)g(k)69 -b(the)f(degree)g(of)-161 8212 y(eac)-5 b(h)56 b(v)-5 -b(ertex)54 b(from)i Ft(V)36 b Fy(.)5 8423 y(Next,)46 -b(w)-5 b(e)44 b(remo)-5 b(v)g(e)45 b(one)f(v)-5 b(ertex)44 -b Ft(v)50 b Fy(from)45 b(the)f(queue,)i(decre-)-161 8622 -y(men)-5 b(t)56 b(its)e(degree)h(and)g(the)g(degree)f(of)h(v)-5 -b(ertices)54 b(with)h(degree)-161 8821 y(greater)i(than)h(0)f(in)h(the) -f(adjacen)-5 b(t)58 b(list)g(of)f Ft(v)6 b Fy(,)58 b(as)h(depicted)e -(in)-161 9020 y(Figure)j(4\(b\))e(for)h Ft(v)g Fy(=)52 -b(14.)85 b(A)-5 b(t)59 b(this)g(p)5 b(oin)-5 b(t,)61 -b(the)d(adjacencies)-161 9220 y(of)c Ft(v)60 b Fy(with)53 -b(degree)h(1)f(are)h(inserted)g(in)-5 b(to)54 b(the)f(queue,)h(suc)-5 -b(h)55 b(as)-161 9419 y(v)-5 b(ertex)46 b(13)h(in)h(Figure)f(4\(c\).)70 -b(This)48 b(pro)5 b(cess)48 b(is)f(rep)5 b(eated)47 b(un)-5 -b(til)-161 9618 y(the)64 b(queue)g(b)5 b(ecomes)64 b(empt)-5 -b(y)-14 b(.)101 b(All)64 b(v)-5 b(ertices)63 b(with)h(degree)g(0)-161 -9817 y(are)50 b(non)g(critical)f(v)-5 b(ertices)49 b(and)h(the)f -(others)h(are)f(critical)g(v)-5 b(er-)-161 10017 y(tices,)75 -b(as)c(depicted)f(in)h(Figure)g(4\(d\).)119 b(This)71 -b(pro)5 b(cess)71 b(tak)-5 b(es)-161 10216 y Ft(O)5 b -Fy(\()p Fx(j)p Ft(V)179 10241 y Fr(ncr)t(it)490 10216 -y Fx(j)p Fy(\),)46 b(b)5 b(ecause)43 b(eac)-5 b(h)43 -b(non)g(critical)g(v)-5 b(ertex)42 b(is)i(remo)-5 b(v)g(ed)-161 -10415 y(from)56 b(the)f(queue)g(only)g(once.)4302 4174 -y(Finally)-14 b(,)79 b(to)73 b(determine)h(the)f(v)-5 -b(ertices)73 b(in)g Ft(V)7168 4199 y Fr(scr)t(it)7534 -4174 y Fy(w)-5 b(e)74 b(col-)4136 4373 y(lect)f(all)i(v)-5 -b(ertices)73 b Ft(v)84 b Fx(2)77 b Ft(V)5786 4398 y Fr(cr)t(it)6090 -4373 y Fy(with)d(at)f(least)h(one)g(v)-5 b(ertex)73 b -Ft(u)4136 4572 y Fy(that)56 b(is)h(in)g(Adj\()p Ft(v)6 -b Fy(\))56 b(and)h(in)g Ft(V)6016 4597 y Fr(ncr)t(it)6328 -4572 y Fy(,)g(as)g(the)f(v)-5 b(ertex)56 b(5)g(in)h(Fig-)4136 -4772 y(ure)72 b(4\(d\).)123 b(This)73 b(pro)5 b(cess)73 -b(tak)-5 b(es)72 b Ft(O)5 b Fy(\()p Fx(j)p Ft(V)6687 -4797 y Fr(cr)t(it)6915 4772 y Fx(j)p Fy(\).)124 b(Considering)4136 -4971 y(that)80 b Fx(j)p Ft(V)4664 4996 y Fr(cr)t(it)4894 -4971 y Fx(j)87 b(\024)h(j)p Ft(V)37 b Fx(j)p Fy(,)87 -b Fx(j)p Ft(V)5746 4996 y Fr(ncr)t(it)6058 4971 y Fx(j)g(\024)h(j)p -Ft(V)37 b Fx(j)80 b Fy(and)h Fx(j)p Ft(V)37 b Fx(j)88 -b Fy(=)f Ft(n)p Fy(,)g(the)4136 5170 y(ordering)56 b(step)g(tak)-5 -b(es)55 b Ft(O)5 b Fy(\()p Ft(n)p Fy(\))53 b(time.)4136 -5687 y Fi(5.3)225 b(Searc)-6 b(hing)73 b(Step)4136 6011 -y Fy(The)54 b(pro)5 b(cedure)54 b(Searc)-5 b(hing)55 -b(\()p Ft(G)p Fy(,)f Ft(G)6424 6036 y Fr(cr)t(it)6653 -6011 y Fy(,)g Ft(G)6884 6036 y Fr(ncr)t(it)7196 6011 -y Fy(,)h Ft(g)6 b Fy(\))53 b(receiv)-5 b(es)4136 6210 -y(as)69 b(input)f Ft(G)p Fy(,)i Ft(G)5186 6235 y Fr(cr)t(it)5416 -6210 y Fy(,)h Ft(G)5664 6235 y Fr(ncr)t(it)6043 6210 -y Fy(and)d(\014nds)h(a)f(log)7154 6251 y Fn(2)7256 6210 -y Fx(j)p Ft(V)37 b Fx(j)45 b Fy(+)g(1)68 b(bit)4136 6410 -y(v)-9 b(alue)78 b(for)g(eac)-5 b(h)79 b(v)-5 b(ertex)77 -b Ft(v)91 b Fx(2)84 b Ft(V)37 b Fy(,)84 b(stored)79 b(in)f(the)g(arra) --5 b(y)79 b Ft(g)6 b Fy(.)4136 6609 y(A)70 b(pseudo)i(co)5 -b(de)69 b(for)i(the)f(searc)-5 b(hing)71 b(step)g(is)g(presen)-5 -b(ted)71 b(in)4136 6808 y(Figure)54 b(5.)74 b(The)53 -b(searc)-5 b(hing)55 b(step)f(is)g(\014rst)g(p)5 b(erformed)53 -b(for)h(the)4136 7007 y(v)-5 b(ertices)55 b(in)h Ft(G)5062 -7032 y Fr(cr)t(it)5347 7007 y Fy(and)g(second)g(for)f(the)g(v)-5 -b(ertices)55 b(in)g Ft(G)7671 7032 y Fr(ncr)t(it)7983 -7007 y Fy(.)4136 7491 y Fq(5.3.1)193 b(Assignmen)-5 b(t)103 -b(of)g(V)-16 b(alues)103 b(to)g(Critical)f(V)-16 b(er-)4720 -7690 y(tices)4136 8014 y Fy(The)76 b(pro)5 b(cedure)76 -b(CriticalV)-14 b(erticesAssignmen)-5 b(t)77 b(\()p Ft(G)p -Fy(,)j Ft(G)7779 8039 y Fr(cr)t(it)8009 8014 y Fy(,)4136 -8214 y Ft(g)6 b Fy(,)70 b(AssignedEdges\))e(receiv)-5 -b(es)66 b Ft(G)g Fy(and)h Ft(G)6822 8239 y Fr(cr)t(it)7118 -8214 y Fy(as)h(input)f(and)4136 8413 y(pro)5 b(duces)64 -b(as)g(output)f(a)h Ft(g)69 b Fy(v)-9 b(alue)63 b(for)g(eac)-5 -b(h)64 b(v)-5 b(ertex)62 b(in)i Ft(G)7826 8438 y Fr(cr)t(it)4136 -8612 y Fy(and)41 b(the)f(AssignedEdges)i(arra)-5 b(y)-14 -b(.)69 b(Suc)-5 b(h)41 b(arra)-5 b(y)41 b(has)g Ft(m)f -Fy(en)-5 b(tries)4136 8812 y(and)42 b(indicates)f(the)g(edges)g(for)g -(whic)-5 b(h)42 b(a)f(v)-9 b(alue)41 b Ft(h)p Fy(\()p -Ft(e)p Fy(\))k Fx(2)h Fy([0)p Ft(;)28 b(m)8 b Fx(\000)4136 -9011 y Fy(1],)83 b Ft(e)g Fx(2)f Ft(E)4870 9036 y Fr(cr)t(it)5100 -9011 y Fy(,)h(has)78 b(already)f(b)5 b(een)77 b(assigned.)141 -b(W)-14 b(e)76 b(use)i(a)4136 9210 y(breadth-\014rst)55 -b(searc)-5 b(h)54 b(algorithm)g(to)f(assign)i(v)-9 b(alues)54 -b(to)f(eac)-5 b(h)4136 9409 y(v)g(ertex)50 b(in)i Ft(G)4956 -9434 y Fr(cr)t(it)5185 9409 y Fy(.)73 b(The)51 b(reason)h(w)-5 -b(e)51 b(start)g(the)f(assignmen)-5 b(t)53 b(of)4136 -9609 y(v)-9 b(alues)67 b(to)f(v)-5 b(ertices)67 b(in)g -Ft(G)5805 9634 y Fr(cr)t(it)6101 9609 y Fy(is)h(to)e(resolv)-5 -b(e)67 b(reassignmen)-5 b(ts)4136 9808 y(as)81 b(earlier)e(as)i(p)5 -b(ossible.)148 b(The)80 b(reassignmen)-5 b(t)82 b(problem)e(is)4136 -10007 y(illustrated)56 b(in)g(the)f(next)f(paragraph.)4302 -10216 y(Considering)39 b(the)d(subgraph)j Ft(G)6300 10241 -y Fr(cr)t(it)6567 10216 y Fy(in)e(Figure)h(4\(d\),)i(a)d(step)4136 -10415 y(b)-5 b(y)47 b(step)g(example)g(of)g(the)g(assignmen)-5 -b(t)48 b(of)f(v)-9 b(alues)47 b(to)f(v)-5 b(ertices)3906 -10913 y(6)p eop end -%%Page: 7 7 -TeXDict begin 7 6 bop -140 2644 a - currentpoint currentpoint translate 0.9 0.9 scale neg exch neg exch -translate - -140 2644 a -140 210 -a - 35851059 9604136 0 0 35851059 9604136 startTexFig - -140 210 a -%%BeginDocument: figs/grafordering.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: grafordering.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Thu Sep 16 10:11:08 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 545 146 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.827 0.827 0.827 srgb} bind def - -end -save -newpath 0 146 moveto 0 0 lineto 545 0 lineto 545 146 lineto closepath clip newpath --21.7 329.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Arc -7.500 slw -0 slc -n 1080.0 4899.4 792.0 -47.0146 -106.5044 arcn -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -540 4545 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -1170 4590 m -gs 1 -1 sc (d:1) col0 sh gr -% Arc -n 967.5 4252.5 271.9 114.4440 24.4440 arcn -gs col0 s gr - -% Arc -n 3240.0 4899.4 792.0 -47.0146 -106.5044 arcn -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2700 4545 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -3330 4590 m -gs 1 -1 sc (d:1) col0 sh gr -% Arc -n 3127.5 4252.5 271.9 114.4440 24.4440 arcn -gs col0 s gr - -% Arc -n 3261.4 7433.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 4257.7 5095.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 4628.4 2710.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 4406.5 5574.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 3189.0 4028.5 221.5 161.4436 -108.9703 arc -gs col0 s gr - -% Arc -n 3427.9 4718.1 254.1 74.4524 162.8718 arc -gs col0 s gr - -% Arc -n 2865.0 3652.5 493.8 76.6530 -4.9378 arcn -gs col0 s gr - -% Arc -n 3732.5 3191.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 3905.2 4770.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 4146.1 4098.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 3804.0 3752.8 257.8 -113.3026 -33.1006 arc -gs col0 s gr - -% Arc -n 3983.4 4628.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3041 5079 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -2679 4173 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -3040 3711 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -3288 3452 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -3595 3393 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -3939 3487 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -4379 3966 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -4447 4261 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -4377 4566 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -4047 5115 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -3715 5220 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -3402 5214 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -3715 4589 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -3721 3847 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 174.63 scf sf -2520 3105 m -gs 1 -1 sc (b\)) col0 sh gr -% Arc -n 5400.0 4899.4 792.0 -47.0146 -106.5044 arcn -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4860 4545 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -5490 4590 m -gs 1 -1 sc (d:1) col0 sh gr -% Arc -n 5287.5 4252.5 271.9 114.4440 24.4440 arcn -gs col0 s gr - -% Arc -n 5421.4 7433.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 6417.7 5095.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 6788.4 2710.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 6566.5 5574.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 5349.0 4028.5 221.5 161.4436 -108.9703 arc -gs col0 s gr - -% Arc -n 5587.9 4718.1 254.1 74.4524 162.8718 arc -gs col0 s gr - -% Arc -n 5025.0 3652.5 493.8 76.6530 -4.9378 arcn -gs col0 s gr - -% Arc -n 5892.5 3191.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 6065.2 4770.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 6306.1 4098.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 6143.4 4628.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -% Arc -n 5964.0 3752.8 257.8 -113.3026 -33.1006 arc -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5201 5079 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -4839 4173 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -5200 3711 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -5448 3452 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -5755 3393 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -6099 3487 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -6539 3966 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -6607 4261 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -6537 4566 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -6207 5115 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -5875 5220 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -5562 5214 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -5875 4589 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -5881 3847 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 174.63 scf sf -4680 3105 m -gs 1 -1 sc (c\)) col0 sh gr -% Arc -n 1101.4 7433.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 2097.7 5095.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 2468.4 2710.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 2246.5 5574.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 1029.0 4028.5 221.5 161.4436 -108.9703 arc -gs col0 s gr - -% Arc -n 1267.9 4718.1 254.1 74.4524 162.8718 arc -gs col0 s gr - -% Arc -n 705.0 3652.5 493.8 76.6530 -4.9378 arcn -gs col0 s gr - -% Arc -n 1572.5 3191.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 1745.2 4770.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 1986.1 4098.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 1823.4 4628.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -% Arc -n 1644.0 3752.8 257.8 -113.3026 -33.1006 arc -gs col0 s gr - -% Arc -n 7581.4 7433.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 8577.7 5095.8 515.7 -82.9475 -161.3616 arcn -gs col0 s gr - -% Arc -n 8948.4 2710.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 8726.5 5574.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 7509.0 4028.5 221.5 161.4436 -108.9703 arc -gs col0 s gr - -% Arc -n 7747.9 4718.1 254.1 74.4524 162.8718 arc -gs col0 s gr - -% Arc -n 7185.0 3652.5 493.8 76.6530 -4.9378 arcn -gs col0 s gr - -% Arc -n 8052.5 3191.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 8225.2 4770.6 216.0 117.0515 14.8509 arcn -gs col0 s gr - -% Arc -n 8466.1 4098.9 234.3 26.3682 -62.5758 arcn -gs col0 s gr - -% Arc -n 8303.4 4628.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -% Arc -n 8124.0 3752.8 257.8 -113.3026 -33.1006 arc -gs col0 s gr - -% Arc -n 7447.5 4252.5 271.9 114.4440 24.4440 arcn -gs col0 s gr - -% Arc -n 7560.0 4899.4 792.0 -47.0146 -106.5044 arcn -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -881 5079 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -519 4173 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -880 3711 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -1128 3452 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -1435 3393 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -1779 3487 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -2219 3966 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -2287 4261 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -2217 4566 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -1887 5115 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -1555 5220 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -1242 5214 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -1561 3847 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 174.63 scf sf -360 3105 m -gs 1 -1 sc (a\)) col0 sh gr -/Times-Roman ff 142.88 scf sf -1550 4590 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -7361 5079 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -6999 4173 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7360 3711 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7608 3452 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7915 3393 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -8259 3487 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -8699 3966 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -8767 4261 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -8697 4566 m -gs 1 -1 sc (d:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -8367 5115 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -8035 5220 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -7722 5214 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -8035 4589 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -8041 3847 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 174.63 scf sf -6840 3105 m -gs 1 -1 sc (d\)) col0 sh gr -/Times-Roman ff 142.88 scf sf -7020 4545 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7650 4590 m -gs 1 -1 sc (d:0) col0 sh gr -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n 967 3847 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -892 3900 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 1215 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1140 3630 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 1642 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1605 4035 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 1642 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1605 4395 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 2160 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2122 4260 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 2092 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2055 4575 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 1957 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1920 4935 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 1642 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1605 5025 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 1327 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1290 5025 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 1012 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -937 4890 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 832 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -757 4170 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 2092 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2055 3937 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 1867 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1830 3675 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 1530 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1492 3585 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 1217 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1142 4401 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 851 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -776 4551 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -0 slj -0 slc -n 810 2970 m 990 2970 l 990 3150 l 810 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -825 3112 m -gs 1 -1 sc (14) col0 sh gr -% Polyline -n 990 2970 m 1170 2970 l 1170 3150 l 990 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1005 3112 m -gs 1 -1 sc (15) col0 sh gr -% Polyline -n 1170 2970 m 1350 2970 l 1350 3150 l 1170 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1222 3112 m -gs 1 -1 sc (9) col0 sh gr -% Polyline -n 1350 2970 m 1530 2970 l 1530 3150 l 1350 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1365 3112 m -gs 1 -1 sc (10) col0 sh gr -% Polyline -n 1530 2970 m 1710 2970 l 1710 3150 l 1530 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1582 3112 m -gs 1 -1 sc (0) col0 sh gr -% Polyline -n 1710 2970 m 1890 2970 l 1890 3150 l 1710 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1762 3112 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 1890 2970 m 2070 2970 l 2070 3150 l 1890 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1905 3112 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 2070 2970 m 2250 2970 l 2250 3150 l 2070 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -2085 3112 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -585 3105 m -gs 1 -1 sc (Q) col0 sh gr -% Ellipse -n 3375 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3300 3630 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 3802 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3765 4035 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 3802 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3765 4395 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 4320 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4282 4260 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 4252 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4215 4575 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 4117 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4080 4935 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 3802 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3765 5025 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 3487 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3450 5025 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 3172 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3097 4890 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 2992 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2917 4170 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 4252 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4215 3937 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 4027 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3990 3675 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 3690 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3652 3585 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 3127 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3052 3900 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 3377 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3302 4401 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 3011 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2936 4551 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 3150 2970 m 3330 2970 l 3330 3150 l 3150 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -3202 3112 m -gs 1 -1 sc (9) col0 sh gr -% Polyline -n 3510 2970 m 3690 2970 l 3690 3150 l 3510 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -3562 3112 m -gs 1 -1 sc (0) col0 sh gr -% Polyline -n 3690 2970 m 3870 2970 l 3870 3150 l 3690 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -3742 3112 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 3330 2970 m 3510 2970 l 3510 3150 l 3330 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -3345 3112 m -gs 1 -1 sc (10) col0 sh gr -% Polyline -n 2967 2970 m 3147 2970 l 3147 3150 l 2967 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -2982 3112 m -gs 1 -1 sc (15) col0 sh gr -% Polyline -n 3870 2970 m 4050 2970 l 4050 3150 l 3870 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -3885 3112 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 4050 2970 m 4230 2970 l 4230 3150 l 4050 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -4065 3112 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -2790 3105 m -gs 1 -1 sc (Q) col0 sh gr -% Ellipse -n 5962 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5925 4035 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 5962 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5925 4395 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 6480 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6442 4260 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 6412 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6375 4575 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 6277 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6240 4935 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 5962 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5925 5025 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 5647 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5610 5025 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 5332 4837 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5257 4890 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 5152 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5077 4170 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 6412 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6375 3937 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 6187 3622 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6150 3675 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 5850 3532 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5812 3585 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 5287 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5212 3900 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 5535 3577 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5460 3630 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 5537 4348 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5462 4401 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 5171 4498 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5096 4551 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 5133 2970 m 5313 2970 l 5313 3150 l 5133 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -5185 3112 m -gs 1 -1 sc (9) col0 sh gr -% Polyline -n 5493 2970 m 5673 2970 l 5673 3150 l 5493 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -5545 3112 m -gs 1 -1 sc (0) col0 sh gr -% Polyline -n 5673 2970 m 5853 2970 l 5853 3150 l 5673 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -5725 3112 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n 5310 2970 m 5490 2970 l 5490 3150 l 5310 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -5325 3112 m -gs 1 -1 sc (10) col0 sh gr -% Polyline -n 6210 2970 m 6390 2970 l 6390 3150 l 6210 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -6225 3112 m -gs 1 -1 sc (13) col0 sh gr -% Polyline -n 5850 2970 m 6030 2970 l 6030 3150 l 5850 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -5865 3112 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 6030 2970 m 6210 2970 l 6210 3150 l 6030 3150 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -6045 3112 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -4950 3105 m -gs 1 -1 sc (Q) col0 sh gr -% Ellipse -n 8122 3982 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8085 4035 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 8122 4342 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8085 4395 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 8640 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8602 4260 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 8572 4522 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8535 4575 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 8437 4882 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8400 4935 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 8122 4972 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8085 5025 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 8572 3884 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8535 3937 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 7447 3847 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7372 3900 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 7492 4837 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7417 4890 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 7807 4972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7770 5025 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 8347 3622 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8310 3675 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 7312 4117 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7237 4170 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 8010 3532 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7972 3585 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 7695 3577 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7620 3630 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 7961 3026 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -% Polyline -n 7979 2966 m - 7942 3087 l gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -7734 3072 m -gs 1 -1 sc (Q) col0 sh gr -% Ellipse -n 7331 4498 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7256 4551 m -gs 1 -1 sc (11) col0 sh gr -% Ellipse -n 7697 4348 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7622 4401 m -gs 1 -1 sc (12) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF - -%%EndDocument - - endTexFig - -140 2644 a - currentpoint currentpoint translate 1 0.9 div 1 0.9 div scale neg -exch neg exch translate - -140 2644 a 1536 3033 a Fy(Figure)56 b(4:)74 -b(Ordering)56 b(step)f(for)g(a)h(graph)f(with)h(16)f(v)-5 -b(ertices)55 b(and)h(14)f(edges.)p -169 3437 9 103 v --169 3343 103 9 v -66 3343 8027 9 v 7961 3343 103 9 v -8056 3437 9 103 v -169 3594 9 150 v 8055 3594 V -72 3549 -a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)82 b Fu(S)6 -b(e)g(a)g(r)g(c)g(h)g(i)g(n)g(g)92 b(\()16 b Fk(G)32 -b Fu(,)83 b Fk(G)1993 3566 y Fj(cr)s(it)2243 3549 y Fu(,)g -Fk(G)2489 3566 y Fj(ncr)s(it)2815 3549 y Fu(,)g Fk(g)15 -b Fu(\))p -169 3751 V 8055 3751 V 180 3706 a(C)8 b(r)g(i)g(t)g(i)g(c)g -(a)g(l)g(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e) -g(n)g(t)99 b(\()16 b Fk(G)32 b Fu(,)83 b Fk(G)2784 3723 -y Fj(cr)s(it)3034 3706 y Fu(,)g Fk(g)38 b Fu(,)85 b(A)s(s)s(s)s(i)s(g)s -(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b(\))i(;)p -169 3908 -V 8055 3908 V 177 3863 a(N)6 b(o)g(n)g(C)g(r)g(i)g(t)g(i)g(c)g(a)g(l)g -(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t) -95 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(G)3022 3880 y Fj(ncr)s(it)3348 -3863 y Fu(,)i(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)20 -b(,)94 b Fk(g)24 b Fu(\))19 b(;)p -169 4011 9 103 v -168 -4011 103 9 v -66 4011 8027 9 v 7961 4011 103 9 v 8056 -4011 9 103 v 2098 4433 a Fy(Figure)56 b(5:)74 b(Pseudo)56 -b(co)5 b(de)55 b(for)g(the)g(searc)-5 b(hing)57 b(algorithm.)1352 -6119 y - currentpoint currentpoint translate 0.9 0.9 scale neg exch neg exch -translate - 1352 6119 a 1352 4503 a - 22760488 6380830 0 0 22760488 6380830 startTexFig - 1352 4503 a -%%BeginDocument: figs/grafsearching.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: grafsearching.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Thu Sep 16 08:20:14 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 346 97 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.827 0.827 0.827 srgb} bind def - -end -save -newpath 0 97 moveto 0 0 lineto 346 0 lineto 346 97 lineto closepath clip newpath --21.7 275.9 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Arc -7.500 slw -0 slc -n 194.4 6671.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 1190.7 4333.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 1561.4 1948.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 1339.5 4812.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 665.5 2429.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 838.2 4008.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 1079.1 3336.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 916.4 3866.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -% Arc -n 1544.4 6668.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 2540.7 4330.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 2911.4 1945.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 2689.5 4809.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 2015.5 2426.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 2188.2 4005.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 2429.1 3333.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 2266.4 3863.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -% Arc -n 2984.4 6668.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 3980.7 4330.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 4351.4 1945.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 4129.5 4809.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 3455.5 2426.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 3628.2 4005.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 3869.1 3333.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 3706.4 3863.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -% Arc -n 4424.4 6668.6 3106.8 -79.8849 -70.0581 arc -gs col0 s gr - -% Arc -n 5420.7 4330.8 515.7 -82.9474 -161.3614 arcn -gs col0 s gr - -% Arc -n 5791.4 1945.5 1523.8 122.6173 101.6375 arcn -gs col0 s gr - -% Arc -n 5569.5 4809.3 1690.2 -110.7749 -95.1769 arc -gs col0 s gr - -% Arc -n 4895.5 2426.9 1187.9 84.8566 58.3400 arcn -gs col0 s gr - -% Arc -n 5068.2 4005.6 216.0 117.0512 14.8508 arcn -gs col0 s gr - -% Arc -n 5309.1 3333.9 234.3 26.3681 -62.5756 arcn -gs col0 s gr - -% Arc -n 5146.4 3863.7 295.7 62.0596 -20.7416 arcn -gs col0 s gr - -/Times-Roman ff 174.63 scf sf -360 3105 m -gs 1 -1 sc (a\)) col0 sh gr -/Times-Roman ff 142.88 scf sf -398 3647 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -2660 3801 m -gs 1 -1 sc (g:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -1748 3644 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -2250 3780 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 142.88 scf sf -2250 3555 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 142.88 scf sf -2745 3465 m -gs 1 -1 sc (g:2) col0 sh gr -/Times-Roman ff 174.63 scf sf -1710 3102 m -gs 1 -1 sc (b\)) col0 sh gr -/Times-Roman ff 174.63 scf sf -3150 3102 m -gs 1 -1 sc (c\)) col0 sh gr -/Times-Roman ff 142.88 scf sf -4100 3801 m -gs 1 -1 sc (g:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -3188 3644 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -3690 3780 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 142.88 scf sf -3690 3555 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 142.88 scf sf -3195 4275 m -gs 1 -1 sc (g:4) col0 sh gr -/Times-Roman ff 142.88 scf sf -3915 4320 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -4050 4050 m -gs 1 -1 sc (4) col0 sh gr -/Times-Roman ff 142.88 scf sf -3690 4365 m -gs 1 -1 sc (7) col0 sh gr -/Times-Roman ff 142.88 scf sf -3465 4005 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -4185 3465 m -gs 1 -1 sc (g:2) col0 sh gr -/Times-Roman ff 174.63 scf sf -4590 3102 m -gs 1 -1 sc (d\)) col0 sh gr -/Times-Roman ff 142.88 scf sf -5610 3496 m -gs 1 -1 sc (g:2) col0 sh gr -/Times-Roman ff 142.88 scf sf -5540 3801 m -gs 1 -1 sc (g:1) col0 sh gr -/Times-Roman ff 142.88 scf sf -4628 3644 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -5130 3780 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 142.88 scf sf -5130 3555 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 142.88 scf sf -4635 4275 m -gs 1 -1 sc (g:4) col0 sh gr -/Times-Roman ff 142.88 scf sf -5355 4320 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -5490 4050 m -gs 1 -1 sc (4) col0 sh gr -/Times-Roman ff 142.88 scf sf -5130 4365 m -gs 1 -1 sc (7) col0 sh gr -/Times-Roman ff 142.88 scf sf -4905 4005 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -5580 3330 m -gs 1 -1 sc (8) col0 sh gr -/Times-Roman ff 142.88 scf sf -5310 2970 m -gs 1 -1 sc (g:6) col0 sh gr -/Times-Roman ff 142.88 scf sf -4635 3285 m -gs 1 -1 sc (g:7) col0 sh gr -/Times-Roman ff 142.88 scf sf -5085 3105 m -gs 1 -1 sc (13) col0 sh gr -/Times-Roman ff 142.88 scf sf -5265 3330 m -gs 1 -1 sc (9) col0 sh gr -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n 735 3220 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -698 3273 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 735 3580 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -698 3633 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 1253 3445 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1215 3498 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 1185 3760 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1148 3813 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 1050 4120 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1013 4173 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 735 4210 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -698 4263 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 1185 3122 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1148 3175 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 2085 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2048 3270 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 2085 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2048 3630 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 2603 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2565 3495 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 2535 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2498 3810 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 2400 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2363 4170 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 2085 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2048 4260 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 2535 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2498 3172 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 3525 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3488 3270 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 3525 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3488 3630 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 4043 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4005 3495 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 3975 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3938 3810 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 3840 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3803 4170 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 3525 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3488 4260 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 3975 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3938 3172 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 4965 3217 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4928 3270 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 4965 3577 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4928 3630 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 5483 3442 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5445 3495 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 5415 3757 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5378 3810 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 5280 4117 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5243 4170 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 4965 4207 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4928 4260 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 5415 3119 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5378 3172 m -gs 1 -1 sc (2) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF - -%%EndDocument - - endTexFig - 1352 6119 a - currentpoint currentpoint translate 1 0.9 div 1 0.9 div scale neg -exch neg exch translate - 1352 6119 a 2001 6509 a Fy(Figure)f(6:)74 -b(Example)56 b(of)f(the)g(critical)g(v)-5 b(ertices)55 -b(assignmen)-5 b(t.)-161 7039 y(in)63 b Ft(G)171 7064 -y Fr(cr)t(it)464 7039 y Fy(is)g(presen)-5 b(ted)63 b(in)g(Figure)h(6.) -96 b(Initially)-14 b(,)65 b(a)d(v)-5 b(ertex)62 b Ft(v)-161 -7238 y Fy(is)52 b(c)-5 b(hosen)52 b(c)-5 b(hosen)52 b(and)f(the)g -(assignmen)-5 b(t)52 b Ft(g)6 b Fy(\()p Ft(v)g Fy(\))46 -b(=)g(0)51 b(is)h(made.)-161 7438 y(F)-14 b(or)69 b(example,)j(supp)5 -b(ose)69 b(that)f(v)-5 b(ertex)67 b(5)h(in)g(Figure)h(6\(a\))f(is)-161 -7637 y(c)-5 b(hosen)64 b(and)e(the)g(assignmen)-5 b(t)64 -b Ft(g)6 b Fy(\(5\))57 b(=)h(0)k(is)h(made.)95 b(In)62 -b(Fig-)-161 7836 y(ure)51 b(6\(b\),)h(follo)-5 b(wing)51 -b(the)g(adjacen)-5 b(t)50 b(list)h(of)g(v)-5 b(ertex)50 -b(5,)h Ft(g)6 b Fy(\(6\))51 b(is)-161 8035 y(set)65 b(to)f(1)h(and)g -Ft(g)6 b Fy(\(4\))64 b(is)i(set)e(to)h(2,)i(implying)e(that)g -(addresses)-161 8235 y(1)70 b(and)g(2)g(m)-5 b(ust)70 -b(b)5 b(e)70 b(assigned)h(to)e(edges)h Fx(f)p Fy(5)p -Ft(;)28 b Fy(6)p Fx(g)69 b Fy(and)h Fx(f)p Fy(5)p Ft(;)28 -b Fy(4)p Fx(g)p Fy(,)-161 8434 y(resp)5 b(ectiv)-5 b(ely)-14 -b(.)85 b(A)-5 b(t)59 b(the)f(same)i(time,)g(addresses)h(1)f(and)f(2)g -(are)-161 8633 y(added)48 b(to)e(the)g(list)h(of)g(AssignedEdges.)72 -b(In)47 b(Figure)h(6\(c\),)f(fol-)-161 8832 y(lo)-5 b(wing)49 -b(the)d(adjacen)-5 b(t)48 b(list)f(of)g(v)-5 b(ertex)47 -b(6,)i Ft(g)6 b Fy(\(7\))46 b(is)i(set)f(to)g(3)h(and)-161 -9032 y Ft(g)6 b Fy(\(8\))41 b(is)g(set)g(to)g(4,)j(implying)e(that)e -(addresses)j(4,)h(5)d(and)g(7)g(m)-5 b(ust)-161 9231 -y(b)5 b(e)66 b(assigned)h(to)e(edges)h Fx(f)p Fy(6)p -Ft(;)28 b Fy(7)p Fx(g)p Fy(,)68 b Fx(f)p Fy(6)p Ft(;)28 -b Fy(8)p Fx(g)65 b Fy(and)h Fx(f)p Fy(7)p Ft(;)28 b Fy(8)p -Fx(g)p Fy(,)68 b(resp)5 b(ec-)-161 9430 y(tiv)-5 b(ely)-14 -b(.)104 b(Finally)-14 b(,)68 b(in)e(Figure)g(6\(d\),)h(follo)-5 -b(wing)66 b(the)f(adjacen)-5 b(t)-161 9629 y(list)64 -b(of)g(v)-5 b(ertex)62 b(4,)k Ft(g)6 b Fy(\(2\))63 b(cannot)g(b)5 -b(e)63 b(assigned)i(to)f(5)f(b)5 b(ecause)-161 9829 y(the)61 -b(sum)h Ft(g)6 b Fy(\(2\))40 b(+)g Ft(g)6 b Fy(\(4\))60 -b(w)-5 b(ould)62 b(cause)f(a)g(reassignmen)-5 b(t)62 -b(with)-161 10028 y(the)70 b(already)g(assigned)h(address)h(7)e(to)f -(edge)h Fx(f)p Fy(7)p Ft(;)28 b Fy(8)p Fx(g)p Fy(,)74 -b(so)d(the)-161 10227 y(next)76 b Ft(g)83 b Fy(v)-9 b(alue)77 -b(6)g(is)g(used)h(instead,)k(and)c(the)e(assignmen)-5 -b(ts)4136 7039 y Ft(g)6 b Fy(\(2\))74 b(=)h(6)d(and)h -Ft(g)6 b Fy(\(3\))74 b(=)h(7)e(are)f(made,)77 b(implying)d(that)e(ad-) -4136 7238 y(dresses)67 b(8,)h(9)d(and)h(13)f(m)-5 b(ust)67 -b(b)5 b(e)65 b(assigned)i(to)d(edges)i Fx(f)p Fy(4)p -Ft(;)28 b Fy(2)p Fx(g)p Fy(,)4136 7438 y Fx(f)p Fy(4)p -Ft(;)g Fy(3)p Fx(g)63 b Fy(and)h Fx(f)p Fy(2)p Ft(;)28 -b Fy(3)p Fx(g)p Fy(,)65 b(resp)5 b(ectiv)-5 b(ely)-14 -b(.)97 b(This)64 b(\014nishes)h(the)e(algo-)4136 7637 -y(rithm)56 b(with)f(AssignedEdges)48 b(=)e Fx(f)p Fy(1)p -Ft(;)28 b Fy(2)p Ft(;)g Fy(4)p Ft(;)g Fy(5)p Ft(;)g Fy(7)p -Ft(;)g Fy(8)p Ft(;)g Fy(9)p Ft(;)g Fy(13)p Fx(g)p Fy(.)4302 -7847 y(A)61 b(pseudo)g(co)5 b(de)61 b(for)f(the)h(assignmen)-5 -b(t)62 b(of)f(v)-9 b(alues)61 b(to)f(crit-)4136 8047 -y(ical)80 b(v)-5 b(ertices)79 b(is)h(presen)-5 b(ted)80 -b(in)g(Figure)g(7.)146 b(F)-14 b(or)80 b(all)g(edges)4136 -8246 y Ft(e)61 b Fy(=)g Fx(f)p Ft(u;)28 b(w)t Fx(g)62 -b(2)e Ft(E)10 b Fy(,)66 b Ft(g)6 b Fy(\()p Ft(u)p Fy(\))42 -b(+)h Ft(g)6 b Fy(\()p Ft(w)t Fy(\))64 b(m)-5 b(ust)65 -b(b)5 b(e)64 b(unique.)101 b(If)64 b(this)4136 8445 y(constrain)-5 -b(t)73 b(is)f(not)g(forced)f(then)h(t)-5 b(w)g(o)72 b(di\013eren)-5 -b(t)72 b(k)-5 b(eys)72 b(from)4136 8644 y Ft(S)94 b Fy(will)84 -b(b)5 b(e)84 b(mapp)5 b(ed)85 b(in)f(the)g(same)g(hash)i(table)d(lo)5 -b(cation.)4136 8844 y(Th)-5 b(us,)80 b(the)73 b(AssignedEdges)i(arra)-5 -b(y)74 b(is)g(used)h(to)e(force)g(that)4136 9043 y Ft(g)6 -b Fy(\()p Ft(u)p Fy(\))17 b(+)g Ft(g)6 b Fy(\()p Ft(w)t -Fy(\))46 b(will)g(b)5 b(e)45 b(distinct)h(for)f(all)h(edges)g(in)g -Ft(E)10 b Fy(,)47 b(as)f(sho)-5 b(wn)4136 9242 y(in)64 -b(line)h(18)f(of)f(Figure)i(7.)99 b(The)64 b(v)-9 b(ariable)64 -b(Nextg)e(represen)-5 b(ts)4136 9441 y Ft(g)6 b Fy(\()p -Ft(u)p Fy(\).)4302 9652 y(No)-5 b(w)91 b(w)-5 b(e)92 -b(de\014ne)g(certain)f(complexit)-5 b(y)91 b(measures)h(used)4136 -9851 y(hereinafter:)4256 10216 y(1.)83 b(Let)62 b Ft(I)13 -b Fy(\()p Ft(u)p Fy(\))63 b(b)5 b(e)62 b(the)h(n)-5 b(um)g(b)5 -b(er)64 b(of)f(iterations)g(o)5 b(ccurred)63 b(in)4468 -10415 y(the)79 b(rep)5 b(eat-un)-5 b(til)78 b(lo)5 b(op)79 -b(from)g(line)g(13)g(un)-5 b(til)79 b(line)g(19,)4468 -10615 y(when)56 b(v)-5 b(ertex)54 b Ft(u)h Fy(is)h(assigned.)3906 -10913 y(7)p eop end -%%Page: 8 8 -TeXDict begin 8 7 bop -169 626 9 103 v -169 532 103 9 -v -66 532 8027 9 v 7961 532 103 9 v 8056 626 9 103 v --169 783 9 150 v 8055 783 V -72 738 a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g -(r)g(e)84 b Fu(C)8 b(r)g(i)g(t)g(i)g(c)g(a)g(l)g(V)g(e)g(r)g(t)g(i)g(c) -g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t)27 b(\()9 -b Fk(G)33 b Fu(,)83 b Fk(G)3259 755 y Fj(cr)s(it)3508 -738 y Fu(,)g Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d) -s(g)s(e)s(s)8 b(\))p -169 940 V 8055 940 V -56 895 a(1)314 -b Fl(f)5 b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)1003 912 -y Fj(cr)s(it)1290 895 y Fl(d)-9 b(o)69 b Fk(g)5 b Fu(\()p -Fk(v)g Fu(\))72 b(:)10 b(=)73 b Ff(\0001)18 b Fu(;)p --169 1097 V 8055 1097 V -56 1052 a(2)314 b Fl(f)5 b(o)g(r)104 -b Fu(i)92 b(:)12 b(=)75 b(0)g Fl(to)80 b Fk(m)34 b Ff(\000)h -Fu(1)69 b Fl(d)-9 b(o)73 b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s -(g)s(e)s(s)16 b([)37 b(i)28 b(])71 b(=)82 b Fl(f)9 b(a)g(l)g(s)g(e)29 -b Fu(;)p -169 1246 V 8055 1246 V -56 1201 a(3)314 b Fl(f)5 -b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)1003 1218 y Fj(cr)s(it)1290 -1201 y Fl(d)-9 b(o)p -169 1403 V 8055 1403 V -56 1358 -a Fu(4)564 b Fl(i)18 b(f)98 b Fk(g)5 b Fu(\()p Fk(v)g -Fu(\))59 b(=)g Ff(\0001)73 b Fl(t)-6 b(h)g(e)g(n)84 b -Fu(t)10 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s)91 b(\()15 -b Fk(G)33 b Fu(,)83 b Fk(v)37 b Fu(,)83 b Fk(G)3732 1375 -y Fj(cr)s(it)3981 1358 y Fu(,)g Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s -(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b(\))i(;)p -169 1553 -V 8055 1553 V -169 1710 V 8055 1710 V -72 1665 a Fl(p)-6 -b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)86 b Fu(t)10 b(r)g(a)g(v)g(e)g(r)g(s)g -(e)g(B)g(f)g(s)91 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(v)37 -b Fu(,)83 b Fk(G)2390 1682 y Fj(cr)s(it)2639 1665 y Fu(,)g -Fk(g)38 b Fu(,)86 b(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)8 -b(\))p -169 1859 V 8055 1859 V -56 1814 a(5)387 b(N)o(e)o(x)o(t)o(g)76 -b(:)13 b(=)77 b(0)13 b(;)p -169 2016 V 8055 2016 V -56 -1971 a(6)387 b Fk(g)5 b Fu(\()p Fk(v)g Fu(\))72 b(:)10 -b(=)72 b(N)o(e)o(x)o(t)o(g)18 b(;)p -169 2173 V 8055 -2173 V -56 2128 a(7)380 b(E)-8 b(n)g(Q)g(u)g(e)g(u)g(e)77 -b(\()15 b Fk(v)37 b Fu(,)83 b Fk(Q)19 b Fu(\))g(;)p -169 -2330 V 8055 2330 V -56 2285 a(8)386 b Fl(w)n(h)n(i)n(l)n(e)79 -b Fk(Q)43 b Ff(6)p Fu(=)g Ff(;)69 b Fl(d)-9 b(o)p -169 -2487 V 8055 2487 V -56 2442 a Fu(9)625 b Fk(v)77 b Fu(:)10 -b(=)65 b(D)-7 b(e)g(Q)g(u)g(e)g(u)g(e)76 b(\()15 b Fk(Q)k -Fu(\))g(;)p -169 2644 V 8055 2644 V -58 2599 a(1)8 b(0)547 -b Fl(f)5 b(o)g(r)86 b Fk(u)43 b Ff(2)g Fu(Adj)35 b(\()p -Fk(v)5 b Fu(\))67 b Fl(a)-11 b(n)g(d)68 b Fk(g)5 b Fu(\()p -Fk(u)p Fu(\))59 b(=)g Ff(\0001)70 b Fl(d)-9 b(o)p -169 -2800 V 8055 2800 V -58 2756 a Fu(1)8 b(1)707 b(A)8 b(s)g(s)g(i)g(g)g(n) -g(e)g(d)g(V)g(e)g(r)g(t)g(i)g(c)g(e)g(s)72 b(:)10 b(=)73 -b Ff(;)18 b Fu(;)p -169 2957 V 8055 2957 V -58 2913 a(1)8 -b(2)705 b Fl(f)5 b(o)g(r)86 b Fk(w)47 b Ff(2)c Fu(Adj)35 -b(\()p Fk(u)p Fu(\))67 b Fl(a)-11 b(n)g(d)68 b Fk(g)5 -b Fu(\()p Fk(w)t Fu(\))79 b Ff(6)p Fu(=)h Ff(\0001)70 -b Fl(d)-9 b(o)77 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g(t)g -(i)g(c)g(e)g(s)72 b(:)10 b(=)80 b(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g -(e)g(r)g(t)g(i)g(c)g(e)g(s)79 b Ff([)g(f)p Fk(w)t Ff(g)18 -b Fu(;)p -169 3107 V 8055 3107 V -58 3062 a(1)8 b(3)698 -b Fl(r)n(e)n(p)n(e)n(a)n(t)p -169 3256 V 8055 3256 V --58 3211 a Fu(1)8 b(4)858 b(NoAssignedEdges)76 b(:)10 -b(=)71 b Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 3406 V 8055 -3406 V -58 3361 a(1)8 b(5)857 b(N)o(e)o(x)o(t)o(g)72 -b(:)10 b(=)71 b(N)o(e)o(x)o(t)o(g)e(+)g(1)9 b(;)p -169 -3555 V 8055 3555 V -58 3510 a(1)f(6)864 b Fl(f)5 b(o)g(r)86 -b Fk(w)46 b Ff(2)87 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g -(t)g(i)g(c)g(e)g(s)68 b Fl(a)-11 b(n)g(d)68 b Fu(NoAssignedEdges)62 -b(=)d Fl(t)o(r)o(u)o(e)69 b(d)-9 b(o)p -169 3712 V 8055 -3712 V -58 3667 a Fu(1)8 b(7)1035 b Fl(i)18 b(f)98 b -Fu(\()o(N)o(e)o(x)o(t)o(g)58 b(+)h Fk(g)5 b Fu(\()p Fk(w)t -Fu(\)\))43 b Ff(\025)g Fk(m)73 b Fl(t)-6 b(h)g(e)g(n)74 -b Fu(restart)50 b(mapping)i(step)18 b(;)p -169 3869 V -8055 3869 V -58 3824 a(1)8 b(8)1035 b Fl(i)18 b(f)100 -b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 -b([)g(N)o(e)o(x)o(t)o(g)58 b(+)i Fk(g)5 b Fu(\()p Fk(w)t -Fu(\))10 b(])72 b(=)f Fl(t)o(r)o(u)o(e)i(t)-6 b(h)g(e)g(n)74 -b Fu(NoAssignedEdges)h(:)10 b(=)81 b Fl(f)9 b(a)g(l)g(s)g(e)29 -b Fu(;)p -169 4018 V 8055 4018 V -58 3974 a(1)8 b(9)705 -b Fl(u)5 b(n)g(t)g(i)g(l)87 b Fu(NoAssignedEdges)62 b(=)c -Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 4175 V 8055 4175 V --58 4130 a(2)8 b(0)700 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))72 -b(:)10 b(=)72 b(N)o(e)o(x)o(t)o(g)21 b(;)95 b Ff(f)14 -b Fe(s)f(e)g(t)101 b(t)9 b(h)g(e)89 b Fk(g)94 b Fe(v)9 -b(a)g(l)g(u)g(e)98 b(t)10 b(o)99 b(v)10 b(e)g(x)g(t)g(e)g(x)88 -b Fk(u)78 b Fe(a)o(n)o(d)i(c)s(h)s(a)s(n)s(g)s(e)h Fk(g)5 -b Fu(\()p Fk(u)p Fu(\))80 b Fe(from)g Ff(\0001)89 b Fe(t)10 -b(o)92 b(N)s(e)s(x)s(t)s(g)s Ff(g)p -169 4332 V 8055 -4332 V -58 4287 a Fu(2)8 b(1)705 b Fl(f)5 b(o)g(r)86 -b Fk(w)47 b Ff(2)87 b Fu(A)8 b(s)g(s)g(i)g(g)g(n)g(e)g(d)g(V)g(e)g(r)g -(t)g(i)g(c)g(e)g(s)70 b Fl(d)-9 b(o)72 b Fu(A)s(s)s(s)s(i)s(g)s(n)s(e)s -(d)s(E)s(d)s(g)s(e)s(s)17 b([)g(N)o(e)o(x)o(t)o(g)58 -b(+)i Fk(g)5 b Fu(\()p Fk(w)t Fu(\))15 b(])80 b(:)15 -b(=)79 b Fl(t)o(r)o(u)o(e)18 b Fu(;)p -169 4489 V 8055 -4489 V -58 4444 a(2)8 b(2)692 b(E)-8 b(n)g(Q)g(u)g(e)g(u)g(e)77 -b(\()16 b Fk(u)32 b Fu(,)83 b Fk(Q)19 b Fu(\))g(;)p -169 -4592 9 103 v -168 4592 103 9 v -66 4592 8027 9 v 7961 -4592 103 9 v 8056 4592 9 103 v 2034 5014 a Fy(Figure)56 -b(7:)74 b(The)55 b(critical)g(v)-5 b(ertices)55 b(assignmen)-5 -b(t)58 b(algorithm.)-41 5544 y(2.)83 b(Let)196 b Ft(N)743 -5569 y Fr(t)999 5544 y Fy(b)5 b(e)196 b(the)g(n)-5 b(um)g(b)5 -b(er)198 b(of)e(times)h(that)171 5743 y(AssignedEdges[)p -Ft(g)6 b Fy(\()p Ft(u)p Fy(\))110 b(+)g Ft(g)6 b Fy(\()p -Ft(w)t Fy(\)])163 b(is)h(true)f(in)h(the)171 5943 y(pro)5 -b(cedure)56 b(CriticalV)-14 b(erticesAssignmen)-5 b(t.)74 -b(Th)-5 b(us,)1045 6511 y Ft(N)1178 6536 y Fr(t)1283 -6511 y Fy(=)1458 6289 y Fo(j)p Fr(V)1575 6306 y Fm(cr)s(it)1788 -6289 y Fo(j)1523 6353 y Fp(X)1519 6705 y Fr(u)p Fn(=1)1827 -6511 y Fy(\()p Ft(I)13 b Fy(\()p Ft(u)p Fy(\))36 b Fx(\000)h -Fy(1\))993 b(\(5\))-161 7141 y Fq(Maximal)64 b(V)-16 -b(alue)63 b(Assigned)i(to)g(An)f(Edge)-161 7473 y Fy(In)56 -b(this)g(section)f(w)-5 b(e)56 b(presen)-5 b(t)55 b(the)g(follo)-5 -b(wing)57 b(conjecture.)-161 7953 y Fq(Conjecture)64 -b(1)83 b Fy(F)-14 b(or)64 b(a)f(random)h(graph)g Ft(G)e -Fy(with)h Fx(j)p Ft(E)3294 7978 y Fr(cr)t(it)3524 7953 -y Fx(j)c Fy(=)-161 8153 y(0)p Ft(:)p Fy(5)p Ft(n)54 b -Fy(and)f Fx(j)p Ft(V)37 b Fx(j)46 b Fy(=)h(1)p Ft(:)p -Fy(15)p Ft(n)p Fy(,)53 b(it)g(is)h(alw)-5 b(a)g(ys)55 -b(p)5 b(ossible)54 b(to)f(generate)-161 8352 y(a)e(MPHF)g(b)5 -b(ecause)50 b(the)h(maximal)g(v)-9 b(alue)50 b Ft(A)2635 -8377 y Fr(max)2959 8352 y Fy(assigned)i(to)-161 8551 -y(an)j(edge)f Ft(e)46 b Fx(2)g Ft(E)849 8576 y Fr(cr)t(it)1132 -8551 y Fy(is)55 b(at)f(most)g Ft(m)34 b Fx(\000)h Fy(1)54 -b(\()p Ft(A)2576 8576 y Fr(max)2902 8551 y Fy(corresp)5 -b(onds)-161 8750 y(to)63 b(the)f(maximal)i(v)-9 b(alue)63 -b(generated)f(b)-5 b(y)63 b(the)g(assignmen)-5 b(t)65 -b(of)-161 8950 y(v)-9 b(alues)56 b(to)f(critical)g(v)-5 -b(ertices)55 b(in)g(Eq.)h(\(3\).\))5 9337 y(Next,)79 -b(w)-5 b(e)75 b(presen)-5 b(t)76 b(t)-5 b(w)g(o)75 b(auxiliary)g -(theorems)h(that)e(will)-161 9536 y(help)56 b(us)g(in)g(the)f -(discussion)j(of)d(Conjecture)f(1.)-161 10017 y Fq(Theorem)63 -b(1)84 b Fy(The)71 b(n)-5 b(um)g(b)5 b(er)72 b(of)f(bac)-5 -b(k)71 b(edges)g Ft(N)3006 10042 y Fr(bedg)t(es)3471 -10017 y Fy(of)f(a)-161 10216 y(random)40 b(graph)g Ft(G)46 -b Fy(=)g Ft(G)1370 10241 y Fr(cr)t(it)1604 10216 y Fx([)t -Ft(G)1850 10241 y Fr(ncr)t(it)2201 10216 y Fy(is)40 b(giv)-5 -b(en)39 b(b)-5 b(y:)66 b Ft(N)3189 10241 y Fr(bedg)t(es)3629 -10216 y Fy(=)-161 10415 y Fx(j)p Ft(E)8 10440 y Fr(cr)t(it)238 -10415 y Fx(j)37 b(\000)g(j)p Ft(V)630 10440 y Fr(cr)t(it)860 -10415 y Fx(j)g Fy(+)g(1.)4136 5544 y Fq(Pro)5 b(of:)86 -b Fy(In)61 b(an)g(undirected)g(graph)h Ft(G)p Fy(,)g(ev)-5 -b(ery)60 b(edge)g(of)h Ft(G)g Fy(is)4136 5743 y(either)77 -b(a)h(tree)f(edge)h(or)f(a)h(bac)-5 b(k)78 b(edge.)140 -b(In)78 b(the)g(subgraph)4136 5943 y Ft(G)4267 5968 y -Fr(ncr)t(it)4634 5943 y Fy(there)54 b(are)h(no)g(bac)-5 -b(k)55 b(edges)g(b)5 b(ecause)55 b(it)f(is)i(an)f(acyclic)4136 -6142 y(graph.)91 b(As)61 b(sho)-5 b(wn)63 b(b)-5 b(y)61 -b(Erd\177)-83 b(os)62 b(and)f(A.)g(R)-5 b(\023)-78 b(en)-5 -b(yi)61 b([4,)g(5],)i(when)4136 6341 y Ft(n)73 b Fy(tends)h(to)f -(in\014nit)-5 b(y)74 b(the)f(random)h(graph)g Ft(G)f -Fy(forms,)78 b(with)4136 6540 y(probabilit)-5 b(y)45 -b(tending)g(to)e(1,)k(a)d(gian)-5 b(t)45 b(comp)5 b(onen)-5 -b(t)44 b(con)-5 b(taining)4136 6740 y(all)52 b(cycles)f(of)f -Ft(G)p Fy(.)73 b(So)51 b(considering)h(that)f Ft(G)6846 -6765 y Fr(cr)t(it)7127 6740 y Fy(is)g(connected,)4136 -6939 y(the)81 b(n)-5 b(um)g(b)5 b(er)83 b(of)e(tree)g(edges)g(is)h -Fx(j)p Ft(V)6458 6964 y Fr(cr)t(it)6688 6939 y Fx(j)55 -b(\000)f Fy(1.)152 b(It)81 b(happ)5 b(ens)4136 7138 y(b)g(ecause)64 -b(w)-5 b(e)64 b(ha)-5 b(v)g(e)65 b(only)f(one)g(tree)f(connecting)h -(all)g(v)-5 b(ertices)4136 7338 y(in)45 b Ft(V)4416 7363 -y Fr(cr)t(it)4646 7338 y Fy(.)71 b(As)45 b(the)f(total)g(n)-5 -b(um)g(b)5 b(er)46 b(of)f(edges)g(in)g Ft(G)7179 7363 -y Fr(cr)t(it)7454 7338 y Fy(is)g Fx(j)p Ft(E)7779 7363 -y Fr(cr)t(it)8009 7338 y Fx(j)4136 7537 y Fy(then)55 -b Ft(N)4647 7562 y Fr(bedg)t(es)5078 7537 y Fy(+)37 b(\()p -Fx(j)p Ft(V)5452 7562 y Fr(cr)t(it)5682 7537 y Fx(j)g(\000)g -Fy(1\))46 b(=)g Fx(j)p Ft(E)6469 7562 y Fr(cr)t(it)6699 -7537 y Fx(j)p Fy(.)74 b(Th)-5 b(us,)4942 7896 y Ft(N)5075 -7921 y Fr(bedg)t(es)5515 7896 y Fy(=)46 b Fx(j)p Ft(E)5859 -7921 y Fr(cr)t(it)6089 7896 y Fx(j)37 b(\000)g(j)p Ft(V)6481 -7921 y Fr(cr)t(it)6711 7896 y Fx(j)g Fy(+)g(1)p Ft(:)g -Fd(2)4136 8292 y Fq(Theorem)63 b(2)84 b Fy(The)54 b(maximal)h(v)-9 -b(alue)53 b Ft(A)6695 8317 y Fr(max)7022 8292 y Fy(assigned)j(to)e(an) -4136 8491 y(edge)67 b Ft(e)f Fx(2)f Ft(E)4968 8516 y -Fr(cr)t(it)5265 8491 y Fy(in)i(the)g(assignmen)-5 b(t)69 -b(of)e(v)-9 b(alues)67 b(to)g(critical)4136 8690 y(v)-5 -b(ertices)55 b(is:)75 b Ft(A)5094 8715 y Fr(max)5413 -8690 y Fx(\024)46 b Fy(2)p Fx(j)p Ft(V)5814 8715 y Fr(cr)t(it)6044 -8690 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)6795 8715 -y Fr(t)6854 8690 y Fy(.)4136 9020 y Fq(Pro)5 b(of:)134 -b Fy(W)-14 b(e)84 b(start)h(the)f(assignmen)-5 b(t)87 -b(of)e(v)-9 b(alues)85 b(to)f(criti-)4136 9220 y(cal)48 -b(v)-5 b(ertices)48 b(using)i(the)e(sequence)g Fx(f)p -Fy(0)p Ft(;)28 b Fy(1)p Ft(;)g(:)g(:)g(:)f Fy(Nextg)q -Fx(g)48 b Fy(so)h(that)4136 9419 y(eac)-5 b(h)38 b(edge)f(receiv)-5 -b(es)37 b(the)g(sum)h(of)f(the)g(v)-9 b(alues)37 b(asso)5 -b(ciated)37 b(with)4136 9618 y(its)54 b(endp)5 b(oin)-5 -b(ts.)75 b(The)54 b Ft(g)60 b Fy(v)-9 b(alue)53 b(for)h(eac)-5 -b(h)54 b(v)-5 b(ertex)53 b Ft(u)h Fy(in)h Ft(V)7660 9643 -y Fr(cr)t(it)7944 9618 y Fy(is)4136 9817 y(assigned)50 -b(only)e(once.)71 b(It)47 b(happ)5 b(ens)49 b(b)5 b(ecause)48 -b(a)g Ft(g)54 b Fy(v)-9 b(alue)48 b(is)g(as-)4136 10017 -y(signed)39 b(to)e(a)h(v)-5 b(ertex)37 b Ft(u)h Fy(if)f(and)i(only)f -(if)f Ft(g)6 b Fy(\()p Ft(u)p Fy(\))46 b(=)g Fx(\0001)p -Fy(.)68 b(Th)-5 b(us,)43 b(af-)4136 10216 y(ter)j Ft(g)6 -b Fy(\()p Ft(u)p Fy(\))46 b(c)-5 b(hange)47 b(from)g -Fx(\0001)g Fy(to)f(the)g(v)-9 b(alue)47 b(stored)f(in)h(Nextg,)4136 -10415 y(the)59 b(condition)h Ft(g)6 b Fy(\()p Ft(u)p -Fy(\))52 b(=)h Fx(\0001)60 b Fy(b)5 b(ecomes)60 b(false)f(and)h -Ft(g)6 b Fy(\()p Ft(u)p Fy(\))59 b(will)3906 10913 y(8)p -eop end -%%Page: 9 9 -TeXDict begin 9 8 bop -161 620 a Fy(not)55 b(b)5 b(e)55 -b(assigned)h(again.)74 b(Consider)56 b(no)-5 b(w)55 b(t)-5 -b(w)g(o)56 b(p)5 b(ossibilities:)-161 819 y(\(i\))55 -b(If)f Ft(N)368 844 y Fr(t)473 819 y Fy(=)46 b(0)55 b(then)g(the)g -Ft(g)61 b Fy(v)-9 b(alues)55 b(will)g(b)5 b(e)54 b(assigned)j(to)d(v)-5 -b(er-)-161 1018 y(tices)58 b(in)g Ft(V)514 1043 y Fr(cr)t(it)802 -1018 y Fy(sequen)-5 b(tially)-14 b(.)81 b(Therefore,)58 -b(the)g(greatest)f(and)-161 1218 y(the)d(second)g(greatest)f(v)-9 -b(alues)54 b(assigned)i(to)d Ft(u)h Fy(and)g Ft(w)d Fx(2)45 -b Ft(V)3528 1243 y Fr(cr)t(it)-161 1417 y Fy(are)67 b -Ft(g)6 b Fy(\()p Ft(u)p Fy(\))65 b(=)h Fx(j)p Ft(V)841 -1442 y Fr(cr)t(it)1071 1417 y Fx(j)44 b(\000)h Fy(1)67 -b(and)h Ft(g)6 b Fy(\()p Ft(w)t Fy(\))65 b(=)h Fx(j)p -Ft(V)2561 1442 y Fr(cr)t(it)2791 1417 y Fx(j)44 b(\000)h -Fy(2,)70 b(resp)5 b(ec-)-161 1616 y(tiv)-5 b(ely)-14 -b(.)68 b(Th)-5 b(us,)45 b Ft(A)921 1641 y Fr(max)1240 -1616 y Fx(\024)h Fy(\()p Fx(j)p Ft(V)1623 1641 y Fr(cr)t(it)1853 -1616 y Fx(j)5 b(\000)g Fy(1\))g(+)g(\()p Fx(j)p Ft(V)2533 -1641 y Fr(cr)t(it)2763 1616 y Fx(j)g(\000)g Fy(2\))41 -b(since)f(the)-161 1815 y(edge)60 b Fx(f)p Ft(u;)28 b(w)t -Fx(g)60 b Fy(ma)-5 b(y)61 b(b)5 b(e)60 b(in)g Ft(E)1657 -1840 y Fr(cr)t(it)1886 1815 y Fy(,)i(in)e(the)g(w)-5 -b(orst)60 b(case.)88 b(\(ii\))60 b(If)-161 2015 y Ft(N)-28 -2040 y Fr(t)77 2015 y Ft(>)47 b Fy(0)e(then)g(Nextg)f(is)i(incremen)-5 -b(ted)46 b(b)-5 b(y)46 b(one)f(for)h(eac)-5 b(h)45 b(time)-161 -2214 y(the)53 b(condition)g(AssignedEdges[Nextg)g(+)32 -b Ft(g)6 b Fy(\()p Ft(w)t Fy(\)])53 b(is)h(true,)f(as)-161 -2413 y(sho)-5 b(wn)57 b(in)f(line)f(15)h(of)f(Figure)h(7.)74 -b(Th)-5 b(us,)57 b(in)e(the)g(w)-5 b(orst)56 b(case,)39 -2781 y Ft(A)164 2806 y Fr(max)603 2781 y Fx(\024)166 -b Fy(\()p Fx(j)p Ft(V)1106 2806 y Fr(cr)t(it)1335 2781 -y Fx(j)38 b(\000)f Fy(1)f(+)i Ft(N)2004 2806 y Fr(t)2062 -2781 y Fy(\))f(+)g(\()p Fx(j)p Ft(V)2538 2806 y Fr(cr)t(it)2767 -2781 y Fx(j)g(\000)h Fy(2)e(+)h Ft(N)3435 2806 y Fr(t)3494 -2781 y Fy(\))39 3031 y Ft(A)164 3056 y Fr(max)603 3031 -y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)1124 3056 y Fr(cr)t(it)1354 -3031 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)2105 3056 -y Fr(t)2164 3031 y Ft(:)g Fd(2)5 3401 y Fy(Let)68 b(us)h(no)-5 -b(w)70 b(resume)f(the)f(discussion)j(of)d(Conjecture)g(1.)-161 -3600 y(Let)h(us)h(consider)h(that)d Ft(N)1546 3625 y -Fr(t)1675 3600 y Fx(\024)i Ft(N)2007 3625 y Fr(bedg)t(es)2470 -3600 y Fy(when)g(the)f(a)-5 b(v)g(erage)-161 3799 y(degree)51 -b(of)g(v)-5 b(ertices)50 b(\()p Ft(d)1284 3824 y Fr(av)t(g)1504 -3799 y Fy(\))h(in)g Ft(G)1940 3824 y Fr(cr)t(it)2221 -3799 y Fy(is)g(a)g(constan)-5 b(t.)73 b(Substi-)-161 -3998 y(tuting)56 b Ft(N)471 4023 y Fr(t)575 3998 y Fx(\024)47 -b Ft(N)884 4023 y Fr(bedg)t(es)1333 3998 y Fy(in)56 b(Theorem)f(2)h -(giv)-5 b(es:)569 4367 y Ft(A)694 4392 y Fr(max)1133 -4367 y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)1654 4392 y Fr(cr)t(it)1884 -4367 y Fx(j)37 b(\000)g Fy(3)g(+)g(2)p Ft(N)2635 4392 -y Fr(bedg)t(es)-161 4735 y Fy(Substituting)100 b(the)e(v)-9 -b(alue)99 b(of)f Ft(N)2001 4760 y Fr(bedg)t(es)2494 4735 -y Fy(from)h(Theorem)g(1)-161 4934 y(giv)-5 b(es:)91 5303 -y Ft(A)216 5328 y Fr(max)655 5303 y Fx(\024)166 b Fy(2)p -Fx(j)p Ft(V)1176 5328 y Fr(cr)t(it)1406 5303 y Fx(j)37 -b(\000)g Fy(3)g(+)g(2\()p Fx(j)p Ft(E)2258 5328 y Fr(cr)t(it)2488 -5303 y Fx(j)g(\000)g(j)p Ft(V)2880 5328 y Fr(cr)t(it)3110 -5303 y Fx(j)g Fy(+)g(1\))-161 5671 y(Applying)106 b(De\014nition)g(6)g -(in)g Ft(G)1996 5696 y Fr(cr)t(it)2331 5671 y Fy(w)-5 -b(e)106 b(obtain)g Ft(d)3279 5696 y Fr(av)t(g)3629 5671 -y Fy(=)-161 5900 y(2)p Fx(j)p Ft(E)91 5925 y Fr(cr)t(it)321 -5900 y Fx(j)p Ft(=)p Fx(j)p Ft(V)593 5925 y Fr(cr)t(it)823 -5900 y Fx(j)p Fy(.)84 b(This)59 b(implies)h(that)e Fx(j)p -Ft(E)2480 5925 y Fr(cr)t(it)2709 5900 y Fx(j)52 b Fy(=)3007 -5816 y Fr(d)3076 5833 y Fm(av)s(g)p 3007 5862 266 7 v -3107 5958 a Fn(2)3293 5900 y Fx(j)p Ft(V)3436 5925 y -Fr(cr)t(it)3666 5900 y Fx(j)p Fy(.)-161 6100 y(Th)-5 -b(us,)-154 6559 y Ft(A)-29 6584 y Fr(max)410 6559 y Fx(\024)166 -b Fy(2)p Fx(j)p Ft(V)931 6584 y Fr(cr)t(it)1161 6559 -y Fx(j)37 b(\000)g Fy(3)g(+)g(2)1807 6324 y Fp(\022)1949 -6446 y Ft(d)2035 6471 y Fr(av)t(g)p 1949 6520 307 7 v -2060 6672 a Fy(2)2275 6559 y Fx(j)p Ft(V)2418 6584 y -Fr(cr)t(it)2648 6559 y Fx(j)g(\000)g(j)p Ft(V)3040 6584 -y Fr(cr)t(it)3270 6559 y Fx(j)g Fy(+)g(1)3602 6324 y -Fp(\023)410 6907 y Fx(\024)166 b Fy(2)p Fx(j)p Ft(V)931 -6932 y Fr(cr)t(it)1161 6907 y Fx(j)37 b(\000)g Fy(3)g(+)g(\()p -Ft(d)1847 6932 y Fr(av)t(g)2104 6907 y Fx(\000)g Fy(2\))p -Fx(j)p Ft(V)2561 6932 y Fr(cr)t(it)2790 6907 y Fx(j)g -Fy(+)g(2)410 7156 y Fx(\024)166 b Ft(d)791 7181 y Fr(av)t(g)1011 -7156 y Fx(j)p Ft(V)1154 7181 y Fr(cr)t(it)1384 7156 y -Fx(j)37 b(\000)g Fy(1)410 7507 y Fx(\024)725 7395 y Fy(2)p -Fx(j)p Ft(E)977 7420 y Fr(cr)t(it)1207 7395 y Fx(j)p -725 7469 528 7 v 779 7621 a(j)p Ft(V)922 7646 y Fr(cr)t(it)1152 -7621 y Fx(j)1273 7507 y(j)p Ft(V)1416 7532 y Fr(cr)t(it)1646 -7507 y Fx(j)g(\000)g Fy(1)410 7853 y Fx(\024)166 b Fy(2)p -Fx(j)p Ft(E)957 7878 y Fr(cr)t(it)1187 7853 y Fx(j)37 -b(\000)g Fy(1)-161 8222 y(As)69 b Fx(j)p Ft(E)267 8247 -y Fr(cr)t(it)497 8222 y Fx(j)f Fy(=)g(0)p Ft(:)p Fy(5)p -Ft(n)g Fy(and)h Ft(n)f Fy(=)g Ft(m)g Fy(then)h Ft(A)2620 -8247 y Fr(max)2961 8222 y Fx(\024)f Ft(n)45 b Fx(\000)h -Fy(1)68 b Fx(\024)-161 8421 y Ft(m)37 b Fx(\000)g Fy(1.)5 -8622 y(W)-14 b(e)38 b(no)-5 b(w)39 b(sho)-5 b(w)39 b(evidences)g(that)e -Ft(N)2190 8647 y Fr(t)2295 8622 y Fx(\024)46 b Ft(N)2603 -8647 y Fr(bedg)t(es)3036 8622 y Fy(when)38 b Ft(d)3538 -8647 y Fr(av)t(g)-161 8821 y Fy(is)61 b(a)f(constan)-5 -b(t.)88 b(As)60 b(sho)-5 b(wn)62 b(in)e(Section)g(5.1,)i -Fx(j)p Ft(E)2934 8846 y Fr(cr)t(it)3163 8821 y Fx(j)54 -b(\024)g Fy(0)p Ft(:)p Fy(5)p Ft(n)-161 9020 y Fy(with)g(probabilit)-5 -b(y)55 b(tending)f(to)f(1)h(when)h Ft(n)e Fy(increases.)74 -b(So,)55 b(in)-161 9220 y(order)64 b(to)g(obtain)g(the)f(a)-5 -b(v)g(erage)64 b(degree)g Ft(d)2529 9245 y Fr(av)t(g)2813 -9220 y Fy(of)f(v)-5 b(ertices)64 b(in)-161 9419 y Ft(G)-30 -9444 y Fr(cr)t(it)249 9419 y Fy(w)-5 b(e)50 b(empirically)f(determined) -h(that)e Fx(j)p Ft(V)2693 9444 y Fr(cr)t(it)2923 9419 -y Fx(j)f(\024)f Fy(0)p Ft(:)p Fy(35)p Fx(j)p Ft(V)37 -b Fx(j)p Fy(.)-161 9618 y(As)101 b Fx(j)p Ft(V)37 b Fx(j)122 -b Fy(=)g(1)p Ft(:)p Fy(15)p Ft(n)100 b Fy(then)h Fx(j)p -Ft(V)1791 9643 y Fr(cr)t(it)2021 9618 y Fx(j)122 b(\024)f -Fy(0)p Ft(:)p Fy(403)p Ft(n)p Fy(.)210 b(T)-14 b(able)101 -b(2)-161 9817 y(presen)-5 b(ts)66 b(the)e(probabilit)-5 -b(y)65 b Ft(P)1752 9847 y Fo(j)p Fr(V)1869 9864 y Fm(cr)s(it)2082 -9847 y Fo(j)2194 9817 y Fy(that)f Fx(j)p Ft(V)2706 9842 -y Fr(cr)t(it)2936 9817 y Fx(j)e(\024)f Fy(0)p Ft(:)p -Fy(403)p Ft(n)p Fy(.)-161 10017 y(As)70 b Ft(P)206 10047 -y Fo(j)p Fr(V)323 10064 y Fm(cr)s(it)536 10047 y Fo(j)654 -10017 y Fy(tends)g(to)g(1)g(when)g Ft(n)g Fy(increases)h(then,)i -Ft(d)3338 10042 y Fr(av)t(g)3629 10017 y Fy(=)-161 10216 -y(2)42 b Fx(\002)g Fy(0)p Ft(:)p Fy(5)p Ft(n=)p Fy(0)p -Ft(:)p Fy(403)p Ft(n)58 b Fy(=)h(2)p Ft(:)p Fy(48)j(is)i(a)e(constan)-5 -b(t)63 b(v)-9 b(alue.)96 b(W)-14 b(e)62 b(built)-161 -10415 y(10,000)56 b(graphs)g(for)g(eac)-5 b(h)55 b(n)-5 -b(um)g(b)5 b(er)57 b(of)e(k)-5 b(eys.)p 4979 460 2234 -7 v 4976 696 7 236 v 5369 696 a Fk(n)p 5849 696 V 6299 -588 a(P)6397 611 y Fc(j)p Fj(V)6508 632 y Fm(cr)s(it)6720 -611 y Fc(j)p 7209 696 V 5852 702 1361 7 v 4976 878 7 -183 v 5849 878 V 5952 824 a Fu(VLC2)p 6447 878 V 199 -w(T)-13 b(o)t(doBR)p 7209 878 V 4979 885 2234 7 v 4976 -1068 7 183 v 5228 1013 a(1)p Fk(;)25 b Fu(000)p 5849 -1068 V 411 w(0)p Fk(:)p Fu(51)p 6447 1068 V 406 w(0)p -Fk(:)p Fu(52)p 7209 1068 V 4976 1250 V 5189 1196 a(10)p -Fk(;)g Fu(000)p 5849 1250 V 373 w(0)p Fk(:)p Fu(76)p -6447 1250 V 406 w(0)p Fk(:)p Fu(77)p 7209 1250 V 4976 -1433 V 5151 1378 a(100)p Fk(;)g Fu(000)p 5849 1433 V -334 w(0)p Fk(:)p Fu(98)p 6447 1433 V 406 w(0)p Fk(:)p -Fu(98)p 7209 1433 V 4976 1616 V 5078 1561 a(1)p Fk(;)g -Fu(000)p Fk(;)g Fu(000)p 5849 1616 V 262 w(1)p Fk(:)p -Fu(00)p 6447 1616 V 406 w(1)p Fk(:)p Fu(00)p 7209 1616 -V 4979 1622 2234 7 v 4136 1954 a Fy(T)-14 b(able)67 b(2:)97 -b(Probabilit)-5 b(y)67 b Ft(P)5818 1984 y Fo(j)p Fr(V)5935 -2001 y Fm(cr)s(it)6148 1984 y Fo(j)6262 1954 y Fy(that)f -Fx(j)p Ft(V)6776 1979 y Fr(cr)t(it)7006 1954 y Fx(j)f(\024)h -Fy(0)p Ft(:)p Fy(403)p Ft(n)g Fy(for)4136 2153 y(di\013eren)-5 -b(t)56 b(n)-5 b(um)g(b)5 b(er)58 b(of)e(k)-5 b(eys)56 -b(for)g(the)g(collections)g(VLC2)g(and)4136 2352 y(T)-14 -b(o)5 b(doBR.)4302 2852 y(Finally)-14 b(,)64 b(w)-5 b(e)61 -b(sho)-5 b(w)62 b(exp)5 b(erimen)-5 b(tal)61 b(evidences)h(that)e -Ft(N)7811 2877 y Fr(t)7926 2852 y Fx(\024)4136 3051 y -Ft(N)4269 3076 y Fr(bedg)t(es)4663 3051 y Fy(.)73 b(The)51 -b(exp)5 b(ected)50 b(v)-9 b(alues)51 b(for)h Fx(j)p Ft(V)6691 -3076 y Fr(cr)t(it)6921 3051 y Fx(j)f Fy(and)h Fx(j)p -Ft(E)7506 3076 y Fr(cr)t(it)7736 3051 y Fx(j)f Fy(are)4136 -3250 y(0)p Ft(:)p Fy(403)p Ft(n)71 b Fy(and)h(0)p Ft(:)p -Fy(5)p Ft(n)p Fy(,)k(resp)5 b(ectiv)-5 b(ely)-14 b(.)121 -b(Then,)76 b(b)-5 b(y)71 b(Theorem)h(1,)4136 3450 y Ft(N)4269 -3475 y Fr(bedg)t(es)4709 3450 y Fy(=)46 b(0)p Ft(:)p -Fy(5)p Ft(n)10 b Fx(\000)g Fy(0)p Ft(:)p Fy(403)p Ft(n)g -Fy(+)g(1)47 b(=)g(0)p Ft(:)p Fy(097)p Ft(n)10 b Fy(+)g(1.)70 -b(In)42 b(T)-14 b(able)42 b(3)g(w)-5 b(e)4136 3649 y(sho)g(w)58 -b(the)e(maximal)h(v)-9 b(alue)56 b(of)g Ft(N)6268 3674 -y Fr(t)6383 3649 y Fy(obtained)h(during)g(10,000)4136 -3848 y(executions)70 b(of)f(the)g(new)h(algorithm)g(for)f(di\013eren)-5 -b(t)70 b(sizes)g(of)4136 4047 y Ft(S)10 b Fy(.)110 b(As)68 -b(sho)-5 b(wn)69 b(in)f(T)-14 b(able)68 b(3,)j(the)c(maximal)h(v)-9 -b(alue)68 b(of)f Ft(N)7817 4072 y Fr(t)7943 4047 y Fy(is)4136 -4247 y(smaller)52 b(than)e Ft(N)5220 4272 y Fr(bedg)t(es)5660 -4247 y Fy(=)c(0)p Ft(:)p Fy(097)p Ft(n)27 b Fy(+)g(1.)73 -b(So,)51 b(Conjecture)f(1)g(is)4136 4446 y(correct)55 -b(for)g Ft(c)46 b Fy(=)g(1)p Ft(:)p Fy(15.)p 4864 4653 -2463 7 v 4861 4888 7 236 v 5255 4888 a Fk(n)p 5734 4888 -V 5837 4781 a Fu(Maximal)k(v)-9 b(alue)52 b(of)f Fk(N)7172 -4798 y Fj(t)p 7324 4888 V 5738 4895 1590 7 v 4861 5071 -7 183 v 5734 5071 V 5859 5016 a Fu(VLC2)p 6376 5071 V -314 w(T)-13 b(o)t(doBR)p 7324 5071 V 4864 5078 2463 7 -v 4861 5260 7 183 v 5113 5206 a(1)p Fk(;)25 b Fu(000)p -5734 5260 V 348 w(0)p Fk(:)p Fu(085)p Fk(n)p 6376 5260 -V 351 w Fu(0)p Fk(:)p Fu(093)p Fk(n)p 7324 5260 V 4861 -5443 V 5075 5388 a Fu(10)p Fk(;)g Fu(000)p 5734 5443 -V 309 w(0)p Fk(:)p Fu(067)p Fk(n)p 6376 5443 V 351 w -Fu(0)p Fk(:)p Fu(069)p Fk(n)p 7324 5443 V 4861 5626 V -5036 5571 a Fu(100)p Fk(;)g Fu(000)p 5734 5626 V 271 -w(0)p Fk(:)p Fu(061)p Fk(n)p 6376 5626 V 351 w Fu(0)p -Fk(:)p Fu(061)p Fk(n)p 7324 5626 V 4861 5808 V 4964 5754 -a Fu(1)p Fk(;)g Fu(000)p Fk(;)g Fu(000)p 5734 5808 V -198 w(0)p Fk(:)p Fu(059)p Fk(n)p 6376 5808 V 351 w Fu(0)p -Fk(:)p Fu(059)p Fk(n)p 7324 5808 V 4864 5815 2463 7 v -4136 6137 a Fy(T)-14 b(able)51 b(3:)71 b(The)50 b(maximal)h(v)-9 -b(alue)50 b(of)g Ft(N)6538 6162 y Fr(t)6647 6137 y Fy(for)g(di\013eren) --5 b(t)50 b(sizes)h(of)4136 6336 y Ft(S)65 b Fy(for)55 -b(the)g(collections)h(VLC2)e(and)i(T)-14 b(o)5 b(doBR.)4136 -6972 y Fq(Complexit)-5 b(y)64 b(Analysis)4136 7280 y -Fy(W)-14 b(e)59 b(no)-5 b(w)60 b(sho)-5 b(w)60 b(that)e(the)h(time)g -(complexit)-5 b(y)59 b(of)f(the)h(pseudo)4136 7479 y(co)5 -b(de)44 b(presen)-5 b(ted)45 b(in)g(Figure)g(7)g(is)g -Ft(O)5 b Fy(\()p Fx(j)p Ft(V)6561 7504 y Fr(cr)t(it)6790 -7479 y Fx(j)p Fy(\).)70 b(F)-14 b(or)45 b(eac)-5 b(h)45 -b(unas-)4136 7679 y(signed)40 b(v)-5 b(ertex)37 b Ft(u)p -Fy(,)42 b(Adj\()p Ft(u)p Fy(\))c(m)-5 b(ust)39 b(b)5 -b(e)39 b(scanned)g(with)g(complex-)4136 7878 y(it)-5 -b(y)76 b Fx(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)f Fy(in)h(order)g(to)f -(obtain)h(\(in)g(AssignedV)-14 b(ertices\))4136 8077 -y(the)63 b(adjacencies)g(of)g Ft(u)g Fy(that)f(ha)-5 -b(v)g(e)64 b(already)f(b)5 b(een)63 b(assigned,)4136 -8276 y(as)c(sho)-5 b(wn)60 b(in)f(lines)h(11)f(and)g(12.)84 -b(F)-14 b(or)59 b(eac)-5 b(h)59 b(iteration)f(of)h(the)4136 -8476 y(rep)5 b(eat-un)-5 b(til)67 b(lo)5 b(op,)69 b Fx(j)p -Fy(AssignedV)-14 b(ertices)p Fx(j)66 b Fy(v)-5 b(ertices)66 -b(m)-5 b(ust)67 b(b)5 b(e)4136 8675 y(scanned,)65 b(as)e(sho)-5 -b(wn)64 b(from)e(lines)h(13)g(to)e(19.)95 b(As)63 b(eac)-5 -b(h)62 b(criti-)4136 8874 y(cal)50 b(v)-5 b(ertex)48 -b(is)i(assigned)h(only)f(once)f(and)i Fx(j)p Fy(AssignedV)-14 -b(ertices)p Fx(j)4136 9073 y Fy(v)-5 b(ertices)46 b(m)-5 -b(ust)47 b(b)5 b(e)46 b(scanned)h(to)e(up)5 b(date)46 -b(the)g(AssignedEdges)4136 9273 y(arra)-5 b(y)37 b(\(as)g(sho)-5 -b(wn)39 b(in)e(line)g(21\),)j(the)d(time)g(complexit)-5 -b(y)36 b(is)i(giv)-5 b(en)4136 9472 y(b)g(y)5563 10014 -y Ft(C)12 b Fy(\()p Fx(j)p Ft(V)5902 10039 y Fr(cr)t(it)6131 -10014 y Fx(j)p Fy(\))46 b(=)6463 9792 y Fo(j)p Fr(V)6580 -9809 y Fm(cr)s(it)6793 9792 y Fo(j)6528 9856 y Fp(X)6524 -10208 y Fr(u)p Fn(=1)6832 10014 y Fy([)37 b Fx(j)p Fy(Adj\()p -Ft(u)p Fy(\))p Fx(j)f Fy(+)4157 10415 y(\()p Ft(I)13 -b Fy(\()p Ft(u)p Fy(\))36 b Fx(\002)h(j)p Fy(AssignedV)-14 -b(ertices)p Fx(j)p Fy(\))37 b(+)g Fx(j)p Fy(AssignedV)-14 -b(ertices)p Fx(j)37 b Fy(])3906 10913 y(9)p eop end -%%Page: 10 10 -TeXDict begin 10 9 bop -69 2469 a - currentpoint currentpoint translate 0.87 0.87 scale neg exch neg exch -translate - -69 2469 a -69 153 -a - 36443095 9143664 0 0 36443095 9143664 startTexFig - -69 153 a -%%BeginDocument: figs/grafsearchingncv.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: grafsearchingncv.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Mon Sep 20 10:41:58 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 554 139 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.827 0.827 0.827 srgb} bind def - -end -save -newpath 0 139 moveto 0 0 lineto 554 0 lineto 554 139 lineto closepath clip newpath --21.7 306.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Arc -7.500 slw -0 slc -n 7825.5 3352.5 247.5 152.9691 -88.9584 arc -gs col0 s gr - -% Arc -n 7687.1 2921.0 550.1 98.5785 5.1071 arcn -gs col0 s gr - -% Arc -n 8017.9 3250.6 450.2 144.8147 61.1744 arcn -gs col0 s gr - -% Arc -n 8004.4 3827.8 312.2 172.2347 88.9678 arcn -gs col0 s gr - -% Arc -n 8472.3 3841.4 304.1 100.8563 5.4037 arcn -gs col0 s gr - -% Arc -n 8407.5 3472.5 412.6 -62.9691 -1.0416 arc -gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8685 4185 m -gs 1 -1 sc (11) col0 sh gr -/Times-Roman ff 142.88 scf sf -7650 4185 m -gs 1 -1 sc (12) col0 sh gr -% Arc -n 715.5 3352.5 247.5 152.9691 -88.9584 arc -gs col0 s gr - -% Arc -n 577.1 2921.0 550.1 98.5785 5.1071 arcn -gs col0 s gr - -% Arc -n 907.9 3250.6 450.2 144.8147 61.1744 arcn -gs col0 s gr - -% Arc -n 894.4 3827.8 312.2 172.2347 88.9678 arcn -gs col0 s gr - -% Arc -n 1362.3 3841.4 304.1 100.8565 5.4037 arcn -gs col0 s gr - -% Arc -n 1297.5 3472.5 412.6 -62.9691 -1.0416 arc -gs col0 s gr - -% Ellipse -n 8190 4590 71 71 0 360 DrawEllipse gs col0 s gr - -% Polyline -0 slj -n 8258 4522 m - 8122 4658 l gs col0 s gr -% Arc -n 2470.5 3352.5 247.5 152.9691 -88.9584 arc -gs col0 s gr - -% Arc -n 2332.1 2921.0 550.1 98.5785 5.1071 arcn -gs col0 s gr - -% Arc -n 2662.9 3250.6 450.2 144.8147 61.1744 arcn -gs col0 s gr - -% Arc -n 2649.4 3827.8 312.2 172.2347 88.9678 arcn -gs col0 s gr - -% Arc -n 3117.3 3841.4 304.1 100.8565 5.4037 arcn -gs col0 s gr - -% Arc -n 3052.5 3472.5 412.6 -62.9691 -1.0416 arc -gs col0 s gr - -/Times-Roman ff 174.63 scf sf -1935 2835 m -gs 1 -1 sc (b\)) col0 sh gr -% Arc -n 4225.5 3352.5 247.5 152.9691 -88.9584 arc -gs col0 s gr - -% Arc -n 4087.1 2921.0 550.1 98.5785 5.1071 arcn -gs col0 s gr - -% Arc -n 4417.9 3250.6 450.2 144.8147 61.1744 arcn -gs col0 s gr - -% Arc -n 4404.4 3827.8 312.2 172.2347 88.9678 arcn -gs col0 s gr - -% Arc -n 4872.3 3841.4 304.1 100.8563 5.4037 arcn -gs col0 s gr - -% Arc -n 4807.5 3472.5 412.6 -62.9691 -1.0416 arc -gs col0 s gr - -/Times-Roman ff 174.63 scf sf -3690 2835 m -gs 1 -1 sc (c\)) col0 sh gr -% Arc -n 5980.5 3352.5 247.5 152.9691 -88.9584 arc -gs col0 s gr - -% Arc -n 5842.1 2921.0 550.1 98.5785 5.1071 arcn -gs col0 s gr - -% Arc -n 6172.9 3250.6 450.2 144.8147 61.1744 arcn -gs col0 s gr - -% Arc -n 6159.4 3827.8 312.2 172.2347 88.9678 arcn -gs col0 s gr - -% Arc -n 6627.3 3841.4 304.1 100.8563 5.4037 arcn -gs col0 s gr - -% Arc -n 6562.5 3472.5 412.6 -62.9691 -1.0416 arc -gs col0 s gr - -/Times-Roman ff 174.63 scf sf -5445 2835 m -gs 1 -1 sc (d\)) col0 sh gr -/Times-Roman ff 174.63 scf sf -7200 2835 m -gs 1 -1 sc (e\)) col0 sh gr -/Times-Roman ff 174.63 scf sf -360 2835 m -gs 1 -1 sc (a\)) col0 sh gr -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n 8411 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8336 4191 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 8006 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7931 4191 m -gs 1 -1 sc (11) col0 sh gr -% Ellipse -n 7601 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7526 3516 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 8771 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8733 3920 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 7682 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7607 3928 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 7826 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -7751 3160 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 8231 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8156 3024 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 8591 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8554 3160 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 8816 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8779 3520 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 8231 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -8194 3651 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -8370 3645 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7920 3645 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7290 3510 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7515 3240 m -gs 1 -1 sc (6) col0 sh gr -/Times-Roman ff 142.88 scf sf -7740 2970 m -gs 1 -1 sc (g:6) col0 sh gr -/Times-Roman ff 142.88 scf sf -8145 2835 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -7965 3330 m -gs 1 -1 sc (3) col0 sh gr -/Times-Roman ff 142.88 scf sf -8505 2970 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -8730 3690 m -gs 1 -1 sc (g:10) col0 sh gr -/Times-Roman ff 142.88 scf sf -8595 3375 m -gs 1 -1 sc (10) col0 sh gr -/Times-Roman ff 142.88 scf sf -8910 3915 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -8280 4365 m -gs 1 -1 sc (g:11) col0 sh gr -/Times-Roman ff 142.88 scf sf -7920 4365 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7290 3915 m -gs 1 -1 sc (g:12) col0 sh gr -% Ellipse -n 1301 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1226 4191 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 896 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -821 4191 m -gs 1 -1 sc (11) col0 sh gr -% Ellipse -n 491 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -416 3516 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 1661 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1623 3920 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 572 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -497 3928 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 716 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -641 3160 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 1121 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1046 3024 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 1481 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1444 3160 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 1706 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1669 3520 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 1121 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -1084 3651 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -1260 3645 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -7695 4815 m -gs 1 -1 sc (UnAssignedEdges) col0 sh gr -% Polyline -0 slj -0 slc -n 585 4500 m 765 4500 l 765 4680 l 585 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -637 4642 m -gs 1 -1 sc (0) col0 sh gr -% Polyline -n 765 4500 m 945 4500 l 945 4680 l 765 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -817 4642 m -gs 1 -1 sc (3) col0 sh gr -% Polyline -n 945 4500 m 1125 4500 l 1125 4680 l 945 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -997 4642 m -gs 1 -1 sc (6) col0 sh gr -% Polyline -n 1125 4500 m 1305 4500 l 1305 4680 l 1125 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1140 4642 m -gs 1 -1 sc (10) col0 sh gr -% Polyline -n 1305 4500 m 1485 4500 l 1485 4680 l 1305 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1320 4642 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 1485 4500 m 1665 4500 l 1665 4680 l 1485 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -1500 4642 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -585 4815 m -gs 1 -1 sc (UnAssignedEdges) col0 sh gr -% Ellipse -n 3056 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2981 4191 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 2651 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2576 4191 m -gs 1 -1 sc (11) col0 sh gr -% Ellipse -n 2246 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2171 3516 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 3416 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3378 3920 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 2327 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2252 3928 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 2471 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2396 3160 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 2876 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2801 3024 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 3236 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3199 3160 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 3461 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3424 3520 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 2876 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -2839 3651 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -3015 3645 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -2565 3645 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 142.88 scf sf -1935 3510 m -gs 1 -1 sc (g:0) col0 sh gr -% Polyline -n 2385 4500 m 2565 4500 l 2565 4680 l 2385 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -2437 4642 m -gs 1 -1 sc (3) col0 sh gr -% Polyline -n 2565 4500 m 2745 4500 l 2745 4680 l 2565 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -2617 4642 m -gs 1 -1 sc (6) col0 sh gr -% Polyline -n 2745 4500 m 2925 4500 l 2925 4680 l 2745 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -2760 4642 m -gs 1 -1 sc (10) col0 sh gr -% Polyline -n 2925 4500 m 3105 4500 l 3105 4680 l 2925 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -2940 4642 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 3105 4500 m 3285 4500 l 3285 4680 l 3105 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -3120 4642 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -2295 4815 m -gs 1 -1 sc (UnAssignedEdges) col0 sh gr -% Ellipse -n 4811 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4736 4191 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 4406 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4331 4191 m -gs 1 -1 sc (11) col0 sh gr -% Ellipse -n 4001 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -3926 3516 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 5171 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5133 3920 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 4082 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4007 3928 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 4226 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4151 3160 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 4631 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4556 3024 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 4991 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4954 3160 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 5216 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5179 3520 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 4631 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -4594 3651 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -4770 3645 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -4320 3645 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 142.88 scf sf -3690 3510 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -3915 3240 m -gs 1 -1 sc (6) col0 sh gr -/Times-Roman ff 142.88 scf sf -4140 2970 m -gs 1 -1 sc (g:6) col0 sh gr -/Times-Roman ff 142.88 scf sf -4545 2835 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -4365 3330 m -gs 1 -1 sc (3) col0 sh gr -% Polyline -n 4320 4500 m 4500 4500 l 4500 4680 l 4320 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -4335 4642 m -gs 1 -1 sc (10) col0 sh gr -% Polyline -n 4500 4500 m 4680 4500 l 4680 4680 l 4500 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -4515 4642 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 4680 4500 m 4860 4500 l 4860 4680 l 4680 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -4695 4642 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -4095 4815 m -gs 1 -1 sc (UnAssignedEdges) col0 sh gr -% Polyline -n 6165 4500 m 6345 4500 l 6345 4680 l 6165 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -6180 4642 m -gs 1 -1 sc (11) col0 sh gr -% Polyline -n 6345 4500 m 6525 4500 l 6525 4680 l 6345 4680 l - cp gs col32 1.00 tnt ef gr gs col0 s gr -/Times-Roman ff 142.88 scf sf -6360 4642 m -gs 1 -1 sc (12) col0 sh gr -/Times-Roman ff 142.88 scf sf -5850 4815 m -gs 1 -1 sc (UnAssignedEdges) col0 sh gr -% Ellipse -n 6566 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6491 4191 m -gs 1 -1 sc (10) col0 sh gr -% Ellipse -n 6161 4138 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6086 4191 m -gs 1 -1 sc (11) col0 sh gr -% Ellipse -n 5756 3463 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5681 3516 m -gs 1 -1 sc (13) col0 sh gr -% Ellipse -n 6926 3868 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6888 3920 m -gs 1 -1 sc (9) col0 sh gr -% Ellipse -n 5837 3875 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5762 3928 m -gs 1 -1 sc (12) col0 sh gr -% Ellipse -n 5981 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -5906 3160 m -gs 1 -1 sc (14) col0 sh gr -% Ellipse -n 6386 2972 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6311 3024 m -gs 1 -1 sc (15) col0 sh gr -% Ellipse -n 6746 3107 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6709 3160 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 6971 3467 94 92 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6934 3520 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 6386 3598 94 92 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 142.88 scf sf -6349 3651 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 142.88 scf sf -6525 3645 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -6075 3645 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 142.88 scf sf -5445 3510 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -5670 3240 m -gs 1 -1 sc (6) col0 sh gr -/Times-Roman ff 142.88 scf sf -5895 2970 m -gs 1 -1 sc (g:6) col0 sh gr -/Times-Roman ff 142.88 scf sf -6300 2835 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 142.88 scf sf -6120 3330 m -gs 1 -1 sc (3) col0 sh gr -/Times-Roman ff 142.88 scf sf -6660 2970 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 142.88 scf sf -6885 3690 m -gs 1 -1 sc (g:10) col0 sh gr -/Times-Roman ff 142.88 scf sf -6750 3375 m -gs 1 -1 sc (10) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF - -%%EndDocument - - endTexFig - -69 2469 a - currentpoint currentpoint translate 1 0.87 div 1 0.87 div scale neg -exch neg exch translate - -69 2469 a 1840 2859 a Fy(Figure)56 b(8:)74 -b(Example)55 b(of)g(the)g(non)h(critical)f(v)-5 b(ertices)55 -b(assignmen)-5 b(t.)p -169 3263 9 103 v -169 3168 103 -9 v -66 3168 8027 9 v 7961 3168 103 9 v 8056 3263 9 103 -v -169 3420 9 150 v 8055 3420 V -72 3375 a Fl(p)f(r)g(o)g(c)g(e)g(d)g -(u)g(r)g(e)82 b Fu(N)6 b(o)g(n)g(C)g(r)g(i)g(t)g(i)g(c)g(a)g(l)g(V)g(e) -g(r)g(t)g(i)g(c)g(e)g(s)g(A)g(s)g(s)g(i)g(g)g(n)g(m)g(e)g(n)g(t)94 -b(\()16 b Fk(G)32 b Fu(,)83 b Fk(G)3575 3392 y Fj(ncr)s(it)3901 -3375 y Fu(,)j(A)s(s)s(s)s(i)s(g)s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)20 -b(,)94 b Fk(g)15 b Fu(\))p -169 3569 V 8055 3569 V 256 -3524 a Fl(f)5 b(o)g(r)104 b Fu(i)92 b(:)12 b(=)75 b(0)g -Fl(to)80 b Fk(m)34 b Ff(\000)h Fu(1)69 b Fl(d)-9 b(o)p --169 3726 V 8055 3726 V 427 3681 a(i)18 b(f)100 b Fu(A)s(s)s(s)s(i)s(g) -s(n)s(e)s(d)s(E)s(d)s(g)s(e)s(s)17 b([)36 b(i)29 b(])71 -b(=)82 b Fl(f)9 b(a)g(l)g(s)g(e)83 b(t)-6 b(h)g(e)g(n)73 -b Fu(UnAssignedEdges)68 b(:)10 b(=)72 b(UnAssignedEdges)j -Ff([)80 b(f)p Fu(i)p Ff(g)18 b Fu(;)p -169 3883 V 8055 -3883 V 256 3838 a Fl(f)5 b(o)g(r)86 b Fk(v)47 b Ff(2)95 -b Fk(V)976 3855 y Fj(scr)s(it)1320 3838 y Fl(d)-9 b(o)79 -b Fu(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)93 b(\()16 -b Fk(G)32 b Fu(,)83 b Fk(v)38 b Fu(,)83 b Fk(G)3232 3855 -y Fj(ncr)s(it)3558 3838 y Fu(,)g Fk(g)5 b Fu(\()p Fk(v)g -Fu(\))32 b(,)83 b Fk(g)38 b Fu(,)82 b(UnAssignedEdges)15 -b(\))k(;)p -169 4040 V 8055 4040 V 256 3995 a Fl(f)5 -b(o)g(r)86 b Fk(v)47 b Ff(2)c Fk(V)924 4012 y Fj(ncr)s(it)1285 -3995 y Fl(a)-11 b(n)g(d)147 b Fk(g)5 b Fu(\()p Fk(v)g -Fu(\))59 b(=)g Ff(\0001)70 b Fl(d)-9 b(o)79 b Fu(t)9 -b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)94 b(\()15 b -Fk(G)33 b Fu(,)83 b Fk(v)37 b Fu(,)83 b Fk(G)4462 4012 -y Fj(ncr)s(it)4788 3995 y Fu(,)g(0)32 b(,)83 b Fk(g)38 -b Fu(,)82 b(UnAssignedEdges)15 b(\))k(;)p -169 4189 V -8055 4189 V -169 4346 V 8055 4346 V -72 4301 a Fl(p)-6 -b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)85 b Fu(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g -(e)g(D)g(f)g(s)94 b(\()15 b Fk(G)33 b Fu(,)83 b Fk(v)37 -b Fu(,)83 b Fk(G)2390 4318 y Fj(ncr)s(it)2716 4301 y -Fu(,)g Fk(g)5 b Fu(V)-13 b(alue)33 b(,)83 b Fk(g)38 b -Fu(,)84 b(u)r(n)r(A)r(s)r(s)r(i)r(g)r(n)r(e)r(d)r(E)r(d)r(g)r(e)r(s)6 -b(\))p -169 4503 V 8055 4503 V 250 4458 a Fk(g)f Fu(\()p -Fk(v)g Fu(\))72 b(:)10 b(=)73 b Fk(g)5 b Fu(V)-13 b(alue)18 -b(;)p -169 4660 V 8055 4660 V 256 4615 a Fl(f)5 b(o)g(r)86 -b Fk(u)43 b Ff(2)g Fu(Adj)34 b(\()p Fk(v)5 b Fu(\))68 -b Fl(a)-11 b(n)g(d)67 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))60 -b(=)f Ff(\0001)70 b Fl(d)-9 b(o)p -169 4817 V 8055 4817 -V 488 4772 a Fk(g)5 b Fu(V)-13 b(alue)73 b(:)10 b(=)71 -b(N)o(e)o(x)o(t)o(U)o(n)o(u)o(s)o(e)o(d)o(A)o(d)o(d)o(r)o(e)o(s)o(s)13 -b(\()d(UnAssignedEdges)q(\))68 b Ff(\000)c Fk(g)5 b Fu(\()p -Fk(v)g Fu(\))18 b(;)p -169 4974 V 8055 4974 V 497 4929 -a(t)9 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)93 b(\()16 -b Fk(G)32 b Fu(,)83 b Fk(u)33 b Fu(,)83 b Fk(G)2161 4946 -y Fj(ncr)s(it)2487 4929 y Fu(,)g Fk(g)5 b Fu(V)-13 b(alue)33 -b(,)83 b Fk(g)38 b Fu(,)83 b(UnAssignedEdges)14 b(\))19 -b(;)p -169 5077 9 103 v -168 5077 103 9 v -66 5077 8027 -9 v 7961 5077 103 9 v 8056 5077 9 103 v 1605 5499 a Fy(Figure)56 -b(9:)74 b(The)55 b(algorithm)h(to)f(assign)i(v)-9 b(alues)55 -b(to)g(non)h(critical)f(v)-5 b(ertices.)5 6029 y(Considering)144 -b(that)e Fx(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)f Fy(=)i -Ft(d)2538 6054 y Fr(av)t(g)2900 6029 y Fy(on)g(a)-5 b(v)g(erage)-161 -6228 y(and)162 b(that)f Fx(j)p Fy(AssignedV)-14 b(ertices)p -Fx(j)223 b(\024)g(j)p Fy(Adj\()p Ft(u)p Fy(\))p Fx(j)p -Fy(,)187 b(then)-161 6427 y Fx(j)p Fy(AssignedV)-14 b(ertices)q -Fx(j)46 b(\024)g Ft(d)1455 6452 y Fr(av)t(g)1676 6427 -y Fy(.)73 b(Th)-5 b(us,)-50 6924 y Ft(C)12 b Fy(\()p -Fx(j)p Ft(V)289 6949 y Fr(cr)t(it)518 6924 y Fx(j)p Fy(\))46 -b Fx(\024)850 6702 y Fo(j)p Fr(V)967 6719 y Fm(cr)s(it)1180 -6702 y Fo(j)915 6766 y Fp(X)911 7118 y Fr(u)p Fn(=1)1219 -6924 y Fy(\()p Ft(d)1370 6949 y Fr(av)t(g)1627 6924 y -Fy(+)37 b(\()p Ft(I)13 b Fy(\()p Ft(u)p Fy(\))36 b Fx(\002)h -Ft(d)2457 6949 y Fr(av)t(g)2677 6924 y Fy(\))g(+)g Ft(d)3031 -6949 y Fr(av)t(g)3251 6924 y Fy(\))230 b(\(6\))5 7374 -y(As)75 b(presen)-5 b(ted)76 b(b)5 b(efore,)78 b Ft(d)1688 -7399 y Fr(av)t(g)1983 7374 y Fy(is)e(a)f(constan)-5 b(t)75 -b(and)g Ft(N)3492 7399 y Fr(t)3629 7374 y Fx(\024)-161 -7573 y Ft(N)-28 7598 y Fr(bedg)t(es)366 7573 y Fy(.)88 -b(Therefore,)60 b(applying)h Ft(d)2073 7598 y Fr(av)t(g)2347 -7573 y Fy(=)54 b(2)p Fx(j)p Ft(E)2782 7598 y Fr(cr)t(it)3012 -7573 y Fx(j)p Ft(=)p Fx(j)p Ft(V)3284 7598 y Fr(cr)t(it)3514 -7573 y Fx(j)60 b Fy(in)-161 7772 y(Theorem)c(1)f(giv)-5 -b(es:)636 8078 y Ft(N)769 8103 y Fr(t)994 8078 y Fx(\024)166 -b(j)p Ft(E)1458 8103 y Fr(cr)t(it)1687 8078 y Fx(j)37 -b(\000)h(j)p Ft(V)2080 8103 y Fr(cr)t(it)2309 8078 y -Fx(j)g Fy(+)f(1)994 8414 y Fx(\024)1309 8302 y Ft(d)1395 -8327 y Fr(av)t(g)p 1309 8376 307 7 v 1420 8528 a Fy(2)1635 -8414 y Fx(j)p Ft(V)1778 8439 y Fr(cr)t(it)2008 8414 y -Fx(j)g(\000)g(j)p Ft(V)2400 8439 y Fr(cr)t(it)2630 8414 -y Fx(j)g Fy(+)g(1)994 8835 y Fx(\024)1289 8601 y Fp(\022)1431 -8723 y Ft(d)1517 8748 y Fr(av)t(g)p 1431 8797 V 1543 -8949 a Fy(2)1794 8835 y Fx(\000)g Fy(1)2043 8601 y Fp(\023)2193 -8835 y Fx(j)p Ft(V)2336 8860 y Fr(cr)t(it)2566 8835 y -Fx(j)g Fy(+)g(1)-161 9241 y(Since)78 b Ft(d)381 9266 -y Fr(av)t(g)679 9241 y Fy(is)g(a)f(constan)-5 b(t)78 -b(then)f Ft(N)2253 9266 y Fr(t)2395 9241 y Fy(=)83 b -Ft(O)5 b Fy(\()p Fx(j)p Ft(V)2947 9266 y Fr(cr)t(it)3176 -9241 y Fx(j)p Fy(\).)139 b(The)-161 9440 y(n)-5 b(um)g(b)5 -b(er)58 b(of)e(times)h(that)f(AssignedEdges[Nextg)40 -b(+)e Ft(g)6 b Fy(\()p Ft(w)t Fy(\)])47 b(=)-161 9639 -y Ft(tr)5 b(ue)42 b Fy(is)h(giv)-5 b(en)42 b(b)-5 b(y)42 -b(Eq.)g(\(5\).)68 b(Th)-5 b(us,)46 b Ft(I)13 b Fy(\()p -Ft(u)p Fy(\))41 b(m)-5 b(ust)43 b(b)5 b(e)42 b(a)g(constan)-5 -b(t)-161 9839 y(b)5 b(ecause)571 10066 y Fo(j)p Fr(V)688 -10083 y Fm(cr)s(it)901 10066 y Fo(j)636 10130 y Fp(X)633 -10482 y Fr(u)p Fn(=1)941 10288 y Fy(\()p Ft(I)13 b Fy(\()p -Ft(u)p Fy(\))35 b Fx(\000)i Fy(1\))46 b(=)g Ft(N)2020 -10313 y Fr(t)2125 10288 y Fy(=)h Ft(O)5 b Fy(\()p Fx(j)p -Ft(V)2641 10313 y Fr(cr)t(it)2869 10288 y Fx(j)p Fy(\))p -Ft(:)4136 6029 y Fy(Since)57 b Ft(I)13 b Fy(\()p Ft(u)p -Fy(\))55 b(and)i Ft(d)5347 6054 y Fr(a)5428 6029 y Ft(v)6 -b(g)63 b Fy(in)56 b(Eq.)g(\(6\))g(are)g(constan)-5 b(ts,)57 -b(w)-5 b(e)57 b(ha)-5 b(v)g(e)4136 6228 y(that)48 b Ft(C)12 -b Fy(\()p Fx(j)p Ft(V)4828 6253 y Fr(cr)t(it)5057 6228 -y Fx(j)p Fy(\))46 b(=)g Ft(O)5 b Fy(\()p Fx(j)p Ft(V)5729 -6253 y Fr(cr)t(it)5958 6228 y Fx(j)p Fy(\).)71 b(As)48 -b Fx(j)p Ft(V)6567 6253 y Fr(cr)t(it)6797 6228 y Fx(j)e(\024)g(j)p -Ft(V)37 b Fx(j)48 b Fy(and)h Fx(j)p Ft(V)37 b Fx(j)46 -b Fy(=)4136 6427 y Ft(cn)p Fy(,)53 b(the)f(time)h(complexit)-5 -b(y)52 b(of)h(the)f(assignmen)-5 b(t)54 b(of)f(v)-9 b(alues)53 -b(to)4136 6627 y(critical)i(v)-5 b(ertices)55 b(is)h -Ft(O)5 b Fy(\()p Ft(n)p Fy(\).)4136 7098 y Fq(5.3.2)193 -b(Assignmen)-5 b(t)105 b(of)f(V)-16 b(alues)104 b(to)h(Non)f(Critical) -4720 7298 y(V)-16 b(ertices)4136 7618 y Fy(The)139 b(pro)5 -b(cedure)139 b(NonCriticalV)-14 b(erticesAssignmen)-5 -b(t)139 b(\()p Ft(G)p Fy(,)4136 7817 y Fs(G)4264 7842 -y Fb(ncrit)4571 7817 y Fy(,)73 b(AssignedEdges,)h(g\))69 -b(receiv)-5 b(es)69 b Ft(G)p Fy(,)j Fs(G)7097 7842 y -Fb(ncrit)7473 7817 y Fy(and)e(As-)4136 8017 y(signedEdges)63 -b(as)f(input)f(and)h(pro)5 b(duces)62 b(the)e(assignmen)-5 -b(t)63 b(of)4136 8216 y(v)-9 b(alues)46 b(to)g(v)-5 b(ertices)45 -b(in)i Ft(G)5722 8241 y Fr(ncr)t(it)6033 8216 y Fy(,)h(represen)-5 -b(ted)47 b(b)-5 b(y)46 b(the)g(arra)-5 b(y)46 b Ft(g)6 -b Fy(.)4136 8415 y(This)69 b(\014nishes)g(the)e(p)5 b(erfect)66 -b(assignmen)-5 b(t)70 b(of)d(v)-9 b(alues)68 b(to)f(v)-5 -b(er-)4136 8614 y(tices)71 b(of)f Ft(G)p Fy(.)119 b(W)-14 -b(e)70 b(use)h(a)g(depth-\014rst)g(searc)-5 b(h)71 b(algorithm)h(to) -4136 8814 y(assign)57 b(v)-9 b(alues)55 b(to)g(v)-5 b(ertices)55 -b(in)h Ft(G)6250 8839 y Fr(ncr)t(it)6562 8814 y Fy(.)4302 -9020 y(As)87 b Ft(G)4710 9045 y Fr(ncr)t(it)5108 9020 -y Fy(is)h(acyclic,)94 b(w)-5 b(e)86 b(can)h(imp)5 b(ose)88 -b(the)e(order)h(in)4136 9220 y(whic)-5 b(h)76 b(addresses)h(are)e(asso) -5 b(ciated)76 b(with)f(edges)h(in)f Ft(G)7697 9245 y -Fr(ncr)t(it)8009 9220 y Fy(.)4136 9419 y(Therefore,)k(in)c(the)g -(assignmen)-5 b(t)76 b(of)e(v)-9 b(alues)75 b(to)f(v)-5 -b(ertices)75 b(in)4136 9618 y Ft(G)4267 9643 y Fr(ncr)t(it)4643 -9618 y Fy(w)-5 b(e)65 b(place)f(the)g(un)-5 b(used)66 -b(addresses)g(in)f(the)f(gaps)h(left)4136 9817 y(b)-5 -b(y)69 b(the)f(assignmen)-5 b(t)70 b(of)e(v)-9 b(alues)68 -b(to)g(v)-5 b(ertices)68 b(in)h Ft(G)7424 9842 y Fr(cr)t(it)7654 -9817 y Fy(.)113 b(F)-14 b(or)4136 10017 y(that,)62 b(w)-5 -b(e)62 b(start)e(the)h(deph)-5 b(t-\014rst)63 b(searc)-5 -b(h)61 b(from)h(the)e(v)-5 b(ertices)4136 10216 y(in)80 -b Ft(V)4451 10241 y Fr(scr)t(it)4824 10216 y Fy(b)5 b(ecause)80 -b(these)f(critical)h(v)-5 b(ertices)79 b(w)-5 b(ere)80 -b(already)4136 10415 y(assigned,)57 b(so)f(their)f Ft(g)62 -b Fy(v)-9 b(alues)55 b(can)g(not)h(b)5 b(e)55 b(c)-5 -b(hanged.)3864 10913 y(10)p eop end -%%Page: 11 11 -TeXDict begin 11 10 bop 5 620 a Fy(Considering)75 b(the)d(subgraph)i -Ft(G)2110 645 y Fr(ncr)t(it)2495 620 y Fy(in)f(Figure)h(4\(d\),)i(a) --161 819 y(step)f(b)-5 b(y)75 b(step)g(example)f(of)h(the)f(assignmen) --5 b(t)77 b(of)d(v)-9 b(alues)75 b(to)-161 1018 y(v)-5 -b(ertices)52 b(in)h Ft(G)759 1043 y Fr(ncr)t(it)1123 -1018 y Fy(is)g(presen)-5 b(ted)53 b(in)g(Figure)g(8.)73 -b(Figure)53 b(8\(a\))-161 1218 y(presen)-5 b(ts)52 b(the)f(initial)g -(state)f(of)h(the)f(algorithm.)73 b(The)51 b(critical)-161 -1417 y(v)-5 b(ertex)62 b(5)h(is)h(the)f(only)g(one)g(that)g(has)g(non)h -(critical)f(v)-5 b(ertices)-161 1616 y(as)52 b(adjacen)-5 -b(t.)72 b(In)52 b(the)e(example)i(presen)-5 b(ted)51 -b(in)h(Figure)g(6,)g(the)-161 1815 y(addresses)k Fx(f)p -Fy(0)p Ft(;)28 b Fy(3)p Ft(;)g Fy(6)p Ft(;)g Fy(10)p -Ft(;)g Fy(11)p Ft(;)g Fy(12)p Fx(g)54 b Fy(w)-5 b(ere)54 -b(not)g(used.)74 b(So,)55 b(taking)-161 2015 y(the)77 -b(\014rst)g(un)-5 b(used)79 b(address)g(0)e(and)g(the)g(v)-5 -b(ertex)76 b(13,)83 b(whic)-5 b(h)-161 2214 y(is)62 b(reac)-5 -b(hed)62 b(from)f(the)g(v)-5 b(ertex)61 b(5,)i(the)e -Ft(g)67 b Fy(v)-9 b(alue)61 b(of)g(v)-5 b(ertex)60 b(13)-161 -2413 y(is)75 b(set)f(to)g(0)49 b Fx(\000)h Ft(g)6 b Fy(\(5\))77 -b(=)g(0,)i(as)c(sho)-5 b(wn)75 b(in)g(Figure)f(8\(b\).)130 -b(In)-161 2612 y(Figure)54 b(8\(c\),)f(using)h(the)f(un)-5 -b(used)55 b(addresses)g(3)e(and)h(6,)f(the)g Ft(g)-161 -2812 y Fy(v)-9 b(alues)63 b(for)f(v)-5 b(ertices)61 b(15)i(and)f(14)h -(are)f(set)g(to)g(3)41 b Fx(\000)h Ft(g)6 b Fy(\(13\))57 -b(=)g(3)-161 3011 y(and)c(to)g(6)31 b Fx(\000)g Ft(g)6 -b Fy(\(13\))46 b(=)g(6,)53 b(resp)5 b(ectiv)-5 b(ely)-14 -b(.)72 b(V)-14 b(ertices)52 b(0,)i(1,)f(9,)g(10,)-161 -3210 y(11)46 b(and)g(12)f(w)-5 b(ere)46 b(not)f(assigned)i(y)-5 -b(et,)47 b(so)f(w)-5 b(e)45 b(con)-5 b(tin)g(ue)46 b(the)f(as-)-161 -3409 y(signmen)-5 b(t)58 b(of)e(v)-9 b(alues)56 b(to)g(non)h(critical)f -(v)-5 b(ertices)56 b(from)g(v)-5 b(ertex)-161 3609 y(0.)106 -b(In)67 b(Figure)f(8\(d\),)i(w)-5 b(e)67 b(set)e Ft(g)6 -b Fy(\(0\))66 b(to)f(0.)106 b(The)66 b(only)g(v)-5 b(ertex)-161 -3808 y(that)51 b(is)g(reac)-5 b(hed)52 b(from)f(v)-5 -b(ertex)49 b(0)i(is)h(v)-5 b(ertex)50 b(1,)i(so)f(taking)g(the)-161 -4007 y(un)-5 b(used)56 b(address)g(10)f(w)-5 b(e)54 b(set)g -Ft(g)6 b Fy(\(1\))54 b(to)g(10)35 b Fx(\000)g Ft(g)6 -b Fy(\(0\))46 b(=)g(10.)73 b(This)-161 4206 y(pro)5 b(cess)52 -b(is)g(rep)5 b(eated)50 b(un)-5 b(til)52 b(the)e(UnAssignedEdges)j -(list)e(b)5 b(e-)-161 4406 y(comes)54 b(empt)-5 b(y)-14 -b(.)73 b(The)52 b(\014nal)i(result)f(is)g(sho)-5 b(wn)54 -b(in)f(Figure)g(8\(e\).)5 4624 y(A)65 b(pseudo)h(co)5 -b(de)64 b(for)h(the)g(assignmen)-5 b(t)66 b(of)f(v)-9 -b(alues)65 b(to)g(non)-161 4824 y(critical)55 b(v)-5 -b(ertices)55 b(is)h(presen)-5 b(ted)56 b(in)g(Figure)g(9.)-161 -5359 y Fq(Complexit)-5 b(y)64 b(Analysis)-161 5702 y -Fy(The)88 b(assignmen)-5 b(t)90 b(of)e(v)-9 b(alues)88 -b(to)f(v)-5 b(ertices)88 b(in)g Ft(G)3076 5727 y Fr(ncr)t(it)3476 -5702 y Fy(is)g(a)-161 5902 y(depth-\014rst)61 b(searc)-5 -b(h)61 b(algorithm.)90 b(Then,)61 b(its)g(time)f(complex-)-161 -6101 y(it)-5 b(y)54 b(is)h Ft(O)5 b Fy(\()p Fx(j)p Ft(V)593 -6126 y Fr(scr)t(it)885 6101 y Fx(j)35 b Fy(+)f Fx(j)p -Ft(V)1272 6126 y Fr(ncr)t(it)1585 6101 y Fx(j)g Fy(+)h -Fx(j)p Ft(E)1998 6126 y Fr(ncr)t(it)2310 6101 y Fx(j)p -Fy(\).)73 b(Considering)56 b(that)-161 6300 y Fx(j)p -Ft(V)-18 6325 y Fr(ncr)t(it)294 6300 y Fx(j)47 b(\024)f(j)p -Ft(V)37 b Fx(j)p Fy(,)44 b Fx(j)p Ft(V)1021 6325 y Fr(scr)t(it)1313 -6300 y Fx(j)j(\024)f(j)p Ft(V)37 b Fx(j)p Fy(,)44 b Fx(j)p -Ft(V)36 b Fx(j)47 b Fy(=)f Ft(cn)40 b Fy(and)h Fx(j)p -Ft(E)3033 6325 y Fr(ncr)t(it)3345 6300 y Fx(j)46 b(\024)g -Ft(n)p Fy(,)-161 6499 y(the)j(complexit)-5 b(y)49 b(of)g(the)g -(assignmen)-5 b(t)51 b(of)e(v)-9 b(alues)49 b(to)g(non)g(crit-)-161 -6699 y(ical)56 b(v)-5 b(ertices)55 b(is)h Ft(O)5 b Fy(\()p -Ft(n)p Fy(\).)-161 7352 y Fv(6)270 b(MPHF)90 b(Ev)-15 -b(aluation)-161 7752 y Fy(Figure)103 b(10)e(presen)-5 -b(ts)103 b(a)f(pseudo)h(co)5 b(de)101 b(to)g(ev)-9 b(aluate)101 -b(the)-161 7951 y(MPHF)71 b(generated)g(b)-5 b(y)71 b(the)g(new)f -(algorithm.)122 b(The)70 b(pro)5 b(ce-)-161 8150 y(dure)51 -b(h)g(\()p Ft(x)p Fy(,)g Ft(g)6 b Fy(,)52 b Ft(h)892 -8175 y Fn(1)966 8150 y Fy(,)g Ft(h)1160 8175 y Fn(2)1234 -8150 y Fy(\))e(receiv)-5 b(es)51 b(as)g(input)g(a)g(k)-5 -b(ey)50 b Ft(x)c Fx(2)g Ft(S)10 b Fy(,)51 b(the)-161 -8350 y Ft(g)71 b Fy(function,)66 b(the)e(tables)g(used)h(b)-5 -b(y)65 b Ft(h)2204 8375 y Fn(1)2342 8350 y Fy(and)g Ft(h)2770 -8375 y Fn(2)2908 8350 y Fy(and)g(returns)-161 8549 y(the)55 -b(hash)i(table)e(address)h(assigned)h(to)e Ft(x)p Fy(.)p --169 8992 9 103 v -169 8898 103 9 v -66 8898 3730 9 v -3664 8898 103 9 v 3759 8992 9 103 v -169 9149 9 150 v -3758 9149 V -72 9104 a Fl(p)-6 b(r)g(o)g(c)g(e)g(d)g(u)g(r)g(e)73 -b Fu(h)80 b(\()15 b Fk(x)32 b Fu(,)83 b Fk(g)38 b Fu(,)83 -b Fk(h)1532 9121 y Fa(1)1634 9104 y Fu(,)g Fk(h)1848 -9121 y Fa(2)1927 9104 y Fu(\))p -169 9306 V 3758 9306 -V 171 9261 a Fk(u)72 b Fu(:)10 b(=)73 b Fk(h)664 9278 -y Fa(1)734 9261 y Fu(\()p Fk(x)p Fu(\))18 b(;)p -169 -9463 V 3758 9463 V 171 9418 a Fk(v)77 b Fu(:)10 b(=)73 -b Fk(h)656 9435 y Fa(2)725 9418 y Fu(\()p Fk(x)p Fu(\))18 -b(;)p -169 9620 V 3758 9620 V 171 9575 a Fl(return)83 -b Fu(\()16 b Fk(g)5 b Fu(\()p Fk(u)p Fu(\))34 b(+)h Fk(g)5 -b Fu(\()p Fk(v)g Fu(\))19 b(\))g(;)p -169 9723 9 103 -v -168 9723 103 9 v -66 9723 3730 9 v 3664 9723 103 9 -v 3759 9723 9 103 v 560 10144 a Fy(Figure)56 b(10:)74 -b(Ev)-9 b(aluating)55 b(the)g(MPHF.)4136 620 y Fv(7)270 -b(Exp)7 b(erimen)-7 b(tal)88 b(Results)4136 983 y Fy(In)47 -b(this)g(section)g(w)-5 b(e)47 b(presen)-5 b(t)48 b(exp)5 -b(erimen)-5 b(tal)46 b(results)i(to)e(sho)-5 b(w)4136 -1183 y(the)41 b(e\016ciency)g(of)g(the)f(new)i(algorithm.)69 -b(Also,)45 b(a)c(comparison)4136 1382 y(with)62 b(algorithm)g(CHM)g -(\(prop)5 b(osed)62 b(b)-5 b(y)62 b(Czec)-5 b(h,)63 b(Ha)-5 -b(v)c(as)62 b(and)4136 1581 y(Ma)9 b(jewski)56 b([1]\))f(is)h(made.) -4302 1780 y(The)d(t)-5 b(w)g(o)53 b(algorithms)g(w)-5 -b(ere)53 b(implemen)-5 b(ted)54 b(in)f(the)f(C)g(lan-)4136 -1980 y(guage.)70 b(All)41 b(exp)5 b(erimen)-5 b(ts)41 -b(w)-5 b(ere)42 b(carried)f(out)h(on)g(a)f(computer)4136 -2179 y(running)97 b(the)e(Lin)-5 b(ux)96 b(op)5 b(erating)95 -b(system,)106 b(v)-5 b(ersion)96 b(2.6.7,)4136 2378 y(with)63 -b(a)h(2.2)f(gigahertz)g(A)-5 b(thlon)64 b(pro)5 b(cessor)64 -b(and)g(1)f(gigab)-5 b(yte)4136 2577 y(of)55 b(main)h(memory)-14 -b(.)p 4596 2790 3000 7 v 4593 2972 7 183 v 4695 2918 -a Fu(Collection)p 5466 2972 V 502 w Fk(n)p 6365 2972 -V 503 w Fu(Key)52 b(Size)f(\(Avg\))p 7592 2972 V 4596 -2979 3000 7 v 4593 3162 7 183 v 4751 3107 a(T)-13 b(o)t(doBR)p -5466 3162 V 293 w(3,541,615)p 6365 3162 V 652 w(8.3)p -7592 3162 V 4593 3344 V 4750 3290 a(Random)p 5466 3344 -V 254 w(10,000,000)p 6365 3344 V 574 w(20.0)p 7592 3344 -V 4593 3527 V 4833 3472 a(VLC2)p 5466 3527 V 337 w(10,935,900)p -6365 3527 V 613 w(8.6)p 7592 3527 V 4593 3710 V 4840 -3655 a(URLs)p 5466 3710 V 344 w(20,000,000)p 6365 3710 -V 574 w(57.4)p 7592 3710 V 4596 3716 3000 7 v 4452 4039 -a Fy(T)f(able)56 b(4:)74 b(Collections)55 b(used)h(in)g(the)f(exp)5 -b(erimen)-5 b(ts.)4302 4411 y(W)-14 b(e)145 b(used)h(four)f -(collections)h(in)f(the)g(exp)5 b(erimen)-5 b(ts:)4136 -4610 y(\(i\))119 b(the)g(v)-5 b(o)5 b(cabulary)119 b(of)g(the)g(T)-14 -b(o)5 b(doBR)120 b(searc)-5 b(h)120 b(engine)4136 4810 -y(\(h)-5 b(ttp://www.to)5 b(dobr.com.br\);)77 b(\(ii\))69 -b(a)h(collection)g(of)f(k)-5 b(eys)4136 5009 y(generated)38 -b(randomly)h(\(Random\);)44 b(\(iii\))38 b(the)f(v)-5 -b(o)5 b(cabulary)38 b(ex-)4136 5208 y(tracted)55 b(from)h(the)f -(TREC-VLC2)g(\(V)-14 b(ery)54 b(Large)h(Collection)4136 -5407 y(2\))i(collection)f([11];)i(\(iv\))d(a)i(set)f(of)h(URLs)g(cra)-5 -b(wled)57 b(from)g(the)4136 5607 y(W)-14 b(eb.)99 b(T)-14 -b(able)63 b(4)h(presen)-5 b(ts)65 b(some)f(details)g(ab)5 -b(out)63 b(the)g(collec-)4136 5806 y(tions.)4302 6005 -y(T)-14 b(able)55 b(5)g(presen)-5 b(ts)55 b(the)f(main)i(c)-5 -b(haracteristics)54 b(of)h(the)f(t)-5 b(w)g(o)4136 6204 -y(algorithms.)75 b(The)55 b(n)-5 b(um)g(b)5 b(er)57 b(of)e(edges)h(of)f -(graph)h Ft(G)46 b Fy(=)g(\()p Ft(V)9 b(;)28 b(E)10 b -Fy(\))4136 6404 y(is)63 b(equal)g(to)f(the)g(size)h Ft(n)f -Fy(of)h(the)f(set)g Ft(S)72 b Fy(of)63 b(k)-5 b(eys)62 -b(for)h(the)f(t)-5 b(w)g(o)4136 6603 y(algorithms.)121 -b(The)71 b(n)-5 b(um)g(b)5 b(er)72 b(of)e(v)-5 b(ertices)70 -b(of)h Ft(G)f Fy(is)h(equal)g(to)4136 6802 y(1)p Ft(:)p -Fy(15)p Ft(n)61 b Fy(and)h(2)p Ft(:)p Fy(09)p Ft(n)f -Fy(for)g(the)f(new)h(algorithm)h(and)g(the)e(CHM)4136 -7001 y(algorithm,)53 b(resp)5 b(ectiv)-5 b(ely)-14 b(.)72 -b(This)53 b(measure)g(is)f(related)g(to)g(the)4136 7201 -y(amoun)-5 b(t)62 b(of)f(space)g(to)f(store)h(the)g(arra)-5 -b(y)61 b Ft(g)6 b Fy(.)90 b(The)61 b(n)-5 b(um)g(b)5 -b(er)62 b(of)4136 7400 y(critical)74 b(edges)g(is)h(0)p -Ft(:)p Fy(5)p Fx(j)p Ft(E)10 b Fx(j)73 b Fy(and)i(0,)j(for)c(the)g(new) -g(algorithm)4136 7599 y(and)56 b(the)f(CHM)g(algorithm,)h(resp)5 -b(ectiv)-5 b(ely)-14 b(.)p 4509 7811 3174 7 v 4506 8047 -7 236 v 4675 8047 a Fu(Characteristics)p 5838 8047 V -6388 7939 a(Algorithms)p 7679 8047 V 5841 8053 1841 7 -v 4506 8229 7 183 v 5838 8229 V 5941 8175 a(New)52 b(algorithm)p -7032 8229 V 238 w(CHM)p 7679 8229 V 4509 8236 3174 7 -v 4506 8419 7 183 v 5072 8364 a Ff(j)p Fk(E)9 b Ff(j)p -5838 8419 V 1112 w Fk(n)p 7032 8419 V 827 w(n)p 7679 -8419 V 4506 8601 V 5071 8546 a Ff(j)p Fk(V)33 b Ff(j)p -5838 8601 V 1079 w Fk(cn)p 7032 8601 V 761 w(cn)p 7679 -8601 V 4506 8784 V 5142 8729 a(c)p 5838 8784 V 1094 w -Fu(1.15)p 7032 8784 V 646 w(2.09)p 7679 8784 V 4506 8967 -V 5093 8912 a Ff(j)p Fk(g)5 b Ff(j)p 5838 8967 V 998 -w Fu(1)p Fk(:)p Fu(15)p Fk(n)p 7032 8967 V 554 w Fu(2)p -Fk(:)p Fu(09)p Fk(n)p 7679 8967 V 4506 9149 V 4968 9094 -a Ff(j)p Fk(E)5124 9111 y Fj(cr)s(it)5340 9094 y Ff(j)p -5838 9149 V 854 w Fu(0)p Fk(:)p Fu(5)p Ff(j)p Fk(E)k -Ff(j)p 7032 9149 V 678 w Fu(0)p 7679 9149 V 4506 9332 -V 5115 9277 a Fk(G)p 5838 9332 V 1018 w Fu(cyclic)p 7032 -9332 V 511 w(acyclic)p 7679 9332 V 4506 9515 V 4609 9460 -a(Order)52 b(preserving)p 5838 9515 V 616 w(no)p 7032 -9515 V 737 w(y)l(es)p 7679 9515 V 4509 9521 3174 7 v -4364 9843 a Fy(T)-14 b(able)56 b(5:)74 b(Main)55 b(c)-5 -b(haracteristics)56 b(of)f(the)g(algorithms.)4302 10216 -y(T)-14 b(able)132 b(6)g(presen)-5 b(ts)133 b(time)e(results)i(for)e -(constructing)4136 10415 y(MPHFs)72 b(using)h(the)e(t)-5 -b(w)g(o)72 b(algorithms.)124 b(The)71 b(table)h(en)-5 -b(tries)3864 10913 y(11)p eop end -%%Page: 12 12 -TeXDict begin 12 11 bop -121 460 8138 7 v 1753 635 a -Fu(New)51 b(algorithm,)f Fk(c)43 b Fu(=)g(1)p Fk(:)p -Fu(15)2386 b(CHM,)51 b Fk(c)43 b Fu(=)g(2)p Fk(:)p Fu(09)p -803 718 3532 7 v 4534 718 3482 7 v 29 887 a(Collection)248 -b Fk(N)1075 904 y Fj(i)1375 887 y Fu(Mapping)199 b(Ordering)i(Searc)l -(hing)236 b(T)-13 b(otal)483 b Fk(N)4806 904 y Fj(i)5106 -887 y Fu(Mapping)51 b(+)h(Ordering)200 b(Searc)l(hing)g(T)-13 -b(otal)p -121 970 8138 7 v 59 1186 a(T)g(o)t(doBR)281 -b(1.92)320 b(11.33)482 b(1.93)547 b(0.97)422 b(14.23)436 -b(2.63)730 b(19.51)915 b(3.03)386 b(22.54)58 1368 y(Random)280 -b(1.77)320 b(41.90)482 b(7.17)547 b(3.70)422 b(52.77)436 -b(2.96)730 b(59.92)877 b(10.31)347 b(70.23)142 1551 y(VLC2)362 -b(2.24)320 b(44.69)482 b(7.00)547 b(3.59)422 b(55.28)436 -b(2.94)730 b(78.77)877 b(11.09)347 b(89.86)149 1734 y(URLs)369 -b(2.18)281 b(153.23)406 b(14.62)508 b(7.52)384 b(175.37)508 -b(-)991 b(-)1177 b(-)648 b(-)p -121 1842 V 1667 2165 -a Fy(T)-14 b(able)56 b(6:)74 b(Time)55 b(to)g(generate)g(the)g(MPHFs)h -(for)f(the)g(new)g(algorithms.)-161 2695 y(represen)-5 -b(t)55 b(a)-5 b(v)g(erages)55 b(o)-5 b(v)g(er)55 b(50)f(trials.)74 -b(The)54 b(column)h(lab)5 b(elled)-161 2894 y(as)63 b -Ft(N)183 2919 y Fr(i)302 2894 y Fy(represen)-5 b(ts)63 -b(the)f(n)-5 b(um)g(b)5 b(er)64 b(of)e(iterations)h(to)f(generate)-161 -3094 y(the)c(random)h(graph)g Ft(G)e Fy(in)i(the)f(mapping)h(step)f(of) -g(the)g(algo-)-161 3293 y(rithms.)73 b(The)49 b(other)g(columns)i -(represen)-5 b(t)49 b(the)g(run)h(times)f(for)-161 3492 -y(eac)-5 b(h)56 b(step)f(of)h(the)e(algorithms.)75 b(All)56 -b(times)f(are)g(in)h(seconds.)5 3716 y(The)i(CHM)e(algorithm)i(p)5 -b(erforms)58 b(the)e(ordering)i(step)f(to-)-161 3915 -y(gether)65 b(the)f(mapping)i(step.)102 b(In)65 b(the)f(CHM)g -(algorithm)i(the)-161 4115 y(ordering)c(step)g(is)g(just)g(the)f -(assignmen)-5 b(t)63 b(of)f(hash)g(v)-9 b(alues)62 b(to)-161 -4314 y(the)55 b(edges)h(of)f Ft(G)p Fy(.)5 4538 y(The)c(mapping)g(step) -f(of)g(the)g(new)g(algorithm)h(is)f(faster)g(b)5 b(e-)-161 -4737 y(cause)57 b(the)f(n)-5 b(um)g(b)5 b(er)58 b(of)f(iterations)f(to) -g(generate)g Ft(G)g Fy(is)h(lo)-5 b(w)g(er,)-161 4936 -y(since)78 b Ft(G)e Fy(has)i(1)p Ft(:)p Fy(15)p Ft(n)e -Fy(v)-5 b(ertices)77 b(and)g(m)-5 b(ust)78 b(not)e(b)5 -b(e)77 b(acyclic.)-161 5136 y(This)68 b(result)e(fully)g(bac)-5 -b(ks)67 b(the)f(theoretical)g(considerations.)-161 5335 -y(Using)78 b(Eq.)e(\(4\),)82 b(the)76 b(exp)5 b(ected)76 -b(n)-5 b(um)g(b)5 b(er)78 b(of)f(iterations)g(to)-161 -5534 y(generate)h Ft(G)h Fy(for)f(the)h(new)f(algorithm)i(is)f(2)p -Ft(:)p Fy(13)g(and)g(using)-161 5733 y(Eq.)65 b(\(2\),)h(the)e(same)h -(measure)g(is)g(2)p Ft(:)p Fy(92)g(for)f(the)h(CHM)f(algo-)-161 -5933 y(rithm.)73 b(The)49 b(CHM)f(algorithm)i(also)g(needs)g(to)e(v)-5 -b(erify)49 b(if)g Ft(G)g Fy(is)-161 6132 y(acyclic)63 -b(during)i(the)e(mapping)i(step,)h(whic)-5 b(h)65 b(has)f(the)g(same) --161 6331 y(complexit)-5 b(y)55 b(of)h(the)e(ordering)i(step)g(of)f -(the)g(new)g(algorithm.)5 6555 y(The)47 b(random)h(graph)f -Ft(G)f Fy(generated)g(in)h(the)f(mapping)i(step)-161 -6754 y(of)71 b(the)g(new)g(algorithm)g(has)h(1)p Ft(:)p -Fy(15)p Ft(n)f Fy(v)-5 b(ertices)70 b(and)i(the)e(one)-161 -6954 y(generated)58 b(in)g(the)f(mapping)i(step)f(of)g(the)f(CHM)h -(algorithm)-161 7153 y(has)64 b(2)p Ft(:)p Fy(09)p Ft(n)e -Fy(v)-5 b(ertices.)95 b(That)62 b(is)h(wh)-5 b(y)62 b(the)g(searc)-5 -b(hing)64 b(step)f(of)-161 7352 y(new)68 b(algorithm)g(is)g(faster,)j -(since)d(the)f(time)g(complexit)-5 b(y)68 b(of)-161 7551 -y(the)75 b(searc)-5 b(hing)76 b(step)f(of)f(the)g(algorithms)i(dep)5 -b(ends)76 b(on)f(the)-161 7751 y(n)-5 b(um)g(b)5 b(er)57 -b(of)e(v)-5 b(ertices)55 b(in)h Ft(G)p Fy(.)5 7975 y(W)-14 -b(e)99 b(w)-5 b(ere)99 b(not)g(able)g(to)g(generate)f(a)i(MPHF)f(for)g -(the)-161 8174 y(CHM)66 b(algorithm)h(using)g(the)f(URLs)g(collection.) -106 b(The)66 b(rea-)-161 8373 y(son)77 b(w)-5 b(as)78 -b(that)d(its)i(random)g(graph)g Ft(G)f Fy(has)h(more)g(v)-5 -b(ertices)-161 8572 y(\()p Fx(j)p Ft(V)37 b Fx(j)85 b -Fy(=)h(2)p Ft(:)p Fy(09)p Ft(n)p Fy(\))78 b(and)h(could)h(not)e(b)5 -b(e)79 b(stored)g(in)g(the)g(main)-161 8772 y(memory)56 -b(of)f(the)g(mac)-5 b(hine)56 b(used)g(for)g(the)f(exp)5 -b(erimen)-5 b(ts.)5 8996 y(The)109 b(MPHF)g(generated)g(b)-5 -b(y)109 b(the)f(new)h(algorithm)h(is)-161 9195 y(sligh)-5 -b(tly)55 b(faster)f(than)h(the)f(one)g(generated)g(b)-5 -b(y)55 b(the)f(CHM)g(al-)-161 9394 y(gorithm.)99 b(It)64 -b(happ)5 b(ens)64 b(b)5 b(ecause)64 b(w)-5 b(e)63 b(sa)-5 -b(v)g(e)65 b(a)e(mo)5 b(dule)64 b(op)5 b(er-)-161 9593 -y(ation,)61 b(as)f(sho)-5 b(wn)61 b(in)f(Eq.)f(\(3\).)86 -b(T)-14 b(able)60 b(7)g(presen)-5 b(ts)60 b(the)g(ev)-9 -b(al-)-161 9793 y(uation)63 b(times,)i(whic)-5 b(h)63 -b(are)g(a)-5 b(v)g(erages)63 b(o)-5 b(v)g(er)63 b(50)g(trials.)96 -b(Eac)-5 b(h)-161 9992 y(en)g(try)41 b(in)g(T)-14 b(able)41 -b(7)g(represen)-5 b(ts)42 b(the)f(time)g(to)f(ev)-9 b(aluate)40 -b(all)h(k)-5 b(eys)-161 10191 y(of)55 b(eac)-5 b(h)56 -b(collection.)5 10415 y(Finally)-14 b(,)57 b(Figure)g(11)f(presen)-5 -b(ts)57 b(the)e(time)h(to)f(generate)h(the)p 4779 2536 -2634 7 v 4776 2771 7 236 v 4879 2771 a Fu(Collection)p -5649 2771 V 6158 2664 a(Algorithms)p 7409 2771 V 5652 -2778 1760 7 v 4776 2954 7 183 v 5649 2954 V 5752 2899 -a(New)c(algorithm)p 6843 2954 V 198 w(CHM)p 7409 2954 -V 4779 2960 2634 7 v 4776 3143 7 183 v 4934 3088 a(T)-13 -b(o)t(doBR)p 5649 3143 V 616 w(3)p Fk(:)p Fu(33)p 6843 -3143 V 606 w(3)p Fk(:)p Fu(59)p 7409 3143 V 4776 3326 -V 4933 3271 a(Random)p 5649 3326 V 576 w(12)p Fk(:)p -Fu(29)p 6843 3326 V 529 w(13)p Fk(:)p Fu(70)p 7409 3326 -V 4776 3508 V 5016 3454 a(VLC2)p 5649 3508 V 659 w(12)p -Fk(:)p Fu(41)p 6843 3508 V 529 w(13)p Fk(:)p Fu(81)p -7409 3508 V 4776 3691 V 5023 3636 a(URLs)p 5649 3691 -V 666 w(60)p Fk(:)p Fu(03)p 6843 3691 V 679 w(-)p 7409 -3691 V 4779 3698 2634 7 v 4136 4020 a Fy(T)f(able)64 -b(7:)90 b(Time)64 b(to)f(compute)g(a)h(hash)g(table)f(en)-5 -b(try)63 b(for)h(the)4136 4219 y(algorithms)57 b(considered.)74 -b(All)55 b(times)h(are)f(in)h(seconds.)4136 4777 y(MPHF)69 -b(b)-5 b(y)68 b(the)g(new)g(algorithm)h(for)f(di\013eren)-5 -b(t)68 b(n)-5 b(um)g(b)5 b(er)69 b(of)4136 4976 y(k)-5 -b(eys)69 b(of)g(the)g(TREC-VLC2)g(collection.)115 b(As)69 -b(claimed,)74 b(the)4136 5176 y(time)83 b(to)f(generate)g(a)g(MPHF)h -(using)h(the)e(new)h(algorithm)4136 5375 y(gro)-5 b(ws)56 -b(linearly)g(with)f Ft(n)p Fy(.)4146 8364 y - currentpoint currentpoint translate 0.65 0.65 scale neg exch neg exch -translate - 4146 8364 -a 4146 4164 a - 23681433 16577003 3289088 3289088 26970521 19866091 startTexFig - 4146 4164 a -%%BeginDocument: figs/graftrec.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: graftrec.ps -%%Creator: gnuplot 4.0 patchlevel 0 -%%CreationDate: Thu Sep 16 16:27:26 2004 -%%DocumentFonts: (atend) -%%BoundingBox: 50 50 410 302 -%%Orientation: Portrait -%%EndComments -/gnudict 256 dict def -gnudict begin -/Color false def -/Solid false def -/gnulinewidth 5.000 def -/userlinewidth gnulinewidth def -/vshift -80 def -/dl {10.0 mul} def -/hpt_ 31.5 def -/vpt_ 31.5 def -/hpt hpt_ def -/vpt vpt_ def -/Rounded false def -/reencodeISO { -dup dup findfont dup length dict begin -{ 1 index /FID ne { def }{ pop pop } ifelse } forall -currentdict /CharStrings known { - CharStrings /Idieresis known { - /Encoding ISOLatin1Encoding def } if -} if -currentdict end definefont -} def -/ISOLatin1Encoding [ -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright -/parenleft/parenright/asterisk/plus/comma/minus/period/slash -/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon -/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N -/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright -/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m -/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve -/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut -/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar -/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot -/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior -/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine -/guillemotright/onequarter/onehalf/threequarters/questiondown -/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla -/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute -/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis -/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave -/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex -/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis -/yacute/thorn/ydieresis -] def -/M {moveto} bind def -/L {lineto} bind def -/R {rmoveto} bind def -/V {rlineto} bind def -/N {newpath moveto} bind def -/C {setrgbcolor} bind def -/f {rlineto fill} bind def -/vpt2 vpt 2 mul def -/hpt2 hpt 2 mul def -/Lshow { currentpoint stroke M - 0 vshift R show } def -/Rshow { currentpoint stroke M - dup stringwidth pop neg vshift R show } def -/Cshow { currentpoint stroke M - dup stringwidth pop -2 div vshift R show } def -/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def - /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def -/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } - {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def -/BL { stroke userlinewidth 2 mul setlinewidth - Rounded { 1 setlinejoin 1 setlinecap } if } def -/AL { stroke userlinewidth 2 div setlinewidth - Rounded { 1 setlinejoin 1 setlinecap } if } def -/UL { dup gnulinewidth mul /userlinewidth exch def - dup 1 lt {pop 1} if 10 mul /udl exch def } def -/PL { stroke userlinewidth setlinewidth - Rounded { 1 setlinejoin 1 setlinecap } if } def -/LTw { PL [] 1 setgray } def -/LTb { BL [] 0 0 0 DL } def -/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def -/LT0 { PL [] 1 0 0 DL } def -/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def -/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def -/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def -/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def -/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def -/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def -/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def -/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def -/Pnt { stroke [] 0 setdash - gsave 1 setlinecap M 0 0 V stroke grestore } def -/Dia { stroke [] 0 setdash 2 copy vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V closepath stroke - Pnt } def -/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V - currentpoint stroke M - hpt neg vpt neg R hpt2 0 V stroke - } def -/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V closepath stroke - Pnt } def -/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M - hpt2 vpt2 neg V currentpoint stroke M - hpt2 neg 0 R hpt2 vpt2 V stroke } def -/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V closepath stroke - Pnt } def -/Star { 2 copy Pls Crs } def -/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V closepath fill } def -/TriUF { stroke [] 0 setdash vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V closepath fill } def -/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V closepath stroke - Pnt } def -/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V closepath fill} def -/DiaF { stroke [] 0 setdash vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V closepath fill } def -/Pent { stroke [] 0 setdash 2 copy gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - closepath stroke grestore Pnt } def -/PentF { stroke [] 0 setdash gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - closepath fill grestore } def -/Circle { stroke [] 0 setdash 2 copy - hpt 0 360 arc stroke Pnt } def -/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def -/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def -/C1 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 90 arc closepath fill - vpt 0 360 arc closepath } bind def -/C2 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 90 180 arc closepath fill - vpt 0 360 arc closepath } bind def -/C3 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 180 arc closepath fill - vpt 0 360 arc closepath } bind def -/C4 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 180 270 arc closepath fill - vpt 0 360 arc closepath } bind def -/C5 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 90 arc - 2 copy moveto - 2 copy vpt 180 270 arc closepath fill - vpt 0 360 arc } bind def -/C6 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 90 270 arc closepath fill - vpt 0 360 arc closepath } bind def -/C7 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 270 arc closepath fill - vpt 0 360 arc closepath } bind def -/C8 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 270 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C9 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 270 450 arc closepath fill - vpt 0 360 arc closepath } bind def -/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill - 2 copy moveto - 2 copy vpt 90 180 arc closepath fill - vpt 0 360 arc closepath } bind def -/C11 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 180 arc closepath fill - 2 copy moveto - 2 copy vpt 270 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C12 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 180 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C13 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 90 arc closepath fill - 2 copy moveto - 2 copy vpt 180 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C14 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 90 360 arc closepath fill - vpt 0 360 arc } bind def -/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto - neg 0 rlineto closepath } bind def -/Square { dup Rec } bind def -/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def -/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def -/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def -/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def -/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def -/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def -/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill - exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def -/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def -/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill - 2 copy vpt Square fill - Bsquare } bind def -/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def -/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def -/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill - Bsquare } bind def -/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill - Bsquare } bind def -/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def -/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill - 2 copy vpt Square fill Bsquare } bind def -/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill - 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def -/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def -/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def -/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def -/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def -/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def -/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def -/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def -/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def -/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def -/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def -/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def -/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def -/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def -/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def -/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def -/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def -/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def -/DiaE { stroke [] 0 setdash vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V closepath stroke } def -/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V closepath stroke } def -/TriUE { stroke [] 0 setdash vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V closepath stroke } def -/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V closepath stroke } def -/PentE { stroke [] 0 setdash gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - closepath stroke grestore } def -/CircE { stroke [] 0 setdash - hpt 0 360 arc stroke } def -/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def -/DiaW { stroke [] 0 setdash vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V Opaque stroke } def -/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V Opaque stroke } def -/TriUW { stroke [] 0 setdash vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V Opaque stroke } def -/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V Opaque stroke } def -/PentW { stroke [] 0 setdash gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - Opaque stroke grestore } def -/CircW { stroke [] 0 setdash - hpt 0 360 arc Opaque stroke } def -/BoxFill { gsave Rec 1 setgray fill grestore } def -/BoxColFill { - gsave Rec - /Fillden exch def - currentrgbcolor - /ColB exch def /ColG exch def /ColR exch def - /ColR ColR Fillden mul Fillden sub 1 add def - /ColG ColG Fillden mul Fillden sub 1 add def - /ColB ColB Fillden mul Fillden sub 1 add def - ColR ColG ColB setrgbcolor - fill grestore } def -% -% PostScript Level 1 Pattern Fill routine -% Usage: x y w h s a XX PatternFill -% x,y = lower left corner of box to be filled -% w,h = width and height of box -% a = angle in degrees between lines and x-axis -% XX = 0/1 for no/yes cross-hatch -% -/PatternFill { gsave /PFa [ 9 2 roll ] def - PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate - PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec - gsave 1 setgray fill grestore clip - currentlinewidth 0.5 mul setlinewidth - /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def - 0 0 M PFa 5 get rotate PFs -2 div dup translate - 0 1 PFs PFa 4 get div 1 add floor cvi - { PFa 4 get mul 0 M 0 PFs V } for - 0 PFa 6 get ne { - 0 1 PFs PFa 4 get div 1 add floor cvi - { PFa 4 get mul 0 2 1 roll M PFs 0 V } for - } if - stroke grestore } def -% -/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont -dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall -currentdict end definefont pop -/Times-Roman reencodeISO def -end -%%EndProlog -gnudict begin -gsave -50 50 translate -0.050 0.050 scale -0 setgray -newpath -(Times-Roman) findfont 240 scalefont setfont -1.000 UL -LTb -1080 720 M -63 0 V -5649 0 R --63 0 V -936 720 M -gsave 0 setgray -( 0) Rshow -grestore -1.000 UL -LTb -1080 1047 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 5) Rshow -grestore -1.000 UL -LTb -1080 1375 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 10) Rshow -grestore -1.000 UL -LTb -1080 1702 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 15) Rshow -grestore -1.000 UL -LTb -1080 2029 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 20) Rshow -grestore -1.000 UL -LTb -1080 2356 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 25) Rshow -grestore -1.000 UL -LTb -1080 2684 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 30) Rshow -grestore -1.000 UL -LTb -1080 3011 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 35) Rshow -grestore -1.000 UL -LTb -1080 3338 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 40) Rshow -grestore -1.000 UL -LTb -1080 3665 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 45) Rshow -grestore -1.000 UL -LTb -1080 3993 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 50) Rshow -grestore -1.000 UL -LTb -1080 4320 M -63 0 V -5649 0 R --63 0 V --5793 0 R -gsave 0 setgray -( 55) Rshow -grestore -1.000 UL -LTb -1080 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 0) Cshow -grestore -1.000 UL -LTb -1794 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 1000) Cshow -grestore -1.000 UL -LTb -2508 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 2000) Cshow -grestore -1.000 UL -LTb -3222 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 3000) Cshow -grestore -1.000 UL -LTb -3936 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 4000) Cshow -grestore -1.000 UL -LTb -4650 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 5000) Cshow -grestore -1.000 UL -LTb -5364 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 6000) Cshow -grestore -1.000 UL -LTb -6078 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 7000) Cshow -grestore -1.000 UL -LTb -6792 720 M -0 63 V -0 3537 R -0 -63 V -0 -3777 R -gsave 0 setgray -( 8000) Cshow -grestore -1.000 UL -LTb -1.000 UL -LTb -1080 720 M -5712 0 V -0 3600 V --5712 0 V -0 -3600 V -LTb -240 2520 M -gsave 0 setgray -currentpoint gsave translate 90 rotate 0 0 M -(Time \(s\)) Cshow -grestore -grestore -LTb -3936 120 M -gsave 0 setgray -(n/1000) Cshow -grestore -LTb -3936 4680 M -gsave 0 setgray -(TREC-VLC2) Cshow -grestore -1.000 UP -1.000 UP -1.000 UL -LT0 -LTb -1800 4137 M -gsave 0 setgray -(MPHF) Rshow -grestore -LT0 -1944 4137 M -639 0 V -1258 784 M -179 130 V -357 181 V -714 451 V -1428 849 V -6792 4025 L -1258 784 Pls -1437 914 Pls -1794 1095 Pls -2508 1546 Pls -3936 2395 Pls -6792 4025 Pls -2263 4137 Pls -1.000 UL -LTb -1080 720 M -5712 0 V -0 3600 V --5712 0 V -0 -3600 V -1.000 UP -stroke -grestore -end -showpage -%%Trailer -%%DocumentFonts: Times-Roman - -%%EndDocument - - endTexFig - 4146 8364 a - currentpoint currentpoint translate 1 0.65 div 1 0.65 div scale neg -exch neg exch translate - 4146 8364 a 4136 8792 a Fy(Figure)f(11:)72 -b(V)-14 b(eri\014cation)53 b(of)f(the)h Ft(O)5 b Fy(\()p -Ft(n)p Fy(\))51 b(complexit)-5 b(y)52 b(to)h(gen-)4136 -8991 y(erate)i(a)g(MPHF)h(b)-5 b(y)55 b(the)g(new)h(algorithm.)4136 -9827 y Fv(8)270 b(Conclusions)4136 10216 y Fy(A)52 b(new)f(algorithm)i -(for)e(generating)h(MPHFs)g(has)h(b)5 b(een)51 b(pro-)4136 -10415 y(p)5 b(osed.)101 b(Its)65 b(exp)5 b(ected)62 b(time)i(complexit) --5 b(y)64 b(is)h Ft(O)5 b Fy(\()p Ft(n)p Fy(\),)65 b(so)g(that)3864 -10913 y(12)p eop end -%%Page: 13 13 -TeXDict begin 13 12 bop -161 620 a Fy(the)61 b(new)f(algorithm)h(is)g -(time)g(optimal.)90 b(The)60 b(time)g(to)h(ev)-9 b(al-)-161 -819 y(uate)56 b(the)g(generated)g(function)g(is)h(v)-5 -b(ery)56 b(fast)g(and)h(the)f(space)-161 1018 y(needed)i(to)f(store)h -(it)f(is)i Ft(O)5 b Fy(\()p Ft(n)28 b Fy(log)g Ft(n)p -Fy(\))57 b(bits.)81 b(Exp)5 b(erimen)-5 b(tal)58 b(re-)-161 -1218 y(sults)d(sho)-5 b(w)55 b(that)e(the)g(times)h(to)f(b)5 -b(oth)54 b(generate)f(the)g(MPHF)-161 1417 y(and)i(compute)f(a)g(hash)h -(table)e(en)-5 b(try)54 b(b)-5 b(y)54 b(the)g(new)g(algorithm)-161 -1616 y(are)59 b(b)5 b(etter)57 b(than)i(the)f(times)h(obtained)g(b)-5 -b(y)58 b(the)h(CHM)f(algo-)-161 1815 y(rithm,)e(one)g(of)f(the)g -(fastest)g(kno)-5 b(wn)56 b(algorithm.)-161 2425 y Fv(References)-78 -2810 y Fy([1])84 b(Z.J.)e(Czec)-5 b(h,)88 b(G.)81 b(Ha)-5 -b(v)c(as,)88 b(and)81 b(B.S.)h(Ma)9 b(jewski.)150 b(An)181 -3009 y(optimal)56 b(algorithm)g(for)f(generating)h(minimal)h(p)5 -b(erfect)181 3208 y(hash)78 b(functions.)140 b Fs(Information)80 -b(Pr)-8 b(o)g(c)g(essing)78 b(L)-8 b(etters)p Fy(,)181 -3408 y(43\(5\):257{264,)55 b(1992.)-78 3786 y([2])84 -b(Z.J.)49 b(Czec)-5 b(h,)50 b(G.)g(Ha)-5 b(v)c(as,)50 -b(and)f(B.S.)g(Ma)9 b(jewski.)63 b(F)-14 b(unda-)181 -3985 y(men)-5 b(tal)68 b(study)h(p)5 b(erfect)67 b(hashing.)113 -b Fs(The)-8 b(or)g(etic)g(al)71 b(Com-)181 4184 y(puter)60 -b(Scienc)-8 b(e)p Fy(,)57 b(182:1{143,)f(1997.)-78 4562 -y([3])84 b(P)-14 b(.)61 b(Erdos)h(and)g(A.)e(R)-5 b(\023)-78 -b(en)-5 b(yi.)92 b(On)61 b(random)h(graphs.)92 b Fs(Pu-)181 -4761 y(bic)-8 b(ationes)60 b(Mathematic)-8 b(ae)p Fy(,)55 -b(6:290{297,)h(1959.)-78 5139 y([4])84 b(P)-14 b(.)60 -b(Erd\177)-83 b(os)61 b(and)f(A.)f(R)-5 b(\023)-78 b(en)-5 -b(yi.)88 b(On)60 b(the)g(ev)-5 b(olution)60 b(of)g(ran-)181 -5338 y(dom)90 b(graphs.)176 b Fs(Public)-8 b(ations)91 -b(of)f(the)h(Mathematic)-8 b(al)181 5537 y(Institute)71 -b(of)f(the)h(Hungarian)h(A)-8 b(c)g(ademy)69 b(of)i(Scienc)-8 -b(es)p Fy(,)181 5737 y(56:17{61,)55 b(1960.)-78 6114 -y([5])84 b(P)-14 b(.)65 b(Erd\177)-83 b(os)65 b(and)h(A.)e(R)-5 -b(\023)-78 b(en)-5 b(yi.)103 b(On)65 b(the)f(strength)h(of)g(con-)181 -6314 y(nectedness)50 b(of)f(a)h(random)g(graph.)65 b -Fs(A)-8 b(cta)55 b(Mathematic)-8 b(a)181 6513 y(Scientia)60 -b(Hungary)p Fy(,)d(12:261{267,)e(1961.)-78 6891 y([6])84 -b(P)-14 b(.)88 b(Fla)9 b(jolet,)97 b(D.)88 b(E.)g(Kn)-5 -b(uth,)98 b(and)88 b(B.)g(Pittel.)171 b(The)181 7090 -y(\014rst)64 b(cycles)g(in)h(an)f(ev)-5 b(olving)65 b(graph.)101 -b Fs(Discr)-8 b(ete)68 b(Math)p Fy(,)181 7289 y(75:167{215,)55 -b(1989.)-78 7667 y([7])84 b(E.)66 b(A.)g(F)-14 b(o)-5 -b(x,)70 b(Q.)d(F.)g(Chen,)i(A.)d(M.)h(Daoud,)j(and)d(L.)f(S.)181 -7866 y(Heath.)161 b(Order)85 b(preserving)g(minimal)i(p)5 -b(erfect)83 b(hash)181 8066 y(functions)57 b(and)h(information)g -(retriev)-9 b(al.)78 b Fs(A)l(CM)61 b(T)-13 b(r)-8 b(ans.)181 -8265 y(Inform.)59 b(Systems)p Fy(,)d(9\(3\):281{308,)e(July)i(1991.)-78 -8643 y([8])84 b(E.A.)70 b(F)-14 b(o)-5 b(x,)75 b(Q.F.)c(Chen,)k(and)c -(L.S.)g(Heath.)118 b(A)70 b(faster)181 8842 y(algorithm)i(for)g -(constructing)g(minimal)h(p)5 b(erfect)70 b(hash)181 -9041 y(functions.)96 b(In)63 b Fs(Pr)-8 b(o)g(c)g(e)g(e)g(dings)65 -b(of)h(the)h(15th)f(A)l(nnual)h(In-)181 9240 y(ternational)e(A)l(CM)e -(SIGIR)i(Confer)-8 b(enc)g(e)64 b(on)g(R)-8 b(ese)g(ar)g(ch)181 -9440 y(and)58 b(Development)i(in)e(Information)g(R)-8 -b(etrieval)p Fy(,)56 b(pages)181 9639 y(266{273,)f(1992.)-78 -10017 y([9])84 b(E.A.)125 b(F)-14 b(o)-5 b(x,)144 b(L.)126 -b(S.)g(Heath,)142 b(Q.Chen,)i(and)126 b(A.M.)181 10216 -y(Daoud.)86 b(Practical)59 b(minimal)h(p)5 b(erfect)58 -b(hash)j(functions)181 10415 y(for)42 b(large)g(databases.)54 -b Fs(Communic)-8 b(ations)47 b(of)g(the)h(A)l(CM)p Fy(,)181 -10615 y(35\(1\):105{121,)55 b(1992.)4136 620 y([10])84 -b(G.)41 b(Ha)-5 b(v)c(as,)44 b(B.S.)d(Ma)9 b(jewski,)44 -b(N.C.)c(W)-14 b(ormald,)45 b(and)c(Z.J.)4478 819 y(Czec)-5 -b(h.)171 b(Graphs,)98 b(h)-5 b(yp)5 b(ergraphs)89 b(and)g(hashing.)173 -b(In)4478 1018 y Fs(19th)59 b(International)j(Workshop)e(on)g(Gr)-8 -b(aph-The)g(or)g(etic)4478 1218 y(Conc)g(epts)91 b(in)h(Computer)f -(Scienc)-8 b(e)p Fy(,)101 b(pages)91 b(153{165.)4478 -1417 y(Springer)60 b(Lecture)f(Notes)g(in)h(Computer)f(Science)h(v)-5 -b(ol.)4478 1616 y(790,)55 b(1993.)4136 1948 y([11])84 -b(D.)52 b(Ha)-5 b(wking.)70 b(Ov)-5 b(erview)52 b(of)h(trec-7)f(v)-5 -b(ery)52 b(large)h(collec-)4478 2147 y(tion)i(trac)-5 -b(k)55 b(\(draft)f(for)h(noteb)5 b(o)g(ok\),)54 b(1998.)4136 -2479 y([12])84 b(D.)44 b(E.)g(Kn)-5 b(uth.)57 b Fs(The)50 -b(A)l(rt)f(of)g(Computer)h(Pr)-8 b(o)g(gr)g(amming:)4478 -2679 y(Sorting)46 b(and)f(Se)-8 b(ar)g(ching)p Fy(,)44 -b(v)-5 b(olume)40 b(3.)49 b(Addison-W)-14 b(esley)g(,)4478 -2878 y(second)55 b(edition,)h(1973.)4136 3210 y([13])84 -b(B.S.)41 b(Ma)9 b(jewski,)44 b(N.C.)c(W)-14 b(ormald,)45 -b(G.)c(Ha)-5 b(v)c(as,)44 b(and)d(Z.J.)4478 3409 y(Czec)-5 -b(h.)68 b(A)52 b(family)g(of)g(p)5 b(erfect)51 b(hashing)j(metho)5 -b(ds.)69 b Fs(The)4478 3609 y(Computer)59 b(Journal)p -Fy(,)d(39\(6\):547{554,)f(1996.)4136 3941 y([14])84 b(K.)58 -b(Mehlhorn.)83 b Fs(Data)63 b(Structur)-8 b(es)63 b(and)f(A)l -(lgorithms)g(1:)4478 4140 y(Sorting)e(and)f(Se)-8 b(ar)g(ching)p -Fy(.)75 b(Springer-V)-14 b(erlag,)56 b(1984.)4136 4472 -y([15])84 b(E.)51 b(M.)g(P)-5 b(almer.)68 b Fs(Gr)-8 -b(aphic)g(al)56 b(Evolution:)75 b(A)l(n)56 b(Intr)-8 -b(o)g(duc-)4478 4671 y(tion)45 b(to)h(the)g(The)-8 b(ory)44 -b(of)h(R)-8 b(andom)45 b(Gr)-8 b(aphs)p Fy(.)49 b(John)41 -b(Wiley)4478 4871 y(&)55 b(Sons,)i(New)d(Y)-14 b(ork,)55 -b(1985.)3864 10913 y(13)p eop end -%%Trailer - -userdict /end-hook known{end-hook}if -%%EOF diff --git a/papers/bmz_tr004_04.ps.gz b/papers/bmz_tr004_04.ps.gz new file mode 100755 index 0000000000000000000000000000000000000000..4976cb5eee39f28d382f1305e2b53ac1b51e1e79 GIT binary patch literal 200470 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 Cb?*28 literal 0 HcmV?d00001 diff --git a/papers/bmz_wea2005.ps b/papers/bmz_wea2005.ps deleted file mode 100755 index 8153a5b..0000000 --- a/papers/bmz_wea2005.ps +++ /dev/null @@ -1,8159 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software -%%Title: llncs.dvi -%%Pages: 13 -%%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 -%%DocumentFonts: CMBX12 CMR10 CMR7 CMR6 CMR9 CMSY9 CMTT9 CMBX9 CMMI9 -%%+ CMMI10 CMTI10 CMSY10 CMMI7 CMEX10 MSBM10 CMBX10 CMSY7 CMMI5 CMR5 -%%+ CMMI6 CMTT10 CMTI9 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips llncs.dvi -o wea2005.ps -%DVIPSParameters: dpi=600, compressed -%DVIPSSource: TeX output 2005.01.27:1436 -%%BeginProcSet: texc.pro -%! -/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S -N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 -mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 -0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ -landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize -mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ -matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round -exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ -statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] -N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin -/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array -/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 -array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N -df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A -definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get -}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} -B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr -1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 -1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx -0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx -sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn -/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put -}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ -bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A -mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ -SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ -userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X -1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 -index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N -/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ -/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) -(LaserWriter 16/600)]{A length product length le{A length product exch 0 -exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse -end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask -grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} -imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round -exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto -fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p -delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} -B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ -p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S -rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end - -%%EndProcSet -%%BeginProcSet: f7b6d320.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10 -% cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8 -% cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10 -% cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10 -% -/TeXf7b6d320Encoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve -/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash -/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand -/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen -/period /slash /zero /one /two /three /four /five /six /seven /eight -/nine /colon /semicolon /exclamdown /equal /questiondown /question /at -/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X -/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent -/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u -/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef -/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute -/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE -/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: bbad153f.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9 -% -/TeXbbad153fEncoding [ -/minus /periodcentered /multiply /asteriskmath /divide /diamondmath -/plusminus /minusplus /circleplus /circleminus /circlemultiply -/circledivide /circledot /circlecopyrt /openbullet /bullet -/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal -/greaterequal /precedesequal /followsequal /similar /approxequal -/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows -/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast -/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup -/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional -/prime /infinity /element /owner /triangle /triangleinv /negationslash -/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur -/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K -/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection -/unionmulti /logicaland /logicalor /turnstileleft /turnstileright -/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright -/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv -/backslash /wreathproduct /radical /coproduct /nabla /integral -/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section -/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/minus /periodcentered /multiply /asteriskmath /divide /diamondmath -/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef -/circlemultiply /circledivide /circledot /circlecopyrt /openbullet -/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset -/lessequal /greaterequal /precedesequal /followsequal /similar -/approxequal /propersubset /propersuperset /lessmuch /greatermuch -/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: 09fbbfac.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9 -/TeX09fbbfacEncoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi -/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown -/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla -/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam -/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft -/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one -/two /three /four /five /six /seven /eight /nine /colon /semicolon /less -/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N -/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright -/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l -/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright -/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi -/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown -/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute -/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE -/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: aae443f0.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmmi10 cmmi12 cmmi5 cmmi6 cmmi7 cmmi8 cmmi9 cmmib10 -% -/TeXaae443f0Encoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/alpha /beta /gamma /delta /epsilon1 /zeta /eta /theta /iota /kappa -/lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon /phi /chi /psi -/omega /epsilon /theta1 /pi1 /rho1 /sigma1 /phi1 /arrowlefttophalf -/arrowleftbothalf /arrowrighttophalf /arrowrightbothalf /arrowhookleft -/arrowhookright /triangleright /triangleleft /zerooldstyle /oneoldstyle -/twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle -/sevenoldstyle /eightoldstyle /nineoldstyle /period /comma /less /slash -/greater /star /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N -/O /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbelow -/slurabove /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p -/q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass /vector -/tie /psi /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/space /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi -/.notdef /.notdef /Omega /alpha /beta /gamma /delta /epsilon1 /zeta /eta -/theta /iota /kappa /lambda /mu /nu /xi /pi /rho /sigma /tau /upsilon -/phi /chi /psi /tie /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: 74afc74c.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10 -% -/TeX74afc74cEncoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve -/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash -/suppress /exclam /quotedblright /numbersign /sterling /percent -/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma -/hyphen /period /slash /zero /one /two /three /four /five /six /seven -/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question -/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W -/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent -/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u -/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef -/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute -/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE -/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: 0ef0afca.enc -% Thomas Esser, Dec 2002. public domain -% -% Encoding for: -% cmr5 -% -/TeX0ef0afcaEncoding [ -/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega -/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi -/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls -/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright -/numbersign /dollar /percent /ampersand /quoteright /parenleft -/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one -/two /three /four /five /six /seven /eight /nine /colon /semicolon -/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K -/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft -/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h -/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash -/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda -/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup -/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj -/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe -/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -] def - -%%EndProcSet -%%BeginProcSet: texps.pro -%! -TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 -index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll -exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 -ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ -pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get -div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type -/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end -definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup -sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll -mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ -exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} -forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def -end - -%%EndProcSet -%%BeginProcSet: special.pro -%! -TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N -/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N -/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N -/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ -/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho -X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B -/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ -/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known -{userdict/md get type/dicttype eq{userdict begin md length 10 add md -maxlength ge{/md md dup length 20 add dict copy def}if end md begin -/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S -atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ -itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll -transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll -curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf -pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} -if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 --1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 -get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip -yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub -neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ -noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop -90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get -neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr -1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr -2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 --1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S -TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ -Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale -}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState -save N userdict maxlength dict begin/magscale true def normalscale -currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts -/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x -psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx -psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub -TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def -@MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll -newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto -closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N -/@beginspecial{SDict begin/SpecialSave save N gsave normalscale -currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} -N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs -neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate -rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse -scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg -lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx -ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N -/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ -pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave -restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B -/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 -setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY -moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix -matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc -savematrix setmatrix}N end - -%%EndProcSet -%%BeginFont: CMTI9 -%!PS-AdobeFont-1.1: CMTI9 1.0 -%%CreationDate: 1991 Aug 18 21:08:07 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTI9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMTI9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-35 -250 1148 750}readonly def -/UniqueID 5000827 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496 -4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D -DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A -F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458 -8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6 -03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9 -211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3 -E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B -D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1 -6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9 -0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC -1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2 -298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D -C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574 -4266FD34C25C8025FD7DD45F44301DCF03F51335198F9EE71CBD72BB906F445D -EE6AFBA2FA06A0A045D56CDE98A6F0DE807D81F26D017B74D1C7A5AE254B7705 -7D96CFB3C342DD38DB5730ED913639C2BF3CEBFA6F3D493DCE5F8218F8BD8035 -9E6CDFB95628F7198CFA2EBDE1905F051BFC4F835C5A787E3B43EAD947EC893D -9D1B04A9A7EE7CF3E02A58BB0867AA7C77F30CFEBCB4B3E6EC68F6B234FB6B26 -7A9D88A3CBF7A2992911727C7CCA3FAF58CE22B8415AB1CC18E36AF58C244DC6 -919CBF1D30FE86392DEFB8090198AF2FD9A6D09CB3EB44F63E0FFC788865E3C4 -2C17538C6E3EAF2E64BFAB4F43F854D36A1C1C4244A7AEB3BCFA0D47454EE5BB -D8728299B08541A91434397FB9C7F38560279992CB4735C8EA89FF668535E018 -97236DDB1E66877886364DE65B594E2AA980D150F95B83A22014AEC85DC7C115 -629ACC128F0D5206DE41356DA0E6A427A14DD1885417D807433BB60CE4AB2C38 -A3B9D83FED4CCF33CC3F6122E91148B3C5753DF5C5E250CA1A3B06C2227C84AC -DFC7F75A81E52312963909C9014BFA81BC243F80280BA2284CD5C4960C65E22E -996D004E4001CD5CD47DD6FEE8D3C7724B9BA322D2BCF4041D3A3615FDDFE98F -EA64DCB0F364EC526A8F684B49F8FE70CCF213451243C88415BE5726AEC092F0 -B15E451B962BF8E6554657B8B4A5827F935C6C904B1BA87C6CD0077C3BA38BD2 -C9683E2014833EC1E44B17088190D0601F58E9FE1AE55F26BD726194146F821C -0736FAC661BE135F6EB80AC4F26EED161B984E1A9F63B1FF84B916B5AD274CEB -54A354CC055FE535A686A8D7F9D8E8B79C6EA92E624CFEDB5660EE4598433A21 -80C619666A2FF206E56138C5B50D1702E30AECF527B32FB02932597C7A4A1D7C -0973FBAC52758041D3A0DD321F82A110EE7C5437139840FADA313267F223BFB7 -1CE6334C0265B87C6ABEBFC3E99E49654A5D759AB87C740ACBAF704338A38559 -6C71FE0DDF9558FA25EF49626CDDAE60EB5B06C9449F3E99E676DC60CB122A87 -484B82C1777ED6F2E4E81E1540F8E054F9ED998142B08F0DCFBF19D40DF8073F -525CC4A13633B4330BE85D475DB607B51D1A411E1EEAC6A357C1B1504C6CC96B -8412F6D1ED6D34FC652259E639646B7C8E00E84BD0947D974F3E9119E1A688D1 -6B6C86F4A72F94B02BE58740B578F3C5F85FC7C79B980A0C33DF5EE57C70642B -4DD704359CCB8CAC26800AFC870CE776FF20C06E15C54DEDE696F2ABEF45CAAE -71A7A3F6293EFA5710382CDD6105938212DCD1CB7AA32A2FF8868E74EEB71D0A -0D98F5F64F34C6491E0874D7D1F2B42946CC33ABB8817A9D3F097EF8FD1619E6 -5C761355B65ABB32D62A2D202C715A44BE3A70BDBF061C34A9919AD7620DD909 -BD87E5596EE0EFA36F9B6590CFD393CC302A367E4F8D87D7BBF1A490778E4A5C -9670D52AE00ED5A64D0183C9DB2F9B0A501F11536641B5B9E510DA713DC37822 -37BA5A3C012F1AA9299E685526040B3513A848A93F88BBD99A4B61C0C25A95F4 -6EE37352C8EF98858896C25172B4BE4399A3AFE5F13A34E758F3108097D2859E -1F56EFD515985C2C69EE658CE0916F152E7837BC3844E8FFE8DE860744DF6CD3 -7289E7EB15087DFC58064B014779C58A3F7DFA0F9C8E6EAA7519D6C0F67C56D5 -A5A1D7BF785AE79547ED658A97E15B090EFF213E81F21F46B13BF2C33DADF7B4 -91467A3E8532AA75BD182034664DF4B6387015F5ED0ED78C4A8AB3DA6A962F4B -E7FFA763BD400086275856FA2A043BF7B445F86AC50316F5BFA185DF591E62EA -6FFF46169879C51AA4CDB182035C065B49D9DF4DF9E98F373C184D9A912044D4 -80D069815F90D0496096799DFF55B59C594DCD376F0787991976ECF4BEE62ADC -33AE747D4B783012E8B04324E97F4088A5470805AE5A2B2DF96019C4630E8E58 -F9489964588DD9E6852D7A6E4BB4FF1A0A8A04896542FDE5984CE71028ACDF91 -9E11196C21010C80983E0973B5CE6C680B0F17C50BDED2840565E1C24AC88B3B -E9E32F12AAFE2C456408E0F8867690D1882688C886D45D8BFA646C48EA7BD5B0 -16E77C7318D8A19AAAE15E9B66AC4DA366F068618F54900956E8632A268515D4 -3167BE687283300BE63F27E23BAA59E5403E4C5EB5D310F0377D590BD0531C14 -3FA6CE8BF2E7F5B7EC06E52C657EBFC89F6D6DC559A721AE2D9E5890A5B7A9B7 -936973CD42FCB72E160416FCF3902EAE90DA05E907CCEC36620D1612DD91744A -CC3129A087BB4BBE809375ED33B0BB7D5FDB24DC20FAD79BE36C2CA46D341798 -F63588A6A0D5AF09C7FDC254A178578B8B12B8F114C5832724CF90431B615C20 -695A70BDEB475CCF7BF84FA0F2238FDF7EF39434BAA390C330A8397518B9A4FB -99870DEE82314AED358530E6425B4FD0877411D0105A2C9DB467D953D09FC81B -70C88E7DDDBDE20FF5D63475E452F94785986ABD72D27FA140A85F112DF2F668 -4EDE46B2CF92782B92E87885AE2F4858612D61CDFFFFA9770538782405372993 -2A7332D05DC16910C05499043D11E9D40A564DA04237A64BA42A117BE7B1C34B -D3E73D4F2820625A0B63C9598D4CB48270F10F1060AA7839C5F052206F0AFFA6 -E716B359CF7797A52199D71D1A1CFB01944EFCBCB0EDC2440BF4F6F4E72C2C35 -A2877A335D8123B6492C3C5CA7F0BF77C3261CD35E277BC5F63BF56EE522085E -7B9E6634BE2D9F2B5B4364A5AFE315AE362BFA7AE7BC4E06E6FD310408096E27 -259930456FD8CF122A44D2629B63F1FDB37ACF5550E070E150F89755A5902498 -1E11E5FC336D729EDD17C961981C4BA1568A09B89681A5CD9DCDBB2422E2C043 -C487A50D6C5103953FB469820187CD66E44BDA480C22B8568B0D3AF2CA51DC15 -39416DFFAAEBA324898D8610385CF88EC2405FC31DFE91D297D3324B55D2E629 -0593679FD696BF09DA5AF139275A01C6D398569ED7D65408A2000591AF39B565 -601EA37E1C4112FE1B1F9085751154A06F5154F86730999372CF866B655D1E35 -B143938170C17990F9495964F2DC4B09CA0F71F9521CDBE73FD2E3D8DA42ADFA -509FCE4BDEC8FA6906359C20D1D32DCD231E19531E19A00C74E9A930C5331AEE -6067AE314E6BD7015ACD432604F7D0D633C953A168FC26707BF11AFE3DCE3CE4 -2ADB46DDB1E3F8755F05E96E4CAD0F48BB044FAED17F18E600A298F788D70835 -7E9AB83850C9A7BFA02BB6A07EFB10C14407D8AB559A09542D2F7831212E7EE1 -8C2A6EE894BB95900A498D2752897022182633C447D29E4CCA623F8016D5F5BE -87D3C8C198E4049FA65C3642A575D4CCA8AA0F58D8A3306C56BD44CB80AD2E68 -D58765B75FC07EAD4697264D44A00687011DC045D86D38F4AB470CA3A4A8049D -F3FD2EE79992A4764AF2CF873A1ABC8C3FCB6D8E7B137DEB0F6E856CA42688AE -8061631B9BA9AA9B87ADA522DA0E35B83FC0977EDD8F17C0BC15AB1292C2CD27 -B1D30252E662CCB82EE240D5DBCC738DD2F9D8B741D35A6ADB08B8E63684E7A8 -BA1886D8C457D8EA031B3F36B2986AB3B12291519ED42B7BF33DD135BE5383AF -0BF37979158307494101C4D073F9C75D45BA2F45FD407CC7FC84C995E158F1ED -B47DCFD478B343618975466511548153A358B7AA04AE814A196DDD22A68766C1 -640C22E53671F2BA7C464046A41DFD73CD499F29D0A9903DE69618C0889CD92B -58ED3E875C8232D5C268B47D8A159A4D9C36615F905206472715B7A749F32ECC -C6A8B0035355F02D41CFB081F1FB0B3879C4AC62B13A1AF69ED747DFEC8DF995 -1ABF074464F258556D71E057B4F28534601EBFED899CB7CE198A2CE70E329B51 -B8F4B48A706E1D31C306DB01A8DC899A7DDA46AD3B521E2321297587B5AF52C0 -54CCB128A005D55C920B1FEC88C480DE717A372EF9FC653C77F637511ABE7F7A -A7A0550B5E5FA423E0BFB07F7A8CA2447FD183BAABA4250ECC80CF717C3FE877 -D8887F195E0F323677640DA0D1B94C10A1942EA3BE2EFE17B12AC4336CE5562A -B8FCC91D181D4669CE63BCB67F090825685C99D298C546873229AFE047D72627 -A90AC47BDC1243CD072CEE8ADEFA0ABEF79554D3468BC6BF536C89BC380FF6D0 -4DBE812BCFA7731D344511BF920C4F4227F640DEC098FED393351959B82B7AA4 -6FE2D05CE5A01022E53BEBE01070D66F6EA7D6103EFC1CCC3F371E7E4798CA7D -2469DFB5109B15BBF577F53F9753FFAC44A98D2DD196D40A3A19054D6E4410E7 -C340515C2F6F64AEC3CBF80C2D9B81C1920D1061A13D4292ECAFFEB3BF980B53 -3BE1BD78F69F277C9F4BBF4E471E740240DB18C98BED973A064095BB0DBFE49E -E4889BE98F7C09F4021A06756EA453C8C55B5B2B27EE64441030019A15E953D2 -EF772765313BD75548142F538EB03A72847B30F12E40A4D7DA343FCD027AF899 -6B210503CC1B0BC9DF0EC64154296C8D291FE2583080744C7D483C3EB7EE5762 -9A73F99213021A648213C54A9BF5EDF9F473D635C9E7ED8C3400ED20D9C4F6C7 -7AB72ADA535CDBA8B0981C9D4C2B61D55A6590100F7C9A5D7EE642815FD4B8AA -4FFBAB11392D70CC2FD4F0465BC6A9F90C250D5F25BA2369AEACD727865F2BF0 -DEE2F9284509000FE8D9D22219D638BC4D1B277105CF6C2B37C381597FF69162 -26DB880B3CD6DCD1D560AD52DF7F3A7ACBDD5BCFFE6D0A9CB8008A72B5F0419A -4ED2415D436F3A317072E36953170C2D91BCB53E4C7C734C17F37021245B8E9B -453F7CCE86107E4ECBF687B5C2C2A10E68885D992599119E50D05EA37698BFFE -1BBDD0479BEA7002EE41FD92992F5C0933AA4242076236A21D92295E8FF636C1 -52F4D829675411D71F82EFB625F6A8A812B5D57D0A51370BBF586E694CB412D5 -2BCFA7F6E12FBAEEE507F8122AADF8A6157AB5D5BE2AD187F0A480F12D92037C -B6DEFBEC68291D84E02B72C2C98AF0A6EB65F5D1FF6F7E6CA33477241125C2B8 -87124A3DB54536EBDF628B751C4474F72FB30E52C2FB061FF9FA49E1DE68D264 -90F0D2AA4BAD8199A702401750B384948705C7F19E8902C6CA1E98E6D7E8AA17 -828FD54ABC0CA1CAA86FE2D56D952A742D89585958E954C631D4A1A4157A9DE6 -89B452CD4739E5D25923028958232E689C286E9BD82BABAEA01464D37F86D6BF -01993AB9DC6A5D94DDB0FAFF83038DD8C28F408C70D3D13DA8473C81314BB0D3 -643033FE7A107635601AB4FDF623491CABAB2BB63C4AB52B54AF849CA52E3F7C -2DC86304E9AAC823320951D084B4C724E49A9444B3DC90428EDE3BCBB8594F9A -5ACFBD97356C96C509C6F8F65C853CC8DF1B9D8B1F934DBABBA4E7431C38C853 -66A3B754F7C24B37E2F5892CCF335EA1A6056005C3AE0C889E867A0DB9FC130A -FA99617AAB0C5FFCE9B3888201C5CF665712E4232AD1B23A3724B25A4643F6EE -87AEA1A408D084B6C642989A4CE37329DB67CC0B0C9B7D5C5505B837E1EAEA19 -8F9386C34CC7DA69EDD1DA81A61CF8DD55AE65C72FED0C937F0E91998F860429 -DCA1335598EE07E926347AFD8FE701C331780901AE73AE9F3B53F6C9FE26519E -B5B3750E293A92DE03658315AB60D91E53DF40E5AB7CB96C57E6CD0A29F5D039 -EE88010206977FF26EF6D3E4D2784E1869608904B411D2704A42E58DEBB13C15 -B5EC1BC78E1CC89633969FC89F9E9F7FEE05971089E466C51BE8F978D5E8ACBB -EE98555EBC9E1065B18A764394F2E7C6A6B883E43B005293FE878A1C21FDE04B -B5CAAD894D429E1899F805A8115498153812F4065CD4285D0E3C015A24E088EB -EA9827365E6720709BEEC612A6A256B4AB26046726023090F9FFC287A5633028 -A193F92632B6B7E971CEB38864830F11B044C2A51ABDDD25E31B4AA8DAAE1D94 -E9D5B79BCFE5FE617A8774FBFF15A3118711D744869CB575C98DF73C5628DC9B -F4C72877483735930A103C58F3592DBF526135EB927E0C0B71846AB4BCE3014E -090B81D3D3ADD395134A55954139E51C39B167641F0FA3675798F4E340553A74 -E08321BD6A783248EC8770AF75BA7971B8F831CE56320BB8105ABBF535D663CC -409D8D66FB0D5843E4006E222442B18B7B2153298A9F80CB97A8FD0F924AA363 -B4DF9A0538DD628A5FC9D9974EAABD1E9BE974C09B008D54BFE0F6E023C58977 -3F96B508FD104BF2055677CEB939782F7911DE3D2C07C137DC07EC2C358FBC37 -159964F91D35B5F8FEF768F40225B803767E9841760678F57CE9FC89E1FFCC3A -4F1F42060843B2E9FA65FABD577BFAED183667727F247AAE9D461432712307B7 -0BB13E46C497BFEB5D4D24AA2580448FF42F7125E06E8C10E390D9E7313CE319 -B0F873A68033DEA81684BD5DEEBC48E7731068B4C59FB5FE020DFB232F425D6A -E0E8BB6DF1056A603E37934E425A9C340733EF5AC8FC57C3E5E90DD567839471 -9869044CA4E7DC277A55DCD8C7EA871C555951A3B61FDDD5E7B1C59A0B1A199A -AA1D7F98721534FE26D90DE5D00F74C5EF107FD2EFE291503932C4FC65CB7B83 -2EAA2FFEB4AC08C46BC10123FDC88F3EDD1C8BC31B7406115C7E806EFE7E1F61 -001E60C6025DAA8E248290FA4D96B33FC12353B630646D677BC579DC54BC4A65 -1C6BE9694C30D3679887E0D5C4800FE2C1B90D40B20AF0879E11610B56D26C6A -4AFCDC5A175CC53C5C4E5A8FF51F8D3ECA0DCB0E049D44A3065E122E7D3371DD -8F2C8AE28369D0E7BCE916870D9FDD8A72F06A91C783B6A2161FEB04C4221796 -3A1384ACA274AB0BEB24EB4EED3E5AFC3DC86BE6AD4AC60653BF5FAF4B0A575B -140A3406695520E56FA4C2BFD6CEC7A2BDDB92F8E0BD3156036F917C4DECABD1 -E61CE3E529894997A52D4DC9E02CED5A53F9D953A47B83718158F314A17C8905 -A8210741B45AF51648947466C1CF8852F2489D960885A800948BD3789DD59DBE -946F8AC3A70AC8AF92E40FE4B95CEBE749F1D01BF72008FD74C2ACA8E2EB8362 -4EA7647A61C02F6EC7EFA9116D9A370DC663BC72226E031D1DBBA4E2A16296F8 -C4E0CA09072A6B86885D06750509126B540840E2DB1613FFC94A33BDFBF96215 -56EFC948975E82B19577F796BECED8BD7F856EEAEFC6D7F2BB5506963801C064 -5D95D26D31CAC82A704936A46D3644FFEB731B1C89674920888C4E6C21BC249F -08CAC84D2C828632F2A32586167AF2D235BDF41B0BC4FE1541B7FAF793B4BB1D -673E6AA735C0AD02C77EBDA2D48462A3539E6B6CC7136D3983123AB0FFD6F245 -BCCF19F1A37C9753AAD93033AAA722EABADA04FD8908C0CC439E434D335EDA23 -359DD9A8386088632DE391418A6821BC6E4513D10503BAAE8543B054A8552852 -AF1281AF701967AD01463AA1D2AC5B9026C7C54A77825FE92260C6B50C874D6B -F80F2345F95D6744C36E7EDBE79F7D80AC975F0820038DB69947327CC2CA1C72 -609A476553D7063BF67B9C733C025B572369605B9FC14EA25EA98F9F206E90A0 -97CE741B8D2A8ADFC68E2623668439990378689715A85606286095C90C98E337 -E218238590E26FE4AC2ECD7D65EB3B4E9A11A1A437E597D2F3C7B15D92F560B7 -964FBA80373D185DA250A0CC2B48AB4404B458A484FCB960E68E54780052A17B -2B6F7BC4A76FFD0F17EA7F91356125C60A5324BEBB5E8E2C2E87D18A0FF5AA79 -0E7D2EA138824EF6383F8A637BCE5F41E5F42064F0C04A6F23DC5DAB94CCB6DF -D1316F075FC67441B0D00794D9FEC668130E2E4504E6E018B8FC05C5CDFCEDF6 -83E50FF8334F38896455D3C8AEB09583F3A40A4422D02A76C91E53A53E351A51 -DFA8BCCF5D712D1E2ED20531E5C4A3C6CEAA6267FC20E24681F33AE7184FC9A4 -21FB7E2069FE79D37CA40A344F88282805B9456FA329A58EDDD2C1BD0B1A8D51 -3BEFE0488063057FDE6ADD8EC86C37422425349BE218F26C39019398E72B6074 -134DA59F37BC293D35AA8C57658AE747FA765301BAB640A73451FFF96A8975FC -F0BCC31A5026C7E1E56D9C313D9E80C24C5D503DF3ED44952D38F4D2184EB079 -6E8654A0E98525D70140A5B607CAE5C54A3E3DFFA594686202D14236A5AE7232 -49BB50214243C1A20822FB7C567C663304E33F7FA344C6A52460DEF1D9EFE581 -0C671B0C7380AA1863557AF29872A2C9579175EC33BD39EC04D93533DB577CBE -50E338F3A6933AD40DA0E84A7840335B931BCD6F54157743C48CD4CD0D568BB2 -CB70B168198C3B1A2D742A37DAD1063682C5DC7C9B30E8D4625EAD1BEE938BE5 -CB34CD787E365ED88D9B3864B43B7A8B3FA873CF7C1B889DA6F7B870C551908C -DCD98A1805F14995A2CF9413C42B48E49EBD26217C3F300FD279460267C96C5F -85F085C52BF7E8F75C240BB14B012A0E3AD81AF500AAAE22691DD2E294CF7EF6 -82F985949BC557F17815341DEF046E0AC7CDCA817A4C109C82CC81DF0A8E501F -B19ED88D8E468A11DB3B78C673644CBDCFE2ABA18422475169E5E574D8A275FF -CD49CE39B29080A7A4903B1B88C0169EFB1790DDA75877D91FAF70BA50BFFD1A -20692CD75BC8BECEBA0612C3FC71566038D505369CB0F51F62B98350FFA8BBFD -1AE2C4A500C91EE5B7536388E529EE9AB4FC6418D37F8322E577A6501B7AFBA0 -923F3C58581DBE12FBF6B0AEE248501F38EF37A96C1E3334FBC60107FAE832E6 -F4BAD26E7AA39E032A302CCF1A87D3E3C6208CCD182A35E5C194929F5837F2DA -F722C9CCFE6B54A6805B5FEA20123BFD69A9406EB5A036391CDBC93A20B0D6B3 -D48D732C817DC468A2AE5F093B3DCD2828FFC9DE8E9466C4F2E8A5DC2BDB8A5F -F86686A7EF9CA4537E4B3D24E35D773B06B79F32C31C446BCACCD11FA3BAFA0D -C7A47C73390C098F4D2E168E122094EDF6299A2A8D1CFB1FC733F1541918D329 -02BFE2233BA898BC2E8F0E342866C08E7D48C4E393CC01A8F498D76010A7C4A7 -7AED770609432BB5B64C66CFAE1AFDFB1EA04349D3AE4A410B3A1025BAC377EF -5193451877876166AEE7315D5A9C0B9AA9AFE4DFC6B471656C39614B955C4717 -866EC07D16E387976B11B0F3043E6A2FEF66316E0FB428CBA5748607E867AE8B -19AD0832106F4A810D99DE3E0D19F678041FDF0719A99558D222EC3042CFE87C -EEAA828430FC4866A9B3550CDA1E6DD62471BC5E148065167ED7E3E081436416 -229656801B5A5431136F963772DB3D3FAAC65DD14B87F83D73220B2F705BDB0D -3DEA16ECDF4F9D0AC4A636C5F79F24E9186FEF2FA5F5E40246FEA2D2BC08DAFC -391003233C89C325A61EA0BD2F10F5C0897BC3A792FDB7C1C002A56C77D1EA2C -D7E2D3E545C8CA4D6A40F960874C233C44C589A3A3FEDF600927993FD12C01DF -BDC8225BF134C451849A437972FDA64249F488D239EE119E4D0C8440A03BED29 -42CE9250B1308313CEB944E65BF502FAA726CB256D452F2E70C5C69E553DBD34 -BA267D1F0A2C1A6A373F3BC047265C7454557AC9FD6FFA67F9FA95FEC1A8F19B -A5157C9067876212A77766D085F46CB145428F8AFA59CB503C8440A70AE46E0A -FA1AB94666CF3F564ECC261F3ADFDB68D3FBC81F68EA4AF6C433B64C93C51FE5 -1F7F7F768BB127F5DE5FC4E366DB1BE11CDF3A23E85D41BB7BFC9C2422CAE91B -921F9DCE34FA8CA5A384BD6BA0C5875313C5086F56B2EF1434926DD32A0CBAC6 -C6A16841F2376E508AD2A78AE0A1610C6E8DDDA361134B7408DE69006A0746A7 -E29093D183D1BF5133E64C936C5332C23AECA55E68D9CD2B297054342636FE6D -133675E36A0461B5DE9BB3E38CA4630ACF1A523A66A4083D1829468DACCDE523 -32EC01C4271E578037E0FCE03D6CC81EA1BA1FA6F7530E8C86F9E3A3B16935A6 -B335A1A84DB1EDEFD240E9E2612F92FEC7B5EFFF5BCE948592CA3A92427405BC -DC8124FB3E4652E175526A702D1DACFADF4AA4D6C955A4622993302386B0F013 -18937559A5D46A8EB69D1AD0E67CB37E07458EAC8E0264081EC9BD88034D4490 -8FACFCF8AD718E44A4978248A2358EF2D314410B082A51D810CF75D9524BC0C3 -535E83720C1C1C917352429ED012E54306FFC8B18E0B111441F3820A85704EDC -7236E6988548A7D3E519901267271E22629ED13AA808317A8D5AD76301061B46 -6F6916EEA211766BCF623EF3F9B954A93ED913C59EBD6B296757642EF14AA1D1 -2FE5F1EC093BEE4DF8F39BFEC44CF3F93E999AFDEF9EB4D833EB4B7C6BD72F85 -B12FDF12B4BC712B743488DED164DA77ADD9E141061E2CB4BCD04379BEC2A168 -BB5D9A7538CDBB4E93A66D0EC4CE19C5CA5AF495B2927083B88C5C4EACC310A6 -3DA837FE9CAEF8287A6C699136F6AEBC21D0E24101B8F03188E308004320990C -ACF225BCA45EDC764EC456377BEFD5707DA30047821A9E85222947595F31338E -0C4109721951CCE8CF3D69B493814EF1835B235F305FFB1C381E4D48A4B62EE1 -5819F320373C509744C0F0C80A7C3FE248333668BA49998FFF690B60CB8263E0 -D29B35DE57433746CFF1419A1D433068DEC12F8944713F9C41388C9DF4FA6EA7 -305A78254A1E9929614A9D005F14EB017A43BF85C8A0D4B45332BEF0C952CBB5 -F243A2FB06C0269F12AA673E4D6AC0286D149DD592B953F42B82333580D5AE74 -EB77939E2E621D842BC200D564F8ED9C08781469BB33C6B92BA28B9B4BDC19C4 -DBDB68DD5F33050424F767773FB8E0765FDCB39203B7DF875A843F9A1497FD9A -041FB08A677F76422B1C45C2DAF5AB07315BF3465847610136DE36C5E6312509 -DD497813BFB58FE95F9BF0135387BFEC0D4AF7A86475E670CF33F87AFDE61BDA -19F7737E82433D3AA22D2A90767B17D79F7DCD0555181C82FC8F45872A165A41 -8370039AB2CEAE46F80F5C36239ED2512199AC612F16BDE22BCF383561D0C2C8 -266DE5F8EA100C6B4583BD88607910D175FC0EAF01E8DB8EA6C2F09865519276 -78F857B3771B96C1280FF69D20519542A1AFC6BEFBFC438971E9851B265B7A57 -5E7F4A5315554C24F7A761C4C93C068D652A11C143EC67BC55EB4AF3FB0B0FAD -735ED54D721CEADA654D65D45A4407D6D8653DF27ABD9FA8EB3B18FE539553EC -C1139AFA9FA57D82776C6AD8F58F5927200FB1629765668024C2268D4719524D -F029F36C1F3BFB6DBBBA871854BDA3D9AF0A2198DF4E552A820C5A246B7C9706 -03993E5CA71A894F84DFC687532EC02F4BD9E94C0917927521768F8E8C2C8E22 -73A84F5E1EBB42C51A28BC0E1D093F765FB8C7F40E229264FE1D25E12C93F51C -24BF872FE994C4A0486306C20CA2EB9DA8CD61BEA019855C7F028E14D5191F24 -B09D799C049D7A30E3A99C32DD93174A9E98DA08716372596ECE1E33608024BF -6C4EFDE0CEC9C0BB632D0CC64EF18543F4E97F4FE1EB3DF7D60C8169B9CCBBBF -74678AEED67E53B921790C9756F08D52E0E29A50BCFD3A5E9335096723ADCECE -B0E57176D02B8E085EC89CB589CAA8D082E4051D1A4B32C6DB0C8FF1FD195886 -F5AADFDB7D067BD999C3C8FFA5F982E166042D6DFC90C0FBE45B3184B4398929 -D3B6083EF9EDCD9B8E36E830FE608D97325B9B37CAB848409FD1359458F43784 -D1E584D1265994D1E4D44E8FA8EFFA8E6681996D87CD75040FA9531828D5EEEF -39763D1687DDCA41D9AB4F1B8B79D929B82B389046A2D114F60D3E96A7E78A87 -556108B7E6A2A828D40F6BF88E3991C1255139B796BAA15F1496710E8995B41C -79679B308685C35389B436AC154518CD95C0DA922B71E29A448042E582F86C1A -E81EF68322CFDDF7202F5FD856159DF2A285CE6466C740625BF9A47DEA1F018D -EBDE2923550DEE0207F1880465E72000F391968F9FD97FC222A1F1FEE7090AC7 -BC6EE7EAD1A8A8AAB7F6C61AAC38E40C766F883DE3DA09D0D9D3CB55CF81A5C5 -15FB317AE6C574D56480ABAB29037F8D86C91DE45794A42535F575CD74CBF264 -265A6710795DBFF60A15E9B3F3ED7B5468462BF4B0CBDBF52BF8B8274D239C2C -E99EA3E38E03C804277B5E94A54CAE43B15E9EAD3815E08A48F9E377CAAD9148 -D9C3C281E920DBC1CD4D870E74494992857909AFCEBBCC78FF9461F364DB1BBA -9DF6976F91BF88313451212E904319EB35C75A5A8D5C8A091AFF41942DD44655 -8B5532727516FC57B78EA5CB254593464AEBB02D68BE2193BA93ECE9B24E8BAA -5B6114D30A450F1CDE69793B9120228E6DEB24B74E84DCC76DE64377B2E0EE36 -4781D9F1E1BE324BA87A3B7460B026B7207A2B04CE39D788197FAC87DEA33F57 -3CBAEB2EA1CA6255B78EA54DAFACC48546354CE4E41B6FAD29973496148BFA1E -23113B3B90EED5429E53835FFF0C02EDF26F5347014D5E580190273620231360 -2EC0AE9155BCC8DC97E68E1DC7988D06CDC85C03221A66FE8C4DE943CA31C5BB -97A0CCB49D3FEC98BEF7ECC358A1F92B79A8BF29383382B8AD07F2641A3459B7 -D4CDDF153EA877EEC1F6D3DE914C9E832E27380742774E3207B7C2C7890DBD7B -560F5C52E7E8D830C7800AA43F4B1BBA5C9A24D5E094CF8BBA01168F19ED28D4 -7835431F71FE315FF8625096961E3B99A8AC9C5956833AB8C6E7B2344305D98A -12289DFE3CB87FB0E34AE19090058006481F53DF2EB45297D9D790E5DDAA2363 -71E93CE60A0187D4229924329D001794DDB698A6128EE8A394535CAC9F3A902E -7477384A550C5A9500A291AC0D44C2809311C3CD91A743ACB89900E8B134F8AC -BB7F2AF4760D379055ED18C257D3621153D77962E6A8A68C08A0F3FDA1FAD441 -6D6279284C7DC6D062827DDE58A322FA10E60FDDE2E72E461047300A17B71B2C -6A70FF5A750B2D66E680C3102C0E956A31FF4E873F67A8419290192A88BE75DF -827A67E0D6CA9C024EA5E0FAF61466748CF190811AC329CCB9ECD496BA95ACA1 -77869C7F0358039DCE0237B2FF8BF5E4DA24A734B8E5B95E6FCA5E67508CFF86 -29478D58CBE297B1BB6ACCCF2B697D58F78EBA7A1067B9236AB8FD516487C25D -5394EE58B933AE6639CA04C94112E6F891635391DDE83CE22BD02F28EC4DED11 -F594E94B7BC4C57A22E2D616A7434342BDB83CE5EA4CCDEDE0FEA01BA640C5F8 -0B40D67A5D413B4D6FA74EE5136C9B7EBCF95F3F4E6A061BB75C2B3B7BD78337 -5BFEC11CF6E5EB79EB30F7A4BEE88FA5EC858A28C65BF5A14155FA4D15763B36 -B911FBD33C1C35F9B4EC14F774591EF4A8C03F60E530786D245DEBB6C90BD7BF -4BA6D364B7FBC4E6A351DBD555B204136C87DA44AA6B585F3B91072147538C37 -C7AF64A3418D61803A994F89ACE132AD4AB1CE1A7235665050260B9EB689B2A3 -65C34F0AC6E144DE0600172EFBE79B5E62F444B54CB456E86A160940DA578FA1 -1960176C16E2CBC1DEAC8D65E488E9597E0A6BC71F6D328B0C431E52E48200B8 -DE8ECFCC15993E459B9797779B98673BC7B5BDA1C78781BEBFB6ACCEAA9DEF67 -CA973CADD5D63DB8FC3F7E9E6F92E10C957F4AFB015F7923C777B21B94191413 -A2ED8D01E9C84368150D21A2093021D53E83F5AE1E07D49C2D4CF556CB6D5E4C -FE6D4CAE2F50A6E0931F402C647040E1DF3AEC1D91D9471E0E3B227F682036B6 -7B5F8719CF0B383B45F19BC24FE33F60D93A544F391A861FC02F01D95C24B4DC -8A8D1A7018A4063C996F1A64AA073C893F2F304C12314EF95DBE8F045C88B690 -FF286A177D22297F6D436690E4348ED8C129C36411DD6ADB81CD2131E9252C3A -5CEE756AD095339DB020E4F69FA65C2FF1CB26B3BFF8AC3F0494E57D919D2969 -6B6BB197C74CBB466E3A7A377AFBE37DF54EF03EAE840C01248C72736EAA809B -AA000B0B905701F5D0CA92F1EF69C07FAE91F981900AB16F64E1833650580460 -5367EC930C0BEA90F2F90D6CC20E1DE52776A24FB203EBB78AED63FD105875C9 -521B35A4D1EBC591E2129DA5D37FA36CC3A4FBF9C719F790D690353C4290CC92 -448FD0BE083B9475177499341D7FDE5E7E9B9E6957539AAD4AB3A47E9BDB2EB7 -7F6271537D8BEDCE20EA5B998B71B3468A11F9A80F0B735BA456020077DA04E6 -10F8EC9434A772E7C2DC73C5CEB422CD58E4FD88D8167920ACAF93A1BB67E957 -558CF70B29BFF01F5BEA677C93A664A6CD72B553D4B6F0B1E22981EA9AA9FA32 -6E031DE7ECDFAAF0D5546326DAA50DC1F1CB3920DE3B309013A508F0BEB91DB7 -CC6513198443419E8F01FAC3C3818AF9C3595443A6CD2250857C5904E88F842D -C04F77DA9EE1908B15E1AE30220FD840270D8168F2588164C186A72284172BCD -77D76A413875F070C062B8150BC405C507DE0F691D13E483AC2063E2E596B46A -4BCB0F57AA892E7561EC2B7C6359A1732ADF9E7815FBBDC2C1DDE15BAA28F401 -9B14E98639CD9ABA350467D219902A549A84C26FC6B75092179AD22229F36020 -B1AAB7C870643D2537D72D3368C2533542DCA53F9AA5BC8EDCA0C01BC82C4896 -3C4B554E3F591A8310E6320220130115F292B70676C9CF67A28D7D3EA4A43116 -2B43C14C5922AC910D9D137DA5DB99BB7767EA3C92DD0B13C2BF46D403478F9F -40BEEE284AD7C303170833A48FD18FAF0D266E072AD80508DEE8F565C39B4F97 -D3CEF046FB9003ED7DF8C5E2D087296CE6B1326A10821CEE7ACAA22BE4012196 -E42321BCAE6CBB86878B9997AC715C96FAC75B7D4EA7009EAE101A05B7A39E9C -0DBDB48525C9DD7346E574F09576492D3DB1A9BE2ABE94E99B33C674C1A119A5 -B6C113E982CDB45DA3C7D349E59C099491A77D506AB28B14BFCDB8F5EFA0AF1E -B8B1EBC5BB92C27A331CD414826CEB91E1515B27B0DFD46282901A676EFC91B2 -FFD85F3BBCF5424BF28E0E6864AA9919 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTT10 -%!PS-AdobeFont-1.1: CMTT10 1.00B -%%CreationDate: 1992 Apr 26 10:42:42 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTT10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch true def -end readonly def -/FontName /CMTT10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-4 -235 731 800}readonly def -/UniqueID 5000832 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 -38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF -D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 -EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 -A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 -F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 -4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA -6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E -A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B -E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F -1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 -452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF -8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 -5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA -DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 -BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 -741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 -E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 -E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 -D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE -C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DC -FF798F2ABFC4F3539392985C4CB324B0007229586D1E0321559F67C057FD7902 -194490A4C133DA790FF3BF23A13C2B1B69EEB75950F9106F2BA1E3CA65C90FF5 -931DADF03DA48AFB8561FC2E710087251BFC42B80B297A3DB0DA138A7622A931 -DA293B0C740987ACE9F2A8EC2DB98F85783C01623FD3612C7E4A84FD93446770 -C3DD7431F955A5F3734F6931BD790F0A45B8D17CB74BDAA4BFF6DAB5380CBF61 -72F37CB67A909E2842E0AC5D9D07D01A4BABBDE2AC70FE5753460D7E1A708B7D -0EFB2B5FF55F9E4571C466AF1F91E545585845B09D855C3A01F713C1BF081EB2 -7E2A0E5980B63AC736D73305BE7C76A6D637A543047CB1FEA0D5EA576DC9E9AB -838AFEECEED5B387AD84597B8F1B645C5CFE109AC7A355699319C74C3F859B9D -48E5EA693BC7EFAC5BEB1B6698741148B6DA46240B5C72EE4A00BE80A631FEBE -8FFA5A9BB55B46CB602E0B0062B6B6B0B09378100F6F37AFB159DC12654EF3FA -2D2446A2E1FA7E54D5E2E6CF1037F536EA71D20090E5442E93BE52E14C9EAEE7 -AA8CFE7898B336B201E774592CC4038AFE9CA1B6E1AF4FC42E722573B1CD6230 -6165C05E58057567BC6AF2154FE303195268BE490C9AC4EE2A3B087FE717F12E -0B8A344A6612A504ADF5A4ABFF40C1DDDBFAF9624F3EA0CD030B9556D0CD81AC -DD096252E9B3055B8E9D4D6C22487BACF1FA85AB65FDBC927CEC788CAAD96571 -272E7FCC619B62F343ADEEAFD4CAC2C2878F2BEECAA47CE87D9D4C72AF75C181 -8F6A1EEB1CF455FD9E1D543BF717612F5E0BFFF37B860814F03A858CBDD46BCA -47762C1A267CFB70881408130515A2FF469FADA3632435894604EF91C74E0751 -C852985269CB64CEBD3A82AF5B55C077102EFBE8F2F4FA6EA4BEDF475DF8B7DA -4964DA00D37959BFBB42F91DBFC072A10D254C10D27A6AC5028D66E59BE54C10 -D6402203AD432AE8DA538812D029484B3E657651A6896611A71B3D70820B9D77 -D961D5B5E458E8CDD13D2515D0BB48545D7101881FA8EB59A671F73604B56B9E -4483619D0225FE2FB0207DBD70B182CED1A33B5A6A8DDE2FF56BD497D6AB2767 -A2E4164B94EF19EBE4B205795558D96B6C7D9543AF4F4196E795F879E2C9F1AB -BA7FBEF668CCD05ED502286C77CCFC0E72BAA640C6EFADF5BCDD60963D794778 -2C668D8D273D981F352D7EEAA39D283EBC92E6EF26C7D5EC3C9C7338AD307B4A -73A8FD605AF48E66FE2185EF7FF789474BAB73969099E7A0E23618D9EDBBFB1D -121B58A03C76B9006B9681A1041D54692637DA827C6CD46417D6BEBD91068066 -6464FE5CB3056A5622DFDFED0B627A0FD6E5FF5DDBEBAEBBF3819DF1936390A1 -1B091A46EF914C51CB22C0EDC63F91D701F3EFCE09595A13E19CAE7B05441249 -B5A9320A5FDADDC1B676039C0FE722F86CB07FFFB8A3F5947D613D10044F8A26 -35037EA869423FA3C93D9074958D862A04EAEA4AC8E074094DC99F276803B272 -C208734565064423C89A030B789462B87A4893258F7BC1A1821D206308301835 -75B5F34A9BF3B115CC07A4C11A8DC97B75A7C8D12017EBF4EC2E0C14B01AA2C1 -3122D3FC389CF5CB4A3AEC20820169D33A36DBEB7335EB89963A737EE724085D -EC60F6F1FC4C27592DE09C93B2BACFAAF6ED88BE0F3DF3F7C9259691421E8F8C -6893A53228C5F43EC0C1FA4CFC27F401DB480A9AD5680A9B9D0723753D547102 -8FE445B22346FD199B2ACF11240470BC55E385F2CEAB834D1E4CFF410F6EF698 -BD61D3E8B859BFDF83BE0DE4A9E34810FC668A16608AF72C441B54081C696B25 -FB47B7381767DEF64E938A05F7DEC802E54F4FBB664D0200A70E829D8E54020B -3A6A166A3EFA16B9F75B6760B3B038C2CBE326BFA92D0A440A5B4C33859A418E -AE2C28F86CE586D37A510DB00D9F6B34F1AC1E84047FBC031DB55C1D83A2B14E -E6F9EC275907BDF37DA4FE10C832AA10054CBC0E361AF655D01072CE98531E39 -FC682E6692F9B9BDEBB9D3DF8ABC6F736CEEBC5B605D7AF839F84C62E26BA5EC -16F3755BE630318694757F2603E90420FDC2833DDB77970A68CA4008D65C5AE6 -49C8463B79340679E8D5763A76B08D102E1D2F2D65DCDA4D4B6C79025E0433C6 -FBD79620A7BD67B45FDC3658FEFD5624171253A317FFF5B4C6A881F056BAB784 -A8CCADDA2DDE3E856EBCCE52994A38578931533114F2E73A5D4397B5AF0D9006 -F22E95AD076530BF6F1BC37584B3EDF0218DCF552EA48A5564605F847CDE6555 -1BA5C4D857E437B4B3A9CAC6E40A206B4EA64AE96C803FC3424AA873CBC53129 -E0233BB7F7CECBEF84465FFFFBA0C7C26012198D95455CB0D250C4BFB55FE070 -131794B894EE8C3E7460713BB9DD1122AB2DC11DB395E073D212F3392F0D5F86 -9FAA01DA02651A1FF5CE2EC9FD03C7A5AF58DB34194FD0B11D8A733DBFC25D8E -8C9533FCD66B5C34C68F66821CA57E8B311BFC09C674787E5BA6017B51A68B58 -B1EE871F72DAAD471A29E3BEA3C8E00A6C62BAB5B4A3D1760DE29EC3F4FA6656 -C316680DB82EC6440D64A1375028826D7C469D2FF749622D15FF2D7B412AC115 -67998AF826F70F239F6D2084633A357A5298B0953A9812CFE5DB96FB885E43F0 -D96FFD568D79BCE6D7CD430C92044173D7E9EAD929DBC860912048705BB3D196 -D94B12506B86070FC586681F1934F8E95FF0BDD975205AD1F824FA7368B8743F -DE5958FCF2C078D926446839F35055027271066C49D89ECE5A9C1BF3BE7DBC5A -14FB7AEB42BE571FF41DDE323354001A58BD6392A8C812610CE1602F7A28EBED -178C31C2BBB4185E0A91A6D47C1746E96C7454F13AB5E7C84AB1F1657594EE8F -59CB0E2CC943B794A6AF897B2A39026A1F70AF7769EBB70B4ECD991A053CFB18 -CF9BE99EAA15CCC7F0E3E745574AD1F1BADC199FD814B839DFF3852775E1AF0C -792723AB5E30CE94F238719EB82A596AC2B45819C9B5DCE0E3A15E65925622B4 -7798282B4DE63A27666143FC96222F0B3A81A4841C706F1ED049371069FB70D2 -9E38394D0E536044C3D73C78D8FC0C0DC15BB790E7169D620C949A5A4A33D784 -1F0511BC23129A523C6B6522F4E9C4AB802318FA150B90087DCD7B515DC2791E -684472BC2A3B106E56B5AF96B47DAD225EA9FA3AE70049D0A342CD32744EFBA5 -D68A2DE641556EBCB76631F00990E0E7606CE0D3E59FA79D5854827232EA835E -34ED89C642B449D3E9D3C84E9D73ED3C2ABEFC3AA8DF61A6D2882D6B5B0B6873 -6A5278DC54255CE995E0A6B59CAE17BF099F2605197C5929BF0E5E7A7C17BE56 -9ED4AC830B49C1BCC1C70776DD735703F7267AB67B9B197818D5C9AB9418A3E3 -E7608743D6772B48F465F433BA191B850B6D7CAF6CA04D5CD5C14545232D52D0 -C48A9A1C436528A58E925EDA37E610A2E9D20DFC44F3F74793E76C9D3C24F87E -B0BDF8CD9C7B18FE85F9AE852336B26A4F98A5A37C127EC32CC36172E8DFE871 -D006CFCFEE86B9EE2A5BD64F721DE18E94B2E55E21E6E32F90E2369415BBFBA5 -F18859D4449AF87A8F7ECA45B88CA5554041101ADDFE7037A1DD4DE9E0BAD755 -CB38C3CC1D63368EDFA1F03B27F80482FADDAA9D6325A2F7FC3DDD7F9D748E46 -EB30E2D4E846616B16B3AEB27F899238CF93DFCA244BD9EADA0F5C833582F2C0 -A77D346A2A062D2ECEA939C45F5E6A721411BA94066F24D34D5792B6E86F14F0 -F51E156C70D8ECB8EFD0CACB8DAA7784B94821CFCC2515D6FB408EDB80698F85 -5D3028A6A06A4AEDEBE47DFE21D43C26C93C8CFB3ABD91C6F5C286886E0B4ECE -B606079BB5B4980E60CAA5B46DECA0004CC7B044D8ED1A73D5A66CA67FC2668E -452F4E63088469DF7D7A5FA0ADCC7887BD71D643F6E4ED41E3C7E283362AF622 -096DB300D8EE6B43B5A7690F3BEE30B0C8D178BD99ED61CE61DA463AD08F8817 -37EF2D3913D40F5CF32B0AE17F62FE66EC8D130843C2448FAC16556E2E77DB61 -3ECE99407079823358E6010D89491B242365D3D1B68A837002097EF1B3E4CABA -D6B0D2059FB7CE0B7FF876458CAC4CAE467268E9A8EA52821A9218A21CD27749 -F072B517A8ED63649AA3680178A0B718197AA3E08BBED26B42CB1CF66DB9A832 -7066961B75C300FC846D42E915269E7C565B0326A07E4A1FAED2FBA3AB02E0F7 -2083B95FFEBFA3508980BDCA24E660F6171122D9DB6B738196C8D4CB95F5412F -F9F3024EFA76D53D9A6FEAD1B72B6ED674724D28D2E4A2A9A02FC7B914540B31 -4B938DB4A83BB14CAB4EB7CE37915F58F9CEAF88E099571D7FA87F46E79FA816 -839B98AE55B866B2D1D78AFED64878DF83CFED739E57D95B911FDE0E35E9CC28 -0DDBE1B0C055B551BD46F9949A172B317FB239E069AA46A9208FEE5939250675 -0C5241835D891930D12CC95D921C614AA2EA7949C5BC9E5A70C776DD628F16D8 -8B44 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI6 -%!PS-AdobeFont-1.1: CMMI6 1.100 -%%CreationDate: 1996 Jul 23 07:53:52 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI6) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI6 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{11 -250 1241 750}readonly def -/UniqueID 5087381 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 -5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC -4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583 -6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1 -8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283 -9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9 -387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E -6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7 -A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169 -70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE -EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927 -BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F -3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3 -3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF -9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46 -D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93 -FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5 -79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69 -C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508 -0797B87C774354F518712BED10630585E99E1C29B15CC9903566677AC2C11EFC -B05A1E85DBB81302C8B2522B3F37C43A981F585A2F5C936F177E7EEC5C9BC111 -14B1C1840E434B6CC5D7108077AF385722ECE0EDB6EAFA0F3A9F9AAA7AF8E9AC -FFBA85E594BD3D2063DB703957BF7B54463226A39FE7712527B4BCF871AB9DD1 -479BA2D10E2F18BB1CC30AFEC7D5E797FE4AF06EADAC0F9A0F7209CE8D2290E6 -14DB62B4139FA1F10339E0713FF9EC0A57CA17226831B2AC9A692E0B73B18DDB -60B30C162D2E5150D6D4373CB0D8C650045366E786BB1B893D3FF2B439210940 -919A897A85EF50079A5B1339EBC7B70EBC474B4024B8FD2628BF1A7391C483A6 -441F40200ABDB7FBB7C832C85CDAC232B21798BCCB07DFBF9A132DE2FDFC3E0F -2E7D15FF013768F2AA10E55BA400BE4746ED1DB739DD8323C46E3302E47902C6 -887D34F86CC79696BA1A4608CDDB93DB67C171C6D72D8609D8103F54E7CF71C2 -905E50DA46947B0546A0528CBC9D2D25865FE40659312238224CA5DB942AB9F5 -87439504A1B78D31DF95F433F396AD8BD1726EB76E0FF8FCBFF9A24C922C1FE1 -44EBDAFDFF9FDAAEC3D49A1260AA4A048645E19895A3EE24CEBB1431D7F57832 -3881085D5AEA699C75D2A02501D4326A9D18A623189CB39D0897A9EF7173AACA -EFB555438EC77986DB06DB75CD8B6C8A64A14C04124301089E9C8F340D90904A -80C2EDCA1C0D22AF66597073D49656DE4F3709CC91A39E8BADA180393D0B4333 -AF9887BB3D28F8648326563F0E3F6B66F9142CE64F2E2DBE18902DD22C1629A2 -1795530B2DF626D8864BE932BDDDE493BDEBA2D0B2B6A9A435826D2BF592B5F6 -84AC439F99BA54875FA0AEB39DF6878DC6A7E097D3466A41B882C9612AAD8C77 -539C1EADCDC357234B103FFB14DDF49081EACA5A63C6942AC803F513353E4A40 -19E68985A6095660EF71347719794EC6AEDE40325AAA33C657C9F3CA431DC25F -07C478A4C0D83A1E02D526305E5D62933CBC8AF7050640B46AC403BB1075F495 -E5511DADC464B83C73799B395B7DC9866B677C2E96AD044D913222CAB3931E62 -8CD4B8FBE6BD9D05A714F8531A061A -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR5 -%!PS-AdobeFont-1.1: CMR5 1.00B -%%CreationDate: 1992 Feb 19 19:55:02 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR5) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR5 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-341 -250 1304 965}readonly def -/UniqueID 5000788 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 -87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F -D1F017CE45884D76EF2CB9BC5821FD25365DDEA1F9B0FF4CFF25B8E64D0747A3 -7CAD14E0DBA3E3CA95F10F24B7D5D75451845F1FB7221D7794A860756CFBB3E7 -704A52A22448C34812C3DBEDD41892577AABA7D555E9298C1A0F7DA638078167 -F56E29672683C51CF1C003764A8E7AD9D8ADE77B4983F56FE2D12723AAD8BF36 -682CFBB71B1D12210144D39DD841A971F71DB82AC6CD815987CDCF29ABC3CC96 -5EEBD5D661F452C6E0C74F9ED8D0C5B3755551A172E0FE31EA02344176E32666 -14B6853A1C303A5E818C2E455A6CF8FC9A66DC6E279101D61C523BD9DB8EB82F -EAF4D7FDF6372383C0794C4568D079648689A199D4B65BA646CF95B7647E4BEC -83856C27A8EF177B3A686EDA6354FE9573E123C12EC4BA56A7E8BFB8F9B75147 -9DD79A743968F36F7D0D479FA610F0816E6267E5CE327686A5485AB72201525C -FB3B7CA10E1BF26E44C24E1696CB089CB0055BD692C89B237CF269F77A31DC81 -0F4B75C8400ABCFDCEC6443CD0E81871CD71AA3064ABDE882C4C52322C27FA8B -41C689F827FB0F8AAF8022CF3C1F41C0B45601190C1328831857CBF9B1E7D1AA -246117E56D6B7938488055F4E63E2A1C8D57C17D213729C68349FEC2C3466F41 -171E00413D39DF1F67BC15912F30775AFDF7FB3312587E20A68CF77AD3906040 -842D63C45E19278622DD228C18ABDD024DD9613CDC0B109095DB0ADC3A3C0CB5 -AB597D490189EA81239E39202CBC7A829EB9B313A8F962F7879D374ADF529BD0 -5533EF977142F647AD2F5975BA7E340419116099B19ACCCC37C5512091CC7138 -9F339C66B2C9B87906DD509D3C01FE58D1FCFFD900A965E5DE1AD282FDDE85FA -92FF0A3C9AE2D5AF98449E9A315B39D2024575CA40F9A2F3D5339E648D3126C0 -8E8807EA0B7D89271E7B8B288D4A61362CA05ED34687FC601A562EB8767863CF -EA5E8364E134C69AD711B84A8FBDFA17E798BA9EBF776CB15300E78753129E97 -FE41E3EAB189A507611DE0CCD44047139B8DE5EFC51809FD209EEF4DBDF0FE49 -1BAD5967440B83B33CF3CEC522A63DAEE6A4762C51FC06B875AC12CEED8FACF6 -4C3DF66B8B88610E4F65E3BFCDBF85EC246DC435C0175547DE2008B998D35CE9 -A14B892B4D401B37E75B60C1D637786A9C92DEC415BE87DF0925DE83EAEA370F -B9E6424D5DEB2C4DF85BEDE87DA923DD949BA072FE674B15400F528241752E52 -40BAA7A214763602750E37EDD462CC3EC41F6A280F86D08C6E1A3F2FA1D88A03 -38F94E8DA7CB48A4C61CBE327501F01EC7C18822553C5979DB6179655504E1FA -CA594F7B0E30C3F0670DA9CED7D0BD2165141819C4E98860BC925EA6A8438ABE -B53D6ED683F391003C2A020C1344D0EC3C40A6A59570577F4F8CC186067520BB -EF87D573B8519A38B54A162E4B48ACA19E4DBFBFA1599008F140676E677FE204 -D3F0F112D625005CAA745D0494B3F0203F4F1C2F65DA974B7271E74402A5E4A2 -09E3586CA443E56E074B83031CAD5F6F305151E6006B9961FCADD21B114ED14B -F7C6AD7F299722EB731A12AC6C9809AAC897D09327BD4BC03BCEB77B77EE5AD1 -1CA151B2070E0641C8CED49EB796A202559D3582C03082BBEA6E67F64B58F46B -98909D79975EEAEF24A4AB41C8DCA05C32E8547B0259AB5D85CAAEF36CC1942D -00122D76F29EA30FAEB17F91EBF7B1544209FAA74BB6638FE12B94E10583EE2E -AC0CB24998945610BCF401F004CF55288979B7A9E8E7B584CC36BE7683327912 -E388619E2C8280BCD60AA8F5B2D0A06DC88F7B011009DC5EBF40AEFE96EBD536 -3526537702686F575ADA2CCC98D3C393B046BAE30C833A6BFD12251BB3B5DA36 -B63EB502A3693C94C87B26BA40DADDE1162DC60FFF11DE6FF88E1ADE26300B6E -AFA3B4E884CBFD5745951839A3ED75436B022326888EF1546263EDD8FF7CACC4 -D569 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI5 -%!PS-AdobeFont-1.1: CMMI5 1.100 -%%CreationDate: 1996 Aug 02 08:21:10 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI5) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI5 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{37 -250 1349 750}readonly def -/UniqueID 5087380 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA06DA87FC7163A5A2A756A598FAB07633 -89DE8BB201D5DB4627484A80A431B6AFDBBBF23D4157D4AFE17E6B1C853DD417 -25F84CD55402AB88AB7EEFDEDBF2C2C731BD25567C53B474CCF739188A930039 -098A197F9C4BE7594D79442B2C8A67447DE44698321145D7689B91EF235EA80E -B600AA8E238064F154284096C4C2554EFE8DDF13AFF8D3CE30E0999375C0FEE6 -F992DEA5FC3897E2CC8B7A90238E61E41622DE80F438DD994C73275CC52249D9 -F6686F87F394FB7BB668138B210BEC9E46415A1B58C990B81E7D7DD301143517 -4C2A259D2A0A1E200F8101469C10D7D537B0D4D39296A9AB3F132DA9A3B459B0 -F850E2B3A03BDCB35AEF82285D19C38F474FB414F8EC971B994D1C7DD753B271 -2B71549DF497C665DF0F266988209D9EB616E4D9BA229FF984E7A886DB01FD21 -48ED2E4859FD6416C2CE52537464EA884C8C9C2D1083E2B83BE4B766474C23B6 -6E8EC5003200AB10514BB44D14CA700416AB6B2683E80862E7D5B49A05526A32 -554BB23AB8B0824BBA198E3825CE82380CC0FECF46651E3E5D77F09465E73164 -20342822F29572BC7F73F2C3BF95ED3BB6FDEADC20C6AC866C4F2C679594D7E8 -8D944704A3C5D771DC39503BECAB89F34D8CDB8FDB91AFE21F3F0260D05E90C5 -73E2C13DFA022C4522E5918EE25038A0498FBB530DA33B0AE238B1C6ED03FC04 -2BFED8236E07820C5BAB411EAE1B31D93A2FA7C374B1725FEC359ABCB88E2C89 -214529A263D795AACB0B95A3AB2F4E08EF350C282CE521716DBB06E5B8291B3F -5D4ACA230FA192F64BC902A4C8842C0F916F92FBD002ADD408BF0401D0284FBB -F05D4C6DB631420747CC902C5E1617E6573612FB26C8378DF41FFB5048D3CF06 -4893DBA48EF4B043D760F60C75712169D16C83EE020C45369E443E853E1809DD -F395B812067D6FDBD26111B34F42C21036AF952D0D767FD17F6959D9FDD46005 -D64FFF54772B50BB9B173AE79702981F58F9F235C591F476A31852174DF0619C -A470359153DC32610E782B204E7945515464DACE9099B81EEECC7EBD4B5126AF -C3FD9DDFB329AF1C95C41FA4A5F6958869509A23BD7210386329771FA46FF926 -0E54AC35106253EE140449425A8670E1F92B178A02A58EB57540F4BD8110E548 -BB584EA6D625C5F5FE0124A98E49915F1A1B95D2125874360EED1C4379FEF3C6 -90E5780C20309F11F2F23FAD635C44BA030B39EFF083A3ECCDD2641DCD35B24D -59A1A8D05205EE919E493B61A71A62AE54025BC2FA041DD31791DC50A6088531 -8A4298B24F0C7824DC95C61D21092BB72A0DC49686D01506FD8459F39B9EB3C3 -9078094DEF5CEDEC660B806755F07BD335F8C46EB490845C09117F269B8D026B -27F8E7EE30E9E4A8BAA238D99D4CDC7F11081AF46CEAC2652D2799A8EE83DB12 -7EE15C3B3FB94A79EE922782E30C67366520B46054DEAF1CAC3473C273526355 -602217963063FE21FD6668AB42FE800B671CA15852C234F3C3EDEE2943E2D2FB -4BF572ED711361114F7F561C369360846BACB94DE283126D03C25BF4DBD4DEE3 -FD1C3C68793F5C45111A1D4257AC2A3D60CA6C311D84ED467D67D786E386D2E3 -28C8946B7C6A6A2D204621A7BBD2A725F6369318C7543266396CF58EBEEFB7BD -6386DE57D69CC461543AAB4916FED65EC5E75724C00562DD4B1822137856BEF1 -1D607E17CB0233FC2DBA916FD3FF9A858AA0DF0B334AAF4C0A10BA981792D8E4 -ECF71B964C177F880320498F9695F946351CBC0FADF24E378954FBE11C736443 -1BD54FFE1EEF7A688B47592A66C3942C406C128A12153999D0E85F3047A41614 -31C745F690D51D386374A187BDAE2F9565DF40CF1159292BEF9E54FB51091029 -DF8037FBF92BAED7961B0961696FB6FA75A588A203D8D30D38E42450FAEE8843 -457B35D3B9BA2FEC5C9401563BED3E4A6CB4CAACAB06EC35745C7960E46546AD -7D79279A6ED963E5D90AFFA820A2F5BCA875BD068F1B06564C826B99C6AD400B - -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY7 -%!PS-AdobeFont-1.1: CMSY7 1.0 -%%CreationDate: 1991 Aug 15 07:21:52 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-15 -951 1252 782}readonly def -/UniqueID 5000817 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 -8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D -F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 -E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 -424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 -E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C -C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 -868AEA25DA3D5413467B76D2F02F8097D2841804B020B210C0470066F33B37E2 -05805CEE76C91696F62E34EA09B7B7D6D5A4009030F0FB377D84497D56557DF4 -9B39A8B5B98BFC07D37F77324AE22B7B9C462D17C175A20B9F5E818796D45700 -1B13FC4967F4CC16F5D3F3DF2BA71BD6A7CCE57468EB1FCFA70BB7CF6C14895B -85983599407B165E91DF43A63851698377CD3960EF0072CD577FB2F55F71DBF2 -D631A6A627BDB80F7ED0A86EEF1D7BA8509CB8E6809CB7D5746CF0779BFEEA58 -FF4796DB9ABCCDB70849348CB10A029249191BAD99384BCB88F30AC35FF916AF -8264A9D8F0159E5EE474F8FF31CBFDD149A7526CDD58B9DB4792FD6852EC0BD5 -C31A9E80C325CC721EB76743DAD0F36A5AFCC5786B8940FD8CF0FACC37F18FBF -DC3EF3C8F6122B56446FDDCEF6DFFB61993726670B06A19274595B1AB448322D -EB9E686190CB0572AB53F2E189D13F0781C39DB4F7EAD7F39FEF4C08338C99B3 -0D2BABE688958EB49410A43E3BAB1803FA276AD49E649EFD52CAB808E599F306 -17CF39FAB736447ABA2BCE7A5DD82554A6A895C6C5DC9A957044B54FE048951B -6FE24C0C6C3F514A23E3C13365A8569B073E5386D65DAF -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMBX10 -%!PS-AdobeFont-1.1: CMBX10 1.00B -%%CreationDate: 1992 Feb 19 19:54:06 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMBX10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Bold) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMBX10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-301 -250 1164 946}readonly def -/UniqueID 5000768 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 -7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 -77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 -2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 -FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F -DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 -7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 -9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 -CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D -6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 -E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E -8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E -3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 -EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 -0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 -4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF -1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 -757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E -0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 -6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED -E067598E1B8B781EB59569E3D0D54D8EFAE0F3EDE26279776ABA15341E42E636 -6E02817082BE6FE0B04249A4840C11F95F8ADEFF72173E9A5F2AB2F62C427E5B -DC010E18641EAC906A5EF0F9BC2108062134A7F10956219C5847C0D82F0E8663 -12D963E012DF0DD899911EC5D8096F80B49CA3444CF1294FBFAB57DFACC9D01C -46F3BA2F3D1C14EC30CBF83E5729F1C074D4F1665405C9AAFADB8BE41EEE43AA -16966E2C0CCC853C4C09F245ABFD4603C4AA55EADC0A59AA6E9F5895FAF3D3FA -83EDC6E2540417530AE7DDA8EF33DEB81444316FB3F93EF944D9FB06745BACE4 -848398BEB747E58310BBA39C64E341185C82CB77E9D4439EC15BEFF1335F22F8 -F036517C436225F4125ED67ACA7A84230D4E2B6CA713FD6B3CA54BEB540D4604 -D58A8335BC20052440C4903786FE3E335E331CCE36A13F05F71126F680077AAD -ECAE10CB7C057C2D55F384723D5C30D20FD1358CBB61AA05EF45403C3B8019EC -6350ECB240F696BCDDD1A9F0465CB43B824457852CEE14CB39164B65A06C6F60 -2FF3A2A62E9567386DA80C4AD7651D44FE76DBF369706318E0C38215CE324932 -7625B5924F5370E9C13F0A66881FC91A4FF6F1AD4CABA49269C8F547DCD6E7B1 -47D53DB0D8DB88F2B7D435B16704B69FB1932CAE7E189DBCE941CC7A968A8CF0 -A5B18680C9C1CF25413ADC7FED11BDA308A61F2B9B688FBE6F35592A7A80E7F8 -36315FEDBD2A86FEAC9A2436E9827F2D291EBE20C9AF3B6EEDE26157BA188623 -EEFD088E3003970F5406023034921BE2CB71FD2FF3A8097881277AD8FB61E2F1 -78234A1900D0E11B18F1FC53B65F62F8F20B22A7C0584A3DEDCE17A045F366A7 -2452F46F213B0EA52186A9693599344A739F6DD15AA4EAE18AC229C7C70E12A2 -475B7821C941EC9B149BE9B6AF9A887A21D59350EAED951E317DD3AF21767FDA -40A19CF746A59B4B32287762B6D2F9850A4A87122E1D509E77B7E20D38903764 -AFCD068B8A76AC6C24DE414BCF255B58E09F4896A0145E57B37C25B3A3B4F806 -6B7213EB4B15F2817F7B535D00FE9C056045D271F2CC490173D436C77A4D1B5C -F3915DBB226CCF227260EEC9FEFF583E0EF338913221F95D86779420A47DC6D0 -A505EC936CC08C50C7134EA025ED7E4BF5CB3929DC1FBE8198FE1253B9CE7463 -6E26F2455E3ED9FCA0037C5AA7B354A4F30488FE344D2174328A2C70F36C94D7 -BC5CD9AF69AA2FC3527FA61243B6485A78107B760CCBBAA33C6B6C58FC8391A0 -29F7CF8E6AD0FFE0BE9FE0B7EAD3952210FA0FFFDAECD21A07D93B8C0D596E10 -998EE096534EFDDE0F14C2FA1749E0ADF8A0CA30DA9357A8702770B82AD521D0 -FB46033DFB7D2B2F19E587308DA70065D910943A34F7D5F2090FB4AA42ED70CE -D9C73192DD9C1EAE1F49708EE0350FB9DDF1C9011C12CBC10853B76A886F331E -4BC14C95C484B176D6D4CE41047A4B1BC0EB04C7D76EF2A99B455CC71AC485C7 -5B8CCD592792059D48A3DA35FD0496D6D68235191F28DBC1BDF12071767C40BC -F05C6E1385F0C09A42C6CF44B3AFAE963C89B348FA0CEE452DBAB4A8AADC47F0 -3B0A4798A24518FBA8777C66F815382539015CB24FB960E8C0022F065DB2A124 -FEF55B69DFC24E093B4E6D8AC8537B93A75CF925796BA8BB95C761C8720E1BBC -F9A52B5E6754A39F61786DCEC8CFB966B04EF14E3BC6A17C4217AF3ECA869E1A -0B71DB080CC86C6E1050684F4E707DBCA2CC21EF8BEE0E5366A1EEC4F83BB82C -A3E6AA5E2632C1D8E47DCC62F4513E2C95E97D643024556E8018F2EF2A19B322 -3D50C962AD7D5169EFA32FE34A42319C137AA1E69CAAA48C0C66BDF5C0CC3702 -F7D3CD98D0CD83A74F808102FC5E55FCA90EA2ADEB12ED6656C370D2A05ABABD -1C394D15612CA6CBA6CD65777449832B7518242032C7CAA693B4A0DA3FD9D7F7 -BC33C3FFD8C31E7344ED06B6724DC2AD2877048A83EA1E710ECEDB5AAA6C9B9B -FD4009573E89AAF88AE0F8C87B7405908BC2352FC91A4FDDB84F6B8128519B72 -2A137FFB5228F90B92D907D18FD21054E9570374DCF22D235DE401FB8354E93E -A9C6153F76FFF89B17B007DD29CEC22DA2F245F329788E5DE6CCE26CB62AB9D5 -1E33CA61DEE88ED42091AC856C05DBE92CE77DCBB280015DBCF1F22A45F94EDE -BE85D30E93A0F0D79B0CF42E5B7013B04F739DDF771C5D3D94349FD99D9A37CA -C2DB864D8777EDAD939B911563D62E177B4A8D57850AA69CACE4D33C3E523DAE -2015A914C0B6ECE0FF52CECDEE842E40D34E00D0F312F80266A9A6CF2D1603A0 -C8C05C989BE54C874666331579A630603F86563BEF52363A47C8AC964E874E01 -54B85E2EACE5381C8283ED0A342D3BA22D35124DCFC2C55369275B4AD7379EE5 -30A148DAAEB28AC63EFF71C7832DB81178F1D9BD3B9188E23268255EFA1E1EA8 -D9535862FE48B69FCFE9D3EA7907F64071B6785D93459B8625BF4315D528732B -42C116CE3E6DB56606B9768C8856F7E66A4A6FDA088BAF64E54B4D58B90EB1A2 -212891B52351C5681DF1C7A6721DA59BC390E7CC26164EE3156A9254FCA4418A -D6EB3EF5C8F5F682F678F5E4FBCB9ECA95682DEB0E8D658A5A822B6C44876F44 -7685B55CBB20BF1E95171AC47EBB67D654C6AA6CB8AE0CCC995734169E557438 -9FF6B6ED4D5D99FBBE15EA2663CECFBEC7B935C4D45F1FBDF84FA05660AFF8A3 -E7453212B2E0D5DE06B967A703ABBD0DA549258759B6F9F51E539E0AB27683E5 -E5C0C5672A8AE3B2C6D384C3FF203DCF2289F5FDD782D469EB5B8A08C94B2255 -129E4D41EFB639E3FC8F2ED20447A07AE629EC35AF255AA4371A3644E022732F -8608020B6FFC6B9347220F113F88065173EC136CAFFA32A7203AC79F1BA848F9 -8E173C318D0561A1EFE854BEE4FB174795F644A97EC2DA2EB0FA5C2CE650168E -918E2B2D163A8DFA316EF602551C64A82632F038F1A2A590C0DB2A25C03E9E7A -8F9E3AD1AEDF165A29CF474E06F241E95E5D5D3BF6946AF64A3EBD2BD7117E91 -F4F39637F2F4CCB69A7679EF69A3E1F5B3B56D37D2F7C8FF21A8428A8B7D3C81 -3508E542F3D699D65357E846A746349473A01F170267DC4D58A043A41E179079 -AB0EE76C2B8AC302E1AA94EFC58ABA22B752D747AC00B702E61CE5DF2C942F79 -DA65DE2128D60014028F5B0E27E26262073F11FD2CDCD392778348CB30939B83 -A91D5B77D31A0F687EFD17E0B01001AD7B2B4415A44B73469FC1A1672CB0236D -D41BE85BAA4C9A229D84D8FC1C48CA295264BAD407A0F6F9229B5370BBBC0FF3 -752343D66988E0CFAF5102C18F418322BD7A5AE815CE7C80732A8E6E9304CACD -2D0D26A7B373DADFC1A1D122FA9BD045F80B7F046501A6175CB550DD08FE1FA7 -2ED432EC37BDDF999D64C0B2D4A91EB0497575BF88D7E706AB126474E0834D81 -6A7E64C9D6B622C48EC2A0263E4615C4E067474984C7895572DA9A452028FE76 -FE30641FE01845BC5957E7DBD34A9A1CC6A0E5588AFA36BF2D5774577BBDAF2B -69700645AD306974597460959A0BC940FF5F9F97CAC04049874E7CACB989412C -06AB8B0E4FB46E32A8F08388592EDB25E6E1FD8F9735D37E36F09F9459FAFF06 -6263D9BD0720C73D698032BD353FC6029DA7F84D12174324D2D085A0EE6FB2BD -F476AF9C467313AAF0CED041400180A984233D0A3661444AB24D940B6229D0E2 -6090646BAFCD916C7914C1E631C7259901313CB7DFC0D6E31B3FC2F18BBCF494 -06267FCA861EDD35B5AA899963D20DBA33D380C30BA8677D9E8AF65A5D1D8593 -ECFE9329A49CC626679DEF50CACAF4AB2BB08E89445CE70D7E7132732259EFAE -DA2109D0938F660888569E7048F4484C76F73B4F6415F7F1AB89D5FFE85CB3CD -197141BAEB704BED6F26F590086CBC6E484F56AA34CFB1420D3982E2DF873C09 -949B8EC98D9E1E6FB07B72D11D3AACB4CC1DAF846F1B55E80C80C9EE41B9CB5E -76B5984826E45D0F5F813F3E57F8F526DE87570EAB2F625E6F795BE4087B056F -9DC65C370FD020C21D87D0EA3361E3F1097B3DA2A323813CF42F533F4E784E3B -AB0378421234F4EB875F9AACDF23EFFBC3F8D2198F15BE7A245B8AFF167EDED9 -F3474D8F900185C7DAE57C09E82B1B4C820CDF74EBF521A93DF0C09A38806F04 -5CD48F923556779B1BB04538E2C00F3CB0D0F9D51BF71074E13881D5EC2B26E2 -4F576AC8F20B2B361EA4625717FE75256F5817DCB433DBC857860D58447A53CE -702E3DAEBE6D0BEF0FA8A3391EE73A1B3E27B95DC7E62B21910108B1DD0BED02 -ACCF61D4EFC3A4CDD0F78FBA08273F5C1CC3C44B0E480C0180BC172C73CE9081 -BBB1AEA8040EE52EE5F9D8FA930CC262FC4BBFB743733A76ED66C5447EF285D5 -C38AAE72439C296BD4E2B34C6697F967622B0823E8F87601D8764475BE597B89 -D55FBEE64419B42E8444ED55608A7C5D3737D76A1AB8550E086EFB6897FD9464 -2E954E13E07564CF0232DB671E9DD49CA62266631BC04E14B7722FD9DBC344BB -B33147C021E2976DC79994D3F7988080FF20D4AEC571538D1B8A690B43A323F4 -77BAB2AF9B62B2670829EAB9A844A3F6F4154996B8DF77BDEE946E92C4838DC2 -05DF6A2611750B2DECF50871598AE66E93EBDAC680D5785D90935F358EAFB2E9 -1A509601B91CBA764AEA990B9196CB813789F57F826C0088B2CF58E1AD5F5FA8 -7F306859F0F9FF75B750420C99FB3B7087282C22CA4DDFF1A3C4CF7A0A822861 -07762AC3C82372F7D1F5B8D0A6BC6C86067BD33143B0290C589F06297A8492B1 -9F22E18671D013E720E49379F9B2F723115FC4E43DD6CEC243756814952ADBAE -3687B7E1AE94FE7D84DFB62560592CD46C7960E7C60556BDAE8509C5F44F3CA5 -1647D8691F8EB8BFB02A78983F33C00A8736EDAD2408800684F19D5AA88680E3 -287B0219E9448CB59DA5593EB876E21CEE2B26FA8F025C833CB12292B5114BDD -B67E6802A026C90F3D58367C5DD91349CE4C958F10F62D113DA6430B6B40B8E7 -5075C65CDAE22E37320457AB6A64976629A0D236EEBCAA925B7C0BD33F129D8A -4C30CEF7851BCA9A87B54F3508DF652C93B3090548900CF5F641AAA4A9973835 -1923B8D0B9C634C42DDBC5C4324AE647E78DCACE5050DE1F7C3491214C3E4B01 -E756A3DD17BFB2A1B246608CF9C44D7B000C53512CC2CBACAD3969D9562B7757 -000C25F5BE8BDE3761DCA3B734010F414A4BB19BB4FBBB9CD48D5B92EEA28344 -3F0D2B426C181DD9461D821FEA82CAB6E1D8EDFE9EEA62D787465776CBB8B861 -76DE00E9BF499F9055B0C0B949AFE2C9DF25D53D9A0E7E82AA96B2C21B63E1E8 -B43C8D12BC5FB938DC01C2301FB6D263E25A788B3C25E3A170CEBEF8B46AF354 -5C5DE01BDAB24C925091E22070EC94F30A455B81CFB77BFBACF3684E61F06F61 -F406AD832A222A6AB99565CF97CED48122DD13AFE2C97355039A14845270DBE3 -BEBC88E3C496F75D84B9D12F1228FEFDA1E0B564A542078BCC91C993336144E9 -493B035DEC81E85CCE073142825B62958C431642853CE997E5AA3650908550F5 -CEFAE56703E6ADBE419B1C25088E6339D94B0178C9CB665BB0803EAF74B26A6D -BD229AACC723EE690A1466B2BDA816F3A3232D842E8FEDAB517DF6E874EBBE89 -FEF64C8F5F83EBD7773047136DC45E2CEF9E2B830B0128567702C60577833CF3 -6FA02C29F9AE822B52FEFF76A4122CA5ABCC1169D05D4F39D060B8E21CD5685C -FB833A0D3BD63BB522E910ADCF566AEA21ADC095C66E17F8A70749FEBAD5A4DC -ED922180944267CD04657BAD6DF1E76CE541CE33AF2382A4FD6809C42E8AC241 -57BE07F7213FD5AACBA8B20EBBEB6052FD996C4AA2DF8F8145DA1513612CF19B -4D5D41EA4DF39BE49AC43B29965DF72FD921DFE8E66D0AF813D51884C68C64B5 -3DD366FE4754ACD855CF6D45F2AFEC3D4ECBC8BA4EDC2CB737E9489544F165D3 -C8C537687831E094EEF4ABFC041D67DEC56E057E8F3493DF83E3CC3C9C6E0276 -4B0E15A1B35457660B4D801407D1C25B0A74B7DA3DDC35588D6F3F8698706F4B -D677B0A95B3DE04CDFD800FD766A49D3CA34A5CB481F7CBFCFD5945BE1B60205 -02C920B7B921679A7F9B03102A060453F5E37B29F5BCEEAA311C6CB814BDF4C2 -353D6A60A64FE510719C8772C0B64EA6F05D9479A0E2EA80DD16B55CB78EBBE5 -BBA4F4D1F4DE3FB4B8163BAFA9E1F58E6584D66D654CD1C5D177AABD53F72C0A -13DBECD06103139081613D28B0F44D9B9728D56BEF9FCE2C59FF30387AABED4A -F58657358736B2E4E8F57E9A64AAADD9292137EAC12EE4AE504A67E8992DE106 -45A90F4375EF885B3E9ECF28A633E34EBEE00977BDEB37138190CB050CA8A46D -E7567F12DE2AE7CBE4D4DF46F1A85D7BC003FDC784379FDC015D1275F10557C9 -A684F99B70966792924B4848AC0BA3D6E26918EC5932A7CAC4203AE378D6F1B6 -DAD4364645CF50731DFFCF8988EA2ADAAFC22BFC7B39DDB629B38B2B1BA96133 -D9AC19D620B8FC9C2BEE43043783BC7DD402A18661BE996E0EF5CA6EE8FEBB14 -B32A0025361FC72C2E71CDCB7E638DF53FA6D7ABA9C8DDD9D215C4DCD234B546 -7B4D77D9D9704A296A634ED4805633CACD34D72BC8958F1BC87B237A2C0D1C07 -D49999297BA5BA190A91FB86CF34C6AE48AA6B3ED190583AEDAFED3434BF67C6 -C87CF20A50BCF59BFE4DBDEA8D1564640C284D9DCDA15130796B757BC08F7F75 -3E0A7C21BB4A231AEE58E6677B2CB7A5BF0FB7E8351EC52869088AFE2C29C1CB -A68FE10EE76B7FE4159A93A8FE5E062FF39716C221C57459143E8CB4B4E11899 -D3C8A90FF5E2B2900789AB5E801FD7A88ECF7066DE9AA220AF555C0BAB934DFE -17C47DC99E85352211F2D5F03C55F6C7E99154A08061CC9424FD175186803546 -CF729670C5A6ADD03C69870BA9FB07B41AAC602FE0425723A45D8E9AEE7951CF -76C8E160D688E75900FCEE6040AE62E6D7E4A69F8D2433374B3215DB8463A525 -37043B54F7E6ED61421F092481883FE50AEB448979E60B7E4EB705CC61C75881 -5544D9A9FE4F8423FA46C1DBFFB1C61C89CE39D68C03A966440C41DC69FAE04C -20ABC514A5697FFEB571A8CABDDC2204127D6EA2B3F7908BE39262FFAED12514 -CBDE582EEED28646AD4D4A5ACC52CEC2B56D580D5FAE598D15BB389F9FCC524E -6F2EF1AD5EFCB7DD9A355DDCCB99EE9CEF784C5A2AEC2212B3F3C0FEE8BE873C -D8B9651FAFAAD61830779ACC9DD16B4B569365CA71FCEDF27FF937C174360460 -1A07EF06CAC3EA28D076D04805D7C18E1B6D527187ED8E4CFAB9C66DCF05E6E7 -19D2FF5229507277DE3B2753235EDAE820AF349C25D4998A2A5A0837103F0256 -4AD59B7C777F6EFA5D4AC8CC87B7FE5C4E876D888E0F44D2F858EAD4DA625126 -34B6339D8F81585DD2630951CAAA31167B3AC0D60C40B90C8F5A4BBCE71251DB -153CC5A830E657DB2AD6CBACFD41A3B9D49ABBF928F7D92E058325348A801BC6 -FFECB6572882B92AF0C0D4412072A36F8BFF6906FE164ED28F4FE2095DB1FA7E -2FBC71ECF2F5675231713E83175862F917A506A295E3D72DEB3BA08614CE9283 -906C4E75C60EAF7AE104F7BF61A441F0B33C9B8B84B40898648F17503C4187F1 -E52C866044F5AA80C1544122F0721EDE7B27AB507407F1A66584222BA7FFFB8E -70AE115F25F2A68D51D7AD57046227808252DCE5C16D657858136EF2AFDF33CD -AA82D43FA786D45C397D6FF62C03718225A77A269B5A54E5B5BA6485154F7489 -7F8C7DE75D2F6CA2D7CBFE3005D41123104C390113070C9C7DB9463F0B688974 -0576196661EF18643D40CED04AF24BF6C497722A256D24757508E560254C831D -4C78932D9E6EFDD6D83D713B1DDDDAF7F6054249AB9ED32B747E77A19E0398E0 -EFF75B0ED8C76B05C5F16214A7FEF9E143661A310D3F4E6E819198419E796C2B -528F84256F86B0A1136154F38B528CBF8B63D7F00925F76EE22721EA27E0D9CE -BFEDBD29A337189C92DE8DB858ADC2A0041C002908EBD002DAE524F172D7C2E5 -B0A16E5F7E5F380612F63D942D4FC2D174FB501CD2B2B98F80FBF348D49F81DB -95F5C283CF7D4025CCD5482B6A679085A384CF6738AAF3080AA5C80C3D8B1DB8 -A945C857852E2D0ED7846F25264682A2B8695C2C2464A31BF3F1D47E7963F9EA -8CAFA1477A0FBF400A3F3E772B471A2DEA720E5709A8433CC5E9EA317D7F5CF0 -EAD516D39B8CD3336D64F46C7EB0FF8CF1489A17791D6C3DD6491DC0512825CD -711802007ADE103B74CF24B54D5B46411F3D7AB68A1110FF7E8456789A35D120 -364F9DC0863CA4E2F2C1A1E3EA285E80E45924FEA1D8F3ADF74BBB986BEFFD6C -40B4C93C35178D91E6488DE53F0A6582D4138614F6B0D5DBF4C9DA3B73F81492 -BC4080A34C5FFAA6F3FF89CDB45C0717E507246FB23063967100D1B7D0D33A5C -7EFBE283904A8BDC81F55CAF9967F15FD26B4A2067BFE077DE75C1F9C218532A -808BEEE852EE6321C5C53930B05326026CDE9983CD35596DA45E0A1C41BFF020 -8AD260493D9E6AF2884C8D431E7877973D0C75A88B5159488CA2DB21753ABB70 -55DD2C5754CE36C46A2F7A9BC90A6B514C1D427E864CA6C12AABD3CBF9729F43 -67E9179D599233118CC7B7985F943C013DA0724533008123E0444C87B5911645 -D9368120AEA0F341DA657D54FA2E3E00ED4101A89757F3EA768832B52F77F7AE -1573825439917061CF86DD78585AF7987BCD2BA930C485F9DB70CD5F2199BE0C -4283DD29C111346D2D52EF03300F7D82819C88426C11EAD54CA60980115FE9CF -AAB3C968F6D7EE5C465322D4377BDAC86623C51F685DC0AD2E379847B33D739D -659A514B4BCD9E18BB7AA643B8793992BFD144266A8836BE450DE2E64D36C4B8 -5EEB39800BD772834D7A6CC887A9940D0EFFA5E2D2F9C2A90E57814D11160718 -6DB783F53C1A8632269FD613D90C207158DCF2D7B4B42136CFA9820AB8055C64 -89CF236059574D4E9427C71CACF877835C8D85ADF68A07D988C833E195D2E4E3 -466C7B2FBE2638BFF8B5E7B0D1B96584C8376EDE8FF80E744D2CDEBE241D8179 -4BAF497177BC50EDBD1742409292B0E9BB526063D036C61EB76950289D509219 -1AA3CC7ECD18750D499103CC926AE7DBC745786B0ED1A66E96C18491AA3176EA -5D04B45824781DE1D0F1B24C468C8FE8FD8BDEEF244C179671FC63EA5ED515F8 -3F608DF242D494FD4AD005A56C7527F06B03E5062A673B64889DBD56FF1BE27E -70C6479FBF70C5BC6CD92C8087CBAEE7278F4EBF0256E476682F357E13CBA011 -1333F560DE8C794A9D51629B7C0BBFB4EB2F2EB8D526C72B9007294CA6172111 -81EB77BC0B1DA002C41CFDF99CF5B14AE14613E522F7324DF6F12317D6C29730 -194DA8E2F2A6D04684F8B1AE003661F4C5BEB31CF5786B122346AC00DB397484 -657B61132ADC3164AB0D1790770D6A974590BBB4AE4036FD648440F925EC7147 -6F76F2DEDB3006EBA5ED407FEFF05B133531C7055E6B83FAF388CF243B68B371 -5D03F8143AB5B815627E81D8B1165BCCADEEDF58F80728CE799569A5882E75A7 -AB69654CE87842FAAB7E675F4E097F8B32C15F3D42ED59682007BD55DA4F07B1 -FC1304078275E4C87646DC525210F7866B6B4494ED403ABB841B8724D7AF553A -5A7C0CF4752805190CF9A28E0427210FF1E34AFE7D6553C09FFD81AA35252D9C -C722FE0E7C2B74D185A6695ADAD14488F2F8F690AAA8BE78B34DE07898D8499C -EBDF1ED1B67E0FA61B6F8AEA72940AC02B21E652C9B7A084F7A151F61F6A22A0 -97A6968499307D2B97C08A7C6E31BD8D200E5CCFC603443A8CE96D90C48AA373 -26CF6AFF62852C8245634B6E9DFAC8BEF8BD5B6A4F234FF84D245A3120D470FE -6601C337E0BBB7137B7FED1BB6DA8B824905F6315C9A21BABB6C5DE40875DA9E -AA29A1508DF7ECD0774C93D30015CED377221362D92DEB871FC9D839EA6F8E60 -A466BED6E3D2CD1C27683E19BA3CD7777E2A1B34C9536935E0F5A34A5DFDE326 -97888761EF268A08332A5CDD1ACFA1ABE3B583167BC833E69E418345A862337B -D9863A0FB4458F8D6C9F70522B8CDA8B3D44CE974BD546576BC0A1EF7B4A9E8F -1BE5FD39102FA256749404297272007ECA644986CCCF8852F2491DADD34D7DB7 -B6C4D46CAFC5941E934A13828D00C6672206A95D06053A94D94F87834E906E90 -80073C543E0251C753F935988A4C1EBF4A67D1C2A1931188F0C0FDEDFA582F93 -417801910B6B4E236C6EF7164C66ABB35F9A516CAB9C30359878A89BAEF04E08 -B2DA81BE9272C2241F95D7554AD6 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: MSBM10 -%!PS-AdobeFont-1.1: MSBM10 2.1 -%%CreationDate: 1993 Sep 17 11:10:37 -% Math Symbol fonts were designed by the American Mathematical Society. -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (2.1) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (MSBM10) readonly def -/FamilyName (Euler) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /MSBM10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 90 /Z put -readonly def -/FontBBox{-55 -420 2343 920}readonly def -/UniqueID 5031982 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6A66A4000A13D5F68BFF326D -1D432B0D064B56C598F4338C319309181D78E1629A31ECA5DD8536379B03C383 -D10F04E2C2822D3E73F25B81C424627D3D9A158EAB554233A25D3C6849ABA86F -1F25C1667CB57D2E79B7803083CB7CC0616467F68450D9A3FEAB534EB9721003 -DBFEEFD050F3AC3492F5C74162A9A531ECEC0F47610B4940E946D21CAA771D30 -A6C27ECBA11708CC46C62396BF9D1990D579D0C394899D24FE7A4382EA18E7E1 -160E7283AF5BE17254790628E79FCC206F28B5566075B3A5697D5209062544FF -D85FD89D6F43D6588B242AB2666B5D2861CD38A8CE676503EDFAE84D12A71E77 -8405E468FE391F4F3F50D2C57ED55512036B0DB8E76A7EF413ED08673E56DE2C -16A3B65CD478433C0D2F9FEC4E662D54DAA43CFA6957D2A9AF8979BE06F70B68 -ED4C8C493D6DAC4971A3F1D010A7726D084EC1074FECD7D12D72AE16C26194AF -21AF5774D9B860EEE8608D34F150092F09C19959BAA670022B9A9F263CD391E3 -74DD1D1B4CD4D75273CAA4E37F68C631723E08FA35AD34C0AFB4621AE6689861 -854D16CE1C375FD159A337E221A6FF1CFFB5693A0623E7EBB58C2969F590D081 -AD92DD9E5322E26D6A15023664AC73A355998BCC48ADD0E7A4BC79790519606F -A1FEF6075033BCD422EE8233B83D1E7C20043280D531223D5AD4D5B41669F884 -95CE4D6DDE819B588742B930C579EDF743F2C74C95F717FAA6154FADC3FE2975 -F59CFB1C1A29059487E75C48505BAEAD7145667D4E18E46E610C868A257173ED -0D30EAA4C090854DD8378E92D0A376226EA7DA63798F247BAC770FE26D70E72F -90CCFAADF118304646955B0310C65F6CA51BEEEF87AFFE294D08C4435C7BA92A -C61A14854278FD1DA6A516B7F548F5723C06ED9B2605882EC330DBAC2B1DC25B -BF4D62183F791DCA7486F9BDA94D14606280661A8B29C2E9F3B2C6FF071BB961 -845C6C8CE222FE9265CB970A11001BD5A058C8749D63B505685E2940A75895B1 -A7F64342914194484DC57FCE15451C4C82A545725124706DDF1C44252F79196A -365EF95562D6BC17232202E625A9E9056A62B78476AD0A9F5E67AA9400A884D6 -930902D6D6C402500B379F3361FB95AD380F5FEB987F5908A52C886B852DA265 -995C9C28C46992E0ED09C64BC6D3ED90899BDA8C346743FD32253C51D14D77BD -52250D3676F52CCE7C1B9CA28B5A8BE6FBB0F2121E448169198FFA7D3CD089C2 -F6C025F1E7E973EFF8308A2FCABD144EF513EC81A30AF3A261093A5ABCF1B82D -5975A92162231A68773F8687E37048DFB892B46F19550454D55FED2F1E522EE6 -903A710DD64E07B7255D2D -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMEX10 -%!PS-AdobeFont-1.1: CMEX10 1.00 -%%CreationDate: 1992 Jul 23 21:22:48 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMEX10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMEX10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /parenleftbig put -dup 1 /parenrightbig put -dup 2 /bracketleftbig put -dup 3 /bracketrightbig put -dup 8 /braceleftbig put -dup 9 /bracerightbig put -dup 16 /parenleftBig put -dup 17 /parenrightBig put -dup 80 /summationtext put -dup 88 /summationdisplay put -dup 112 /radicalbig put -readonly def -/FontBBox{-24 -2960 1454 772}readonly def -/UniqueID 5000774 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF5B8CAC6A7BEB5D02276E511FFAF2AE11910 -DE076F24311D94D07CACC323F360887F1EA11BDDA7927FF3325986FDB0ABDFC8 -8E4B40E7988921D551EC0867EBCA44C05657F0DC913E7B3004A5F3E1337B6987 -FEBC45F989C8DC6DC0AD577E903F05D0D54208A0AE7F28C734F130C133B48422 -BED48639A2B74E4C08F2E710E24A99F347E0F4394CE64EACB549576E89044E52 -EABE595BC964156D9D8C2BAB0F49664E951D7C1A3D1789C47F03C7051A63D5E8 -DF04FAAC47351E82CAE0794AA9692C6452688A74A7A6A7AD09B8A9783C235EC1 -EA2156261B8FB331827145DE315B6EC1B3D8B67B3323F761EAF4C223BB214C4C -6B062D1B281F5041D068319F4911058376D8EFBA59884BA3318C5BC95684F281 -E0591BC0D1B2A4592A137FF301610019B8AC46AE6E48BC091E888E4487688350 -E9AD5074EE4848271CE4ACC38D8CBC8F3DB32813DDD5B341AF9A6601281ABA38 -4A978B98483A63FCC458D0E3BCE6FD830E7E09B0DB987A6B63B74638FC9F21A5 -8C68479E1A85225670D79CDDE5AC0B77F5A994CA700B5F0FF1F97FC63EFDE023 -8135F04A9D20C31998B12AE06676C362141AAAA395CDEF0A49E0141D335965F2 -FB4198499799CECCC8AA5D255264784CD30A3E8295888EFBC2060ADDD7BAC45A -EEEECDFF7A47A88E69D84C9E572616C1AC69A34B5F0D0DE8EE4EDF9F4ADE0387 -680924D8D5B73EF04EAD7F45977CA8AD73D4DD45DE1966A3B8251C0386164C35 -5880DD2609C80E96D1AB861C9259748E98F6711D4E241A269ED51FF328344664 -3AF9F18DCE671611DB2F5D3EA77EE734D2BED623F973E6840B8DAD1E2C3C2666 -DD4DD1C1CBB1ACCDE9DBAEDA5FE0BED42D4517BDB3FA340A29777AA8D4FBA6AD -EF1A2593BE17D2A688023BD4E12768E88E2384C5B5141B8079A12636E1B26138 -083CBDEA78AA36184B5B7650855B6438A501201CCE4C8582678A5A0F842FB4EF -E8480151CFAF845F42FFB0D8B71804A0517E161826A44B37A5E93E1F494EDFD9 -F03F689DA1887C3A03C8AB76AE2DD553F81C433511C4122C0281C24EBC57BDC2 -98E97C3B672131CD33359F7892FAEFAAFBFA949E2B5EEB08B03D19F7C298A1E4 -E0993E0D61260231B45BE22EEC582659AF39C34BBDBA945A85F8983F873AB131 -30EDE0566778E56C8E7D411D88D5DCC5E11FDE47DEC962E1C86744A99198C6B4 -6F1DE5E3D819C35522637A0898F5A04139C7E2A8AEFD04A3F0F4872CB20537A0 -0422FC2FEBC04DF2CD88088B1B5EDB500EF71F4B1D458563377F39732D532338 -8FDFEB66A8143A5D1A33E34C83B6C6BD5E584EF886715D6ACF7372A562C6CEDF -9FD639D92952F34447F2E7BAE044CC4B9E1A4A688B4B28DF59C3848356842A54 -1DBD149A6EDC08C4637CB9C41046F8DE207FF8706AC76AF15FCE7508D6955520 -C222E4AB31FE4A67F29DC7FE9B0D090669DAD1C6570DEFF0EA051AB9640D2E9A -B315A34EB067BF96DF2FB2CF7B52AE8F4A8BA0B4182DF1D4EA185C41E83942F7 -96101E6D10D2066F69CC170A9069AB00FCE0C6D09B72973460262B7BF4E83497 -4D5FC963D2820EFBC724DE414C40F1581FF7836CE48A78F3D5529C2CE5176B21 -6B7FE44131F6C0AB60B4C16F2FFCCDEF9CBF1CB9A9DABF4C91E259114DC5864C -C6B22BF85C533DD21B131D618D290588A9D72BF3FC1C2E3DBA14E2CBD98D540A -152DEDFCAFF62E6C7C4BCFD96B547565C964B6BE0B2A44CFECDC489390FFD751 -527189E1554E1F6E658BAAACD02A570A523361ADDBC8D1DADC17E164F74BFB2D -CD9B989B9DF448337F2518F57FD85C36438C9D9DE5D944C8DF9BFF0F09F768E7 -A7A5DF7AA3DCFC5A59168C98CBC6DDF875441729045B5F37F0702A2108904DC8 -3B7C3E39D043D275F5DA0AEB08DF5DA8141DB0EF577597E54D422059CEE19284 -7701AC80907A83FBED770711BCF07C633C11CC003207D3575BE6E5B4EE275DA8 -5E19B9D2E37D1D1A3C117EA7A0EBC6B895F60E25A4EFD6A10D55B13F6D8717C4 -4DE8DA8A723D525A951AC4CEC024B03E4C1E522D09BB350773F82BADCC8BBD39 -14580CCEE24DBA2717A38FB6F2FF549951DC14178B4FEDCCC619B8678AD2A554 -7BA184C4F24D4CA25FF6A23F0DC2482665881C69CA85864C342A428541509453 -6191918CB50C51502A9276E4F0F8275FA58D3F15E550CBA679EE732BD3E3CDA7 -2A4BA3E749C536D2F8ACC03364AB3C83C4A64570310A3705096708B9735FDD28 -78424457BED3EC1F6E501D9886A1FFE807A3D0D7EBC6A15A5084FE15A77835E0 -D726B1C6A99CCB1182CBB6FE8D3C1B09397C0E659314DD018B7704D8C7B9EE5A -D9C2D4F46637586A8072AC7422DB1BA052DA5F4351FFDBD9C4F099B5709483D6 -7774551B2BCA377B51190112DE7A19BBE27A7EAD663A646949C970697D0B72E8 -89DDF93C65EE2848217493DF4B071AABC0F1A0F335A5EC1E83771110DEB40F03 -FA3E725135E0B0713374665141E37724FD153AAFB1D49F4A6B3D98AF8B2D95D2 -24BBC61C7534BB129086766E104B84F968211820512140EBF90E83E583198342 -32750BF96D18E6F613BF15B317E6F7E69F28535062AE46BD1AFC0825D81B6223 -B1ECE5B8F2018355CE7A7DF91ECAF71F3F86D7AA981491D295D67ED51F58C075 -9FC729F03903470FEE0C47999B5BA3120C9817447DF02FC685B597AE3A8DB7CA -C5B25BEE2270D44AE40792AADEC389F6DD41B95366C4E18169ED118BE50838AE -83D7D4590CA6095C7D4A56144DDAB11909443E04D286587F15401DCD3F792E86 -7B29EEA3DA7A33DDD62BC5EBB80270B98B1B5EB230B56C8148F12959A596F254 -D56F21DD6B8A1EA362D59BFF5847FC4A7F27CFF140A1B6AE549421CA57A90EC8 -EC5A5603F5109B8C3D8307B48E2326749E0E532DEF6E2538ACF1A63B3E299B21 -3A10C2F13D6BAAC8833E4236DC6ADEFBE3E0FA4193F054DCA7AD839EBE376BF4 -CDE36B2F34CD6255C6762C6D5B31CBA953F6BE62DC72CAAE3BE6C2616E587814 -96D8E602E351A56FD0BA1E4AC969EBDABDC6A1A05F02A9831BBFABBFC82C4888 -666A04E71264FE2CBE8BCB52ECBB3369DE4139C0387F78B4A8F98653547C31CB -45AA7B1107D5C3FF1F62C0CAB865E8CB844EF5B39B48E341F15458F279E95611 -6C4F02AF2186BBA5366B76E65A1CDCC63597B4A6FCFEB74A7CE0B41A83E9A86C -C7D144CD32988339CC8ECFBB46CC3DD5FB15071E7CCCA8A6CA5B4388E2D346A2 -FF583E0FAD181E66AEE9D0018F4ACD612BAC372E4E094C740B86A39619028BAD -DB6FDA2B2F174467721E2A95A192F9426B09297D19BFF69084A61F0AC860E323 -8B8EEE67DDC69B420AEF3EB062A40EDCC5090AF7BFFD -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI7 -%!PS-AdobeFont-1.1: CMMI7 1.100 -%%CreationDate: 1996 Jul 23 07:53:53 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{0 -250 1171 750}readonly def -/UniqueID 5087382 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F -C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B -B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 -DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 -4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 -FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB -76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 -123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 -012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 -A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 -44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC -4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 -01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 -D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 -914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 -261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 -24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 -A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 -9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C -889787CDC2B7473D4BEE78E00E265ADB7C0CEA8499FFD61EB3664747E10CDCD2 -4C4CD8B6E1BF43E47F2C095B3AEBBF83DA83054E20DD03B85D9240595447BFC3 -C78A3A1B96AD63DC9738603A2A6B44553BFDE018D6538D7D37BB98BAAEBE7287 -336E81AFC2764ED0C485237D6875761D847CF5DC96D302C88830BACF471C4FCA -8784636828BA44630299A45A72EFAC13B6941F43F7E3DABA8B45ED2A4F6DE096 -DED341AF8BC1AF12E79740055EEB64B872243E908CDFB7D3D9E0D89E556F959F -708FA201A68B0D2A1DECFC8CF792C31AF8132F17E6371B24EC9E835A9CB11F0D -27F13B62E3181A6C67763F4195212790189D95F7CF50F05ADCAC0B4E9E859D8B -E7A02844F66B8A3EA384AB5D65D96549CDCE00E7CFF1BDCB0CE3ED0BC2F3A72B -F1D62E3F45A7289BC9434DF8E709FCA8EA66BA661B3632ED15D5E1B9F915F460 -1E82DBA230492566DF9329C8B8CD2DBCFBB6813F14851FCDFFA6279F39B0727C -E60F5177D9EF0AD4A52B2043D14DF18C6DD26532DABD77A57FF371FBE2690E09 -1EDD535D2B2B4681369A0CB716BA61A9A5AD4BF1C629BEB047E1A3E96210F00E -B81CD57EF40C06CCFDB56061E9751705F81D8086F00657D4BA65604239CDE406 -7F6A607261FE7AD2CB9F24A7EAE10920E2EA30902DCD7C8A29DD7D4B7750BBBC -E1F9A1EE82129D4A81B4B1B62C02538D86A98D0E475CDBE884BE7C3F24BE9891 -7BDABD2ED1089FC7AEAEF7AFC8551125FA741EB33CD39A291A66D498D70CD647 -39E5E50F4DCE1292553F92C6BEF96A7209500280BABDE4984D638C6ED413524F -2CB1C5C1A388C9354DC5F7F6038781797384415CE912EE766C01550A6212969F -701F445EAA9444F085C92749D6612CE0E5642CDC1ADA9CB13507A33C59D0A7F6 -AB0FCB8E3AA3590A0B1905C5934B0D2469E4D311B5838ECB0E154D6BDE574C24 -1DFEDC436B6D023D68EF5FDF845347A7EF9E701573D66E219602E2B266FA95A1 -2475EDC3C6D5A7E7E961DF1A8109E977A70540CB6B4B9D9FBB8403B127A8FC57 -15B100F35A9862ADF9A3587078403FB0F2E5C16158CC507C5689BCB217C6E9DB -5BA0524AD8FDECF129B37A4E6853B968247080470AECD9423C6DE89B2787390E -F7054F87D836FFA1815F6892F56334BA6C7E3BB8396C4540CBCF725F63C3BD67 -8CAD749DC3CAAAAC9C23C9370478C8532031E2E4878194DFC9ADD6E9271D100A -5560EBD32D236507B948FFA59DAB8FAF083FDEB01BA19DB1097DA0509F23B903 -B1B394C6DD239F1D61D337555A856B1C9D316EB9A50C61FF297D1500F835CDA4 -7006F3F3F694AAB5935F0827E74D2649CEB948835163A131269DA357910F9186 -DDA9C3C20257D251F74AA50D8F16F744C29923C98D944CD11FCD39551CDE3D7A -82783E1AF83EDE4C658CA8C2DBD10D70233D30D559F7449CADE9339FC5B5B02D -1D9FCB2FE344395A498B6D9A5F5B5BB39FE0C14A67EBD9630F810D08AA2DB838 -BE425BEF89149214346AC2DCA5194B8450B12B8789CDE3438EB2DC2BC4B90077 -C3537778D71803DCB7D6A01340FCAFC9910ED014A35FA43DC0F0512C924ED96D -110F38B587E74CAB89D394F7AEA374D32CC9EE5ADF055102208A9D23A85DE08F -389A4CDED358A3F8ABD5D78005DC4A64170B673A313477B0510604B40C50922E -75DA4FA75D860534E96EC0467A7996C57BA4DEB2FB4A1BABE4250B13224025E2 -9D922BA59D8971F6C77BBD79F087B1251086E05738D7E7634AC2B2EB8D0F996F -75CA0EDA110653DC68F926EFADFC29710ECB41B71409543727B6EE97E6805B70 -50043860E86AD3D4C5091215231A696018FCE311A4D6824E079A0696A390A14F -B57E72B20FD8E4392059036D9E2F1A62F72EF887FB22AD76618BCAA7570CEE12 -9490045BC0AB90A6B15587505FC5C111F4BAF25E6715C177AB483125A3C339AB -3466F81A8EC54E5A9203ACBF6BAE0FCDBAB7AC8FD9E95C9951F0D410BBA0253B -70758E9B90A8592355F091D28E7A0DDF856CD747FB664791B81C682771461503 -19089C771A6CAA0CFEF3DB3A82DC4CFDC3CCF0FE01992CA1024E81CF3C1BDDC3 -0A58CD5BC1EC0D4C6D10888C778F7F5CC57BADA6EAEBFF35BA84E0288481ED98 -7CA98511FA50D68C43D4E66D6199FF99C610638CD409ABAD4E5C3AD166083264 -0A69AD6CEEEE1127106AF08848E49139D0BFF10A2CDACCC4CC2ACFD6595ECACB -106AB8FBD46EA8DEC53648789EA59FAE6F91D54531BCD615165074B33F78FD5F -B1594009A38746BFE9A692B95F4860DC87D6A9BDCE4A51C72B312C112E7DAD5D -7946B9A37B16356B1FA4241755A25BAB484027BBE1ACEE1BF85F412FF2C0BFB0 -E3F35E73B0EF286E5EFB25104139BF0B32CC1464372E0486C6F00E50C856145F -98DD4EBFD7FBB8D4C1CE211522B99879C8779B4A26FAE4AE2033DCFEC809E255 -911876B8B0308FAB5E3AB6546D2094576FA56A8E710369BBE4CF6674259864E6 -61DA77A1DC223A8E495FCC4BCFC7E72F064C08986C607765B5CE7F9BB4E56451 -A721AE5DC7AA084BAC157FF01B9339EA18561E7716F367E4091A92DFCD1535A5 -1B8150E04F700981B8A6B57AB90079B3366ECCFE1FD4599739E387A7DE21131A -F4D6AEF19071B86F801153D2AF33BADEADCFAA00667928EFC01C7381FE5A17A6 -EE85374CA54EE965A94CC2CC5567A7FC309A6C9F5C46E1115BF3A3A9F1E75B25 -D9E0134BAB49C7DD7C1CCAA9470B9BA92E5D5020088397A35FE0DF12C0541AA3 -7BEBC0A47B683B5465B88644DAEA1C41B567D8F0FF216C6800DFA7ADDCE0B381 -42B580FA364B55B50C0208E80D32DF587F21227FA3BAC5B5C5A27B83D6FC46FD -0AE0E336A0BA1974F702785FC4B9DF4EF669BE7EEDD8B1D4068D10D8496940D4 -5BD046B0349879B489B81DF714F42D06DAD62E104E95DF0790198DFDDD886775 -E4BFD75587598A3081910F603C06D641CBB733ED41544BCB8F49436CB86E2FF7 -A992BD1D2177A30DEA721C750DA91999C0EDB016AF96BC093F8F30A1270306AC -E7675A3B2F478EEE65343A11FAAEBFF12CA9939F6776058C23CA5E09D7139D2B -D39F0159DB7FAE91646FEE624F7F87E5450353A50DDD9015ECAA10D21D86FDB5 -21532B88440EC03FF12D6EE5F2C6543F569C9681CB7090143B35707EE517516D -5951A6FA27855CB86499A2F06473152C4F4DEC1B9ADBF25CFEE0B7C4C135EEDC -83EB2147E1592FF50AC12DDB268C5253DE6BDCF7D57BC71845EFC29C8D20F856 -F925E06D7AD1514AC100B268204FE9AF5223EA85CE9F33950258FA2CB7CA0C7F -4A5B449352B32DBB39FDDC41827DCDB2E84513196A17CC8234BCE974DC6ACDE5 -F2E53353B145958868584AD58AF98CD765E2F286FEC1F2FBA4BA09D2F0908E29 -9EA169086F194A068A696DCFD8B53D3036597205FA6DE247530A2209CC210B83 -D7BAC7CF8F5542F80B43FC1FEC6C1E35A4055DF8C156D407520078D307F2100A -F31F94DD69538043A1FC82633F60887890AC80C529B7CAEC670D734E88EF4232 -B361182687F45924A7E9BCFFA6F6C41296A1FBD539E416008D2F35CFB3E0D662 -FADC2243CB8947AEF917E1C02FBA2050BB432840C71F986A7466D3391F0AD1FA -283EE9BAC0F8C2D283D33FC02D96C690D0D4E45A471BE4432935B095B8436A5C -77D6A8E69EE39388D151B833A52EDEFDF3D4475B0F2B14468B543DFB009A760C -1656FC0B9FE61334C8AAD10CC4A3FD4096BDDE932997DB92875BF73A488F01BA -7BE3C50E5C731894B7F1458D88025D9EC7B69B05267A2AF3DCDC57739D6A5B34 -5515080A4E91B20DBA5953537D3005EB2FC84B78839380BC93DFEC1050E1F19D -6FBB416E3E9147C3D7F3C6C1B42ABFB865808154FE03A9F087C5B7AA5355739C -364D3AF430C29E7251CBDAF40F60BDC1D24325FF33DCC6AF829BAAC7F9145587 -AAD8075A151B1F506EAD68134BA7B3F60F711DE62391AC50A8681E114578BB5D -F4A8CFE1106D14E80131C07E25F753A56FE4A84748D9310DE22148D987704AD6 -FC7558C143A75BA9BC0C2B19D76D7F7F604432D3658EB9A521A3ED79CAC7E4ED -4E774A832D92CB6937CEFF69E32076A25FBC4406261B0C8A2C9AFF74D424E520 -8E70DE6BC93CCA560FE3147758B980085239C961547DDF35A6D20FA016E1B37D -F4837A65 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY10 -%!PS-AdobeFont-1.1: CMSY10 1.0 -%%CreationDate: 1991 Aug 15 07:20:57 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-29 -960 1116 775}readonly def -/UniqueID 5000820 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A -27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF -5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 -0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 -DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A -71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 -4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C -515DB70A8D4F6146FE068DC1E5DE8BC5703701F77F50FBBE021F4761B08ACA96 -DB5561981607A8BBEAB3F49FD8F059018A95D2C836A793C947AEE5EAB45815FF -7A18A4A453C1E8C10EC5E6020462A92A0AEE570E81752D6F6E82A1A002E55B6D -14234E5F0E23B2A08F5815EB86DDCFC9AD9650B988398BD3EB373A536CEA1452 -C6A865C30F6C348E29A2526DD001E54B4C7317C3DFF498C3BBBF51F8EBD5457E -58A4B0EA67193BB53BDA67F7602FF381B5DFA732D40A0DDFFBCED6134005A9D0 -ADC4BAEB7FB51956B5B6A359D3F2D497ED2E8C0F9660448329AAD5F9A8D4B92C -BF4E49E2D06588171644D0BA6E7FEEB29B075ABE770ED9B7C3744009152FEDCA -3803C6452E8E23724AE2003D20B464FE0E69EE14C6DEE26210D66FA08E997261 -B5A88A3F3BBF889F4F49B7B9D71CAD2F16FD79CBC6CBA8E5330A5457B17D49C0 -493FEB1F00D059041B489FAF99A524F561E40DDD6D090A2FA31E74A5AB5A6ED2 -E175963983374F201846B26F0D77C8AAC841C042B8DD78DC5C47E9C4B464220D -9969B5F3560C5EAE70856DC99533F559DF96BBABD4BA85A775BB15F5A6722B45 -A7623635963C994DD7B58C0B10B05433530EEDEE033093DBCC6FE81397DF6B72 -BBD0E897F9628F3C275750B38586BA7225C1907CE545C3BDB87710CBD305E1A7 -E5D453BFE1F85FE9205EEDFEE6F7EF6872F1442BAD15D918E0EC836BE5924046 -F44F52CF048BB3FBD0573F1EFBF8D34D1C53270B919EFF5FB1F6BFF8BF024F43 -9B0B55D56CBFFF9FE57D356640284199C65C882EF2FCDA54C0E9F111467DA670 -821C3BD88D43E8C66861C4853E8C18566A59DCF4CDE47031714D24B5FF66DDFA -8E675C31EAB63790BE5F34B15B2545D2F4DCCC6A92D65239AE42A54B5CD59885 -E8D5CF346B931F0A89631BFF94FEBCB167DC8999E2407C96D075172865288C70 -0031C522E1392DECD858506CF4F8773331A46C5F6BDB8E0CB39716B91BF3F7BE -D21414259B13228051FD8F56D58F37F0E4AB5B9D1D200320F078D19C755BA127 -2E60F134C204E3EBE66D0029D5FABAC54B00F899F62F6B7164E365D9DFAEC6EC -A4E9F372C2247DEDE433C550BEF87F9C67B4B2B2EB6963BC9A255609E908F19F -1890287623ECFD9C914DA4BED3C7DB8B178A85F42FC9A81AF7EFAC471CF407A9 -C28DCEDD8EE8BB2134C2B911AAA9946941723BEEBF462618EC2B2B16AB4EFC9A -8359373610ADF6E7B98239F90705B8A4441A7BE15A9E6E9AC8DB4ABA1F753C96 -2D9DBBB9AB88FC33E8D6DAE1DCB8BF625DB1E24744B92B5D0F31D508ED41EA50 -7EEE872CC7F2C849282D96F150109FEA36C618285552C0891ACC63EC64A7187F -502AC995F693270400F6202AD3CC4F6B28845CD7C092398137CEFB5410F65D79 -7705890F10002F7E1BE61D1DD1EE3C0C6555417EDFAD16432EF5212C27020E37 -B327FFF75B06BF6CD236B18B7543180F67FD6C6EC6F9E57F517CDBDD263FA29A -4DE7C7666701F5DAA1255FAC000DD7CBF1EA0213565CA7598C8D4492B8FC5656 -9E7934B57E216661FD5769BF80A8E895851868EB88E508998A549AAD99C6A3E6 -45F313B4E9C37C84B90AE99DEF7D92AB383770F891CC3831D5924A069470209F -55506738ADFD757FE3D7D13D60C8BDB8550B951D7AC1A5458197CC992D372709 -603CF9EF5589BF5DFAA67B505C57046DC272B47B4CBD2B0B369C654DD279CA2E -51F325BDA71D4CBACA68AA14BD6E2F4715AF488F30B90A54ECE3A3BCC6FEBB30 -A5490B558BF240748398A237604E194CBA89B82333C39573A3E797D875CA95BE -B35E247E1C0C39F571871957220C15F0F5FCA5FB9D4C39E9C7B0C119B003D283 -8CCCFB48D2A3340F50E275EEBF21611336796D9F9062A0AC07F6B3BFEAD6117E -BD7B72D389506CDF553D42B7DE59514DC2C97A85761AC21F3A6315ADBAEBFAFF -E3272955F459FEBACA7387D697FD12D8C81AFABADB7AF87A65E5F34939D80FE8 -9DB0C001ADD40FD8106E8EE9D79E20DF186BCC42BB34B3F2585312D391D7B272 -D401714CB16C8BBA024DCB86B9460C8FA84C414232FCB4C18CA01CCC7937D989 -B021A75ABCF4D82A2A3BC22806657C84AB0E44482F7074BE7B26B40F79C19E85 -3BA9B79888AF196378F26617DB62DAD7BE9116F9903D9D5278ED39D6C2F139C8 -4EE2C95B2D78A8F4BA24C490EF4387EC10CC4EB9B9417DAEF9789C5AF035EFEF -8AC1042E394C93284634141DD328938D7D6C037F97FA13D639598CD3B6ABDF87 -94FAFE71F7CF9F99A8DBCD538E56200C5E4F494D2D8E87340A076E674347D410 -0C3229970431F71DD924F3BDC1C2AE2307DFBE5D304B7CBB3BBA5B657312CD4F -AEBBF7745BBA9E6AC017C4AE890960E5DCD0E678FB5BED824CF3C07F41A998D0 -D581CFFA20BF65127AEB0B2378B54F1568644C8036508E73E2681DF6C4454B12 -76CBC6DA1D02CF476772398299D758FF9E8DCACD07EA20C22DF96B1F4FA821C1 -13677F05CDC5E1D5BDDD185D2D4D7E4D091CDC37F637708D21065616E589F1C6 -17C3337B5F200068A1DC8A2AEB373434EFCC87242B3B734D8D38194F93D7B685 -6EE745BA14B99A76FFA6E0E3067FA53FB22D1EDE34A0E1AE4B3D96137F82E434 -3A129A621A84E1758D467D7A32FE6CAF8F037462EE3C4CE3890E16E171968BE4 -09CE904EA453E8A216E8BC7855AAD4B47941DEED49A2EF0BA97A9291326AC112 -1A5F7240A4857CB546995110462980BB348F73D06F704A2653AEB83EC7475BA8 -1694291E38DD439ED61681DFE9D2F4FB1525AAF260AF20E300FC2556711264E8 -8387DE8C0398B709820040C0E70ADEE2DA024732F2D49D8CB382E8BCFAA0D14D -2D5B19A083D5C384839DC0870F278E1EACEEE77BE5A9808979DDCA8155250E99 -B0320FFB9A7BF4A90F21434613AE94B25E6BA8883943B0C62C8713EC2B309E53 -66E0D4533D20A119294A99CA4FE3F69CFAC9179352ED4AC2A79446425614C3EA -7EA116AFC6B4AA795F4C33BE7BC1282C5B98D429A3AEE7EF769CBC99AA527772 -5A0BE834AF64B4CED9EA564981401534E70454F2BD4509A66C7BC635CD87C51F -5DB29A2F168E3AAF7CBBA9BEC13B342D6084538FF5375C6156A5FF30602509F4 -432EB830908589E035B4AE309A27B1F5EF20FCBEDA6EBD66AFE110B74001BA54 -F8334C774EF2FF84A48EC4D755E48152D257AA89B6FE9D6C737FDDC2F5E5EDD2 -485F9E68A53DD5AAC417DCC3404257639C181FAA6E90742B036A5B38CDCDB9FA -9AFAF14DAFB64ABF82F38BED26493F771548A63B309DCC0D66460AC9E3403B45 -E337C56B18E5279F84880F450036F12835B8EBA49276C15C5240EFC55E8479BA -1969CD205554C23B4081078FF461D9DA489885AE078F37F6235FD7075FBFD32A -091F077E3FA399722AE0CB3FC8CC33808D5EA4EF78F4873FECC4ECAC923D8276 -7DE9817546A7E4E6DAF4DF0CC479CA18E1B856D960ED462CE9FE1FB8111214FE -4232E498F3D17908E7F305FDFB6848E7E8A61A42BA433778E1B879990B0D43EC -8BE4BF788783128B3AAAD62211391B2118DBDFC3D23599D8A80A12697C3EAB24 -09BEA0F03F0B19E34BEE2BAF81F725D88591E22BAF855DCD46072BEC22D8B396 -2767013A03708D147FB58445B018E4F12DB7E09C656CE0F0B65D0E21B02F2116 -483944E2CCA7A24B29F9181FF3FCFB7BA29251821661FF9B450E93E566E1C5DE -41F4EEF6843D35C6A0A333992111E886DEF5BE1983A2DFD0834A1DE39EC62DD7 -F384CA8A60E65D4B69BF04388C67253762AB94D1A0F6516D3088311B483D1C47 -256A0659726C25C83FB334CA8EE22B7563B853F206831EE1F959A48E234EF9A7 -269EB4A50FC7E255A728662BDE7F411A4C14428FEC5AD573AED827A782A57BB5 -912610DD99869F6252743560467D639F2517E67E8DB161A29826797C08DB5842 -DDD4075935E2869956B46C818C7BE799536C0EA57F4F462BDD9AC91B8C8D3079 -E74BB5A23476AB4884E8D855C09C3E3ECB83FF59AA1395401B13701BBF765F8F -A8F28533DD740D42728C7EFE6EB77DE58B01B112AFFB1CDFF08034117C19646A -9B1491B7C829BF580D35236EE8FC4355E7B5B30FB2B440146D5D868EB2D95D81 -1462A9A6C94AA3 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTI10 -%!PS-AdobeFont-1.1: CMTI10 1.00B -%%CreationDate: 1992 Feb 19 19:56:16 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTI10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMTI10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-163 -250 1146 969}readonly def -/UniqueID 5000828 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F -21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 -06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF -55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 -B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 -0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 -1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 -7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A -7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 -356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B -19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 -C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F -244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B -AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 -5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC -D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D -993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 -2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B -E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 -309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 -F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7 -E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66 -AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9 -17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3 -05965AA02B8A67AEB04D915DADC1B84A531A1D60569ECC2EEFB7B6B0263B8B5C -E6EE63CED9FA74FC7C03610F6394D64BAE1BF3B50FB613A39C300CA5F4F16CAE -F9B9F4DACFC69B69AF30E4FE9E41A6DB0FC987A13A3AF3F99127E5A44E7FE781 -399BF303B773BC0096427B18DFD0DEACAE196EB3927A7EEAE0F6DE8434EF0873 -20F134579D9E18D1E0A10DA116F544FD2B6C6917FD8B2BA682D2B27DA99555ED -7C47B44193C623C871703226039460A62C80D6FF14121F46F03F0062E0E83ECD -C37CBF62603F7C3034C2911FEA79C94AE4FFD25484B3E03601E1B002F074E9CC -928E4D2E0597F02095094686EBDFBDE5F655BE53DB132D2FB9A18A88EE0698A9 -13346A3C39C11C26DB801B781E4E5A8462E533F2F07CB7ACBEABBE37F443AE4B -62B55ECF92720389E9F4EFFBD73F170754D342753F759FDB0B98B977F66CA563 -4CB52D24ADAA91150C56338ED28E91FE4E4356E8ECB425E5044378CFA60EB0D7 -E085204481EB71B3240ADCE0F49EFA5571C3E0DD6EB29CAEB5DA6D4BD05CEDF9 -1F077CF8476BCF08AA0F785CCA36AED2F7AF1E66D3DD5AD178F97C20204B83A1 -897F51AA59DA45DF1F815E3B9A41CA8F16263775C7823902BA39A6ABF6CFA3BF -7A45CA7DA334791E05687BAAC35D893C33860E73C7F5223718DA50EA0C5C5AB9 -AFDA68005F20E5FC2EBC57EE358620B300237218CCB1BF49E36F9D710F3973F7 -79C3B753C044D77656EBB2BEE67F424D2997AF3D61FC8974410D5162E1DCEF41 -FAC3711DDF25DA13192705BC5D915AD55532114CF28FF576AC0CE04E6191EEAD -F46ACA1FB5423D13BF154C04C535A9B02A330AE72DF349613B0BF0EE7ECFAE10 -F70F46C24F29524A8198A08288169E70855E9949A79225597B669D5EAD516A1E -8F617A3EC4CB30D3F24526EB12A60D6FE5BCD3760351834CAC50F94522DDE187 -4C22E49980E29FF4147321C62F52EBB5147AC0C7DA2FCCC7F5064FC10160577E -45C6DD9647398AB5B67E286772D9EFA65DCBD279613F9FFE16A802CD3CC153E0 -860458959D7F39BEA772DB33CEB992FB725FB7B52B1D9551913C445D6A88CA6F -51CAEB58168197F0E9DA1C2F9D9F71AFD8938BD4A88FA4A5A287229DB00F1701 -90EA840772A02CBA94B89631D31F733EC5647A1B74D7DE1A6198FDF07C89AC4A -CCFA0DDBA23E98C1E30AD78B9FC165FEA09B3589C7F68F481018352DBF007250 -4EEB2039CFC22E5613665E6C2299CFE67B31DFE436709FDF7FA4677FC9E198DC -D4DD29CFBCF51575277926D4B1D298002D2360B50479DE2AFC52F6708332CC1C -6755EA8D8BF62872E2185D4D23372F8E5149ED31F17CEF8363DC770CE4555998 -81F12E9B0518AF9C313C32F2E32E2297B08A1C1B2606CA4FFDB8C37BFE0180DD -46A8CBCEA8641170807B24EA729851B1C65C1C0D7A04818741643BAB5BD208CA -D2F8E029F86DEF2571476174892C63A85931D9F993990CD0E581848304A00574 -D550EAC3B92D84367D91E7273912089EC98477409B086923EF409EB45FC8D580 -D7682DB4268F21BAF5FCED6A9F0ADE040585C41E2B38A21DDDA7119B4BEF3CBD -8F35C3F869AB8DA098BAD1B2C8424F9597D97BB36CDD3FCC83F29306993DB137 -226145493E9632294CD7AADB7D6C80091159BA3886EAC62D5A25319BC2F0F224 -321F0D9806F456C2D11559CC2D74B006F2EF11788790061E1443CB35238AA390 -790E90C4C9F2FF9503FD3E9FA8951999AF20CA83A8EBA3143C271AF5B062DBA7 -E02F70C4636CFB2458A12C9152C65616885395C69E67D22A092A159228D1CA5B -562594B595C41001474711252C0B6656B5D3FE1A5CC50F6B4D4E54EA7F37BFF3 -C485AE3AAB776E6A354E904E0AD33B00AEC02CBAC24B0B2B60ADEC353372E13B -D1FD01675BD1BB251D85E73684D5364ABCD9AE0004AEB74661F3185EE2D1F18E -CB48B4F275C6408B35358622E1CA0663E115EF4E1846C3018476B5F9BAC90902 -21DB96A25EA60260245FD9172C2407C28643ECFE0B34DD95AF25164A4A289461 -5B9E8319E9DC25D55F8993FA755C0F154937936DC4B8229720BE9B483DF0C971 -0CC6A7E6034434AF7F7164239D5DEC9EEBA4ABA9EC940ADF4100868DAA6B6921 -23CB847BEAA783A07233A3A35F0568C3360A28D59E172FBF6E06A88BE2C07E75 -121029EE403159C5BDF754DF352FAF353616E10DBE0D78F1DC20F24335DF935E -4FD4B1213EC75163509073513C600B5775712A5F13AE90584102F31E1C51DE6C -8F6638CF724287061D7E17A5ED495A10ED93AC67F0A954AC46B77C73D5529D19 -58B8343D2AD3E18091F70B5537691D103EBFAC583ECCBE2DBCA1AA83EFB8D337 -9FD800EC523172E5F192391B44E02450EEFA3180851F902C01A5AA36D6CC4FEF -E04F2232CFD2E0E3A1FD6E38E18CA7DB2291E64B890F4AE3E9000C67B07D5577 -5DD7628A171E82D233FB4632B18B24DF76B908D403BE1316E184E79CDBF17BFA -E1A0BBD93E8D0D11C8121895896150013F6CC4B36A9F9C08CADD20D9476D3BAB -DBAA38C2EEB1DD1E36A82B3BE4ACFD98035BAE636759EAF54BD250F4EC33189A -839C44F9162C2B3A94FC301B9F946E15316A908E296F74B4914AD3EA47923BAE -C973BADD34D301AF9984587CC0C71A540BD6CFAD16DFC9B36B5B1DD471E1F15F -3572D024261CC9F26ED19C01D6BA89C8A07E56BA94BE3E62323F7E80B6EF1163 -B9A9A6D1FA9CDD29DB236BFD3CE06BEAAE793E8204DE8C49F14B8EE0ECD7275A -1EEA069470F50EF23221FDA44DE1AF0352964422C715D522E3C7602622E02D9D -DE384F837B8C1044C97CB2BC36AE67B5DB26066DF4838F8CCB2AA683472FE4F4 -80CDD85297DFD474B67E303D6FDF483DC43FC1204B91992DE2A56F68634DEDF2 -2A33E123565B0FF98FD81A68C45B6F371511F6F10A8B293C59D1F73871AF4A8A -4D5D18254E351F37B3C8C94E47C90B36224916CEA1F16EA695FD967F79AB4AE2 -B97D088F0730EB1DB3D4B0BCC18B119C0FFDC0BF798DBBB380DBE60B82D58B67 -2F6102D8BE28E2F0415024A593205A98D58725303DDD19C710BC398F47A7FB4C -BBB4DDF035C161B40BDEC40142001D8DC1ADCD17EA6C14ED3A03523E5FCFAD61 -9DC2A389EBECDB600E9AE5984BEEE20E3FA619653783E7C8584C5C4689B43350 -541B1BC7E7DCECDD24910ADA330C68CD4CA31765340C0B0533A703B30EFB5A22 -23819ABB37B7A93CD2C2E69C0B2AA0EE0B5E81797B99F6F34A35E8CA75E956F1 -50AD3F2C3015B1B2E9CC261009B1E9FB2366ACDA3B1DAF39F479800D0F81AF0C -046B6A6B710EA2B41CC3B9C61C2CF56E30D21D28ABB596A1FEE0F8A3FD0B0F7C -82FFF39C6C08B3B9332CB68DB902EBD156A7DAF85A621B853C3F215E74915BD3 -8D9A4D93D40BA7DA82FEC0B2AB071E474F77D30A6F644E1C3454BE32A2F53FBD -00ACC0183D84ADF7E6ACE0D8A5AB0F53AB97C8DE412396E09224D76E00CFF1B2 -F508D856647F2E7F7741D1BFEC7A260DE76650C143AFAE619821D46B18A88F65 -A7B5595DF7FAC0924548C7D505C12F98326999A50EEE29EA52FB5ECE0C112A86 -C2D3CD515B09D16498CDDC47EE104DBFB607F086D3C27F0DA30E198A3772CBD2 -BEC842441F6872431CBBEA31D9B8297224AD3AAF94A17C18203CCC4701EE420B -A478354C700C904F6227FFDC118C5C5BA50F9E5F505327D41D6C0FD91AB4E980 -9C3AF3C3CD107A67E684F2926DA1AA76E46FFFED732E28C463CCE4794900BFFC -18F426D52E07CE060A99A4753236CD237756919B069BDCF0D1593AEE8AB23CA9 -685BA6CC198DDD870468E3907F1AAB93F5E88A45BE84EB54F953916EB3582609 -1C7B1CC352000A494D4CFC627D55DEE37832874FD8F229BF480DA17ECA96C43C -876B3A1595B90B19A52819CBB36C884CC236FD220B3D9E28E0B9C3B6A2189C88 -670919A0CA97BC7691FCD5CCDB205A753EE67896828C92ABE59460C47D7587BB -6B1B68A10825CBC070B03E4E264B963742AA0375AEFCF96F0FC39BE2FC8E636D -59B84BAA5CE57AC2A7A62F87562C05050F6D47376F9C3035F151C81C88100752 -69BC996BAC91A08F2BAC8D48AF876EEA2425387B949C6CDE060EA05A6725712A -FAB2B95914E46E7B029B74226465F56F67A68BBC9FB1207A80E24D91A18BF5C1 -10F193488CF71D56D896CC3C5D4BA6A44E28CAB7F1FD314B08B9E5F747D6AE21 -FF9CE225894501CEB001DE09048CFDA36D983A240F6ECBE12688467DEA0DCDFA -D95014A94A4D7137DED6D0A93E3836B9D66E8EC72D542E428BBDCC71AD3A2199 -0C8B4F9812B2CA59C9252DEEAD366EB024FD5D92311286D8F5F6F78BC2521E82 -08BCE4890873FDAD22A04F1300B69A207A691539BE0B3F3BEA80B37955E91412 -B917D7CB638C037A9FC864F52018EF68452E72DE7D8BA3547EDDD8861E9CDBE8 -82A6CC77A368443133D54F330EC6F38616F6EE171380AC8A113A2D0513133513 -8DE061968872373AB68B3420DDA47BC958B6DB27846A5C9A45DADF9091C39F3B -8C21D9CC0E91035C1B5DC7C32203DBA80151E7F9F8342CCCF896B9D899BDF42C -08FD26A8A1EF3C2474C8F00C01CA5E8CA8B81D99EB3B2EFA5A5D0F8FBB889E3F -B2B98B654B88A10583776607F29889457BD9B7BC896A5AFF37761520E6FDC92C -37A26EAE1398750700064EC3C20C5FBD50407C74283DD8D7CEB4078A9BAAA65F -2214CCF4BEB603A8D71CD314F59B85DB8291A7C04E3054724EEA023BF26AC53E -2BE95B5AD4F47A7FD58F146B2F4F8414921D87E2EEAC7EDDC2954A56687B60B5 -88C279D31CDA09CE2036E99FAF6EE3942A91DFC67E13D0C7D411C47FA269F1D4 -7B8980452BD3F1DD13CA59FD9EE2D4C9B0E6605F50E37736F0DDAAE4042B93BD -AD33E692EBBC3232F2631DC33E793499BEB79861064885C48280553396E9CF9A -C2147B4DB2274EEF735F855D4DFD07051278552D0741EABA6F200AA88956543A -0A0E8102B6AF79820534FBA62E0C0AB44EBE9FBC8E3EA81370FFC49CE72D1EAF -E2EEDD7A2F4A3DE7FAE68B990543E17CFE13480950AC5211C8CDDEE1B4E00E07 -F3FE17424907EDDC18B0B7C7286D6E7E1F6432AEDCFD46DFB434B725A8E417B0 -A09460633F717DA670821C375191CE2F3D5495B7B9F50BA7FF38E976AC9DCB9F -2DF6F34A55EE724E26D576A7ACDA834218CFE64854756E03825ABA5AC3C2C33D -407A726A69A9E1D497E60D8F2687F9718571BF5FC56378F08AB85983DAE2CDDC -E2AC6524D328E27B93331EE180092241679276D24F3AAF65D098AB43A26AD06B -99B8DBB205396055D16D0D43A4B17FE309A5AD3AF1A41ADB31B88C847554A99A -AD34138AA4A95542D22243468D4CE9D258D8304939E2F3EFC2184E8A1CBE6D5B -52C61F45CDFF88ECDAF14BAE3FCD2E0FB9A3D914BA78685EE9E57B2CDEBEB496 -7C0AEF869E1DE32D97F5C481020494A505E14C39B04CF13F30FC440F47800C3E -6424B86610A65E27E5F55C2AACA141B8E5014991DBFBE760033356FB6515CD74 -407899F6DD9512FD5DB8431B24EC6B3BA7A3E3ED1CDC151CEF16331CA60F9766 -23FA945094AE304EBB0321D6F0E6B954BB371E1AE64FA290B737A39EA528FC4D -3DBD0584CDC5DB2975EC16AE8AEDF18401DADC376F3C8A7C0650EED78C27ED84 -99AE1C43A89A8A850CEC768ACFB0F5AF00ED9AA77E9D1B7BE6C50D75CEA06D1E -D171F0FC8A595935BE2897F40165A417C69522623147C4C0314CFB1DAE2D61BE -9F4DAAF0CA69950AEBCB2E2924454772B2B486B8F72A0E54E5AFA140BA2860A4 -79F20AF9947AD5D571E1E5507EFCD26943429E5481128F30044A7A53520934AD -3B814B661CF82442C611FF3D21F698D46B3F8B4F67D7BE6162B3358F2358B0F8 -C11AEC7785ABE92F4DDCFA00B9A6724A4DA91996C7C3C04D597D27A78254A1C3 -002E540D3FD978CFE44AFDF20B83F30B8E388FB0C0551D7620A94F96CB3B9A1B -5A8395C04EA2E3CC46F0930FE758F67969BEC9355CB815A18B9EB1AF56B4D8E5 -2258CA467410941871C6FEDB7FD1680F40BF5B0C9526565DAB344E23B1989DD1 -FE4ACA04C5C6FBD692253DBCF21164BAF4CBFBE65ECA78FED100B4C8D7AF2595 -0AFCE2B1E67E2864860A0637915F9ECD1DBAA6C81D81B14C3BBFF6B499E364EA -B95B3F7773B28A4AA3402DBDAF5946BAB4892150393202A0E6B2F7AB8FD18CC3 -17C6F3D012FEE23A796FD42F78F8A44D9A7DF3FD4565DDC3766CC7AD303DDD71 -1F3853EAC8ED79EE90135E048BED4BD966910BB03BC162A8A64C4765EA4BAAA4 -F1F0161BA6ABDE194560EFEAA5E883CE46E4BE59B26328E104AC7BDECF40F10D -B9A19A7DF4042F70488D231A3502E582E06587A4BC75317C369D04F4077C67A2 -560C4C03B6FCFEC65ED92068E423D65350321B7279D4DCFEA9079649CFF26B07 -94B8D561D57732034C459F5C7F8B0C57D29F73C3F2E098AC6E496A7316B8C5BF -CFC6A8BFF03E44C404F7E910CCA9C519A977587C755E39FC3E4327B7800A6292 -863C6A2DC759D4B539362573B4394A29FC36137D2B4AFAC9B24B4A06527A2CCA -3BA45F10B2DED3165FD215F0A87D30BAA5D5D7C005C6D052360C4A957CE22FE4 -4B8EEC8855752782D8AE10FBAE11A00330F83107A846EDA0B8260AA7212CDFC9 -3BABB3F264237B712FD63FB2F47A57E038626EB0A3106C01772E358B25099966 -6763C6A5A3DBC43D41C9FBEDF36DA8539946BC7BA6F8C9D9508BE7536F92E1C4 -E691D0A8BEBAB1C98C1E8BE4CD734155E96E55658CA8B45C688C835E16621CA6 -123C51C9E076771CAC75AFEDB7EE5066CD8CFA29128B767DE87992B0D9F03D48 -9A5BB623DF241D563E7A74F24BEF1747A1659EC01023BB881B07DCE0E56CDE58 -F33D0A333653680142E0A85982482A59EC34D885471D45F93AC68D75386309AB -71B92E6C425C70B9D7BB47B50AE7746A63B7CA1D97AE22C4767E15F8B7C34C8E -11C737ACDA7DEEE2BC17DDA7F6DE3B780F2F2A935D8A2DC1622A1D899E8ED900 -41A66B43E5B287C105FB19F1B483E148D6533DD40257399678583B55DA40DD88 -9171EBC0C9AEE860C80DE482FECB699D47DE45FC9837716E80A2BC96A1DA86FA -01F0E8C5879F9E183B59DEDB6A02EAD7E9656241368D171784FBBB294933B5A9 -4F443997BEADFAF4825F05061125C30B6FDD07AEFB064451C75401B9D1E4DBDC -650DFAC548B31C16E912BDD3D9154A5AB383CD8684CA1AA9E584F086D2CC4647 -FE26791D74EDC051BB9E832701B0392254FB45C89659D68926F173A9558E30CB -BD5B4FAE4974BB93A294BEB097FD1BA8A717EB778437C11F93F596B48C94CFAE -0054673A090C7BBD12918D4D641D150D47AAB16ED2484C76622DAE9FFE7D02D6 -B5E490269E563055F9103E871286CA89D81E94852EE55064A66DFAD93FEA0191 -CBCB757A0B5A4475D4C13DC02B47215535A9797F2BB4D88A84661E8D30A45733 -299A0C54E987487E1BBBC30A36C559955414FB563C3B80F6C79159412C324E20 -A84CD748F8627DB1DEDDF19CE676D0C4777CEA8AE6129805B8B8BFA4C83B49E2 -F039A5C91261194917AF44C75450AE38D6934973600F5D9BDB3EF027BC43273C -1134CD4B1194775C5FDBC0ECAD7E9CC1B4272C3BF3557C9A3DFD9EFCD137CBF1 -0DDCE077891D15B83A31FC4AF80FB8585D12BC531B78FBCD558F75FF356D301F -0728345E31C4BFEA6AFA8AAC896DBC0082B9C4454387BDD44E16B82654D2BE79 -3E294D4E1E00F47B70ED79A8C5392D4DFD08490A3226639D8840DAE9115CFCCD -D186DDAB2103C9F206729BC0C3A550D50046F4F9B218FDA76C5C1B85559B96A8 -5E07736E24B6615AEFFC9228A74F7C6B3C07BD9CB8C34E475AF485AC0451228B -742919D2804168E11BB20A314278D9902ADFB08486DFBA43608DED1C89D48EDD -E5A3D4C0605CE4D88F0DA1092BD2D5300EDF0054B07865A526014DBBFB8AB6BD -805AB35220C1A5359B46B89C9452ABE52753EEF8DEF34BE06697A8342509D5B8 -C3D0E6F8004E8F36E0EFCDD728808D69ADDEB6992AD627BBD90B39B140EED01C -129863CCC9FDDAE6A73EB50D84F203342A4BEA2447D45737FA88BB5A09442DFF -2EBF4CB9A246A7561ECFD4C222FDFA38C375040D9C364A3B4A2B0D6EF59A851F -6BB2721A3D161CDE03E59AA2B12A5C43A793C5114190B60A331CD390F8D411DD -6F904318A45D4A550208C5D4464A1CDCF5C1330AB4FEC096E3A58E44F57C48E1 -8C20EABBA8CDF112596ADD29E8FF5797A6AABD9AA6B6D3923A547BC340A49091 -69A6146C1432604CB80E9747F89AC7277645468D98231C14B410DC9EBCAEA62D -482EF687083539167CF7B3410753F16D4E295A44BE9AB8CD250AEACECD322C60 -1DC8D43C949B549C5441CA8C8D4E0F8D0BBBEC44904562F15FEF31C3D81F5660 -14211DEC407891985134F98437C850C93870A4F8AC981B96702076AE5AE6C280 -F984160B2228050D31F09EB34AECCEC0AAA045A62054B7431300BA175B0E28BA -07CCEDC4E9ECD0C806ACBF26AB11E8B6FFE1646B82C7AD8A14998470E5F298D4 -073660D39A9D62F6C4CE4B66C8E5A01DDB74244D443DA84853487FD9F5222218 -F8C2178BB91DF2A64E346FA3000AF4E822F44C1D7CE75742B36C291A5DD29636 -49E6696826C562798501CEA5783696F2744D3EC8D84504C953D60CBBF0806B7C -041422BF6255835CF0DFCD4C254AFDE9F80BEE47159F8E6D10C520B9DBAE3CF2 -474B9F8BCAA2EE2FDCD39A428828E2B8D6DDACD3CB893F62D584D7B17172A7E2 -25059C3A3C8AE4F3E0B9AC31B00101DF87C8F427DB76F39372916FFA9EA419B5 -7303F6C70B99D74872FC7F82E50C1DAFAC912134F188B70546C475BE4F7F0263 -ED51173B68A87F2AD23125034AE1EF677F60980002DDB8F1D76E6BB7C79EBE05 -31B1C2AAEA65747E9FDD4E6B98FF08B2AA39F316D1690D264D5F9F5A264ECE45 -B07F22F2BD5B1E59BF032F5130432AB4E3B08C725B26085C8E1AF9B9D8E58937 -A30E3B10F3B98027FEA116850F1931D8B90D39D16FD755BED2B4AD47B0CC5FE0 -9256123CB74A69073AC40BCA00E964ABA2DD3C1D482868AA65C9A5166AD837AC -8B4B75F9D7C2EA9CA9E3231EBEEFBF7C79F1A5F8FF71B7D436F5FA967C11621F -EDEB02A7A922469CA2EC676A321C342262383045EB4E95B54A16B7B3CE83C90F -A339BDBC64B11867AD874EEAB0D81871AE524E5248ADBA781D773E57BED5A76E -1C01507191B836908344664B21E0F0AD9FD81FD01CB9492C0EB839A300B6A536 -EC1236D38D051AB628D76406DD553F62F5738BC086D281FBB29763938E88C5BD -EEBA0AE1007D8F59FA52070C03B9DA7AFBB75F822DE21FD2077529981CE65FD5 -DB0230EF1F2C1F4F1071D3C10F412D6B3587F5133834453F0195D4 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI10 -%!PS-AdobeFont-1.1: CMMI10 1.100 -%%CreationDate: 1996 Jul 23 07:53:57 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-32 -250 1048 750}readonly def -/UniqueID 5087385 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 -990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E -6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB -DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 -59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 -D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF -8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 -6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 -1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE -03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 -95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 -74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 -3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 -47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 -AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 -42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 -40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 -B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 -9560176670870D5FCF426198619576A02FC22BED21AD729EA408C566544FD4DC -8EA5AC194456EA208A00303919DF5DE5F85C566B4C290AAB3282FFBE1D6632D7 -EEE66F159E5247C2FC64160A6A5DB990B374081645B0F31E1347764765F0F9A1 -2072550AFDEC88EB3B0DCBEFFB45BF003CB1DCCF94BB71B00FA2848305D5A411 -3871827F770DEFB850214B505808517A62946CD3C0F48EE2A7C4FB5195C28007 -F11F1F094C8AB55A0C035DD958EF78CF094AC323C0B95CFDB3A68A18C03E8A92 -0234124B9B4B17D25D911FF9D62815E104F59A1E5A0E822C72E8B26E4126F914 -DBE303783BCC2CFF60E9B6B289ADB536F7E033E2DCF32EAC5224A140989CE93B -9D0B25E308823EEE72B44D54C5474A2BB9275B2E850DA8090649B86397EDE8F1 -3D7027209686173CC35004679B5381C37ADFA907FB4F95C7BC547EC171290461 -1A5DDF9745966A669829D269CD99E8561218F3A172420D39EFD3904DAC0A1FCF -C033AB9D4683A5688E0D0D08FB5A16F513E9FB4CE1B3B2A87BC94F7610FB5C4E -E53877706F87834F082C79DB30F0F9FAFE134B6EA0785AA65707734021AA5FF4 -A8F454398AB3442888AB5A59484C82FD5BDACBDEED8D5FB79E436C7D18FBF232 -36ADD97518BCEB22A6D435AAA0A3FB9B0270DA43FAD07746ABDA3DE6CB5E1F7A -517BEFEA98C49F4C1CF7FCC6BCF8C997BC62A5B8A292F1201E6C044A404F1BE3 -9F55B98C5EF235C5F51E7C593A21BA174697E131D2FE4F71CE5AD95D2C421903 -D6B2B0F46B098570F009A3AEED82F87A58B4DA7F1338D2273ED1203F2ECCFDE8 -E961E59E7E5281DE21AA3BEC66F1CA88809092B4E8B578D72E5F2C22B5D70805 -6E945D8FBEC6A78E7824339F3E7C23F9A0ECD6F6DEB8E008F3BC00954DD67593 -ECA7227B717D51D5BA2F98CC1BE96321D52EC5B5D605082D039F37B9CD75CCF8 -69BACCF74363B52BE8D75C5700A1D0FECD874B3BE7B86716F8ABB943670266CE -C49DE85DAC325FA19047416F09FEDD18301F3FF69FB5CA4DE934CCC4403C71D0 -D9689DD010EC1E2AC9F98968C14B6594864779D563CBC61575AF09CD1703FA8F -29189F97FD102A1B2132ABD24D68B51FEEE7253DEF27B0FE00A177F3A26009C2 -610C33CFE54CD261651AC6DFC7A2A7266CA1C6F505F52CE9BE1E943FB2AF8208 -3015EFFC66CDF5D797F01FCE0741BBE9D326AE672D1D7C3AC9CD3F5C627D6683 -455AF2F45A2389F40759305D129AE7F4E0DD79B30F793032BB5B4E79CE589FC0 -81EB9A921423F180C630A7FC61EB600F7F34C6E593A9C1FE2ADC12A8BBD18EFC -16980A08C261E50ACDB172B27181750BBD45C443E03C57BA4D1CA7B09CD3B796 -692E94665F3E34008ED857A473C7DCF0DDF82ED2BFE63DF1DC664FFB3AD55D3A -382A2A40157F957AEC91A0EED9BD0C6435A823805820592357C2531C41FA16C1 -8256D02A1D59C39289B7825096B3A1215E012F8228C33B84BAD01CABFE155343 -44EE59D51C73E9A2D9FF53CC2CC781CD26B2DA71BEDF0AC01C8C48A8A8377E3E -EEC7025D4DE6081D7B25E7AFBD04EC24B7CF3948089CC8151BFB4B8C827190B9 -23DA249903C3BA1DBB1FD0BC996943730A3666ABBEBA62770225B3494D8D6A44 -96E4EA042FE91CA222849E86125E86D2DFDE7D8F85589C13EC83AC634C5257DC -0AC9B9E3297A16BE2FCEDCACF721EF3F8852043C0608956DA3900F34026B4943 -398F5E1056B337C0832CB1EC854B69C342BDD9221D2807B15EB23BF86B3E8055 -903777B876AFC82F24967DD5C217B9E53B7FBD17605FB79C79C349242550D693 -6D2416B59AD3EA5E26C727E79C4A5CA9441134D616BCFBA1C225315BF49F534F -1F00D1EA017ACCB8B888D91C24F5167862432039887347F5918FCF54A591CC0C -54433AE1BDA243262F546FE8E4618B2D5B3A32C518F3454EEE1630C39A18A2A1 -2500E60EBAD5BBA62628C7C55E262DEAA705C438C2596ADB8415B8EAA4A8A99A -CF23AA1B40286CD07D8D2C192312D14665E2D0097933694F784D079ADEDF39B6 -0ED6FA879C524C63B6F6574551B95B076E0BC75986BD3D09E06EBC7E41268E7F -4155AD68276D8F56B029B75B5F4D43BD37E5154A6111EA87C8085BA566293BFC -F3CE019D9AFCC8EEA51E337BB39AEBF7A893BC7B0B58F9B37D086180B4F910CE -3E88A95C05D7E8D4A930F55B621E7547865EB245D418579605E7CBC041CC6956 -6B9A9EFBBFBDDA843C9504D73901192BCF51B1EA6784575A538B6B6C52AA728C -3A91008945D8735668C73BDED1C0859047FD840C1EC67C5CC3EDDC595427BDDF -635890EC296CEBA32CB6E8BC15496006AE018592D881CEE722F807353425D7CB -D286B59EC4F54DC62B674A24DC2F874719FA5E3C3C7325B1C442EE6F82EC9E5D -578FB40E4086BB57FAA52E01D98492203DA0E544D453EE80BDC5A96E039B29CD -0C46B2DFEB3A0BA4A6F296C7A93817640D86B3598D7D0F40105328D8CD2A1DC0 -D98BD24FD7A26B1F5256BF38EFFC69714107EC03110CFC0A3F1984210C383E28 -3838526DA360F9499B75FF6DA024F1E8F023CF13E2B2D12A5801B3ADDCA5692D -D5616131FE19AF576EC7EBA77EDBB85CE3B1E93E008E395358A778ABD6BE1C9A -EF3DA2435EE59440860E0C52D5FF197A7AE17112D060C0A5BF97D5E984835AB3 -38220A1C8E3DA6236641EC089AF2C68EBC0316B48E9D5A90566E89EC9FBC6832 -A0B1D1A500DB0A04E6DC99214A945A1E7758F73D795C47EB112AC71A8A7E50CD -C1B94CF0B96EEE0ACB643F769E9511DEB2A2FAA510A11C69155E77B11AD7E4C9 -EF5A940D26994BE432BA0B0E441402BDA42BCB62D5D14F1248A95A10E0920D27 -6F2BCF04A8580D11464AD44698BA1976CD97A10D7614B798559117C9E00B7EEE -A06E5A3500F38DD58D88640127732EADC4123AF5F1354053B1BD1FEBCD156278 -F7ADC502959A84DE73A76E48FB1F78F7271918DBBDA4574433AC2F9828C5CDAA -17F61524CA0DACAEC9009D30B191985F455BF097C043A2424BCD853194BFF699 -989D8CB11027444775FC7F552B0F15F9395298B48C7E1A8C36BB9F73BC898157 -BBC014C5A11B918834C83D4914E4EAECC8F5C05C2078587B876CD8386D13A6EE -8BBFA80A91926B2DFA5DE0B6A23A5F2925374F77D53B7602F8BDB22E161F44A7 -6E8CD27B06BDB5C14670F64E88E6445CCF72A221544321982861310D95A99C6C -EBA6F82FCEDA1A859D4344C94136E6ECB584C2E51E95D533FB29144C2E29A7AC -2B4D648A04FE2FF86DD0511D09348E235DF54507CFDEB8CDAE3476B6D82E9C8D -DEE266D458E862EB522AB3A07AC012915DFB9DB4DA1F51D18C95C69C1AE47108 -B956AE33224286A0FFD98D7DE43960C21963D5F5320C1ADABDC3DE50FE333740 -FFE70DC5F6DDA28F955E410AD0421B791C9CD906F4BEC994FBD3E27A9D45C263 -F530DCD5BC8428D7F3C0600CA4DEE1467F736E76FA1D91F72A04E73E3566281D -CAD7FAE634D6784BB7FC12BF2337921152FC5F9ACDD61125C70659A6132AD029 -7DAD35116FD1769E036C3BAB715F40B12B5ADB244068EA12F1DA74BA929AF45D -650A0D44CEB7E6BC5860B7059119747FAC8E9E980632CF05E9C9B9548B67C0E8 -A7E17D0B16339A5BF1B0C8CA53A6C805143B4549A29D8A4FFA02B05D51A27749 -4DB5827C38CFC270C939617BB54FEBDF6FD134CAF4FF791D5D061875201449D5 -3C9960D674C739C8A0936FEA517511D9F1D35DB7C1497900D309F68203A3EB57 -C075A590CE82044C060494D480D1C1633D3FC98F42B9ADDA927CC5A91B7F9E70 -A06AA41E653A9E3499902EC1D61076D28A0516B2AAEA2CF5CD91DAF43283BC83 -8CBDDCCF454DD917AEA63A92C82F996A71A0FEEFDCDBACD05505D2C5DAE7BBC8 -CC6167E9C392EDF4636239EFDF4104CE2C2CE70DFC3A1165023D31E6CAC53A1C -7815AD801A75E3C9D8F65461AF86C4054009DD55F0007578F4A447D56578C647 -5707A3D621D244B72A1ACC09C55E8675A2AFE45E6D5B2FBB2A0EF21E6BB1F3D6 -FADEF8EE84EB5567E1F4E0FE35AB4996DD8F8189A9A0D4FBE9B1CFAC0932CC13 -ED4D06669142533D1FBC3C2E6AE781EC26BBF69BBDD8EED6939D6EA6C9DAC635 -F883F7461F4A161B2E12D1FF0670550CA117C1C66D9C95C3BA31ED9C077287EA -202A5E2E9C94F6B77B3910E91FF1C6563AA8CCFB8040817D7E02B144283AFE7F -ABF11312857042E5EBFE4417F9640202B837B74B529B8F047845C017EC3B005A -871F7DE808FBAFE2355D365150586EB6D4CF9170D946CD2594DA53E7EC196273 -9DFBA8FA3CC2C08D3AEE25A6D43FABD897150CF72FC06FF7DE1DCFBD35F1AED7 -06D89FC772A1EDD449DB05CEE8A3093A5D8CFE2546ED87547E40101B57A972B1 -F4CC51098ED7B1AAC7E95D752369651145C6F0A77F7329AEA885A21720F46D70 -C48ABFAE74ACF95E6FC9C310644F59E69EBDF818FD9D6BF53CC4A1F36C0106A7 -22B8FAEC934FA0C6C17BC3F0C56E39457D0636CFC1F6E966018B9EEC6B278329 -482BDF7BC65641174457CCDC0EC7FD5F1BE549F80AC51CD55E3437C185BE232E -F9B2B4CEFF5999772946F6567070AB8A996FCF02CE81973C30D793A15DBC8DAA -2B93F019A58931C42A73E686C3F85910D18C5DE49550841388FF38F253AEF5D4 -6B00557409B607532C694E76D74B186D6311BB88BC7C2CF7D77526D176DE0001 -BE55A30187C62977221CE8409C96CE65B9F97F2FE7A4BBF837573611324ADB82 -B90C74D9B7E9D0FC96BDE0D8759EA0ED433349D00FFC8E2A4DAEC56AF48F7240 -036BBE64AFF09F08EC61F339AF3FE06733EC9943B53C39FC0FD73BDD72913211 -B6DE2F2B4D21CD3C47584AE818DB1DCE9F5B56D4227F672E628EFA4BC3A99AD7 -19C5BCD60EF653C8FDE4A53786D2DD0613CE0B754DC2051DEC8AA0484EC4B815 -ECD69ADBB71D30639ECBBFF5E351738CC24B113B3666FDBE220208A8AE012328 -B7F948AAA44706B8B4ACF67EB725B448C53E9201A0F380742A47A6533D70493E -1C39D3C10B4455AB6A221FD7E44C2215EFECD391BD2BED15DE1AE1EF73080825 -8F142DFD2E746547E9182C41F0EA0B84002D4ED3A50B4E5998B6DB54BF03EC14 -6682357F886B72E4DE77E8C73AE18739AA3090ADDA8FC432489855B2E10C50BB -FF1F4272587F2BBC05AFE07EE1717BE0DD064BA1A31DD4CAAAC0243CCF30EA5D -C8786FF45E85FDCEBA455FD05F77739DF1A56635B44195C02506F9FB4829760B -AD5649CF106F54542F112310420846BC1540E3379CD9F6E4B3F20984445450A4 -6DFE6279F4816933B548A40651D77C9384060F50F3949C20BEF0E783B6B355FD -5AC07EF6BDF954D0F765109FB76A356E6BFC9F0195C6C80384AAF9BA076EE3FD -384B5BD939A338E06552B687DB3CB92EF538FBB9B6D6ADF73C03029E47FC501A -69B540E1152F8F125AAB3D30CD44241A363F7701884A59D75B7E9CA73CB1CA99 -B914C2F84CA05780B060EA5FABCF3D6604FDEADD2B2E54A6FC5E412DF0CE0B0C -D5FFBC9A1BFFBB7E8293C0C8219CF690339B813F5A6A69D70D4A8154EE710E6C -12EAEA9BCBECE6F1CA23A67B22C48317B275B2BEE95659F57BAD23DBE705FF00 -1A2962A05B6557779A6996F4F586A0E3534C62E6EFA29291F532CE0A4EFD2C64 -CC27AEA2835FEEBA89FD8C3C475EF325D53A38D1EEF1E6B780E305DBF76B01EE -38A9DCB0FB72CDF0A7CDB32F8A008A47A778CF2A692D5DC539814DEF530B3012 -B6521306163CAC65BED2C3403BBF5B7129CAF0FC04BF9F93442CC1B9EFDC83E0 -3BE687EB157596937225EC82B0A2A786EF1A9BEA791E38B7453F160184041685 -0E0E339AA8A39E3A7E4844BDCD7CF6A9ACE21A42C60698FE9BDEEB2CFE3F60A3 -1FB633976F0ADA40EADDBD356D1F53DC268422AE716BB1A1A9ACFD38D7D00B43 -A796D01828E8B18910D0F63430D8ACBB2DB08EA93553FDA44DF19253E99CD939 -8AD0080A67084B56E87616287811FDBCF8C49928F2FC83E8227DC4B9EC72247B -5E0EE55A10FD15DD09DAA0FC267AB18A89E84CC438FFA035F99A7735B96944D8 -91B2789B132D1D7D9B3DF3ECC9ECA166DC357D943D4978124B4AF82E738ED1F0 -F2AFAC10CBACCA9F7D153022D241EFC7D4F3AAC4F73C1B6027F0A029313F63C5 -8C9399CF051978C25B9969480E5724E45DA2DD3CBADC7505BCBF9138CE3382AF -EE218FAC24BA299144775D838E32F7A7B48D3C26A0EA185522A9963EDBD58D7F -6631EAE420D0FEA6E3B88ED8C6515C730A0D60C57C570357B42EBA1A7D963856 -1B16A8F8286E8BA03051879C4DFC7DE30A0DB451A327750EED6754B0377D9887 -3A63F836C0D22B36D7D3D86EF29C86E6DB602409F425882A0314C061540F85AB -118EBBB2C3AAE4BB746A563E3F4DB66B84837A2C54DC15D5DCDDFC6A00536D3A -DD3A3FEC1536111FC3035ECB4A7A7763FF6EB7BD187F0105D11BF84027228A7B -2C8F38C58B4323917FBE1A07F99FE1B99AE65E0CA1088641B658F61134B900C5 -7114FC43B8EFFDD4AB982D092D7E1AF24235978BD82FF8E2F19A7533BB9268F8 -364847FC2ADACAE7170351F8F5FEF4C2F99D68FE66F1C20DD4FC3124D068FD2A -23DCA0C55719F5251835530575CC4874F65C1EA39CF16064CAD59D6DEEF87CE5 -7F54B34BA025100D098E61CB0F84BCFD2E36321A2F524BB140D61200F448D1CB -D53F813213FF06A990441C5EF5B3477E1D939E47579EBAEEC756922DC715D34E -75C5A7C37272AD901C71686F835D123E16FDFE05BB1951067404D9BCD963D251 -673EDB1C578E980FA72C683B3B5E17138605571912609876A335E82BA8FC8FA3 -8CBD9FCBEA83CDC66E50467918172ADFE8A1A954299D40D5471CC58AB970C213 -26EB7247BCD0923A892346C78127C294EAF1FE87FDE8ADE3998627C7712D6847 -4B31805A2892C3A4260ED7E49328B769411DF50B4C11944F87CD4FDE36A53F05 -48BED51ABC0555CCCC6B252817AB27763ECB6FD7F81B744456988EAB853201C9 -2FEF7CBD74144E7F1E8C8C7414554189CEA2C1A7F6EFF2D84E95CDFB931715BE -0CD88F222754319A90865ECA75A895836528A63C243C0BD279123B14C8C7DADD -75B7EA380299580CC3F0CBD148B46C1B1E93F5F3E534B18B5E3C9DD07CB9AF8B -F1C1C572C285A67A040604F5D2492F83C5D270B824DFDF023566A0724EA3C185 -FBE37707F4591D4489AF6BE57BED1EB2A90C5AE15069EDCC16528A73997F9C1A -4A08EBF62E74BF131227937DC18BD49721C09E375ADE15E72A135211A61B989C -D1B1E33F3FD94D89BC9FD0E86C9CC5039E7CD1E73F11B87A55FF888DDBBF3FE0 -203EDE5BB025484D3C46F8253E3F8258828CF833A23BD0C357C80D13EEDE01A6 -72920A5D06A0051EB0C3D88A06AE504AB26172307B023C22078FC3F9CD2E7D05 -E9BFD653EAA689627F8100C21C1C258AEBB869F7FB7F836881D969FBC4D60C5B -03C045EC61E75BF21089E3E96082D0BC91BD2884EC1929CC61D865362F18AB9A -32F32F2FA2138D0CA2FB6E1E2FC4759C49E3D7E7EAAA586672159EAD988079E5 -B9C6FC79FA9293A512BF2F00A3B73461BFB7EEE22A37920FF52F4D3A7D2AFC58 -5925707E7EF20511633D19E5B852DBA05D9514B482F33CA674113AE7149CAECD -AF110C6F932CA52401E7C0FD918221276161997A1233723DDCE063F04AD65A37 -5F90761E015C476CA6B789D2034F1E9A3358AC4328D834E811B819C6FB512F79 -18CE48BE148F1E745B812AFBBECF4251C462FBBB5632015C931043E6486C9A6C -3336E9CC1FDFF496D7CE24EC848840D8238FDC427FE147AE7EB1CDE81BD7727E -4F638AD9A20C854FD7A1E2483FF159096F3395EA90474B04C1EBC14981E450ED -863985CCBD14C084B9DF32F2E9E9557B6809D3714D9093F39E3F8CEB9E20270F -665D79EE67BE7359FA1261B5F61D0D6F03D522B416F4F406828777954FD66CC4 -0EDAFBC8EA36F61AE4BEF7957B952A5CF0EC7C05ACF780C81843A3B4E8EFE348 -DF1E820CBE42FFF1463F20EE9BE45F6C0E5D4C24C312EFDD006C872E8AA78495 -2FA6F783D0431255BDFE40F620E2B6B8CAA2A315A92699C2413E624BCFEC3658 -16438395A08C0EB899A9557C0E317098B595C8315F0B851FA9ECE4CC7D1D61CE -0F537065924308D5AF0B86BC0066AAB953FF040FDB43E7AF345DBFFFE17082AB -10C651DB7B549B6DF4D5BFC4BDA660848234A0F8D010F20A3322163186A0776F -2586727D451E365C143EB897E9E06E90AEA603252E31F4CE321BE730B831DDD1 -14B1FB06FDFF8E2D6BB96E33B0DA33C030667A2E8D91BE903A40FF468EB7E0F7 -D7BF6A02AF5673175D620A1E09B7C1BE88C83CF54C4A40C0A5E0C4C2DD190847 -A3EE682DF347AF0AF18E4582EAB2003CE1DA3991D2E8CCCD2F0E750FE05D6E6E -73A8630EB4F0FF8FAC4FB281B3C5C3A5E95A75D24F9DCEE57AEB6E1FD90C84D8 -DC1B9822613D17A41DBD6E4C0204F7667878950D406700089F155B5985DA3E6A -54C0D7B8AAF5E3F6C413677903A02D677F621E1E3596B78F4969840D689D6311 -76119B928A56323306F7CC663E685FFC91C2E87A1C1D56ED6C93B7D6A5B5B5A6 -BF706EFCFF2E4FEC4E3C10D67B46D0FA29B822991E9906C802BC9AC2F62924D7 -2499ABF07AF44B7DDABED5B2842499ED004167DBC3D074A804B0D2518E683807 -601E10827CD762CEDADD1EBDE0B63AA25C8109CE4CAA870E4D0DE79D831C098F -6B403D7F5217A1C5061829264B252CE10FFAD477A1DBBC68108961D186CC0503 -3368657728675977685ECE236A436408D29FE2D4B7CF8705013B3E29B41D0B75 -E6F81E7D7B6BF9CBB42B83C4330EA36E0FC611DC728A778277E7577C5797B90B -180782F7A5D410F93482910B7DDB40A09D1CD35184F5BE624F09302F9F84EFA5 -A64AFD03166832C46AD4CD8FF4418C65A2D09F69D35FC96AA2541BA1AC1F2CE9 -1B2F5DA6B5BDB49B2ADBD4248E7BC68DE639495023E9BB6C557D0429B89B8A6D -5895850E7D0A3E2958AA5FD4AA32C9D91C54FCD0F65C11AFD312905B9E6EF9AB -30BD0C4BF8B02AB348251C2B30D017FC63377DCC693A91BB7B96689ED2960DC9 -1E5044AFB81812C8F776E33F89C53A2FF7D05D67CBC9BD266854B6419F47F0D3 -35A66EA5D1678C0B8C66FF203D2D933CCB7141A58B858EC72FE95C0A32FAB86C -1C0E13404FAEBE11C1A3118D9FB50B460AC1B258376819E6C93F6CDDE6D51888 -6B290AF346C85BB7C926D595F824D9F83EFD7D1697097DD26163AFD8BC9DD929 -3C6CA68A62FED73D1EB703CF8176862DB849F5D3693F9E3C6471469B4F005EE6 -BBA24651A0DEAFCD033A8FEBA6FB04100B2429572C7B8EC4FD2A93C59A777BCD -1E7CB2EB86002D6ACF21C023971C11F453A92EB0DA48E1372B3D31C1002DDAEB -E51B3F65ACAEECFDEA264DEE945BE242B67A917307C707A05CB1FF864436B6B8 -65406BCF7A3829D280C04A2BEF9C1F2307AF621ED5176378E50086EA73C78971 -954D773D5638630A3444C71E1312A108CA24CE81D7DF6922C843C78620926221 -CC05DA3CF465B836C52CD1C676E6E2F9BFAEA2A477570A8777A8C0897DB6689C -1AD73F0B8E37A9210258838C1F6CF8EF50A9072D6DFB4E37A1E26C64DB65C16D -AB185551214E099551FFC868BCCD67F73D9B810E53E6D25D838A4A8DA6565FB3 -E8968F72103AB70E9E8C2FAC97F84ED01ADB6767D650AD6A28DDC9E79661BC0F -EFD5E7695C7D9E79DDBEC6F8FE0D1BB5589D07992E6BFE9BB9B3FB470F53195F -8C1F678B9921B68A781C129DBFA686945B6871AFD761202F505AD5C8B3750713 -88B3B5FAE3F1B1FC3CED21CC74B281492BCE3A9B4700A926FB281E3EFE501C6A -7D1A4B8A3038DDBB6C5D6D494FE93CC86616B26D0F7B2C65E54863471EFCFBE3 -4C47C6353CF3D5B0816C6BAD2A1AA86ED4514BC703D45D9FB3794DF5BB8BBA3B -473683E24353B9DF7574BFD1470FBDE026C937FD510DC26DCBA456EAECC38F1D -5A2647BBB67B44DA2488F68E267A3078F8DD532132C4FA926FB88DCED15741C4 -05B292C2BEAD1730B2817F438BB5DEB661FBF417C9286069784203BC5E643A70 -13193BEEC55C960846C1F4C5ED6FB3200A8400C50BFB2A1A8ABDA032C2859549 -F1BE68BEE4C3B79DB8A1D42F05C113ACEB76649D118C3472885492640176748D -401ABAADC64099A05C5663E98598E8BA946BF35D7814CEB2BF1B2F019B13BD81 -A4D02CFF954EE0C7A30C3DA2168AC92E4569EA6E65F9AFD1A289058F3E003AB0 -A853A265C696EDAE8856026C0CA2D5B9CE8A71807C06A5948224AB77C7269638 -6DB18BA9E2618A17911C35CFFC690B1A855F5C2A14FC04F45DCE58F86FED4F30 -4740098F46AED65C6E72B97B9515108E90AC625F023F0D1BF11A244A48CCBEE3 -7FA9822FC6AF38F0CEA95F5A732353476AEDA577342E784130D2F40126A05290 -1B9B2F5F8F4970D2B9750E34F08F520CE8895D2B09CC63F631B42804AF420A6B -10410D8BE9385A929407A5B41BC251A156428601EA3D176F4EE3B88690017EDF -D96156C5355F66363DDD7377938BC4FCDC499FA9427C61960FC1781167339AEF -AF7DFB0614809E3E3A073F788DC53CABC628F6F4A4EA603DD5CF9D8BE06BF10C -5BD7341080785ACE30FEF404BDCF40FC1DEFA2AC9640153DA50AFA84F1CC08F9 -C89FDDEED8D449CB050CE7D48B5B13737B747199C72F21F8D702F0FECE0FBEE2 -C99B54AC3D58168F07D42E7CE87CC92BA1DC73410F19106A7F7D6BFA739C9CF1 -67684B7C400598D0AA0AF79F059804537E0021877A4CDC8C5E7F516F22A855C9 -9B906618B6770FB3DF4F2E5D3D11DE724CF512632B9077B4395888AB297A67CA -A25C72036EFCB0F26ECDF6E31136E3B11F515CC329A156D0D4E73C6355882492 -544F32BBA141EB05EFA30954C540FCE415CD3201BAE222BFDF97F87447910C39 -EB68BE6DB21E40D2E483D792C04CB320A2714FF8AB5ECBAC0A85C6B0552CD3C1 -3E0DD51F17B4B8D81B20AD7BAD3E71AF7F6517A7F43464958E8D1A1E11E75EDA -FCD9826C201320143965D2F4E1EFC7A81730188E9B202AD186864C5E5192DB57 -87B5EAC82224BCDD1CC68338B464C5AAF79D0958987EF747E013F414DB35176D -A51973FE65015DEEF2E90286281DF24BAA3758EBC120C8018A5CC57E638FEB81 -DFA40BF350A558103D05A3B20132A204A0D1D550271938F4E660953069541853 -22908D1A78DE88C9D98D79954B36D926E1CCA222004C3D8BD7968728989C0242 -F1BE705FA2629F707CFF050349A3300F14BD1971B545A895B8ACF06AD3BBF830 -451BC3B0AEF51CFDADB6653DBFEF4D5DBECADD23B8E09672D0AC0A227A545506 -818720F0A95E80649EAEEB9AE5BBBCB0D533A681A694DE690EADA90AD2D0F0E2 -7DF4E733D685368475C7C9D3ECA99F70F129EB889AAE13FFDDA6FEC1F098A9C0 -07FC794E6677061602C96753EE4A02569D3466348D250CF0A01865E2739C930E -CC63224DA7309CC969E6822A532535CB3687A3139D46A626D71854531AE64DE2 -7ECAF6A750864CA17876814569FA5E09DA009EBB1654FAAA45CD2DA73FF981F8 -37FA73C5C4CDD0C78847AE1D5156FCB8BC98A3772D7E37F92379122404632C6F -431525D5B8FDE8B6CBE9EFA7E9A4C0FD75D518AE -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMBX12 -%!PS-AdobeFont-1.1: CMBX12 1.0 -%%CreationDate: 1991 Aug 20 16:34:54 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMBX12) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Bold) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMBX12 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-53 -251 1139 750}readonly def -/UniqueID 5000769 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 -B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 -AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 -7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF -20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 -B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D -68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 -D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E -26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D -F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 -77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 -BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E -C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 -30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 -148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C -E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D -E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 -337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 -0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 -472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E -A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 -35FF2C50073D99A7C52C5A8AC74994B1E6BAC878037AB76B193331DFA00BFBEC -389AF6C476A3F7FD9597D3FA2DEB506EF50FFD5104737FC9761AE3FE4B291D1F -26A91ED73FD4E65E2CE59EE714DC525F9897CBD1D844C4F6C3A9BA5C19B39D6B -F6CD530706E73855CCC9F6CB39680207FC8B27BF8E361E1DA6BB0FF2E4967F96 -A64F1C3F9B80780560266290A039F680A69D5C21630588F2F8C7CB0C42D0FA12 -77033062CD1D025A2A3E0808BDD6F81195D9C4784342507866487390F315DEEF -E353611A3319D136FD42F44F96DC632003E656A4BDAE4A59824F7C4B1A8075D4 -73736A581BFDEA1E77AB84EC7FAE1968C5872AF5B49B5EC8D5BEB3C88C01CC0B -06FFD726ABC7BEC857362066BEAD0151632E48F3F65CED9A5DD2119621409708 -83CD8913717574690B6AB5A56CEC5F49AA256322591942DE60B867C50B562148 -2CFE5CEE8CF32F48042CC30D219F7F02935755EE80DA985068603B762AC9E6D9 -578C329AF955BC8A588DB755D2E34E1D546855C4650C8AD53452B328A34DAA38 -28237FB20FD724D87509D67724FDA891264810BF7CA0FCBB7573D1B2EB9C5FB9 -0A38E0202BDD21744AC650C8A21D5EAA0EEC49ED5248F4FF8E29A43B7B40B10D -AE133FB0A7A4AC58F3DF59A8CAAA567C444AB7D38F44AA6BE56B2DA2F13A975B -B70DDF5B29099B3C7381D8201A41DE108A5518664028766A9FAD0EA13A0705CB -2102035C225B89C17A216CA90D220E9842E3758F9CBA61505B963E84189E9A5C -DBF890A2A45F39F86F67C369DC6F2E76E8FD2369DAEE8418569281A6E6B79950 -FB8DF17491490DC8BA791712E3E314D2FC71F39335EDAFC880873D7A72650703 -E7694961AAF73FE0CC8522468FAF6BB2D544BD49EF065CEBF26FCE1DD09538E3 -CAB281D5CA9FA9A8B31FD97D22D4F76457CAAFCFA9939B1F786C7645A8E04A47 -DA0DC490BE8CEDD23D4C18823D9F8CF0B103DCBBD3216F8EEED81E84BFBEEC93 -0E7D17784E1066605275E754A701AB4F2B331EB67BEF4685A45D388213D21F0A -F0F84193D4C3E91124437326E8E13284706DC37122EC896E2F18D0E0769245EE -25EEC762EA684109BB0EDAF3FD73527B6329567EA8C324C628BECE6B37F33335 -CEA67A1180BF579EE857438DEB64B438A5DDECA92527733490E47A8A12CDBAD5 -1948D633949C11DA71C6854E1A9920B3FED7EAEE6EFDC2ACA606918E5B9D17AD -2FE6B823FFE68EB884052311E2F59341E987E80DE9144E98B6FE3945A5225721 -4A771F03948945177A5B2ACC01539B013E54FD9A7DB151A8FEACB3457E4284D5 -4CE2AC91C8DA738051E34881F2FDC685C0DDD273BEAF8F4E39829EBEC24DB40A -832FE75F89C93E35B846626F5665C18001EED557E9C66D120A5AAC879E69FEDA -05885A892281F5179561F670C63DE8648FE8E7C04B1CE54D2B05DCD31CC7B54B -4415909E0749A50966FFF18E2017F3639CF3CB3D7C84542A0E0591E33D4D15E5 -C9165AB8F3E0FC5A555B98FC2C6AB580BC1D9975CED3898F774FFAF1BF862109 -0AC19E6880A27EDC56373EE479C8B5FDA88AF59FDF0EF849E79AFCE96F82424E -C9D0B24C7A767C984D7C285B199CB0A56A731383EE6A28CEECB9FA656C84019F -9B445873F032E989D55CE131D724875EB035E082BE404BD7F2F9C00792B273F9 -2E94142A6FFE91C98673F92EAC2FDBAC1CF490482C416B3FCC2EEC79D65530EB -5F874B3A5009383C7699FE928BD710C210F35DA23377434F1AAE333D52480487 -3DE7EBF3C574F3C184B9527D651700EE59EEB36BBEAD90163DB8EF1595C4230F -B5366782EE60215AF2F122E22FE40710FBF799B6AA328A24FD8226F8FF266225 -EC1E2ACD0470B4E98F5AB4A4E208283BAE090207A31B21B595F9BCE1E8E9D0B7 -0D637476F25E69DBC5BD581010E50E26C7EACDCF70030B462E042BAB5D7C0188 -362DBB4D943E50DB72619706B6AAD247470612A3DF403D0A880E92D5108A4976 -FC46C9B7594642B2E62926580F136B23098FFA3C3614418E87D0427928202ABF -5FA3E8E5F387FD6D49F194027FF6C9536BA83627EC5A549DE4D107363FA9D1E9 -920E40885554C0EAD0EB5EDE92844B1FA345CE968FBB0BF335494ED48EE8DBF8 -5D1B31E1D83F4C6D559B873510A2F4E4B4DE8A474C200F555E31287C955139B6 -81E5C932D737D58AE4177D82D9DF8E27E7DB12CA995A43E5270B582CAD2E761B -BD4FF0BCABEF271DF881DB68D86DE567D2F3D03B1978322F53B8E15A39E9BA98 -E0E791EFFAE0AE16562BEAF679030F69EB8F905AB9EF18FA12FB20AA51A2859A -180E2EE6356D8ED5A9FF57A915A7435F66E2B74AA4C67B682BDF0D79AF847824 -33C637453D5927B23FDE130D87713EFAF350144BEC2F71ADA6C2CE42D83C808F -9DCB0870B9AA1406F8ECC954683109846D8AFE21A3A7E202261B41CC721E6A11 -1F3C69EEC70E709DDBE3056939D17AB88BC24E5C39ADAF03620E249434F8765D -C1D35DD072AD102983FDEB76473081FB4F3159B5328DB5E559120DD3F9F2CC52 -FC41A9ACBEB2493C5DB98A4400938CDD862432E45D048B5D49E75656F7E95AB6 -C445D9E89260A6F3FAC610D890B475B211D85AD56BEDC3088723C414B1F2F88E -790A1C45CA9A0153432A55454BCCEC669C3BFF7026D3F5A8E9DA2B6FCA873CBA -14664D0736657586909DD32FAAAE9997DCE88B07CDFBCCC723697A8D4863B953 -30A55C5B4F13B0A8C7F9BA0EC72F3230F24E0E78EE768B410898C31D300ED1E0 -1D984636C66AF73CB089F631DA4A7FC122E4149A39DBFCA3AC57ABA5D6A73494 -4225871F313F73BAC597B5AC9E3FEB8BEAC9BEE448E7DB37E6ABF0DE302F1CBB -1FBF360FD9A4EF1D06118332CDB96998D8D26F96910F6A3EC6393AD09DC4AA8A -782DEC5B9FC50281E4DEACBF5B4F47A8EF827F730C7BAD6F224947DCC71D3D62 -A70ED9FC484FA8358548BCDFF1AFF124B00EE1E30286B6CEDB37A0D30C75E86A -A680683A7487F3554CAD50E45F1CBE89DF309ECB522DDB9FB4F4C3D4437172A6 -03D7D20DC053C71D5C12EDF2CA6A3340F25BF50E7452B42218C9B1CA8FA12D5B -2BADC3341CF15FCE1342078BC7387EB5E326C6148716558E983F080EB27E2C30 -B695CFDE2DB100CBD9AF7CFA02E99A91A400357C3AA29B2FE1633636101C603D -4CFB0E52E16AF001FC6C88A94887C36BE39A5BEFACB417449154D51974F6C1C2 -3BFFFC76661FC9C517592D51FF6CBFC77437606808B993E15634AEF0260F4017 -FCF6273E72ABAC97B0809ADAE44003417FEA16AEA3021A269883E4712F040C9B -29F7A534B0DA2796D62FABA6A58D0D272D49C9ADE6C726A23283ED2B0EF8A4A3 -B859B8CB775CE955C52D3493A1723CFC519FEC1C6DEB7427A42AA2AFFD429303 -BAD265B458B6282609B0B302DEF2CEBDEF7CC4AA2646895A916B620801B7AF1E -711DBD4660DE5EB12CE5550FB040D35C345F1336DE173F97AC8004989916806A -AAE89E4226CEF51836EAD16E84C25D6A94167832F6385555E950C59BE07C4106 -BD61D92A30CBEB49AC390C85F0DF83B78B60B31635AA39EDA6E788C17645C715 -DA2DFBCB09BAD7FEFBF14CC4FB34501FA727BC84BE574A2A41CC87DEFCDBC67F -8EC499896E01845C2EFC5AD6F46085FE6AD723311552FF27233050E044A70269 -ACB3CC6D2D24804DCDB9FEE91EBF08983C05C479AA642F466945037BC361420A -48FB3B335E3B4C6C5790CAFCF6A0AFEB27010AFCE9676DDA871C2C9B5F1A7935 -0D5508B7B36560DF7A4683A4D6BF39A205206EDE0A40F2FD6DB1C7CE9BA7C777 -1620C2F88D2E607623AC150E2500175358B0B52F51101CD2F052EFB6FB61FB80 -981AF8BC99A5A50DFBF3FE7E4FB054E082DAD488AAA3B194DFFAD38842B4B7CC -FA49E430082980182D3B8F70363912EA1C8A742FA7CE38634172D2BF3683E6AB -3224477668D6F8BFFDB765E6AAA73FD52296E1E145E9BD9EF188F952D0C421D7 -BC47FDC6F314F6DABB6747A0478E826931A527EE40FCBA09C5CB475FF25867BD -0CEDD4110E079A823E60C8F66CD9EE1CA449EF7F1DDB24C0253D0376531DEB9D -32D0F4CE9F654FF5ABD881A4280801D1FE53EBEADC5417F9BB493D0E96AC11D9 -AB7679B12C4A8AF81A6708684D0F89A02F1FF17DB818422C2CB9A53AB0D22F47 -AE14C4685DCDA30639CD15F5C3ED70D6282CB970E6D2277ECA67DA8985DB3432 -BF2B5CAB0B43EFD41E7EBC8357EF10E05A8056C3587AF2F1888D330D5F5E2DC1 -7C527E00FA27BC105194F167D204D326565D5F0930ACAB12E684FC5A0B737D80 -4D1483984E1EFC6D4D68C80B29E1DE30CA10F5FFE7C93F85F6E3B81AB9218FEC -8B9A840ADF35505F33C89D300DDA928309D01FA5230F608992434E2DAE06B254 -6B80DFE8155DAC4A8847A135F424CC090FED4BF3E9094C5F983B6E04B02DCB3D -B72BC604DD8B5DCB11615D318FA8E19751AB4A01BDB345A91A80F230EE0BAE07 -1490C4F99E8D39E8A08C7B9E10BCAF8D5901B67A4FDCB8E6A2D446151405361D -921D531C0D9AD889780A0788AF5687BF93D9153508E7DE305D8EAD77A7238B63 -B70298F5E69A3CA3994878D84A41CF598F9607E092C2C666CD3C28C60220CFDC -E84B94DD9C1102C47950F0D921B82C07713834356B4C98272E58A89673AB1DEE -29F5CD9FF4B9EBA06CF42C64F2A2B431A76A54E8846C1D2D6C2E4159E55C44F5 -029B21E816B20DFFDDFA80307E69BBF77283B3DA3B2B5ACDD7256178B060AD34 -DE211EA094466DDC8E21B86EE829922FAA4E381CF79AB127A661D2DADCAC2BF7 -34157BED101C99D4B66E79E7EB7B280E0D09B3CE950D05FD4684F25F671428E6 -EF4FAA6C954F3F3BE6211508D517233ABA7D9F3CD20BFE4997BFA1614BC08203 -A8333A675EECBF2532EDEB0B79F31746BC5BB0C9B66547F1AD81727C6F20D4CC -DB92BB5AC94995875DF130CA62DAA08C818DD6C9300E2D55CCE729810495A2A1 -1180876A77F7761DA8E0F0F55D9312698AC47EA798838A4FCD98BD4A565F5196 -66851C3B993D3B772681161A2FE70A2CBB572BFA2240E8E496D1356FE0C00390 -7FE892B9E5DCD5B95FB51FE1BF4D0023F55D90C3EEE911E57E233BF2BA4F798E -313F32696C4CB661E70352CBD4B249A430AAB49FD72750940B270E253850E3DD -7E3A6243DB8DD50867DBA3FB99138CE0DA178ACDB41628D39D84A5615C720BEB -8FDDD9CCAA15D8A258DC0506B40D4A9BC31A813FE3EDF80E02BED2FD23F2CBD3 -D5A884766AF71F1C694D4441E9C8634A985B6CBD5B27E9C53CEFF0C1CD15FDA8 -2B39BE515ABC1641E1ECEC0CB5D00D520C7BAA339BB385BF67D424118E5F1396 -ED4D402FC4CB89E35821E1A7A1324BB2EA509F64179EDEB65BA1F65BCBA55EE0 -993FFC039F22344FB6DC7440B04A570525F3E3E883BC54AD0E9C573A23F19703 -134E79E70E94E4C3D3E1009E81449640E14B68B88FEE047A2CCDE3D544D692AA -6461DA69C9B9E9647A80496FDDE8478095E3E743CCB6B05DDEF9FA18CE462AA3 -F70C77DF7A02C0D484AD69D2D350F6550BD6DBB6C79B0D72AFD126B11E8E4C41 -43F7AB39E8BA462BE6204374C5BDF2E5C63A5021D4F56D150BADDBEA5AAFB721 -E486833943E1B23CDCFF4C9198CE27528FA3CAAB96A925956ECF6E5699BE4B0B -F2F7F0EF414B6FD35549EBB0EF786F47231977DDE4375E954EE10BE17999460D -82194CBD1F796BE5FB270C966829150D9EF64B05D1B00C73A0E19F02D12784A7 -F3224310A981AC4E58BB63368091377084F921B4BFBAB4D077736F4355DDA20C -9F7153BEA30FFEE629A2247C6DB324C9EAD295466ECAF1D91193B31DE2B0714C -10A2401A94CD38734955C9A6D50680E15395F4846F4FDBE5D9D851441882EB6E -83FBE39C7C3EFAE853C70827BCEAD25050CDA3CA6D5C224C471D9DB73BDFC356 -F3E8341C82F6ED38AE9EFD91A430AAE2603E7C9A2B9EE81047129FDF56B75EF1 -143C7D2CD03E601AC2C8C582CF2277B820F99DF901C9F2698D968BA402CED234 -110E24C7E331B1963834D6028DA7F0E1E64C94829888A3F0E54C6456410931F5 -B059CE09E81047956AB8956CBC83B99F9532326E2A1572BFE9B6856042793DC9 -61645952319DA1971BA4DAFF18FACD684A2B3A15BDD559616843B2D5FB68A7CB -712D2A64C78C58BAA63B8DE6307D46436338C6F19B4DC0304A2D017448C2CED6 -A31E5C41F2B4CFBD66B9DDB71684D68E2CFF268946A0D0E3F791920F2FEA7BB8 -517F0E3E9D6F94C6567545F87EC7B24AE36CE3C047078CF60427277FEFBD9368 -2D42E770E3ADB6F95FE9B65DC66EC68F29A386012E812B0A095C3C83305D1F3A -80878B13276E21F3610088E6A19F6CCC4847A68F09A316AC8E46A925CDC0FFD7 -01173189774AB33680B6E593E7E0166ABED14673A3C2B6ADAEB08A292C7E1295 -9EC140C24E363DCFEF929C45844D7DDA5180C54A3B3C791868426C5F0E5640A3 -CBBF8D6C4C5B38E110171B6ED032266D7EA9E29BCF16355AD7A904E231E6BA49 -44FE08439DB307D1FE5BEFCF4ED9E4E9A03247C0DF547A475DBBC3D3A7D0BED0 -8BE7532BD196AEC7F505C33FCC9DDD67981139FB7998DFAEBA1CE865B11DC996 -2AA56E05A0C6ECA43771E0F671C0D5D6BAFD84404F4D3073E29DCB9974E84B1D -40E74751D300AAF6A5767793A07357FAB1B9B64AF6C5DC83A882FD74B01D9857 -7C970FC4C9F1AC956CE0C84F88B1564A515146E9D5DF766C3CA61879115CD20D -BD18DA8509DD7D7ABAEA297CAD1BF9C1058BC1A87C78ABCB76FEBBAAAC6E77CA -8F0E06DA48CB7FF15F15EAC0D0BE75BC89C40F4F265A164AAE406E1621EFAD63 -922993208857EF1022BA53604AD72EAB4708A492C49CB7D1B6DCC820BB583D78 -C3430090A74BD416D8B4E6A9631247383780947D5A0E73E8AB4D835A432F5180 -C311E7405A1EB0CBAB68DCE930D7379693AED1B392A499AFA935C788323D3D14 -678F3000121CC4216EBD0083AA41960736A7E132DA255735652B61152B4DC0C7 -B8718543A30D0B747D287DAA21373543A2A4B0D337B78760E32B7E81CE904E7D -86BF24B8D41E7E9A6B2353220C38C6264F6391E02E63F20EDC21E16446A1EEA5 -D9E52C1E211F7FCFC6055D5E815F42C20891C6EC3900058B021C05F339EA4ACF -2092C8BB5010C09F8AED1448EE20BC15F5C622AF0FE86DF1735F0839BEBE8871 -3938B6C0AEA647EC38353480F6C22A38517DA13E523D95ED2331445E1C2CB254 -AD9BD7A35497A71FCF67E1156EF5BA19AB96E625F093C11079F29461BD822314 -906CF8ED83277FE0805087BB53CAC8B7C62487599DB36CB5D549A3AF360AE184 -F12B03836B62994CD15D66430FC8B5F29334612117BC2D09AF318DE848DE0D0A -60C3C63ED4C10C54BF7647A71B22F81EBFC9F135C96F7C02796E3BA0A0BD6B80 -B64C8406678BCA64F3970F73FD9DBF35D1BE1FA78988C94DF776653508546818 -10BBD62C4FA91C6F5FFC9B4EA5E49DC77D2F42AB31AACA1C7156E76DCF04DC4E -5E0AF91B80C7A23AEC9ED959A683E1CDB8324AB826EBE250547181FDD0CDC49F -9AD4588FDA53A421259535928B9AE8AE8A64C582AD01D74F58FFEC9F2F29FD60 -062FDAA7234193D4BBE40D9DEBFBBB78A7E2DB68E19352DA9E14C5F6CF5B1CE1 -715EA018D81CCA5F66A518210237485F48DA84A158F238E66EC71579F93E5D50 -6D0E3706FD10E97C41DDB7BDBBD9E71043B6E57F39E3E2428B0156F2BD3ED94C -58C91A4C4732446B303548A10F21304AFBB7BC31B4600E56B0AA -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMMI9 -%!PS-AdobeFont-1.1: CMMI9 1.100 -%%CreationDate: 1996 Jul 23 07:53:55 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMMI9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.04 def -/isFixedPitch false def -end readonly def -/FontName /CMMI9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-29 -250 1075 750}readonly def -/UniqueID 5087384 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE -3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B -532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 -B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B -986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE -D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 -9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 -86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 -DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD -67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF -6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 -FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 -22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD -730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F -449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 -97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A -E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C -AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA -A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 -B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B -9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E -759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3 -5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2 -BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680 -3435E9C9444F7FAB46B1A8E628A53CBDC4D4577404624C551B59B22430F1A4B9 -69CE559354AEAED37503ECB297EEC5A6458604C25A48198CC839F9C0B912A303 -DA01579DED7BE963C911C872F196596C93859533742F94A871FF84D43C744927 -09EA781C5DAB38BC501CE7E003927D194E5B94998B5051FA6548B87CDFFF1486 -D1439EEF09B0FF1B3684944B2B2125F6D15DC04B2A458CE5154C929B8C0BB520 -73448B36F03887606C657698508B15850E2206ED56C37A7F2C50AF78A88D58E2 -8E36100305FAAAEEA028C2BFB6E0118B48435FE609B1F02168BB55753F42BF4D -00A3FCC485D8D3431CBE32610EE2720B1221F30C9B08581288C74E7F89E7F8B6 -2C8B55B29AB652180401651FDB807569F5B1270100783E403CB388750F0846CD -3892E34E83B8599E1D33B1D2E402BEBE57C425996AD5DF64F54E17CF46FFA239 -BC689E34B719AAB350F84CA8CA3FC65C008BB74BCF854CE130348204C0C90D94 -A465AD4C8324F1BA659A8F6C683B3230E6558CC4A3842F2AAB6824588822C055 -08563243CBB0E856321D2CA1657B0298CF07117A68276F6A58AE7C2F49B163CE -051AA200A4AA08078369D71FE14E831F820D4852FD64F15A1027C5F981D69DE1 -0E60B8495AEF627BB79EE377216DC3E6577F5C1ED071668C505330CBFA0EF4E3 -9E0492EDF2A386F17722AADBE16D3BC12AE48990184559998A7130FEA6995B7C -A68E4ABA7EF999492B90735C50E3D3457B87F50FF91A96BF6B6BB0931A716B43 -CFD4A74C4CC5F912AA42A943508C3511F1A010E2973AD0C4B047DA3A70A49A3B -233F460BBE213EA49D416E6F011F9AC64DF41126D77A01C9D16F0D241D0FFD5A -F8DBD2A6B166DD12217A796A412E292407837545F0A6AEF44E4961C1645E51B6 -51C6848D63BAE77CE528CEC8FA3AD3F10FE3B5D4A2A0C823AF2917107A68E126 -DDBFE92399D29445C59A43F56A4EEFC8EC7FE4C8950DC0305AEFE3E8C048A870 -25E887A2F1A315BD2E1475F293730E0D855BD07423DBE627BE93EC20853F4ED9 -48FD2E039C35DB25D553629BA31DAC79A0FDF0FD2237B863E1B4A0C0352BB94A -69A579E87E3B58A15E603031BC34E5E345695B16702B2050C944A2023F2AE7C6 -F61B777160EFF3B6258D96D804465CFF754FBD0D32CB70A02D533CB04CDB63C7 -0AEF7EC825C3B87C8DE3856F4B31F3E15AA1422687EB9503AA7CF456589AEF62 -04C2146F16F51856097CAB1C57766899EFA6E54067DA02A2EB0737BBFC5D6A39 -BF87E6EC752DC419AFF10DE77954AF8CE261ABE380DF2A9F6D60443EC06DC617 -1A1B26469EE8F7AD574D39F0954FB681E986FB4C6DCB2A51661E2DB9957E625F -9DD123026E280DDB4E5A22A2AA79104E102DF60E0B3B6CB82B39CF66F7C6561B -AC4EE4C14238F835313445AC11D270EE586ACAA2AEBA80FB084582DCF44764F9 -CB7779EE8C481F264BE98A3C1A68C5B1D251E801FB9E82279CD73E737A2A996C -29D4305F01207A3B97433C149CE58DD65CAAB7D6FD0021F4568EBE4CC3A41FF7 -C11B28FD9CE69BF1A6DB76E15CEF49E7D1464372666CCB04C76C773630CB64EE -A5FF95EF34E7FBE7A284E5302810A108139DAFD7116E5383111CBBC5E3B07BD1 -B0C4B78242879638A679BD50F0FAC02DF84AF5B38FCFF09988D65FA4663683B5 -000DEE3492E0EDF7EDEE28BBF16919F00A08FB362A08E1B4185CA8D280DB56E2 -E153CB81AA33153AA473EBE895AD1A5DCA7503CA0BB8B54FA9510A4715A50BA1 -89E6CA9D119791564524FCE967B08C505C52A6E6453703D8BC35FA1A20FEB162 -4C3A7D4337BB91F9375E9268B915D627372A78F8A84D5ED535AF70EDE8E07917 -CC75C3BE728ADD09E4176B983A3646B2184BCDA8F7FEE5413ABFA9076B76FD93 -153CCB198C68383E361CCEBB82B7E2489D85D0872C050723410524CDB5D04DD2 -C6A573B82C8B110001CAD21386026646FC5DADDA28A54871373EA393A649D169 -CA1F0D37A5E00155E722721903C1A2F235EB14AE87D6ADC39766764759F3F793 -8A8134D96D106C0F37A7F4FAB9450930301E70A062A7739F9D86156D971F96A6 -A19602C63A7E27FB9209EBD090DC20C1EEAB647BAF67DAE9CF17488870A45171 -A1D26FAD81342832C93C8D4EF9BFA33628E86AEC815604AE171473140AB976E0 -9E33A97CEE262DAA8E2C1FA68A23DFB767FDC0836660734C217BF77AE433B156 -3D33CEEA31683EEFC6F89AA916F902A73836F48745E9D412ACAD33382752B16B -260C14BF958BBEAE486D9FB6231A09161EA3F277A8E0A8CC04BF06DE504B100F -BC6C4EFCD60E1CD3BEBF5C64920F7002D59B964ABFF1AAA47EB94C2B6E0E0900 -48417E803F0BF90EB718B2352C78617B3FB43F8E196C489C938C182B3693B487 -34F4C973A7722BD15DD2BCD5AFF82C42F8F2FD44B597D2FD9E104025D396AD03 -2A258B8F96B1D411FE713276BC275A35C3E0418A65EC2E1C8897950F0AEDF822 -7FC99A27508E19E42715B566D784A1CA324A9ED9E015416F6531EA7B3F388CE5 -BEE4BEBD775E63B9E45C6622661A1E360CA636111D4816BA306C50CFA2F9FE30 -1176FFE860279FA8011009DCE19CD9403350DBB7882CE5EBBF7224B42F54BA5F -933145BF03CB8CA6FEB3F3C9E980AE00C917189ECE129075DA7C0AB73DB571D0 -2265C81E099671E109168056FFDE29AACAF12836DDF0F49B67B93586D3DB4845 -94C68F81481E11F97187BF5069061F6D6FB47A8ADA97A59C6999D0B5624CE935 -5D961EC24603A8AC2835BA442AEAE9DE1597CD5F1E1D49DC5111A1C7478C8C8B -8F4AC17F38E0F01881548736EE5237F3CA6E6C7C4B681E4F920764C1AFE032AB -CF5EC6E21947A7EF8A9FD9171D68FDD16B35BFEF9AC87B657D59368904D336AD -F2906B9402E13817D64E485C93030B64E5ECE2D45B58D8EDE1154AFEFCB1625D -F31A7D595B95410B8DE67F896B3F3539F8C0E7D347C938408B44BFEE6B06F84E -F76B092BE82FD89966FF987D6DDD3F2074BD33403B1CF1825DF0B20C31B2C7CA -95E27E8A7E1ECECD6C1D36E6EA498D0F274816E9502B60E22666643BB248B9F3 -E11E4B17950141044B81B25C088955F03130B05C7BDD69302AEF3345231389CE -7C1AB2CE93750C0A61413B198C8811EBE10EA75AC9851E80B7151D5986D7ACA6 -BA90B1104B18796907751C227F383CC9240E4A73675DAE8B78E985561EBC8EE4 -40E10C1E47821937D710161F2149E5CBF2D566E160B4EB59BF962D82F9099D17 -D36C294668FD37207320B30524284DAF4DA1FF83C398FE52155197050912E92B -4BDF9EB12A3C9CBB284978A30E835E5A1D1528E645C3A39C2A37CD3ADA47F19D -B3FD1B48A04C67A72E5CC6C0D4C8F79B823BAEF2D58238C6102E28951F72E945 -1EFAD61B2A661C6D509E2574635A66BED21623DD608A605F0932944CFE7F5D4F -9850C78E57D4F1884707C53FA0AEE12FA80B24697E7FC678ADA36D730BBC484B -AF5BE1F8B225EE0E14E46D9E188F69EBFD96D4AD3C8998E7E407EC93D3373C8B -9B5BB746133A21E58B6780E78D91DEF0AAD36A004197E11E4B1B6E0E8E57E739 -9183363149A1D88E709294D9C3563F5C4A5085527C2DFCD56866E259C757A90D -2FDB17D586297C08DCFC3D13157830AC9879432E314D11FDCE886C7F3D11497F -6572EC548EBAC1A4EB9871BDEF45C6EF0DD12524CB8BF3C5AC58D1D12C4399AE -0D2DE1F7B09A2769A82246A490831D48C63FC521DAB2609DAB921741A5FE006F -75B32F09AD1D554034C9E050A3BE6478A54D19B9DC685EC8802489482CABEADC -449FF21A98FAEBEAACFD9ABF494B499FEE00034B9986F41A43199DB38367CF55 -EA41C0E3E923B5E86BBFB048CBAF05708ACC1DA188426C20B54D1BE2B0A68B82 -3B2019CAAD6676F9BC845B678404B536C30DDA9627F1C40D3BD3A6B8CDF4553E -3CFC13D25077897959488132E8729A47A47917DFA1186AD54C86A6431A4D0894 -899452839DE07EE0FC73568A3FB4A1A8CDA2F7165535F65ADD78DB9397D6CCF3 -A8F054DE0B499237A6E95EE39B3FC1ACF590037E27B88ED867F1E63BDCFB6CAD -324FAA94F2BD5DEBB7EAE6A1002D4AAAE629795719EFA6EE77B7B12007953C33 -8C1BDAE47A6B8A03208301F75335725E5F81BB0C390CC2C12D3C5B83DE9AE79F -403E0F17FCFCD71BC27AD58AC8944405C0BB14788A58CE4D701DAA3993390BA4 -80DBF35F187FCD4C9E72A0FDDB0832A828BF43CF9CFB8D0E9BD8610EE08AA8B7 -97208890C0E7ABB3E54212879E444C9BEC8A4BDED85C87065AD98A0DE2DA7D9F -EE8C5ADE4FF52901F2FEED90A640CBCBA4A1A3D679F7AD52B0C280C5883E36A1 -5E466787009F10AAB413AEEC82CF212A16904467FE5FB855DE45D754C0A49D1C -A8551E9A2C401F1C428BB9F6550AE46A3BBF4473B478E3E9EF81A95320E8E470 -4BDA3F41AEC46E22CFBE73B60EE1603C6F9F778E3D661A502113DAAF4A9DFA60 -0D4212C592DCF82740FAB1EE7A10760D992C0A44BE4A13D2E29684DFA2B8046E -D93E362D093F0890ACB165F9AE7E2EE93AFD90E3D338E2F7C78BD59F00CC8930 -E5F051DD738A602C325EACB05D9079910C784872A3C5C583C2D99E5D6CCBDE01 -147EACF8DB8FEC7C60EA6DF68CE2D00523D779823A94C032A96FC503E17E3327 -2F953A9D94446946D3B269A8A50B539A55FD4C561B6A15714E3440DAA053EDA7 -8A6E214B35FF41807B11ED193C0F446ADA88863EE789AA3408EE7CD14F5330C6 -F1D40D60391E057AFE4A64DBE865255D4C01FB806BFD2E8E3BC08D40E7CBA2C9 -66B1C673A44B140E13738B93EE64B5B137613B2077D66D762E386D3EF47F014F -E3A1B359A993488558B87C8D6208F78ED3E7B281244CDCF51F114E736171BCC3 -345FAADEE2FDE4462A349BD223B1E6295C46DE93ECEEAB0CE43A614099191FEB -6D942578259666CEA8C61B89143172BA4CCA7261D4FD2096BBB245CBA35D7041 -4B799295330F16E80D21D90D8D844476FCDAA76AB9167136CE0823E71F1F5DBE -AD259E79D77F960AB70098B68750D065CB6743B6C06E0122B2999846F8A8075A -69138C54BE8BB7D314928A65AD626E3A749208BEFA7241AB6B5B2319755BDAC7 -1C8BA6992EB2D4F950AD41E181973AB3E0B70DB56844EF47A43D178166FB3AB4 -CD008CC2825E2F4562841C69A0B1BED9625E195366CF7B31816EBB1BB1D8F711 -C94766AFAF56A8F05C50C07EE5DCCB01E350FEF2D3C73E34F7729F449C0EB030 -8D1C13B82A6013074410C88C0C56C01A97E41CD5DCBDBBBF1AE2B59D4550EF0B -E3933838C2E56F233B4F9DFFACBC96BEDDE884BC58FFC3467D32836F3FB7BA6F -0D2DCC23AEA8F8FACE59DFEE51B89E52E40D8E86D2F11BBD1BEAC094260028B4 -C11470D438AA11204256563698787FF010EFA65F0400A4E506F3C66ECA73F2E4 -11D711C750DEA94F1718E0A1E0C805C9E392582E5EDCD0920C0801034F5A123C -D4B073E4EDC89F2798ADD8F5D94E17B8D3185C34B67274262ACAA6B7CCC86CE5 -A8B28182550C7C5A22095AFFCE4960D055C8F69F3EFB7F9EB05FC78423F91B0E -887AFB11F326E04B1E5FB913A024C38419A15F9EFFD5606FD1E597A46457282F -5D9ED13FD0438382B0B3D81E0678462E710B726136EBDEF6909B653B7B03105D -7E904E49E2B42433425F431FF5F1DC45FD4846FBCDA5106409DA78866F285FA8 -E74B8CE093CAB0B0DB0B565D69434F3602B6B2F8CB6AC3C10A92533B5C701B7C -0130AA4188193FCA0E77344272FB7A5D80035E4855CBBA6EDCC46F49BEFA0366 -E8203B2CFDE9C38C7727236064753848BAE8B3FD7972EB7A97FB210716710CE7 -19196CC1FE352CE4D039361B75655ADE041617FF48805E40F18C1A15CCAAF2C7 -9698AA99BE4AFB752D61F0F266CDD50645314BE5EBA28DBA56D5CEB84E4924FB -4D6665BEE676A62E6EE3F5691FEFB5C868B5BA1337C7BD7A9DC487AE843C055C -68E64C43593E7DE85C98999572B7DC49D26418EF5B7B9B26D1A8A6D44A3BA8EC -9655653FE1CDB02376B43AC1FADBD4CDDB51B28BB6428AC2507C589ECEA19EFA -E3874921068C1D44013ED4559919E97E1B1392607B745A0A86ADF47FBC064511 -CAAF33B08178E52CC8F8B97F10876214D367BD2CA0E5C3539D0D7A7929ABA8F9 -9B678421AC3A826766A8398AF1EC211BBB559308660FFAA0412B311D239D57BC -76C1613052FECC826BDD530583D72B624EDEE03940D9EB8E0C3A4B092153BCDF -0850918ABD2F8778B047A4ABFDA3059C2E7D1EF592BE6CB5BDD5C28B279F4C8D -17E2B95F50D544BBE6219AC6C30C971D86D23B2E6955943C1B752D87097A402A -BD2C3B0DF3B321E1FE2A76A709B64EE206821192398D0002E7C3F4BF4B0C2750 -22F9E421BC8F250FF51E581AC57F2F539DD62DE0D578A8003C13F4C444C9FB65 -3B1148A6FFD15EFD3870B3562BA78301D10045CED79BF869DBCEC553FFB25C30 -DD4571498B5C0ACD192B2682A0E07AEF79559DF8BF06D5CA27E8EAFEB51860BB -9EB7A55CA99A058C9CC108E63353D17588CE47AAA026EE7D81C37FB9E8CEEDFA -24AFD525EED8361BAC209FEFC5433C05000D4DE8272EDB3A3F03345928627980 -95BC6FE7CBA537F0C20D4860EBAB5953AE2B3C6D3EA2FEDFEC406B173BA197AD -F1EE8D2C863AE37DDDBA6BF69D703846BFF588B2D0A7D9C377FC5A22C1C6A31D -6FDF4111AA1DE8FDDBD24471741812B50291EB1C8FD18F54E279B5482F0286AB -BCC97B36742DD1CA84BFAB7E6A06CF1F51AF95AA5E2E3528953519CBDE9F8698 -8F63A4C39151836B17ECC8682F4DB8D57FE5291DA744D1AAF3A1FE0256E5A693 -09F0CCCB0F1182A75903ED1BCE4E32A9F0A912027B4CD4421848FF3B90257841 -E0B0A7489BB3C50C81026896E8AE3C16C8D359881FEA962DB8552D3E81C9D563 -DEDE01C2CC94071CCE974A6F14AB42F9DFCE160741D0A8B36A1ECE3B4E468799 -B7F4D0B5DFDF8A935DC9CBACB40DE0B5D1103BCEA9291CE79A25816A8436734F -A00D18EE0D3D54D541C432D2D072D9B6EB634BBE600F02194457EAA787259266 -94134DD491DFAACB2F3372F81164CC03B477412CF4296B4B2C7C40E6B76A8E04 -A02A1A22224CF95FE63C5FA41A3379B819B2B8716AD3A196B4431305A5672E7F -40D698D4F69662C370D894B39CB2CE9D68172A46818D5A950E2609167D9D79D7 -217633C5F8304D1A9A1D4EBBCEF6B47C1BB9ED75BC0F58932CE7F98E77BBEE87 -74F75960FE693E2D7D588D93D5A620377A8214B270D68D7BF9440379FEC9EA2A -B04CBB65D29FFDAC50426BAD1A30E2909A820179F1D4E37833CD780ECAA9DF0F -B54B0AFF2F588D4DB2285C56765A2E360C7537401F4A0F897185B497E81A4F32 -4562AC243AEF8FC7D15D53E4CA42BBF4711FC20C86194F89398AF99B971A6048 -24EF9C0C58AFEFEC63552322 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMBX9 -%!PS-AdobeFont-1.1: CMBX9 1.0 -%%CreationDate: 1991 Aug 20 16:36:25 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMBX9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Bold) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMBX9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-58 -250 1195 750}readonly def -/UniqueID 5000767 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 -B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 -AEBE70DAAED49EA45AF94F081934AA47894A370D635D93B1823EC35EB8316AA1 -86031FCC99F57CB21E8400E54AA474B57112F0D4754A16BEC19117E9D3638986 -0777A71B135CC18E20E193AE6C2BCD89F4A27516DBD2BFE69FF9920D547796F9 -89E0825B6BD5F492B36AF136EA91B826501ADB1979A4204B2CB5C0517F2B9494 -9B2077F316D2B3DA256C99F7549E6BC4B04FE12072B09B4F5D482A126AE351F3 -97DB85F3026A793B51E6B28B54661FEB087F011F0BFF67272DD1E8825C180723 -22AE77CD6166D2605D0C0F131537417CB60086F08E7197AA916D590944BD801B -DEE8F29FFC516E11396CCB8395CFEC9262E22521882DC0316B0A129DBFA5FB57 -E656890C2471675E0566FE461028FB05532E274E6DF77E7D320D09B2203BBB5A -8B185B66B2F8A18A49589C4EE27596DD56260D0D759D2A12CEF7FC3010BA1B36 -85A2FD45129DC01A0C7570423305C25D957DFF9215102FFF35F428C823D549E5 -014E7F99ACA6C10B3C92805376D0F3F280D65852CEA54F5CC9DEF9EC1347824B -0733D3341B34937316E77E952AD9366D3B2ED045165565F07CB636385E5A5911 -2620E185B105EF6C93890833054E05B6301137338A3F1D6AB2F80095E57AE60D -6E5EE2764624849978C811EC38E014AE4A5823734C5CEB2BC22DDA46BB408D00 -4F25CA8ED287D35E26A4CACA77D2D4B986ED2ADD3BC0C3405741CAD56DE28C7C -68E8944967C022CC55907B3DFACC1EFAFD38D3EDDA1AADB6E2C006ECBEFAC8D7 -18ED3C46C331623D8FAACC6CF9292B8F1B407806A0D4808F51A5BC97FC6D6169 -B4A86870BCF9F4409991CE05CC4FF7B175EAD86267C03413629B6246AE23728F -3301B0EBF252BC91554E82631A5485CAE85464807571069BD7CF36E4836FB529 -B994EBD830525841FEA57EE40E2B223B906EBBA53854571957EC8B9D4AA2ED97 -C0496796C68A41C9A84683D3E77EF80CC6A56B78F273D2F27FC9C932ACF0CE77 -355E0461E818CA0DCE986C5E5BCA9A4826B51516CAC05C6750099F603BD91452 -E36489BFE2919F4B6935F29160C204E778EB9C23944B27A0F9910AA32958234B -FCCBC2409860B371BE52823D22138D5E3E606F3E177EA0EC6158B01343D44B54 -3F14383E782905777F7493D0602F24AE3DD8B698038E0100F6219C59F51784FE -F79259F92A2B13BF8F1053654980089EE7C199912800B107E1DFC93CBEE05185 -19C87C172A224CF569DB7281577D628A98BBE0894362A030596B49161B1449DF -08CFFCA53B81A5F6219C79900FBC1978DF7218B303B8EE24BA647925F7D669C5 -BE81B4C0250935A17BE02A43FDB64A5DE5E8BB679AC0F2096ABD76C9D56555F0 -82FD4FD26DEA254858465FF0C4D2A9BAF8BFA4DB6F703D8B0A6C0060254E379C -077D577620A41A5C9EE29896AE78429079A0633AD5EE31B2CF4EE01760CE8B92 -FB4973C7E59357898A01F147E0FE6FAB5F7682997CA9A80C7837B056D08FEFCA -55F999EA0939DE8B731F9E0D37C7E1C30F5A0720BE13336A3117E8CFE9CD121C -6EEEF68E5CA5BF50F0054B20A58528702E3593F0493DD012E28E0B8DF0EEBA9A -9928887ACC05AE5FBD840FE28E514629E5CCD4C085EE30DED3E4DCEAFA7C7C6A -D4B28BF45FF39F02199E69ED5595D0F236F4385D28B6FC5DC7AD94AB576C881F -6FD2FDC7C0DEB91B855B11A94BAF1DD00817E3BF710420A06CA55639DE37BECB -9EAA94B9222E155606AFED86674AB806791852F43B22540A6A57B2372958B201 -F39C1EF73D55BF1D0D58CB1307FE581E11F785E80A5390354DE7F25EFBA8A8DF -71B55A8A78F9EC136F83EF05B1C596FE68FDE8972F0D585D978959B5E3DBDA01 -0F795D64BC652BF99867F332915B7A7626C58AF5619F01CB251D17E8F7EF90ED -90BB0304907842E48ED402286A8D6C361520A38F631EE09BF9F0595302CAEB7E -E0627AF48F6A51A5B85286C1FF236BE9A8944D4717E576AD7E004F4E76D900EE -F6CEE804B129A45CDF008A9CCE41E5DB4CE00F94A734D487475F36CF35285946 -68879B0109F91A5A851A6A9CC7822450613D7D1C8C2EBD5FD34A859C20209B7C -F45A5E9449F40403FB1B3E8FEA232C0CD08B7046416F629CDBDF7E168ACB8AFD -96764542ABCF127F73D2F9249DFA9DFF428668E74568941093A750C54982E9DD -026672F7FBB3304A97245F6A5178BC7B970FDB1C8E29080585E96D5E87ECAEBB -6E91A0FB31FF33DAA6A0FB5CA2E06D53FB7BB17ED380379991B0BB99614BAD93 -2B9F876B162716E11D4601CB37DF3CDEFC4EDFB1854D233DD0BDAB71B79FEFAE -B3CB8273ABBAACAA0F182622338AC41B0476579E246B3B242F99153BA087976D -1BE003706CF7C852759F80586C262F31EEAD0BC6A74FEFA45D942A683F22ECF4 -5CC66BC062AC52E13F8EDD55DE5C43669950E5E32F439142476F408293C561C4 -C68433BF5A9C922DBEA834FC851D58C2CF8B032E069EA0D84B30737E69E2757E -B56EE741755927FB7EEEF26AD4130B67E02DCFACC8F7A0185C89876D23645468 -683DC2432CA86C0CB13A046179779F2B9862B10E3CBA75072FF46EAF3CEDF266 -CBE36460993CE826FB794BCB487F64416C2F84569BACAEE4E6819718B2A12869 -3146068A6B53F296DB2E9BAC98067877B240CFAF64454DE24A4673B4B8B641A6 -C47C4D0BC68A814F222543A00E3C604ED2D90B02D579EC6FDF3F30A0DF852B4E -EA7CFAA798E0F923797A836BEE58016228B5B618EB225FE6817CA22A4887F603 -E7AA624CF11B3BDAE88FCF29E9EBF1B1469C89C9A7BB84647CCFDE157605041B -A460D4A33E4B035D1DAA01992A70C6A3AB137687DEC810306B0903A250BA77F6 -48C8F7DE22DD376DB2D220BE434D7ADF8F2B6FFC8D05402829501C2A642FCF39 -325B4540A0C3668FD07CBB7524225A3408565737356BD6310DBE6A87543ED33B -3EC0A11B004ED097FA18DD35F1E951A571D5A0952421D3935A523B9A9F1101EF -AF51D2216691BB8D15A45F80C07A1686C6FFABB1DDB7042DFED82EFB0AA85E36 -57C1E8B4D73B357ECEEA0959D408CE4716C801D0084B9B85FF4E483BD65A45BE -0767EE922185E5CCBF337702F686B797A3E0654513FA554AB58A7119730BCEB0 -EED92A68F5CA12D199766205A95F60050DA8D57CE86D840E6EFBF7863A8CFE73 -15C1D4B06BEB5BFAE76AB76E4E4F58DFA94ED65D4404F085187251E1717E011A -09A2C9ABD854AA408597DCF2F1140E89B570E07D970DA68FA8EDE8B693C974AB -D82BCFD4FFE094C555D8A94F50C9223205A87606383B66143D6BA40BD4AD6DDF -057E8581FDB02610ADFCD943B146DF118AB0B8EF5565252C4DE736FF1ED791C5 -2BE84F9305BE1DE1FE4DBBC42A186BCFEAC8E9520CD7A9C4973E4036673090E6 -DD3AD99C216629EC77BA017168E836EA0477BED73D9929D68F5BA24422DA02B9 -607294139B756061200629ECE30DF461D4188C803A1BA7946FF2760CFE604485 -6814F3B63E8289D37B7A3C5D39BF721CE956E8DD0EB44B959F1D984B19547376 -CC167DE2623DCF6B780B1F4F279C0E04C3D3CCB2976D2D724C2A207FABA486CF -BBEBFA67702D3B34625BCD4A5DF6142760667E25D147FDD876B67828154C3585 -1632932739CACE514375F014595B0DAA5005678C2C68EF0BAC45308858F61B60 -CBF43C842C83112A81F5F1DDFFE2100B3FF03417257446A3A81516A8B1465A8F -194E5B3289ECC2888CE70B7B6B63A5F8588F6E8CDB9C76BB7AD89A8C7F193F19 -8845FF21429622C31665F3EF102FAA92D413060A7DF9E1338F4AA98A5641E9FE -E02176BB8F75F75F90CF85731D84F32426264C4F4C0A58953CA3D817951FE0E8 -76FA5031C8C7D7B81D0957637C5947156240A42A9D8BBAD3B40ADFDC457BD16B -916633276982438C952D16EC1BB02EE6563A1CF852A2068733E0411F17BAA698 -AA7F0C06CB894BE37538D1F39A01F8EFAAF01154BA2378F7D3E70C4CAC11CAF4 -152FCAFE5602B9A85C8F39B5BE65E5549ED18F34310C476452696643C0B3EC07 -52596744098B56C35A53E3F6C9961DEB3B07D2BF14D8B4A4C2865D66322F2D69 -92DD062606919F7EC8FB133915F890C0483259E5188042913F09280340748C74 -9D3A7F46B33107DCCBA0CB8D52775074F22B47C9BEE182487366B94EF271072B -05B4CA7A05D0B1F2D425295A416CEB4C9DF5F558DC7A2FE51FB30F9C412433CC -179609ED14F61830B939710D2A7F1451262911D4793B19EF27A29E754092A7A0 -6B5D4D93DA04201EDD5E70834EB82F2F6029B9D8EF4CDDB612FC7DFDF2A66D7D -8596B22480AD301A41D11F38CFC9BA623D11D73036DBBA43241EBD14C19F74A2 -FF55FAF1408743D86399E6F16E329233BF53FB62EACD61AD019C784DF989D1BE -ACC83AC7C9333B2902951D4450746514893546460795B4A0B01986220C0D27B3 -655D2AFB92FBDDC8EB7EF69660CFF5BDA74DD278D3F8E0A89C0D7E04ECE76B13 -EB1B45011A494358AA47B957F061F8F77C2D4355D11526BB354C7C8D41409688 -29D076BDF1CEFA98C7820ABF4B921584C6580117366F0B4ECFD356C160F9D721 -3289771BC99F1F4E354D2149E31E2086DD0AC3E732F8C29D2722582C9FA5FBFE -82CFBE764EEFF153ECDF6D37875D759732B0C484A064D4FC40E6E39591754FC4 -6567554B7023E79AB4213B531E13AD9A3BF73230E76FF60B9996338D22DEF5B0 -0567E574ECA4274463763485A800EA21D5AEA2F0F5A39F08A1C9C1024D0DFD47 -226BCCC4E0FAB0D63648E218060C59B150A7B9B26C2A693480CFE79B0DB25DB4 -7D6C6AD5EFFD91488E33D71A0F71CA5BD57051F2FF81361A1D7A1E44D175C3B1 -4E69D21146622C0E57B9F3413ECB9C92D178C755DE8A28CDFF7BE669ED736BEA -C87BF7A6253D599E1B212D818C7EBE1572D154ABD99A458F1C9D7ED45189F105 -A1ADFDF7132FE1401A4AF8DB8906F47C35A38EF197D51F4E4761163677203DF1 -9E316FAD336626D7D13ACC366B2F9D012DCD490B34CB61EABC193ED88223A756 -E7A676CE44DAE8B17AED0D450F7C5B6C79BA10A143CEAFEF63FB37CA5A4EB062 -255E45F7E64E354E3EC9CCD1BB134B63DBBF65AE4866C44C01EC95162DC337AB -0DAD38C695A7E2A1151CB538B818D39A49DA36C2FDA737AA939A41186E272C34 -D0097ADDCBEF7883F73A7514CBCB7CD5CFB82A8A0F009ACB5D965228DE78AA73 -0276B568F352B471CFD12B2F95CDAD77897EAB87E2D7A477742D275150EDF7C5 -0B8BAE47646E392230ACF70F496722BCC5D299B87AA61990AD65945D28A5E4B6 -426AF16AD6867799CAE607149642EDF375910BC50F82A4E6828B4C3CB7DCA3B6 -5BBF80F2C026174465B84222CC24F39BB593392DE8FE5F2DD1D914386EF717FA -EC2F4D68F789C18F32D5734D0F4128BA97187EF71A14DDD226C2A7A951615071 -0C55A327F58376B030879AF444BC26452235CF18DA50AB8C1042EE01B5BA47A8 -1958E327C872E92ECE4306108C213C3D2063C323F261AB34EBE5C68D49357505 -E54698152BB44B140FCFAED8358E47F1C945EB228EB444EE5551245C52509647 -96BAD302442946A4A4D767C352BEA7E632186CE5F081E3E4AC0F8853F8D40288 -DF0F41ADB9D8687E7034856DF60FC042EB2E46AB3BB95600871793733D6C2B91 -852BE005026D679E53EBB535793727A01E543AC1AE1B91803318716B0E645ABE -16F0410016FCFBFBF83E14E178D51B2A571D7223616EA38DF7F04E3788CA54D6 -05F38159565EC1F747AEAD79F0905137002AA9AD103EE63324859D44FC30BDD8 -07060752F2DD51038F2D3C163306BB391CBD5647E0C28A8C987586733E581D38 -5CFCE67BB5C50954EEFDE4CE7A04AA4BDFE5E2BF4752E183CD1C621632A6AF2C -FFD75332DA70EB2B4B7BFC40B94BB96AC34CCB047F7F7ED8A27F52992267A47E -18FF3AE1015BDFF8F8C698F1C5C294E901741EEA720BD24F42F5B746D42F2551 -6A1C73C66DEED7CD4D4C4FBD671EDA12956EF0EF8384794FA2F33B09B479EDD9 -E12FD0E206689B9FC7331FFE21507073E8FF039C11AFEF9DF0B7A3FEC4C08C94 -014790E407C2CAF95A36438E18C8550D55B5124470CFEF7F2748BBA5D44332CD -C79C6562DB2D2962856701A74B37C9BA85CD441E9EC6938189E46EC43738F84D -49C114FECF37067503D5100B79BCABB83634B9E46AA2CB7E3CBADA3AB46274BA -04E0086D005AF1C940A599036C85C569CD7E77FAC13D34B293920122 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMTT9 -%!PS-AdobeFont-1.1: CMTT9 1.0 -%%CreationDate: 1991 Aug 20 16:46:24 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMTT9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch true def -end readonly def -/FontName /CMTT9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-6 -233 542 698}readonly def -/UniqueID 5000831 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E -2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279 -650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35 -F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A -D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E -F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1 -4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A -438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD -BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B -A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641 -AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74 -D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB -CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A -082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980 -9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0 -4BA1EBFAFDBEC531EA13DFBD6700E53818CE04D23886B8AE75DCC36BCD3189B1 -0D55FAE27D0D126E82AEF31D7B5DF27E58C30BB0867D6D7AC1DA9EFB8A2DF095 -B5B934A68EE122DA0A83B36C952431586B957990206194E89339048AA6EE4C53 -703763505ED57C494DD907D0EEA04F6B1D4C8F3BA778F4E7AA832AAB4D75F024 -61E91C6D25FD6823CB24FC863B57C0471CC9FEB22D97D74D9D68C3137ECA842F -01B3014812BA4A3232713DB44F320E99E558DA25AE9F6EA5CA26CAA5E321903A -689B2C0D84EDE3D7371BAC131B97ADA8FC1E9A8E33AFE737CEB6D9D424C43D83 -F8F89FFCADF713C971D8C16C9F402E8292DCA1AAD6507B55AED64B58C386AE71 -1898A8034AF47031B7B1B493336104D028739003FFA0EB6A74607B8327630B24 -C1121AAA68BCBF128B3E68E16E75892EC80221D2EA3F73D8497180E094DF63E5 -2BB6B13CE94E02AF6A0ABFFE06652E8F757447E50152C300A6660F6963731B26 -D0B154A80F2F0CD49F8259BCDF09ECC92D40A9C8EFCDA68035EA3492314DC20D -7AB384D5DF8C55D33A637E15BE0119E46385019CDA55262A52B17FE7525B14AC -1689997AF651710AAD0153A940C04858D2088A195B2451FF531FDE5CBC8DA689 -FAC1B0A5A6A88815BFEC5A0020ADB28093807E5F77C077F86A963D5C78286C90 -3AC85AE7092E03FF01407126BEF328D3F9912A34AB700D9A8FA0E381D24F1674 -4555D2CDF324D0B2910D092266C359C813F1A59E64EBF5C5DEB2F55662EE3051 -91507EF579D4B106C61A3BF41A69211EAC762864B8C9B5D25084BA07B0D303DF -9C35C116A381D891DFA54764E27C55DD38B83576186725D2DFC7229DF662E48A -627BD93E55DE9A7B0BCCCB04909D84DBA3CBA311B777693A8E677085688EFC8E -920C063FB8711FFE4C7A7F07FB7A00A2D39D79178FF438AEA36135A1E671E6C4 -FB38D7C5C0167FD7CE3DF1A2C34EC8F79E85766CD6E0AAA136700D3ADF43A2A8 -20B70130BD7E9D10A1DE05B1E1801456E4D31B3B9A26C6F2D83688B6D1ECC3DF -E8244A5C6BEC60CCFE1FD473FB7E2B08509673FB2B0828A8AD24B53E475445A9 -601FBBE47444903F41CE4101995AE4D9AC903154D4FE50C41581C46607AF76DB -8107BE0296BEC46349BB5D1BACE47C6D0D447B9D7DCA3EF11325108F1DA47DF4 -54E63928F0C5A0680F46F3A83F0C44C44905503D792E2F28FF622E380B660157 -D740508B5782BD278DE45FA2767E9188626AAF99BA99A20C1F0DB9AA508BA183 -85E5A5313BC28B5E7833DADB584123F67A9FC4B444340C58C3A253ADD1679775 -35C02DA8A7CA03468E3D4DC9E4B22EB012894632F1EF1164E756A2D2976776B5 -495E275DB7B98A7DA733BC2B9DF66F983C3A2DD663AF8CDB4FC577F1222C127D -1347179304799F29509201845F2D4EC9EFDD9D826BA8235DCB22F6E0B91C66EC -469F6CA3DEF47A612EF00522E439DD65396852EB4D2BE378F7CABD6B33A27E94 -504E957DB46A48C2228402333E38D454EA259D757A277309574E9E8A2ABCC75C -B47BC9867C09CB27A42B0AAC87F7E15D4A4F0EFE3095E3818CF493C6A2165787 -948321FFBB257B9FB66F57CBE24D9593326525A526AF178D11BE1A4BF8B3CF7D -BB089D49E4E571A357ACB341D5443D2040BBACDD3ED5AB589FAC38E15B849735 -458172E0238E4B8A6672B8328D1F96625EAF110EC280E31378A3E574532A4FB2 -D05ACADDA1E1E7BA140B4961BE966B7657A02873A8FCDF3109FE302E22007587 -EC499AC2C67A421AD8088E5118680A6B8CE517833425A49C5FDC6B65808A4857 -F1708AE151EAA278E0427A116E161F318B1F647C294558734A8AEC45C4922FB1 -2A4F4CB7E27E5BC2834595D6E94BD0410266876EFFFDD2E166F513CAD3E4CCFD -39A63211BB6BC7558B61567C887016984B0B438AC6FBD20EB1E62F2EABA88501 -6803647BEB836EBE67763D48EB702F88B00A0E6325D19A8A81951AC7B4B1F902 -4D30843B31EC9B4E54B7B03F8B08CE6025D0D648A00AF8F02A55DA7140ECCE3F -8D0862B647758E6DACE4987E7EFE21B1540445C483D01282BFB55328A35B9524 -E8973C067E3CA3188E75508B92691AA4830DA2C198EA3F4B1B262860D6DFDCA1 -0CA0B1A3FA9055C08CD3BC3EDABE170DC551B5FB0D572AF0E70FCACEE8C5DFC2 -899E8C829A47ABF998F455FB51A505AC2065B6471AEC9ECA69262B2661A92C69 -D079790211A7F4F282DAA98FC5204C574A71C23C268B230392710501C18C1E2B -5FB9DEDBF36E8116F378D5FCD99489A6B2FD443A0B2F7DC2CE882263E3E18BB9 -6EB8D58AF98A6675E173A178ADF2369ADB60F5AA821DB0668BAFDF8CBBC243DC -39073721E861714410979DE518E325DFF59D82DACE98505FF15A3B0174F620F9 -48BC344823BC5E22AD39E9C53E41A238A48E06AEA67387B50DE8287EB607205A -8379081519AF6215256BA2C863CB3E75C2F24D34E8C893537F6CEE6EA3E68E23 -59411AE55432CCC74D62E8AAF627262906CC8ADE1CCD2E57140176691B88724E -E9CA95C6B638516118EDF9C055A157447F917517ABDAA93E26287C209E6CB29F -A33703931045F85CE6559255EF992EFCC2E650C986BD0F8A9FD9CCDDF9900EAF -C55A40FC6989D1A3674360BDC396CFF420E15084291241BDE26AC0EC1F9A4C5F -64CF43AFEF81C3FACC5B523322B306CCC173E87E3D9780678820F6F392F808A1 -DC6D29319B630DB469180576BF8E4349EE9586229528A736D2F6A7E3C0168788 -6BE21388723F2FD5FEBC8F835C64B11956EFD5BDE88AB1C2C6359D64DCED8D02 -B0879BB507520EDFD7FA49986483D38DA759D8AF3C49BD1CCAB2B3D15D0C484C -5A55DB3F480D3C4E426C1AF34828D2A615E274E7F90F6032856B0C360FA88EC0 -0EF574487177B5638092261CC72EE47923F7ED93964E2602ECAFC61644C3A0D2 -C9BC3BFF232EE453C5048502E78DD301AAC88CE8C460F51378491E3BDE22BCFF -717A0708D7148BFE16F15D200F5F5E34499F16E75350913F102D9C29E75CBCF8 -CE5393D6D189583927141BDC31720B03E3D2893D0097729093371FD482BE7430 -A671027650CA381DDEE23D03F9D3359C270138EDBDC1965D350504279F08B7E4 -2E3B0EE9B8C571251196979E702B05A23A38AB022FC95041A73A62407E13DD5D -DDA7A0F5D37283D1B4C32E5251244653CB02C425F09AEC201D1D61F76AD5B8D5 -34CB63D3EBE97C6DA6B603FA14255E952354459598EAF65F40602A76EEA1B26D -247749A429CB3644EE33BCDFCF6C6036A2C517F50C92677A538AD4E19F885666 -C9908EDA5561E2E56A8842BFE80EA7917FC27C1D60A68626A6F0194CA7C1E749 -E1EE61D0450341633DB15C545569F893CBFCF1992A0184DFC89CB46E50E8C910 -E12E642949B807A95EA212C763A249194EAB78A37BEEB2DE6CB4EA238C071A42 -375D5CAA12DCF2D9295CF5E0D05D0E7B547367077893B10D9E8957CCAD78151D -FAF08A38C136EC4CB0F1A2924D9FC15192A2C24B6B1E9D508A8A239602C167FC -A2476CB609CF2BAF559140CB9199891D4C5163B9F8C5207D96A78DA7745A09FA -F3D1E55F6FB6A5472157BFF4A9439DAEA98587559E29DB34475A3CAFF79E8814 -3F85735A02208455F01196E6E5F20133CD08C7920FC8741E699143AA7C0E5B94 -12C504D56EE831187CAE53427201A4C2E58E422E5621BCF571FA2AD6458028BF -C1BDED62CE553C6140AB344C72DE39774969E87FF67C05550395F5A2780A09F2 -D3073A68AD8F774C39A503220C091401A2882921E498358E9A53EF58601B469E -FEB9CED8EF20CC17B144B908805D0A94449EBF433D85EF901C1B057B379AF26E -876BC3B30D188DA7C7DBA57F27F26CCC2727B095B601DBCE1283F1E5F9A7E448 -A5782DA29BA339BE01251AEEEAA977C6D037F4BA1B814D3A235FF0E156CEFF95 -F29728B74B63D9F6D4A42E4C86B1C51F66B41DA4EB10D3535BBAC842B3E13463 -7D21ED5371F12F60DCAFFAB7E7BC33E8F414ACE4BCC4E1F11286C1CA7C7C45B6 -A66CA4F330648CAA607815D0E591E4A8D8413F62DF443FC5FBD1AFAACFDD3C64 -2849895138028254C63ED777917DCCDEE9A2861CF201B42C6FDBA23EB58FAEBC -28D7E7F345BEC19711B722F42D94916A2F8390979846D1E2AA1C696DDEAD377F -65C36152436D0BD7480CC2F4C260D4AA5EE5A0913B9CAB88BEDEE30C8C867B36 -F40DA082AE27813721CC1DD529A52A8787C99699FE4FB5040A5C8D125EC010DE -7DCCE118658632B448B73E0C79CC41FBEBA02C6E6E3F7FDE200CD5C94F695A1C -4B43B475A2CEEAF902C22F6E9BFCDB11DB438241BBBBFAEB0EAFCA995C5668AB -E166D344DCAACDE6D2164568019CF39CA33B5BF185B14516DFD11783303A6B39 -AD9A706595F5A506671A15BBFCC0FEF6BA2D0D14A8BF56C2032E7D896A1C917C -86B24C103732B6F5B2BE5E1E03864755544FCBBC7BB8840000505F2FF07A11AF -89A633830544CCF02FAEA5CCC3E5796CC37D3AEFAD3A4B7DA8691DE19C7CC4C6 -7D7D646E6ADDE332F988342E6A312A935648750D78744621CBEF5D20E5151B25 -AA0CDBB5C4C2FDB279651FE7F0E186C77A13FC9B507971484953EF3BFCC92490 -FB4D512D3C90E98934A1A11B2975A44B936C0BADB1711E7FF03FA8B004C73E6B -166F4EC107A3B52BA0E2F56A61BE0C5C1C8CED05F2BCED3F1B213979B90F92FC -EE6D471255075953D20D88619C930F4D60F0A67616091472F28906 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMSY9 -%!PS-AdobeFont-1.1: CMSY9 1.0 -%%CreationDate: 1991 Aug 15 07:22:27 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMSY9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle -14.035 def -/isFixedPitch false def -end readonly def -/FontName /CMSY9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-30 -958 1146 777}readonly def -/UniqueID 5000819 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 -7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 -A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 -E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A -221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A -27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC -65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380 -D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C -77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA -15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F -491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F -1A06C514D91C4C937D4E642503392B1CD1BDEC3ACE767A10DBB8285F5EBC6CC1 -AEDFCF3EE7B10512E068EC1C2647FE0C9CD111FBB93B73EEEBF10FEC098ABDC7 -5D495AFB4A8CC66F9C70BEADB84143DBE7E440326556099D2B25A815FB2043CD -C7FD7D8FF33C3EF38924FD112A2DE79C9676062A36317173DC5187DA094BC8EC -01887AC6E35B2C55101152B8A557AD2D45E3EFFB6CA25D88B9F7F1D4E6A3BA50 -9FD5C07C244F14215ED37A8874A28ACCAFDA6EB011D399B502870285978D1A5F -B8D15AAFA43FA59E679214C87A737B0E5E80B25A6D00760801D0DE56A2978496 -A35CB0AC62CAB1F5D1C322FF78DED4073E49651394F9CBB8E2FE079244654CB5 -FBD472C2E89C3E03C9408754E838E292ACFBC43472010FFE4F3F74E0637F52EA -DE71C95CC934F6C9BFDDFC95C588A929DEA13460A8977F220AB1140B459FAAEB -AF908F073050F759E5DFADB5F8EAB5B0E423475133C790D1A00235DEFED09572 -4C1B2470EA21AB475B89372A9494E7605205319CE52E3C1F9ECFA101076CE4A7 -80C33F1CFF0BE6361B2A4788BC74697A83D8A78970F2B4EE92053C4E39CCC624 -391DD58E253FA9F80B946DD257D0EFCCFCB65D77CA4D13BE44C2BDFD5324CB92 -2E9B6737E5D23122908274A542F46EBA4DF88BF17B10C10FE8BD1C1B2DD95627 -B77AC6EFF0DE0BA54A32895E999E0350678F2D87FE97B8529E30ECE578214CEB -37E258026C62741436850346A29852E91611F9CB9155F18AA1154E54683C07BD -ADA1D34E3294D9F094ED3D042FD7AE57F8ED014B61681D07DA7A673E127DE52D -619815D89AF545D74C9906AF9C55AB152A20A7867C5383D32499F868A888B0E0 -9DAF577180995588B42092AF47F3866AF1DFB9983A97CDEE568C38047F2617E8 -4CDADE44797F87318B398AF42E7AB331078F1926AD192389C1A3F79A578887A6 -BCAC4FCEC309F7B2B8A84B85EB602B83FA42A4564BBB4392718C3CC1C439FBDA -793A247590970419E3F5B2B35FC60BA737774C4AFBBA41C4545F3F609037BA6D -DB40DA3FFB5AF515AD1C9666C382EB11B3685B631800C61AE67AC8380CF10FF8 -0AA111D6D22803B793C25A57634DD94B5EC8DDAB76046674B7185CF8A2AFC39F -E6509B3E6BC73ADBFE67B8C0D1593C8FD87074ABA5F0A23359637A6FF8868F42 -1329698A92A9F47AD10E559546903FCF2C683C4C4D611C3F66765FFD48050368 -72F1C2C3B3141BCECCC860FCED11ADC693B6FDDD1E6FCF84923457F7D3781ADD -76F5BFE9CE7C08FD1D773F2581404A4A86D4642D5410A198F2CA42D2E01607BC -759DCE23A1D05877C0DCF4091D5BC52330295579D6D6EDA63F864048569B8D66 -D194625D58062079C47327A78D3E1FC9DC9D8A44496E3777BEF937326FAC3866 -64ED4D0500D99125E97A0DA3E75FC8CB0587F8AA5FAA1623702579E21E53FD4F -EA3393CD34B07D1714A3A3E1E58E392D17EC685186886C35DA5501118A7241B8 -932185F168E825DC774427D6863DBDC5111455131CDC11CEC517CDC41C0A5304 -D5C18DD6AF3ED443869CC51A340544AB4F205ECE28B4A836714916A960C41D4A -8837A72E2CC6205416675839ED07C70325344E89EC13C8AF666BD63B61511AF4 -5DD3DBD96E02F5D9D4C23DB3BEBC41876387242C33733AF63D65D5D28419A3B7 -49BA903A3A9694190D5DB211292774328DC366CBA490A82F09F3BB6C79E5DF34 -17BDF6885F475F24BEB83213C086F517CB0B04ACEC7E5C7DDBB5693A4CC5EE24 -AB555C0F0A419E996B71A8182C7B087631F6AC798437F238B2C99BDC7E85779E -DEE1BAFB95BBD988C8DBBFD50D3D122F782CFF5A7AE88933F98DB96E8D5335E4 -AB284462546FDAEC91BE55CC605DBF6C862F40E53DB31312E45E9EEEAE204CB6 -9322A67325206BB9BB9AE4316E9E2D634DF2291A33ECDEDF9516BD657138E069 -4F9CB0AC0B2C81AD2A011547063B5F33E815BCBBB1C8E67ED61CE53F5E1140BC -D09FADFEF42CEA0D8505B0E8A33F25D8DDA9C0BD37B25FDFC44303349A413A6E -C7D5602DAB0A59097646B1274CA0F3674E483A060342735CCAE91CCA22CB4139 -C399DE4C6802411F91D4B94567A8254E6D08163B9AA2B718A38E16EB9B7223B6 -67CB41A005F7A957258B203CFB243CA78158C15DD23AF8D44EBD1F8F4A330C74 -407DB88CB26BD874FF439F67246ADA0AC33AC7D191807FC9A38D85C1E362F12A -C6D191188DC62EF358FADDA3DDEC9F2871C385248BF1B128CEC1DFEBF4085415 -D1EADFCAF50F7678B2B39729650FBDA3867D96C9CB0F9A8566EDD84C51F844FD -810287E609D9C7170871788520959801C5315F46501CA543899B889634760D20 -9DD5108448D7587C74BD02EDE88750BE21D6B93D8F1C5375BC1E9BADBBF3D667 -C752968E81991561AC6D3C56B2A7C93A853398C4BBE15B16A19537CBEA0C8CB2 -26FE4CA714E6936512E549B9F6450FFE09627AD5471A9FF0A5F64363DA7A89A0 -D91A59FA098D1D7E60768D256AF0D1F7CE0F07185C04ED1ED6CFA69E4C4B -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR9 -%!PS-AdobeFont-1.1: CMR9 1.0 -%%CreationDate: 1991 Aug 20 16:39:59 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR9) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR9 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-39 -250 1036 750}readonly def -/UniqueID 5000792 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 -87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F -D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 -92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 -3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 -046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E -C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A -A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 -A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D -731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B -09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 -49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B -5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B -54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C -C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F -11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AC46268691C741B2D4 -48A840F1128D9B2F9CF07D0709FE796B23A836417BF7B5B12D67F74453C82F5F -25F7B30701D6F6D4F4DC623C0C27D6A6FBECC7312A3CD10932FC7C10851C3C52 -24B75DEA8A648B7F34F5711DB0E843C914E25663C510185BC37BDB7593C1C259 -21D8DDAD33982C336BF272BAB2F48E68217403FE9F54877B243614A87E64784D -2796EE4179FBF96123D1BEE3EF89D682B427BA4F12A1318A57F18BE5DD903815 -26191C72DEA47514220D23859E20A186A7EE791E60B1671A293C5D5FCE91064E -BCEA9EB0BFF478261EEDD7601309782B9F9C0B84DD78706262721E56FFBF64BB -A1EE5189438A36119055DAA1D509136D5A00DAD8BB0827D6A8F40E264BE338FC -80D39D8DF9060D82E8C8700DFF48B0AAF9BD6C70362164CC0772E390D6EB1B07 -493E17FDF7F64D57ADAED12CA20AF2D803A185898E4709AE584F412451BF72BE -B9821F2124B0BA27E4603EA6110547C3B65C5945EA007FF01723A59E3F9B1468 -2D8DFB922499D39F7CC7C9241BE759176F948D4BEE933ABAC2381D4D721211C9 -CD240E4A102A02B1DDED5BA476E887B9B2BFE4DDCFB5AD83CA65209CD5D30437 -74BFF7EF09E1A95CDD3E414535592B878EB6356A4F3B6298606EED4BBC65CA25 -72F8D897492DE20D27F8A97A6767AC9A373E4E54445C775FED40E6356F00EAE6 -A2B12AC114FF430082B64A540C07B396A7CB4ED5CCBBD32F21E4D8EFDCE1E538 -37D672E6943908715B7E5842EB69412A3009A7EC6977E9D42C2087E37A4829CC -59450164B05AAFF60A47FE5EF9B83E867F7A94203B34E20414525B1C7D3F89FC -A343972928E58B54F3FD4B1118BE7B17A3D5D2D73C47CA6310DD0A183DE475AA -D1A6374AA5951993E7BF723CF6EE70BA049F955E0A24526D491F1DB841A21CE4 -6D72A98E19A782FC5F5FBE178517992A5DACDA8A3CFA1BC59781A91BB48DE2FC -EAFE8C5A4AC55D29CA819477EE772B7E838059522A950A3C1DBCC422ACCF894A -7997C4EEEAFB2C8D0866524244155BB2AE9CA688FF115B8276A931B7318D53B3 -E30E92ACB720CCA8D4E8F6E2AE6F19FF83F5AC939CFE8A8FED28568E167480CA -07C4EDD53791B4EB1B24440AA1BD22C9A9B21BB6AD13FA4B92AC37495C9BEFD2 -87D03DC1E44F03E37438578DFEB856D3712544DB23CB8E3CE1FEDC61BDD727E5 -8D70A8F07B5A105D9532D7A28343C726D8562D4D1DEAC77C5A757070FF8793DD -6CC888089E1640313FF14BE6C9F20FD56037FA69FDF7895CA0AAFDA22F63AD3A -9A6CE7294DCAE2D731A129B185CCC47CBCC30017B9233A2A9D0AAADAB8384806 -749C741AC8C3A6CB7A3098B5E73506637121129502A5CA050DEC43B822A2E5AC -C30DCCDEA765580C1F6FA8CB9AE217BA5700DD16377C9E0E7BE3704BE745F1CB -7F33C8829D56628E4816B2C4CC6C5F603BAF4FB15119CB7D76FE08EB4429D39D -29973BD0E76EC5A3E89A6822201411BA7988729498AF98E948DD0CF06FACF7D9 -BF874D1DB00008490739C9B13B29EABF8F41A3B569AB8EF09A7DEBBA75789C56 -7DAC4E4B63DD0307653A3FBAC8CC1E2CB6E9D9B727B46CFCE57FEDD71AAF4A02 -C700CCA623726B04CAD85414EB22801FBA3A067A6C9F118BD4C5BC72B002ABB2 -1D94D81D0B14402EA15762DAE23B711FAF209666DDDF5971AD03741A027C1C45 -0E45F9CA6C2D651F1D37F11B7E26D9BC11C1784D04D39E642AA9C0977D443E12 -686B44F7D742B708BEF8C79CB58BC5BB6AC0B077AB7B0BF7E43075D90EFFE739 -79A225E6784AA0269112C4081A520E9EA15212E5F5AD59D1390D1EE66C18D43F -47863A575BA4F282B9B7326C3DE15E8002D7584DA921B2CCCC2C1290C473B286 -566AC94BE08AE6A91289141AEE40E76A7244B0AB75EFE18D3D030C5D5987EC19 -7F628208E1B8F32B2B9E2CE699913315FFD5C2979A6DF57DFC25A426D58951C6 -38ABDED04F33CD5647947B06F26DC9A515E73ACF49C78934C264F142295D141B -862EE8D4C88CB9027C3A3440A2621CFB684ACC47AD148D0876787A991B488816 -62877D7C5B0B548A37DDED844FC2865FD25359C03247DE45E10CC5F4B4D43155 -376D6AFC66B1CB1078E809A44AD41CAC363780BEA157C43046612F5E942AD5BA -CDD63689D13B55EDEF8736D68064672F6C4CFBD8447F7D610A50DAEBFC091D18 -2A28547982617FF21F233852BD7FB12D58A37A0FCAB00A770032CE0DCD3F8D3B -2192B5453F75A43D56610F9F35DFC584B53B6797201FDE2D0E3D5510F78425C9 -0DF6E4183CDD211468A7944F1198DA60EB8C12F98F71F270D6825DB4E5FDA532 -F1D1C552B092ACBA970E8764F8B0406D52A21076A2434A4492E9963AA915E08A -45C78D3E3154FBDF38FF4865B401C82C53D523C1BCA0F2DB3531DE12F0E5ADEA -F83690390764F38B9A247752DDE160C412292C2BC0FE7441CA23FAE402005638 -62E3758988C0DA953894ECBA17356E2BF0EA972BB347A6085081A5963F1E830E -8680BADD9478E1B21AD5CFE45D85EC00376D74798875574F1101559A944FF2CA -A91F3EEE1B0A7F92FB6E8819FC4436825B8C202F448305910EE717C63AE24088 -644CEC64A253C526663062A8AF5F08A1F9E7665E426BE1E34936D110FBC23DC0 -FBCE266736774BF018BAE3BFBE5B442C2F31FE1A102023DADF3FD13D611A48CA -426E9822710F3209B71BA79142AD34D263E44953A4AF35EF1AA3AE6FEFA56F75 -C6439CB64E9EE6D0EA4310A3BF50EF866240E2D343B0DCE2CB6EF721744554A2 -0A53980C0AF9E3C99C0C3A160F846CE55335929564C76A58D1622C47FB1C7C27 -4E7167CA1AD66EABB3EE9F44D0B479DC8E4E38C64438C355B727156F3052682B -5BCA9ABA7FC82E46472585CB643095C9797404C8D6FCF64A0FBD1F3C2FBBEC69 -E5975FEF1CEF76040111C2C26EC6E753ECDADA43D73B06DE583D68F991519F03 -9ED0179A6355BE6BE5FAE4BA6389BAE9C83BD71612810C0378D6A5399C9C0D27 -5C88A642E2C2FE6FE665FFDB58633D2D3429ACF75F71DF124CB55084E36017AB -2C26D489587363A71145B99F244435B7B743C0275AE632E2911F27FCD626E8B9 -6E5FE4D12DDA558D4D52CD45C1F3BDF3BC377C7D31D3B0750633AF68D91EDF64 -3B430C246A7DC76967099BB39F0F98DEC0FC4548C7CD8FDBE428982E74916F73 -75F576EA99E922916AF3AC31C9D0F4B329529ECCE01D3B344846DD193954E5F7 -288DAB43F2F6AA85C83C30136C8C85329716279A3F80ABFB9AEF8B3039EAFE25 -973E7F5B785123B7EE7BE69FED69AA0D66A5B97E40026AD913119B673A642DCA -BA6581F9937A1066304894C42C96F6C97662AF85AECCA1D201E6198D65CF9C15 -241C42973CFC7C8D77DED663E08DD3F9A22FD78246FB72ADB07EC2389F8FB65D -A56BEA777021BA389FC9C64BEC0204ADE954412F82BD35F3F619BF39A809E3CD -35C8C875BB9387216FADF19B027AA84B8BFBD453D89BED8747604DBE8B1985C0 -6AA8A47A3372800FA7DD8BFA6C71CBE578B03C604164EEFE875CE7E6AB256112 -FDD6529D2EE61AFACE973EFFD815C97BEDDFCCBA6AFB59DCEB4FEF51A9105F40 -B05671D263A75D8961A3D524EAEF4ADA3C01C8D9ADC20DB979E993EC83936F45 -A48B44C65D6BA2602A09F56CA3B2E539DD8FADEC6056311B6379AAEA362FBEC5 -C1807019450A23DC07C2856616AA58DB290E89B297C3FBFB23A2FE79D28E0BD3 -DC152026DCC0A649BA7E64CEDBA1F73DBC32D2EA018205863D3AE28C566487B9 -B5AFA5E267396B33E46AD3D1485B77E3D989D7A14DA73A38311861ACE06E7962 -57CD879D38E52FB17AB005055A700777459A66E16075B8F8640C93A8457EBE36 -A8B3F03D1760A61C9E6BB72B87D4CE71DBDBC454C358DFE9D634FEDD54B9666D -CAC47106850E5F7F8C145519B039F9C50A9842E480CA7E0372577819CFD28B14 -0E4741775245D2B424EA401652775671729FFED5122137BD7338C455A071648B -EBE3720E87381BC9CD2DE7A218A12D26C6D7DC0C8C979E6E75E0EFA5CE84E7BA -7C8A7ABFC7857BAA5B2325F9F84028A08C9374B1021C02D9BD9903DEC00B19B0 -2B0733B6984699BC5DD7A58345C050DADE4DD3B2929070989373920CD533FAFF -C6C892DAD202E96D238132E26EBABC21D57BD8F8366FFA7B86F4B5A995EAA930 -3B8F709D418012FDC7293B18568BF0A89BAFAD4409AAB94FCCF93B8EC34FD4C9 -F504F4EE952E55015865B1BF79F9788638BC8AA0093356352B2A52911287AE5E -F5ABB8307274C4416109CC8C8C82456E62F9CD401D555D4BD63790884EE1BDCA -492568ACDA35509F9778AEB41D190456344B36BCF4D638A3EDCD0FE4428D767F -161FBD2831EF30E691E75A9CFB1B41818BC4B87B68A069168057423036B1688B -F1985EF708E0ABF1BED910B4357128723722EC56EB40EE529E11FE1A564D0922 -CD9F3894732FD00DA88537BEBBB75B670764BA1F6C858BBA314183C68A8B345D -510DC21293E91EE1FED2E59029FBE1708FADFAED8FA5D254911A600F218B24A8 -594357CA5E36831857B3882FF49C8EB81103A7160530800CCA6F2220B3AA83C9 -BF8E1D406CDCC9D1CC1E3533D420A77A1BEB80CF3636AD44266EA7F5124B049A -283DF23D8C6133CA2B437537138CC26ADB1903410A5367B8C81727F15F2BBAEB -82046768AB05C85F8DCB6189862C075A8158DCD92723ADE9C08C19DEA25E933D -8B9A57FCCD0E3CA9F19E45C3060CEF001C0E9BED798278733E52D7BD773D702C -4FA9EBD1FCA080CB3A13FC35D414CC7E8228F69696F74FE087D0A0E843558265 -35B3466BF825B237A9819C5E77B24931815EFB347348A3ECF37E853E7D059209 -F076382A8D766ECCFE4374B05CD2B20582353BB18BBA42E9B04C4EF6106207C9 -87B56DBC1BE72E0079FA02F151F35A974E260DED4978E208E492DC97AB3E7C62 -19FFDAB9188F5DB40E6DC9013E0DD19C7FFC86F37FD0179ED91BC2A33E496B2D -8B40170A41EBD0AF91FCAB240B3F8C12E68F9F4CFCB90550655B77F312E92872 -D835730145D73C2380B271447627FB90B4D873C9D81857F7674915024A1683DB -D661A1CC56D49F6E5773DBFF963F407B5EFF2A2543697F475AD9146A5D8DF345 -2C4065B563D9FB12BA853D0F93A46E13DDA588454306AB9983549B519ECBD44D -A452204D35C24F5410230A51089F8183884B28064504459B83D7367E59D9B769 -950454BFE898FC8FFA359261F6BA8427D6A3832AF972BDBDA65479477F441BBA -4EBA0E626641F7540336A108231C56129B0268BFA095798AE8C344B08DCA4E4C -5DF6EF71368A9CBD9E81590EA3591D21977355781501F64062D295F0696B4575 -F2FE01C74629B5BB60A588B2A508605D1E9F554E5EA3601BFF2BB81C97E99575 -423FFF977923775980FC2FB2CEB63333C9F60E62636F95A4005172B2F92674A5 -09EA0A773C046717E35DEF00EE7F4DE0BFC2BD1CAD1F00F49E0228268347EFD2 -ED9812D9C2994D92464446C00B80B90E5DEC5F4E9B30665544C5A527F7506082 -6D03B1C4E33DC7B398258AF95F6FEAEFEFDF63AD4769478A72CF8D93039C6BE4 -BF0E83324B758F26939A1381B44DBAB535DB2C51601C7DE4CC33B2A83D8BD5CF -21C9A334400BDAD74EEC4E029CECFF0D5A8EF1FFEE3FD15F7B53DB2195C42AB2 -6A4F6441731BD5FE2F51341AAF4F5CF280CF4C96DD7C97F5472B60CB30F15159 -FAA4A16E941CB45F05D1B45BD15AC7EF9A97E837902EDE1503DD587678E37EA0 -D5345CAFA77DC7E3D437759B8F00D6ED018889CB2109A2CCD2361969C2716146 -B5D5166C849B2B6937DF9DE38F8439462B63EF3893FB1393AED1A25C08B409BA -0FAB0C73D34FDA3310B0839F0635C05D451B89A39895DC9B239921148D5FC149 -CE4F2B23A1D294D3129A87D47A3D2A8BC4CE8C4D27C495568CE52B1DE8EE5B38 -8508A72097034587491A551D562587BC82FE2A864BA42AEA4F66E9459BEB9027 -B47F4D9A6EB20F032037E8992326115BD3DF419D6669FB4EE075BE5DE7AE09AC -0E51FCEF3516499BB2F95403E918AD479473921A46D648C8F7C756DCBA674510 -34AA13E45FA5DEACE407CEF94B01A42C556AB811EFC7D4DEA581A019D2C06C42 -18DB92A5E94A728FE61565FE825DA5F7BB88227D1CF5F577560AE6A4B36A92C6 -23497775896A472272E651773E4E5955EE6BC1EA8CDBE987279EC7EC2A5D633E -73892F2C576637AFC15F0F3E5FDBFF9B68731D3A9FE3107AF3860E3A80D8133F -4851FC996B9AA54D0AFA7D6BDEAFD81206BCE8DEE8F2A0E9EFD5BA4CE01FEA40 -48CAA82B8CD894EAF7DE1CF1E68B9DCB16821489AE44447FE6521662E051E22E -792149E3EE3E75509ADA59EF35AE1DB8A1BB1C04E3C8ECCCA1C0BC5A24CF356C -3079B2FF45C6CFABCFDC6DA0177B3D1B2C96D8A7B5D1681867438BE593592B8A -64AB9899100258DDE80A7F82A7B29E40221AB1F933579A4D9159880176CAB6BF -D1641DDAFC3E512BDEA139E15914ACA2746CC890435FCB98549005BB382A54C3 -66D5EEF83338B0BCC03C3F0C1426B0CB2D180F1349CA79C642264BFB04A9C315 -04EA4DAE1435AD805621AC4EE58AA768CFEDE17F7786C9C43A7A11C16F1F864C -FBB80A2B134609075D4A6676F1CAC147050EC680DD96D156DB4470F4ECFDA645 -F18116BB189AB0942C67A254F8E7BEE0B70CBD43E65A402A30248E2FE5B8FBC1 -95FD81172CCF469BFFD305C6055B8B1A6DB9A6D285797EC58315246BCBD8890D -BF11A926CE92271B782C78103D01867EDA935877972BA80B3B568D0CF5E6421A -A0F1734E01B194ADCE54FBFE2A0C8413C21FFE48E87BB6E218FD727C212A1EF8 -BEFE2D4A4E4E690F85A78B1BBABC88E5028F7FBD119DBBF224E05152FD8BCF6A -C9E06B50EAECE709F88715BFDB9D8B16F70BE07D707C22F096EB43887F0A4A8B -E0DD51FA1CA98409AE66E2582429C9CAF12606318A19AF10023B64D90A7E0304 -3DDD0BB738C6FB39C8987D2F1BBF4CA2A930E838174426A0E33D50779685C670 -717A5701450317DB9A1BFDDE56D032C264EDD55F31401032C272984358F86059 -1F6447A29F2FAB6F44DDC7E14CDDB0CFCBC1F6941CB4403E5E90518D24740496 -20BB4FEBCD7C7DB307FD559B7167C01EB3D2189B079F99DB9073541C69F86934 -93362B66B4E298F475F067B6427D327DDC996E6FC27FD513C4DDA03837794A1E -A9E63101B19B5E0BC5E1D5A0E28A223FECACC2E79C226FB191BBFB5759C14C05 -FC60DD04AA7400D1ADFF88C619D5C7ED4613EE00F5D45D05F83A64232F8AFB04 -DC1F256C18A15415BA04E85321CAB278BBC72FCD36B32BC70B58D865C75C86CF -EE161325492DF6B943C964F7E38CA3E25A4C6CB5FBCC81E2EB759720622CDEFE -1D8A3C16899B334831CF8E1C5190F0BB64C99D0159E38389E477AF11FFCC11A7 -4E1CB0DD0A128F177386DBDCD42295ABD0A4B586B9AEA32BB1C556387378EFBD -363E6C495C86225C6D49E623CD95CDF45174622BAAAF8902B3A5A3259EDC41AA -32A380C3DF08621DE8DB5F322FC0AC6389468C1A257AD45948923498C785407B -7475E2C9444C8A3E00F205DD1B4BAC255CD03D9EC7800CEE524F25A5C7A80508 -42D7C09BEE4350CE4A58205D797352FFD3ED91C8A9945C8AEB8DC75D63648BCE -D3490B25542295AFC850BD692FE04B2D1602A0992E313BEF49B4700615182941 -83C072D69CD4B56B91D49C4F128B2A48AB9F4014478CDFE0AF440D27C293DC80 -596438EF38BC78B88B63E582BDDF1D19B09FC82C1379F519881CB6AAB42E082A -3AC491B05A709A68AE808602B4FBCD385B26C342338A56523DEF3C1C6B624E56 -7824843D037FC221B4FF3F3A8ECD441DBF285EC5EEA94430D1832AA4CA6FE09A -35CEB0F8B9D811CAA57C8A512C45F057683269F7C1A7C4875B945B8C36ED549F -A5E05717E99DFA20FB3F8A9906F32248C34C734C1F2A56DC2DB5807E0F541D8C -103FD9FCDC4EAB3B0F097978F2B678D3D49D4DA91F93248E10002E57854A5DDF -21AE4453B5792C003E083E8AF877D4F0AEDFCC4429C2D8AB632BCBF030C774EE -64AAF785D6BBE8A3E68C62D82518D1C94C8FA272442D22BAB0F26F1A59F81B69 -D823B55F5A1DB4E2122022294CAB3D6C0B154D3F8775F5B9FC455646AFF2292F -D135F55296ABADA9CB8F484A7C0AE8E8F7F58632884728EA4829659EDBC89675 -B5FECFEFFFEFA18E1DAFB0768BE713EF839995A220AEBF2AC92E363D94B7062F -EF931E5AFDE6538591B0C08E5DCB3B6F7C2627042A1A0ECE84EE8F173BEFEBD7 -A9E1A1539A6AAC92D0822CC5C0C547C46BF9B2BB5F7A90D38DCB019B78A6694D -417652EC6B7F974CDA4792A674813E688C70DFB6302F64FA96F4C57970088D05 -4314EA028EF54013FB629B111FC013EDDBB26745E9FD038CBD7A0B0E1FDE3EA2 -0A5409CE172F1352414A6116D880734902B1920BED0D136EC2BC11B89D8C40F5 -0CE96AA878E4789003C7B5EBE0BEAB9351154532C2914F3425A8670625BFB065 -3C3C5616A64FA233F723D46A69E540F9C5CF0AC5AB3136EDFB261ED4C232EAF0 -844208FBFE2439BBCC6FCA8BF4C201288DB5C9C45A5203CE6DE9D411462E8627 -DF3F50FC24C5FFA7FC5103F43DA056366D9ABAC0FB4F8BD6AC508E9AA6C31833 -764EBB0C764C74ED7799EA5D03EA554C69A5F1C55A70E7D0AB2710475F7C56CF -93D22B1CD8623A17056B174752AEE528E55170199092EE774371A2E6E940A08F -BCF99C22CDC3B11DF30CB51E413D8F1519BABF63521FD56605006037CCB4CFD2 -C41ABD12B28D81E62CCA2C52078B8E2688958912BDC0323FDDF02FAA6DC545F8 -762DDEB51FC01064C19FC2E7AEAF3F1CD7C056540346B69A8406F42408A4F634 -98131B9F662D85A52FB4B07925A5E18DF9161271D72E58E4B308AC2A498D8231 -03572CAF2DFFFEBD22BD4B90618F9E0A9EE2C5B0A09DB6A0651BDE3341BC410E -D7748C7FF02E6595DA0A42627CF7D84A89FE584E5279405B64E0480E2CB5866F -4366169779B3D1B65C08B232EF28D291E3536D03E7D33C83F0D959C7D79106BF -726EF9F9E722654D70BF6F547413A2212A2553132135F1F38632277001309ADA -BE024DB6DD26850CB5A3FF2BE3F7D29A0F55E6297CE1A96653F41E9C7B714452 -0AA1A435D7962BF91A2EC00E159B96C4C9E663E83E43227167DFD731BA675320 -497B3450E0CB4EC4A77479A071664A7AB42F58861190EBE1BDF9C2D8F105A7E1 -C8B13A1A84FC597C3815A273F52D16648E921BAB91FEEBAE0E4032EE2291A21C -B8979B58229CD27439A671FB542D347E26BEB0754984BC7AE7DB7B95388DB8D9 -CA3BCF79A5A4574D3551DFA53039D1A791629B36E35CF8806FA4A66884644F60 -EC67AE95F49FD035770D8780BB42DEBDBEA7D0D1FE121060CC42CF88B2456A39 -18884A8400FB0DD52ECDF005EB69A2E08F70236D6F7D6DE316998FE19F866E0C -BD6267ACB77158558D364033258F6E4339346E37932AC5610C3F65DACDA63C35 -21E9D3D173299FC94D91AA24F135A421E1857DE62095C909BAD7FEEC2D5E6DCE -03F91C1D348E39D8AAFBA39D3DD4A0ABF9D1E6DD988FCC0A5E8E8D14F397B5C8 -F736E9697101CC555C57D072BAF424FAF5AD54244F17D2AC3D13FF8575E029DD -4E94543300D3AE6BB5C8B4E912AD75CE396944C5E0AF941C64DB80887FC9370D -52273F11EF3C5D906F5B0EB61C3817E002839C0DB356F314FEDE1FFD7A3C0B43 -60955A74B77838B0DD408ABA153612C59450A7280BDA427EB313CA73223DB772 -5BBC4F3A84377E04DE37ECA2F73190BAAFC9496437B4900A99826B7912B1554D -F8BA46464CDE70BC4BE0BEA72D6676A3EDBFC16448184CD8962A84DE9759B77A -C4B543BBC7974FEE02A819E9E09BE9FD4E6F5EA27C8D35EB4A8D719CCE4462CA -D70FF8B07F7A873BD4F33285E26914B00D23E3A99B393394230EFD836B28D91A -DCA84B361EE4B8F0B0957889DE770AAA1D3CA9AD9DB950B3B4DCDEDB1EC5AA6D -EE2B274DD66449CA89C05EB43CBDE9033C3DB8D0FF9A86D62C7500E1D87CA71E -F0B443237D5DBACAF84A3CE93243E0A85277AE3BD002C010DCBEC3BC676FDB1E -D3E7E249E2045DB50A35C7AA64CC11F6A10EA9AE519FBB3DB9624D5A3F3042C2 -73A8CB48667D2036E8925F46F17F2180C8D4E251F9006795CF4FA5E9C01C66F2 -5C2E48B077685C6AAC676770D8C0FC496077DCD82EBE27A62E842347DD50053D -ABFA8BB0826B7934262E624BFD3C7E4E8E8558E2DBE3485CFF902770CEE40555 -1F4D736B8DE0832401B1994A5A4F366155E700E596C90645803EF1BB796CABAC -570D03219220F960C93F71CE39346B824B3515EBB427F60123D2EACF6E0A2B8E -B727D66BE4AD6A64EFD56A6B99B6D26C153E5F87B7A1132AC03A4AAA9D249166 -9DB8CBF7702FD445465329B11F8DF87FA561ABC487185FCE7B4311EE0CC75DB7 -E12941AFB33138B204E85AE8CB4072C6D12135036D7D309D79AE0BE3C361C9A0 -90CD8BFCECE8DB37033DD8FAC1351A5D631F1FE375DDA96099832FFCD38A0C75 -DB20BADFBB3163AA92F454B57DBA415181ADFF621EF2C03EAD917CBDE320E508 -DD4E20B0C127E7CA2A5D4F1CF3275877A664F82B1FD89E3B3571E421E028E379 -B0D6AA3F371766E1ED3496931CD0BEA570EE0CFA7FCB18CE9280CDC353B6C0C1 -FC1D7B65D3235C1CA6F888A338D344F43BE1C7747107FDDAA221ADB863059419 -D4707996FEEC7FE188C566A1FBF5CB4B76FB9EF6D22DAB55AB0E1AA69CDCEAF1 -BB9C1B4A86CF96F4CD90BDFECAE059D0969452CDF87C00DE2D314296F2237653 -B5E851FBADEA42B68D86768EC2367D2955B64E19CDE30553A05EB5EB62096840 -012DBE282ED6345D0E7185CA9E2172759BBC4D9DDA65A9AE9535335189D93D32 -23BEAA9FBFA16BA3CF75BF09931B1E486DC4E3732C6CDAA7C813F828DAF18C30 -D380E4478A5BBF4C4DF8A40C3176AEAA9544C7A398586AAC5AEA5289D2C40D46 -631B4737BFF4698D9CBB59A3B2E67F95B5D768E86E4CFD1E3B8582069F25AD69 -BA51815E3F4190E10D3A84D14C40DCEC5ADCCE5F1755B878C46A45E8241FEF77 -35D48F11037A7BF7061941CDA977CBB389766B7BC36CD67EFB60A48259936266 -D2DD283BD35634B3BF5AD5BF353CCCA573A1E69DE0E612F0E36111D6B427E357 -8C8C706705DB97324DA947C3427F95CCEC541972F6F8869B6FB2B8745C26BB2A -E64B711FE6F9BBF035C5C0A6BE50AAB944F9DE90D1898999349021C8ED19A711 -6A95A1F1729C08E77944B81710FB206CFD4D1534FD65CA779DB88BB8F024B502 -DF62D0632FEA1B70FDF7810A83126ABC0C6D0D39D451735B1C5BE28140931412 -B2B98DB689CE5FAF8D1F7B99A3FA3CD8CCB064B91F621BA5787FFD2CC466CE41 -5D77B386756C61BCC9933402915A0CD9EC643C75410CC87722B8E0B11BA695F3 -28038D6BAF9BD1AC64ABBEE98F695CBE983FAA1517EEA952367B87FC31C22D66 -E662889E27AE914EF3562AAFB3E3C8FC7D164D016CA022D130F34C64652B5179 -5D7072F49CC3394E01BB6CD54BCDD6B1BBFE685134814F9175F6D62E189971D3 -EF5A3FD5AD0FDC0FE1F36C2D8A40DCCDC32CC6AF4AB4DB25ADDAC72E2E5622E0 -BB907662D125F8D8FCA0DD26B8A5042596373BC069529A51D9D8CD247B03F273 -B7AA525EE3FB79498D81C5BAA40A533480F57E3E4AA3484355ACE9EDD9F670A9 -FF9395FDC0C408566F605D70E799862BFC667B762F4B71CE0067FDBEA88FE304 -63D7192BE68A180CEC0D23CBE7787962C657EDB83098B20A9D87ECD368700410 -63C5455FA4084764C2F36195C7F92805D7DA1B30E6FC8B0BF34FD908650556F8 -9DB301244CF76A222039C6D0F3D22DEDCCA4E53374D0ED5E6539AFB4371D0FC5 -5BAF5EF6880CFCAD6F2CF1CB3109F1513CA14FA8162666677AE9015FAF28D1A4 -B8488C4EA810B16C86E32BBB479B33DE3158613404168970AE16FCB3EA765806 -B14B1CCA48BF9CBE25423E652BCE38C9769117BC0A84D8555D232207C6E5AFCF -79CA67293737780DFE57A472457501A9F082E09A14D60301648618851B247A2D -EACCA353F4BDAF8E1A4C14EC0A7D2B7B82FAC4F6FC68844DDA31E9D833307716 -FDB106CB7969B7487AE836C410AA907C9E16FA4174E4F840436341714D849D95 -7B3F7A5F6BA1184C4785ADCAD4E4A21FC4E99184A961DFD85A9A4A585794F57E -47BE4239FD179C19E28EA4D6F2A8800549DA3C4510B244723A9D760DC417F6B8 -7D0D4A7F6B651B3F23274ABD647638CE853B3F58105FE78D8EC1033E984510BB -7D01C93A9F13C9843654AB267EE1F8EE41B84B83F065062D348F8F83A0F67682 -D189AA9D99A63CD603A2BC5ABDE0B41562FB2DFCAD5B8EF6502CA6468F77FB5F -C1A817C1131661D89F9F54E61CB09E0FAEDAA0593B2D4B67F25FA96759D5A8B9 -E84CFECED0AB400C755CB82D1DC7C4BC368C4228B4037342ECDF209537992B47 -F3383EF86B2ED8C16617F507CDBDB03623C23B2725136EBD00519E7C73289569 -6DE12563D06363FCC7AEEA5B907CEFAA634920F6EB4A36AB7134BFB79C2CB129 -510D6FA6253E30C1D773A1E9150CB41878B928073657D239A868B7AC365D2340 -7FD4818DA3A23EF773CE5AA6BCE4BE5D54099B3CE734033315F8544E1032F687 -AE61BC7FCED72963024C7C21FA9D0F6827E69986E81AB7D53C4B5C0C681B110A -ACACCE8E6246F135AF75903691CCE03535D9B9228ED12BE2FA9F38F50BD46B5D -3FF54BFAEEF262F299D8F8CE935DC1AADE340DFA0EAA186688146EE3BDA24F22 -35BD0D6A9943BB4649DAB153CEA4BE763A7D086E568B434AF847662C63860976 -19A7BE9DBC44C8F4755AF7A0FA8E0955FDDAB76A2E312E4FEA263FDF9639F710 -82AE3BC40F977F700FD0A4CBF14E112C89059384AE61F5D8AE8AAADF8263EE08 -BBE1508D8BE96088746D126311EBE9E53C3D481B2D05C3915B837CD2EB9246A0 -B45CF349E003A1772619F926D21D974F023984FC9F250C2B047D8BDBE3160D95 -C1EDFB590C07055710EBCD36206C14680DFE7B2FDB815F192E174EE1788E404A -EADB20056A38DF76356E25CBBC243E9F3B0047C1DC2DE4420F096CCF430FACAE -68E6E855FE4F5DB453558F6F9A0863C9BACBEEC0D496E64B4737E4223A847FBB -136F40CA1F924595E4DA72E6DC8FD1FED0312FD6BF642B1F4017A95577A742A1 -6FFDEC605A8C01793FA201E89FB92667654DDB2C79439C17C5D2AAA6755AA742 -F5FD6421E3B92672EF03E78049EAEC7218872D7E8B8053A3306F8CE8C5A1F36F -21B73544EFA441920E62B85B282D09E4B7AC9A0F45F3B4D03EA673471F2D2AED -08F107E9194FA669A7CAA31AAD8A849DDA803CA99DDD4669E616992A4DC47321 -E276C2D21A101807C1CCEF4BF6A6277283D6240AC1AF1CBB10781E1E81D2CDE6 -61EE562214B77ECDD2BCB014B97B9C1ACFE52C6844B6129A2F6EAB95FCF33371 -B941A32B869276DC4BB5F5F9CF132DAA3766692268B0C7BEDA0E3430769A4C7D -390E771245DB1462F052ADF0EF6521028B60806112FB000158DCB1A42A654342 -A09E410F18F27B1CC9836B5EF545D4E5282C6C82F05366F8629F115F6DA28AD2 -DA7C16C6E47B2062457A1523E456D0A8B915BEC0D23A086AB0A0E7CC1A086DE2 -1B2D4EC74C2CD70F2F20620D484E5F3F9E841AB0CDAC1829E7205F0948FC6DC0 -03B7A97141399B48DAFEE845B7354CFF8AAC4D78AEA709AFDD49AF6ADDEA800A -8EA8F5EE64F3E635FBA35BB5EA0A5ACDB731A4735FD75DF0BA4750E212CC986F -DD5719D3EA651AE7FE043CCA93CEC9E00DAEBD09DD641564032E49FD4F1E7ECF -7779B2EBDE7C9968C3926995EC8B782D52E2B587FA2252A665D17F25DCF905DC -4C42CC2AD7D61BCA1778E8BC8DF9D98903776DBA03B2521B39A8092FF149C828 -177A12A99CAC8D5CB5AAF3511458F2AA47A62F0B461CEF4A85EC71F265675164 -FC1ED0EC61E2D58E87A7248987B7D834CE16DAEE376C783C7F27ABF6EB80EF55 -2076F29789877E5C1E8662396EDEE6394380E9939B659913B65CA6156A8B24FC -661A399C1E095D3691DC707EB1537525A73524914FED1783BC6907B7D234D6CC -4362BEA4D960E5B71472BE2B60BD4A46B0B99401D22264AAF66E4E6175A311EC -8C6292110EAB741377448733B44B4FF17148C088FE1EDA17454A9E3318838806 -D0B94DC518769598D93231432987A83D8B3D7737EDCD3BD6767A1F576DE4CE2C -4E174875646E5A7F41A8B9FAABFBDC68A20C790EF1ADB783D3B59CBF50D71146 -EA14DCCAAD8FC203B7A1F9A4D94F682022787E13F9DDB0AE28272539F507F481 -9D994B1C168ADD17330A091236E1A84E8C25048EB760A2CC7A259810F5F47788 -FEDC61D519EC215B40B7CBC786C74827CE77CFAE85B44CE2D3A2ECE63F392DAB -D6A7D12B3762316D9A392500F9BE25DB9B261DCE4D7F0795FD1683B06B5B3CF1 -DB9BB5DEAF0FA7C40D940C1A1B3B8B9308E43CA16C4D20E828D645620A227274 -0E31F04673101CDFBF8BDB8E4A59A47F04ED55E3E2B3D84B3120470BF0DD8808 -BA55FFCA47EDE1F1CCA4045EDB7AB8B8A9811E5AC61BF924168B773724C49F31 -928E591294A7049901A74D6DF0637B8553560CB39811FB4D4135DB152F962930 -D3B6154C22F3D1FEA823F819133CE4E1F9E96DAB170D96608C66F7533FF29CEF -30C963D6D251D397022E3E5B7E75488071F38B0A62BAA792A40D5A1084B325D4 -6A45B150EDB3093FB403789F071D55F4DE904C713F58E24BF4910ABFB439C5C5 -A2109AB701E5CDF261C28065C8ACDCF9BD2113C4EB0A63A2C647E316FA4133DE -174624BA54EF9E40C0FB3CB90E1BC79996623F2FAE472E248D979E15EF053828 -6B0B17422B7C24D44A617B15A7BD519D3D39DA1AC9291E6031E40AAC95D81698 -77BAD918C3DEC8718F9A65F87FE15A5E3671C25B421C5BD410C5FDB7A5E9F7AA -E4A9FF3CC852C30531A9A9D118A428E35730C15BB21DC155E5A7C5604D484B5C -CB4DDBFA441AAA99BD1660CBFC5C5D694BA58B0D458363DA2BAD570908827AEF -457D78779D104D8E0FC94AED87F8719F7CE91B2D035398525141B6AB6277150F -121CB363A18639DC42FA78F79F8574D741C8231DC4DBB74E9749B7EFAAA9B837 -F76605DC431C6C97174DFBE4F994372483B83D0139F0A5677D34F6FDAC340705 -F5B7695B41188AEC9570358450B93EE7B0EEE796A14CA7950C2353682DAA8B91 -7B2053A73C95E479E60A57E484CB9CA5EE58E7FCBBA9FD66590A05BCA4E104FA -A14F8A891164B901D4C905B651B2C0AE52F656043DEA5FE29B2654543CA6E3F2 -1954F482F91B2E619595B6FD6F75CD3893A04B1B403BA037F3E5C61D295B4362 -9047752A4F3887A77C5E972A1BCE4E1B1BBAF8A29AFCA3A7CB003CF9EC366976 -4182CD264AA33AA7741E2591F4D6720DC4E549D8DF7D030C95B6BC01F67F7EF9 -BA290F26EB0817BD34E6479A9F3D64C5576E4FEA55E21F0835258AF43DB8733C -D9AD0380D6FDAA7C3A159909D51F8355AFFF3B4966184F6858F9C8DAB0C4B6AF -DB35DCEB259E2A69DDAFCA463AB8D15BD1D44A5C7DD9301ABA8C5C1BCD2199CF -3C71BB0CC646087C43CB361B63AEFD6166650B00889C8574DE207AAADCE273BE -9D1DF3E239D95EC30F96560BF6267B36452FCC593E212FB3B4E0EB61E1B95C43 -5112AFFDAF357AB079242648813BAB19C789AACFDA18259B6A0A830203298245 -53DD17D806762D0660E949DBFE33B70BFD5F11095043A38F6FADC9DFBD9BB904 -AB245C6EBA2EB8249263BE41C9ABA87BAA5F8302EDE09FFCB6F47766A604B2DF -CE5E291FB8B002FCED8FBFF9AACE083812D855A972705B17CE700C9A1AA25D06 -9C1B102BB109E499E8744C382BAE4083B377FFBDD74CC72FB7D8CC74F831065D -232CD579C4190C5E1E36F1D0FF5D659F936874C3FFAE030BF4CD2A114BC2DA93 -0663FB31D30747B66B8E1DC469425882D2505E66E1324042F54B32F2AC31FAAC -29D3805E5C0DAD5EFB7C0C2A7FDB9B6BF6958BBA3E60E562C4B6CCE5D435C754 -ABCD496309310DFF2A82B1E483A84CD3E739B538333F26ACB66C2ACF6CC9342D -D336965EDFE939B8A3DD70D49999C539753F2476FB0DAC527C189CA7079A7AF4 -7D3B48FAF4B6508EFED01797981457B6BB193EFFD9D2C0CFC3E64E2F2EAB4D41 -8922CEC836AB83D345D7BF96E12D8E33C776AC3EFC542994A6A762C238CC00D5 -641DB281092697CD143B7B83B4B0328BD9534256B54FCCEF03D0F94130E7CB06 -B3B87A10A3DA25AE1ED0D1BBEAC7599B429770FBE7EAB5A1E8F6E275C88538C6 -90854DD863565932D546C940423E032A3C58149A82FCA0F78EA63D52CEBB6B50 -3FD8376DBE6CEAD19824DDFA2ED141116BD46EC68EFFC60CB6EEADFBA6AA76B1 -30B2C6F8F8AE128D1642C786FEA9BCE8993BE302C149BA5B617590CE2771B798 -9B56E6159F41E76EFC0C4DCBA47F93BDA0DBDE3D2B31981DFEF2B3579AE42269 -35BD4A2015165F494A24D7EEC7DBD7819DCB7E00F6579C71FB42B428D9D1B789 -5496CF07595B5F68D77ECB6C75990A0E77EEAA91661FF3E25BFE3DCB5487E921 -C19CB362A92E4513C588DD4C07929F42FF1E0C90A6880D0BD462DB37F967CE66 -E490148F6924DFA124E2167F42BA2B0F631A554EBAD62DBFA71F813EDDA89CAC -AAE93DA7206765F0C157AF6D3DEF80260A39DFBE4EC2EBBC491C89A2BE598BFF -E30297CFBCB06BECDBFC8ADCB86ABEE0FE9A9D03D3B6B132E74B5E7B31EE4D93 -42114BE62CF59162E2F734FE657D71F85501ECD61FB3FC43686F984654AF799A -CCCE53300F3B26DF00D2DA5C7A4C50FFC3581157A188F37DDD81660B5E093440 -F13F2553BB494AA6E237369C26BDC401A1DB277D5F9ABDC4934E1F27845648FA -E581FCCE57AC9BBF805A9BF12735BA6A2451905B3F62220B562E14C62605C17A -9155493C9BC368D4D29F546B5DF43B7268C411C6FA83E287AA4482F4C9C11503 -9FCAF5984B704119DDE016289B699298178C7A8474BC494BFEAB05AD1A65A211 -5BB204C5357F1A9200D487DC291215D41D254756DF4F903E202F45ED97003184 -E7019B98A089DC08F45F67C9CC2C6C1E01D15D77ED6B0896F9990B2E5FA56EED -3833B2CE02D250F25D5F4896BD2977E3F846B6EFD6A21A77922746EB62ADD591 -F29B6B248C211AA3E5DF0947C2D47005835949A89826193C51FFE4D02C3567AC -3E1625BE08DEF17F1233B0F48F58EE531BDC3DF88C449FB05B1294E0524B49C0 -AE4A5FCCD838F1338A7C3B8DAFEF0D2B442D0214A58C8B5E4155A9413D058670 -4D888C902C86C1B7D57C007083523470B4090834D0002C23B0486E7BF45A1E0D -7D801C61A85D2B36B720AE37F410B02223D500BEF9C31F3AC2B37C7A5396C038 -EC5022062C101CC4513ACFBF3EEEE9CB45A25FB9692A4B2216A6933B968C7FED -F4C55F6D4E1D30EE75F46E81F2D4594B0B2D0CF79E09E2668FBC79DCA1020CED -8DB44546A1477093B3F6DD45F0DA3A17A0B14AF9A5BD7AAB93E55837CAC87E23 -BA99FB93B9DBEDE250F66342BFA270648582C7CFC37322D9A2004E39FEE1446A -FFAF9A218267D0971380E743A22C5421359CF6A3ABBCB452BDE51B582ED95772 -E03EDC7CAA15A9BFA33540EA7B87B579DA656D53BAD2359F2C2082D0922CD409 -B3447B94D8647086FE0A4F2EEB85C7B57DB2711A2B1BA0AA764EB567126D37CA -C0ACE9F5355E253542D64C2A06DC3E1A21C9593A4391A5D35F06600975F73FBE -9F9685FBBD72C6B32087168F0DF07DF783AA84EC7E8BC7468D301AF7238FCF28 -A6D37344F512CEE962E6701E0406BF3BED4AEC7AC01EC2B90421135CFC14E519 -A51930EC859887EDC7C9C52D65DE128C07DD40B9AAD7841A43469AC33492779D -1C728B62E743BE3E2575B9853D58F8FA2DB17D98DBF94B68D8DFD5C646CA24F3 -40DA3AC4F4CE8A2FBADDDEFB95F9928EABC113F15F8479D3504CF6B9375634B3 -A451D446DCF6005122DAF1CFA827D44A78D79BA70DAA5B6F3E19597ABA4125EE -6E821E036BBE36B9E49214E46FE20C200BD78A8836F89DA5B79443CFBDDA32B2 -4A0F8D27BBF03FBB2A57CF08186E6EE74BAC19A91FCC27D6F457812B58DBFC1A -77ED677C0473636EE092254D2212FD04A2BA77D242218B5F83E5D4EDAE0A2B0B -DBE2673EDB605203090EFA41DFC3C8C4A6E5233A4C183D18CA6215D2D973D4EA -6793381DE634097C4F6B2C93964C1EC5CF6596ED1813FD562D977CD38856047C -A5EF68331ACAF685D5A1C20DEB8D326CCC983F005F6506E286C37E17BF72F0E5 -85EA373250F302C32BA7D99F7317E919DC580CF9A76324087EAA3272AEA4297C -1366888FEF3A8295802F6A327B524FC47100C9EF5AC2FD422F3C79BCC3364BB5 -589785077E9C279AB0FF0D2F3666DA9F8000AABB42925D2C4D91EC69C618CD33 -3335C63DC2EAE080195C6A31DB2774440A0573F9F4064B24223DC4565B344038 -B50D9F822D368EA7BEE7F138C41CBD3272 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR6 -%!PS-AdobeFont-1.1: CMR6 1.0 -%%CreationDate: 1991 Aug 20 16:39:02 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR6) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR6 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-20 -250 1193 750}readonly def -/UniqueID 5000789 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C -68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 -3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C -BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E -CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A -C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 -D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D -23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 -D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B -93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 -6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 -EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 -CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF -D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE -00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 -B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA -99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 -A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB -11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 -50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB65756D833A -1000B06DDE8802EFBEAB4ABB7F9B3134A80C1E3358DE0BB7C7E51DAC55CE34F6 -949446A64FC4974CE66ED1990963E0BA5A0C4860D57D772F6A93145D522455BF -62226735ECFA0FEA888EB4FF20EA2724635CB53DEF64415865DE5B33A5B292E7 -6A89A7DF53B77CD7653F88027C5B49ED3E6417F973F79241CC971AF0381571C7 -65C21C8767AD7EBF8CFD3594D20BEFA8CDFC74A5B1F848667F1FDD78611060DC -687458B74A7A0E602256ABD17B0E42455C9B127DCEEB61D7B9DFD5641265EDF3 -4B6CB4A8E389E2291614443E011E243EB647E03BD82BAFB2EAC335219A2A149C -379EC531F25C6FCE1A268C166FFB5F259A48026AEFACCA5D6CACB176AB573A3B -199DDF3114E686646D06F09C96CAC26E4339D1DF3DEFE24A4DDED7FCEA5EC354 -6D5FA33BF5ED740D1C27B119BC5A61D764F81A74C845E77735E31B9AA0A1AB63 -E68AE86A42E2DA1BE558C2D122D78BF7E9287EF03F2AD83D288C299C6C6751BD -0025908B7B7B772C0E3B190AE8344948DBC923E16067F089225AE05A75F81907 -7D66B6CF238ACB52200E0149AC348558C2A82B9F52DD1E60FAB0FD30D602D74C -EB395A0B583EA75F2800D7F3246120C7DF7239FA23ADD0360EE46ACF252EA416 -1AAE12243FA42DD5EA9D0C06D2FB29F9B232F5C2654B719EA24760E803C4B32C -61520E1436AF86E1D73D4FD050841C0FD679203072BFB62EC0AC34224A7F208A -3789E0B95490E1AF5BE624CDD20AEFCDEE220EABBC681784CB979EF137A6CC54 -C0F25F713C17AF9D7631F2F6E73D837F360E6411E513382BC0C1070C0994AFC9 -827C4E18D1DBE51C478CEE2F4B9325DF2093E2CE1F3DA2F99DCC3105AC6B0B50 -C0C1C720DEE422045F26FBECBDCE20DE21F8CBA18623D3FAF5CE0BD22DF835DA -DD5C3989FB5769C72A4D877270C2C07C23306CC9F13E5B6CAA6755EF3E3C1979 -87EC0FFC7C81A510AEDE2A19A7F4C8984BC4F2590DE33DC173201CF72ACF1678 -C88A1BD4BC3F4E3AEB63410F85BE805F95F31292ACAF5E1CC0BBA55334B1077C -13DB6883390C9D56BCD47FF9D28E98F280AE13D2E3893397CF07AC86ACB9F358 -633ACEFAFF140FC6F51AA27966B1A3A33328AE6075F7DDE94A14671D1E8F0859 -E7EF0C0B087F60C6034CB15C77B986784EEAA747810907F9420649CD0643CFD3 -8F288531D98CC8C71C6CE026158171866BBEE26AB8F7B184BB20D7541B6AFB6D -4D7D1FFE836C0849C2D647D33DF0AF6C58798D26768658A8A77CEF396B77AABC -F263808E363557AE4D69D4703A970AE16A8BF4236E2CB5CB9E238514BDF55B07 -6E7A0BFC8D864E69D346CFAB4756F82A3507C1F7063B78BFC2D84CDCA1188657 -A085EBF2629B535856E6F3A0EAE57E253CA3DB2BE402F94EE15212F5B9527159 -AA463596A062A32B09BB43B4DA9874D0DC6ED691DC32FEBA6E683BA141D5CEAA -CB5BA60C670AE31AFDC926E1834338B9E0E6AA696CAE53128DE335DA8007C49A -379EEC4C21756DF4C0A04C7B351BD02BEBED75B543BAC59C28F053127DA548A8 -17136B4BD2883E2E3CC3737DF62E7BFAEBEE2E87D038593807B4276C5D690341 -4FD9E323A2CC092147351900B02D65B48464CDFC1A69A5748EADD7BAD497447E -47095C35EA732B0A8AEC160E2FEBF2E7B757A17446C3F00F6DE8E635BDA5D4A6 -20DB01E178F99D944FD7D79D1EFE97F949C1C04C7F04055191C0E49B90CDDA7E -62A8F53D1940F8E05B5C7180D3441B42CFFF159840879830EC3560E8773AFD02 -1452A8B65E86FB40F3C5B854956969070ADC5E4F3B505E480E80EC22C2A8915B -9DA580FA78020FCEB328E3EB2F645F3E46F49E34360522B43B9C03A9D0124819 -02CE7DA97D017E3825EAB17DBA957C4C80018468AD7E0F5EF7D3EB19E62A68B7 -27490F0AC832F43C4D41475625B614B21C6729587686506A509D64E7F0778E1B -008E5049D6AC491D892CF1B5B0157AF10971AAA97708F0796C3DFE53C15539F8 -88D89125EF7EA02F7FBC7CA1CC09079EA47FE2935060FCA3F72FB408E7C79320 -D576363E77DC2C8000538C5536F7D95882766D07121A8A3422C6248A892D2D8F -E33D0AEA73738915D300A0D0471C98C471AE0E3EF4E0111BDD8EDAEEF4D5AD7B -59710D95203B81B53E869954CD0E3F0F870C6C626D272B34EB35E9013BDB894A -29E2F2623171267D4D6099A9B1DD65076C5153DA0858219F0082425BAA6CEEE8 -57305C5C87137461A03C67CF8ACD2A50AE663CEDC34E1D51B281839059B85541 -0FA9C31B4252B7E5E1970828D48A4E3B7F001C3A69C3322203AF8A45A15F5FFD -9EE2D4943B1EADC26A0EFD44C64FDC1971D2A1CDB192D0A1F1BF0C1EF78B5D2D -47ACE7B81BD5F046FD1474C2153B4F06F4A3B886B5CE88F55316F9FBA49BDF52 -67A9762BBB46C68416EF86887C4F3532F92759352D7E95D0C876156BAD209283 -A1A276BC10397D8D54DC4914086ACF8A74C5079B43C63105 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR7 -%!PS-AdobeFont-1.1: CMR7 1.0 -%%CreationDate: 1991 Aug 20 16:39:21 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR7) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR7 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-27 -250 1122 750}readonly def -/UniqueID 5000790 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D -E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 -47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C -8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 -78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 -1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E -01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B -C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 -F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 -8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF -A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 -455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 -9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 -EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B -52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 -563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F -0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB -7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 -0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 -1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A4DF280B37ABC -A1346EEBD0D45ED6FF47288FFB96BE63025656A709BF09B182D8AD3CD8E4CDE6 -825B475CFF0D53651084C45952BBC30175F20866D75F2164BCB4844968F35050 -635AA16A5190F56D09D0CF2EE78C9C9D5BFC9B9972549D51C09213F74722AB5E -1271B144CA8E607210B803466E357CDD5429E52A42A86E1B4D58537E7249983D -992EC29C3E0805FF4872F0A86D615CC413DA7E09FC5019A16F8069CF9C407611 -2D930B0862CFE5E11E7C69A3AC1B6C42A306E58B22D9A19DCFE810511055F295 -9641E8ED2EF901BA42C62CB1D064575BF6DF529277F285114C40E5E2F0B5FAC1 -E419AA0403FD2770E8DB3DA6A3CFF53343E77E47781263979E1AE91789455133 -14C1ED7B50DCF884705B1AA8691FCC1318507DC347074FCBC779BE27BCAF446B -0DAF92EDA7616A69FFE557CC78A42A8B62A39D7CEE3FE7A7548CDD135723BC59 -6930737E53A8539971E3CB959DE44AEA22C90958E70EE1F519279DC062B7FB5F -647538A3AF5EC8030688DBD9592824BBB04682840E27D8ABC8583B1FC23B44D7 -290963D7FDB935CFD6182BD1B896BF0401958D4FD2D667D41CCB247ECA21A289 -A6CBB426C577C25DEC41849A947D78D234C5DE9CAC72CDD8C5A05FE7C81D0155 -81CA471695DDD608AE00B6BE58BF165B29A016126D91944F61D658A1772019C3 -073E366D0187821CAA24F32206C609DDA74347F217B2304588688143F012CBC4 -704B3FB795E6353FEFA63FBCA61CCB0347C0A4820FC888DAE2F8A0230E1F185D -F0E0898FF6405943E615DFDDE82D828931A1B895879C517E21BEAB210B95721A -133E6B7A8C19C93F18CB0C4AA706B406D3EBE34965CD395E194CC4B4A5FA5AEA -B9F9B4B6BE58D47DACB9BE6B61763200E71ED10F44DF35A14E1DBC53E38CBFA2 -2C7293B8457EA0A10DA6172B788A4EF94CF490872326FEECFD94DDB8B064DA64 -6CD5A76FA8937D8D553A8E4A6DC1D4051F53A7EFE7641FD8F5EE5E17F09BF0BB -47F648202D8EFE8090D069F96F92A32ECE5452CFF1F04E73CF5347D9FB201437 -6C4B49ACF3D2B17DD2AC3A2E05A9FAD9611B32784846876B8118485B926406B3 -9C7E1D815622719E60248D7C6ADFE7963AD4391ED465905966C4461EF0711B70 -0ED5B8BC0FC09AB67791967525BABA34711BC395A83A8E8B7C1406503400C7DA -CA074D623E2AF6C3D774D8D6106DA1E3895189C12133226B1FCF89B8D85DCC55 -E9680C3B0DB172B002C3D93BEBFA7E49051E12958809DB86FA6C1E21D6815F27 -75F0FFF85FB29F7680E7E92E3DA4EEA8AFC2BEF096DC560BD55E4BE38D813757 -FA66BB39B4DDC3C266D47AEDD0026E734F11AFEF9DF0F817D3CB591CFAF1E685 -CF1D5C1DC706E93044F09FCC605C0028838C4EEA3DC9DF7E43A890C8A7520CCC -176A4C819542C508B716B1E6C9549C5CB2889E431CB695F998E852EA210492C6 -854FFAA438BF323EF50BA1E1E1AFD76EAF9C1C6185C89E0208DB28E2F8C620FA -DC3D194448A792BED15AD094974C2FCBEB55D475D9D0597661F1420803600A05 -483D4C62B79A0ACDE400212F8FC14CEC42604FBBFC53082AF1A5618A58A35BB6 -5A04BBE58EA1395832FF5F07F5AF7C0340ECA6251A64AC15B5B4DD09CF1810B3 -13CDA6B8424CE3CCF9FF8A707AC94B0C6A3B2A99D0AA662D36E7F28718511184 -EF4F65A1EBEB5E41ECEB4B8D540A0CE74A6A089C99CC8017391466C01E349615 -1D9171A2752DB23673B211DC89444874473ECE4E301DF83757F12E7F9971C52A -85DA98069E6FE751020C0F29ED0D074F36B731B87BB890B3CD205C96C5CB20FC -65E8520309392316AFD815FAA4DEC9BCF8C310F98B917FC7B3E1EF3438F3293B -5DA00C6635B7A3C63A3C114E01FBB3B30AEFC96E9820B6AE47ABF4D6781E67E0 -3A51E4CF5F863FBFB98DFD9A664DCF46DFB79A03180AA7A75C16D5B9DCBFA1E1 -3D956B68E924B692FBE26918D512F55AF48764702159E241D3CFE89EE5E1B4B0 -C4704051915A422B2AD113FFAB8C87ACC9E9A4975301D461A065AB787191B043 -7E1C59D5E06EF46A145E661BADBDBAA562CF3CDE3AC3ECA24CD7273BF3103EEE -FE77F12C77BC2A164A89023193ADB4D1150323F880FB458938551CCD2B503D68 -8503A00FBC1C01F28A5C5B1FB7AE8F5005232BA17DF8B9CD8C31265CB9A4DC55 -BDC946DF10F37F3A0E3F3F4EDD1DBB26FCF7BEDE6C532F421914D605DE0BE1A9 -FA4DF183845AB3C9AB680A378128148EF8C3351BEE01DA3A78A3F3EDB132B8D6 -7E1BA03BAD19DF74F0FC004B39F6975E7B00E4E4D304B6E41C4527222F24829F -143ABF9AE8470B71926C943CF2537B69B5980CF94CB70C5F5B4CA65814727B09 -1498CFC769BFB8899BA7DEF36AE294A2BACA8F19D976FE93A8D88CDBA8FD2757 -44ACC72BA02D78D8B4ACEDD9169F461DEBAFADA2DE66B5686A0952E4A324C04E -1817A5D4DD66272DB75178A7976830048F296296DDA13477B0A15C7DBCF7401B -FB9EB8C2FBF071B6C21B1743850EABAEAD35AF3925A0DCC822EDE9A795F4B2D7 -2AC9A6D369D8E4945DD16C152179BA2557700943EA6DD2578186065E3F106674 -2A5EA5D4BF138FD94A6961BF0DB20F3224EA7DC8AD35B97202AF3FD7C01AC7B1 -0F363772AFD896112BDF2CF73C0E9A3E82034A21550877819BCC7AEF6F7D76F5 -4783D625C168939D53AABA2B013897EEC010580E2A2182AF3C6C16C8CB2A82CB -7DB99A35EA3CCA8F22CB6809986AD920491B3D2E29D79207D90ABFEB31F3498B -6F4D9354D30FB14A62D4E876DD5F53019F61E17BCD7EBFBFC3657D7A34FF60DE -19139A57A103DB356218F50F3DAAE3C0AB266F5C1DFF88A447241FF98FC85A69 -97AEB4D5478065CF4851CB85FEDABB6CA9B82C4594B8D0B6ECD2F99FD529BEB1 -3171A9F3B3BE13B2555B658590F063A23F7DCB1F6C4713E2497FF832D08E07A7 -BC661B538D1B7C56C8AF6C9EE35084DD9BFC0FD6F43793A1C914465E923C5E8A -3A5C65C5B6326AAE9DB3C7C7B0F456F45C707F9CBDD8A2DE9E398333CBD24B17 -18661B279B9B379C298DB6BD99A0E8AA3E815D02ED21A8E6A256D93803E9B896 -ABFD6CD697FDD48121949221ACB5DBD69B36393E3CCED4725C58E4605803C43E -A2D84387B6DE0AEBC42FEDFE5A59475F713A86F4CD974524DD37595F10398C35 -A93253BEA3E823C849D55987EE27D7F06F6F8AFBBEF6F0BCAF90F9042D0B1E0C -678C2A1C23B8A4A0E22F3A9E1A1A5BA8B8919303563B34EE84B7E25B5A491E73 -9D250D3E7D96DB5DD3A04B0AFD30FEE1C68FE53282B0EC7F4D93384693268813 -BA4F68EADE7E8831B1F2C9A5E3FA4A2CF0130E8ED78C5CA4ECDD51BB7B5B1029 -60F68E2757E7AFBF3554419DFE3A745B992BB301AD1FD9F599199FE6C0150CC3 -93EDA1A42488A422B2EF1C9B08DBDD0DC86EA803DB96226C053C92B5A2718F16 -399BE114F43D3F3BA483AA1257D6C69268153F60DAA43FC5F3EDEC24D0428194 -72F1F63669E8DF267A906C116157305208928641625F56082C29635A0228A598 -24DF2016FBE69ACA2F0061A2C982214A6169EC4E7368286C48FBE1F3A8814AFC -E600E66F5B220CEF865C705FBFB8FD4EC4FE233F4F79BFEF379532B5B2FF7DEC -E19CFBF529317434B3F60465513CA2429E995C6D306BBAE8D31C549A92A96F4D -E39753B0FDDDDF2C360C9DF9C6D06EDF592A1120B28DEB2BA9F1B50DDA8BB3FC -DB7C05A2E934129935A493AD65341978D99117D96C687CEEB45F068FB522EB21 -5B4EBF4AC7B60427AD6D1242A3EA568B0708D9C132E691E48E51789B48628E9D -68A877FAA81A7015E32A0472E4C7E720346543E9EC787A32FCBDD6622124888A -94E90B70165CD125C0F760D67AFA0AF889D446126D8748E256B27259D5ABBFE8 -7ED511F7FCEFF0777FE18940E4452EBE3B9693EDA099344C0430BAF0EAF53209 -B2C96CECD28112E185250C9E91ECD9B732D92FA832B48D75EEBEE14B8CA16AD3 -D161DF761C02DAF325EE1EB67AD600C8DE0F353B815EA51E8809FC6F83F6796C -9E3140150CE6A32D5E30D64477AC3EA3D493856439D3078F8796C47C1AD72C43 -DC47F18166A0574FC2DB24FA4E8D7C02AE6C9638EF959DAAC08C89D53D99CE09 -0849FACAE421534F9A5ACFAD14324FA0398F45449CA82A0D30CB043776A11A21 -FBAE3A3A8FCA00CBC0DB95E982F7E447E1CA781DD9589670988929DC88839650 -921CB48C7FF0CB0CD6FE4D94A3C3A0DD031C1B81DF970AE381DC3B26F9284323 -859BE3D71C97AFD615D5A28E1B5B4925EF62EDA3782E7DF2C9D2DE5A360A3B65 -6EDC8CD12EC7CCACB9D92A764C016FC6F5614584D13C7CACC5A518EEA4144BFC -796271F1435158D6D2460A8DCF9F20732FED935EE7CE76979AFE0DC5633AA5A5 -1F4DE934FBCCCA66183E55945811B162F0BA8ABE4CBAE250039DC05CCC1D8D8D -4C3A8511F72B6155A92F7415BCCC0D2C97265D11DD20EB2BBFA35D641DC27ECF -F305D8AA70901987AE12051FAAC4C4B13E93FCA93D0143BD4D013B4055FCEBA0 -4383511AAA6390FA72680638D1B096FF7EDE4A6202F7A910A93430C8DFD39E41 -A758917936CE476F3E47EE3EB9343E122769367571B137B06F36EBC60B6BC495 -2798A6C5F081989C99DF47252B8D9A9D1F46AED045AB7E05 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -%%BeginFont: CMR10 -%!PS-AdobeFont-1.1: CMR10 1.00B -%%CreationDate: 1992 Feb 19 19:54:52 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. -11 dict begin -/FontInfo 7 dict dup begin -/version (1.00B) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def -/FullName (CMR10) readonly def -/FamilyName (Computer Modern) readonly def -/Weight (Medium) readonly def -/ItalicAngle 0 def -/isFixedPitch false def -end readonly def -/FontName /CMR10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/Encoding 256 array -0 1 255 {1 index exch /.notdef put} for -dup 0 /.notdef put -readonly def -/FontBBox{-251 -250 1009 969}readonly def -/UniqueID 5000793 def -currentdict end -currentfile eexec -D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 -016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 -9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F -D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 -469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 -2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 -87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F -D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 -92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C -295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 -409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C -4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF -2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E -0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E -B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 -24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B -43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF -D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 -5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC -96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 -7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 -0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 -B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D -AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 -97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 -FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 -20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 -0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD -F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 -3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 -A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 -5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A -45A24ADAEC63F61C9FD18376D39E0FDDE3FB4FBCDD6A7B66068A99D31CF54CD7 -DF2262DA91CCC72889CAA62B1D6F2155CC8E940A2C35D8CD3EC75326188E2D30 -1090F31AB50F30AC77D2C445BAF7323389406C44641B3A72C26BCDA442504D03 -6C22A3BA1A69E5F87EA400501A3B3231E46F96AC3A6C0E4A4F6F21E0B2BEEF53 -E016F34D7003351FD12436520926C632218410359AF9FF167750D3CE0DAC3B91 -B310C457402E05C316F400246C8C38B98CC8030F71104BC4FA0505B5EFA4F5C5 -9E4FA27C3E790D698690336254D7E34451E692AE23BF5FFBACBDF33E25359BD2 -B0E7A0686602568BC87422F32486CB50776C7EAAE7F1BF78B228CA3254510653 -3D6368A4985C5FF5A48AEF16E1AB71D7CE2C6649F2CF4B2879D4FA042239B504 -F988D2FBE87C3BC784E55B8EE36F1BB5EF14FD5836CA448E139EF8FE221E827D -0608A6B90E08CBF44A30669AF4E20CD5C0C8051E5F86062204AF362DA690B74C -B952C9F4799FB2535E47AC019175950A1F3A0D0937016148222B545B1E00A91B -39D2121462F51F736802C523BCFBA894EC11C3353F9BCDF0892C00EB583A4D62 -247118996064991B816F9F490FA73861FA614FEC7FC23A5D45310527B6559781 -F1C805F0EC931D0C60E70FD5AC55F22E6379D369303F63A0E7069237118DA0A6 -5BB55FC6EA1797BC51C1D053401ACD4E9B5E724F4AEB149C38DB0E2BFEE811A9 -A94A7405422CDC911CDD97EC4976E27F766A9E3F84387C04C6367509157E4D91 -09A1F6DDB59AB9096FC43A6F9773ED9CE3DA6B56D10AEF99FD277F8666E72028 -807AEC6C26E5A142496CD41A80EC051E875DF9F547BEF060B969B197AF97608B -F7A3740B3153621A680DAEAB0454706C65581255CA9B40078FA6D352737F0165 -D834359ABCFDF5C212F8AE9FD50BEE9683E7D5969D183C058E8BDA78F61B61AC -98746B3A1750093A40C17EBD4AEF36BB2DFA1C9AC2A12834DE4623CCC76BF5A7 -92B2B2E368D1DF3471D83495B19154836569D2A30F9CB05C0EC499EA5D3184CD -BAE8D2A2CF80C6359275B3894B4DAD7F92501BA9A6BD215256CF9F35C2BDD40A -D1D949000633FF0B5FC7674BBED71294AD28FF25710E968E85C3FE71046BF0C1 -71EF48F8024C28959FBE6E896BD1AFE579764616672C724959FD66C8398ABB5D -6C02C5619866453708E3FDCAC2754E9C333C1123A5F746DC5B2CA9D430263645 -A88C743EBEF8C82DA0236FB73D3DCDFF874A1A5928406838A81E40F34816EBEA -0D7A89406A6F492E5E5E6C8C4D85A2B9A83B6A4304B05AB541041AE014C845B4 -283CE3F75DA22CB7CD78C67A1F067C79B209BDBA6705D80FBF08CD0FEB9D3293 -D9955BF6730BD59495A1F81B708292B509537089D8AC34A06DAE5E8BBB9B0A0D -F09BA6723DEA964F06C0E1A6541656470E251F5AFC6677043DE7C6D85B60D3EB -B8A4415DBFDE3F29D5FAA0B5CE4BE9559595265FA8BC24A172FBAF9B1AD0A4E1 -1CADABC2B71A43098146DBFDF7E126069259EB490CAAB07D5C9CE3D50CE6FF88 -DA94E6D53F72FA65B5CE18E2EC13A63E7EEEB698898BE82DB5F39F4A43046A8C -074646406D1AD4C76DCC6E059A0ACA869017993CBEF9AAEBA95A1F9412F08F35 -F46906A33C956E6BD717F6EA4E5D88B820F08641BF7DC21B3D394AC413A9FA79 -5A9E2EEBA446169409B76E1EE5342B4ABB36FC6E55419BE0C3AB28B0B7A174B4 -77D651F56C8E6AFD1D4AC9D861176BB8FF4A20678F203789C95A05B03D46E4FD -60A16CA5794C594D057B349E632BA6C801DAD6F5B5DFC418739AF2382F7ED25D -E1A78DACD981ADD73985F2E1060EB0698BAA46D04FAAD21985F518425D9D1E49 -DACECCF7E675A852DC9AFE2B5CC8CF17FE0EB8380E8708E9123594268AFE39CD -B81E15AE823DBC9FCF91A25F9F6EDA4A24319ED6C4CE9ACA0F700D909737642D -4FCA8A8BA29DE7F86490AE6C0448FD3F5B734135329530CEBCC6C254F1601CFF -563B60A21D848A5F84FC8AC6FEF5DB847E1F93DA5015033187E8AD3D3415D85D -3519F0BA6D2D8865E4B5E3213850F9F2511B065C05E44007B7B17352B08C3E09 -EC46A5D390C529D19146C242115FF53244D8AF61DD7DD2440A9835FE27D0AC57 -3214F0B5568CA5A7479091B999F8ADF1BBFB09352C0A37BCBD17C34090B42CD0 -FA55E5E0AF184B4E391F4E553695C46F49156255B847299F9498C1DCC9CE0554 -B2079535D087565BB5D67B23CD55C216C8324A1D122FD95C56D7DDF9E16521A1 -F3BCE428B6713F40844922EC67039562F71AF50C275C8B98BFAC7A87753A59EA -DA419AD61F1BD4E24DEE2EE7F68B4703A888909B06E91BE0444C7AFAD10887B5 -49A96A7EF6AB3D9F5D8DEE4DC84E31A9BF2331E18DEA4D4CEDB9A5DA03F2DF05 -121733C6E89628EF3327C7F6A364B64F0C3080634CCB19B70C402967D68F35D3 -93D75B9BF37B9B928E4AF68200A07638D27D027C07E9302925D0C55355F5CFA5 -FEE8F412CBFE9CB4A2D71CBF17A669DC4B9BC612AF1798A4BE5F9F14DA5C94A2 -D2133561E50A2980D1733C3BC9FB73DF8817A28F11767537C9F69BBE2BC51B07 -502A31B7E6AB831737C2777E927BCD088766922F626DA287C18132E9320C041D -DCCDD7CD4DE51135F0D8B35E8602BA2720C4B3F8C02D769F728E70528F162946 -925D09073C067F55C317EADEB5CEB7E3426667EF27786EFC71A6BE9B7377021F -35347B323FF8FE756837C17A6F73BF822CEA668A41D1C70CC300AB870937044F -5F6B65C3715C2D0F193859C2AFFCA75ABAC45BC7F4670CF52A9665F3A0C3001B -6E468794562D3384CFE7FDB2A534D9CEF93C59AB33566DF02F22C6875C88EA75 -C39443333034C03F9D9E5C868864623A8F95ADA59D04A7B602A347EE9826082A -B38EFFC3B6BEB21B1A204D1FB8FD40131812350240568E7DA02D94B4879BE921 -B59C88C22699A3ECF5B88AE68304F49FDCA8C972D0940F28A8CAAECF0854B6B6 -A620B55C38F898DAE56DD2492F8D355FB9EBEC5C475067ECE5F073DAF59BA508 -DAF5A1C1350A0097DA2589878A943CB5B17C4DFF782ACE06CF7CE566BC837FC9 -2C0272825DC7064C72716D42755B04ECFA994E93952AAA41D4CFA298DCC82B69 -69845F436E28E5BE16AAA5E09FA9A9A76208F316B92C4BA947CC5EE5B6B3D747 -17CA4DEE5AF91CF5FB8388952A4C455F3726404195001A5A2809779B1D57DFC5 -0989179252B8405D42542E5627C9A9FC23AFE1E3A0DDC45587900A99D547B9F1 -88AFB866F7844A05A70CC4E6F5CECE8D2B0F241378816B73DB6103B1F3C3D513 -478A1403589E91401246A875F2B84C185BDE76B210C7E83F5ABEE6F1B8CC4AAD -0A625654B2BF4ED3780414635013B74C99134428177029BB89B71204A6D8810A -9EE00B4CE4FDAB52007D6871A76CE2AF1E4F85BDA68D362F341E1E8E8E86D158 -F7208A57524EA917CBAB094370B9EC277D421DB65ED946B4995A2A6B7BD3198E -9545A97515482C40AF66157D18AE86E5D5FB0789A87C5DA848FEA40D5EE04D29 -BE9D1019C5D8DEF6D3BF7D0F31EA5EC221EDC80D4903DBE46AA9E8EA730AB8BF -968DD705BA6DDE4EADEF7037CC398724F031334B2B61B8116712BF3BAD010082 -3A6293358965A8ACC57FEAFEAD43359D41955B2C9CE8FA73DD25BB409917C13A -D1A6899E726AD30036BED751921C9CF862F1E6D39F128F7A422A3E53CA979060 -E52911A7B25655A053497188EEFB2AEB72F9D788CD621DE5886AAF7875A7F421 -AF246664F101B56B7C9134AE87D25B2C9D536DB7C470C6774AA16C63E627DAC6 -C274E22B894980DE12717A3591AC7CCAB7FBA9542ABFF4123F7E32C134ADC321 -D1EC84AA5AF2D0F6076FE49882BCFBC6AC361E22AA71AE2F502F7106F72121C7 -9F5BB5574E43FE03DC239E799B31A6311F293A5CCD77A11D1E1C800AC9C87C2C -893EF2379FC05E0BB2DC03529D690D236E07EB183C3A71EF5B7E604DA826C373 -2D9AD0620F415CB5215D42088273CEB5406E8FE75214FA0D16B82CC6B9BB13EB -296CE30CA9B82A4B7DFD2210CA69E58047B13D4D659A64BF9C381FF5C473334D -554D66F1084941A6AE2D9E2B0E681927E397D17C3BD7B15C7AED99F18583996A -C260173C9E681F85286C79A9153741F0411B2DE2AC6FD12E3196B8F113A61251 -3A622C54E4218B53689B910336A1B69034F2603AE8DA781879FAB65A4CD57FA4 -2FAD9F5B45C959832EAE4DA27A0644A6853115172CFC60AFC65B0CE186BC5E85 -51A9257A629DD2CEC7AEB534AA9DB4315BC8290A44E718A5FE77F9D8D2A1EA2C -9C759E494DD27091BCF28EDEA3B2A172EBBF2070A51885F4A9ED6534FAF06572 -3D7146606A262FB45E22BA1824950466EA14892715DD46E501E398A6D52135B2 -542147255BACF39FF1CEA5044309A0658182401AFAB0B6F6CAD481E11351DB64 -CC43A7348273F0026665976DD0E5686EC532D8464073E36B1E3CD0F0D11F791B -7D89D29AA8C39C8C075150D54CD57F3986A731C7A1C8C03621B1C92F2007F3B2 -F1A3C6DE4CF954FF6E496CA55DE1C609AF9E328E38B38C388E18C13CDF27D64E -AAD1071A14F2AFA3231869A6CA3FFBF8497F086728E7D752B216805EF4CD8A3C -554E6C6BD4304AC7B6A915C93AB27B300FB1CB040D763005231D2462471264FC -003FBECB4973626AE7740755DA5ABE4009D2E404AF95F8384BF9C93D60CB0B34 -89A14CEB1F6A7513CCF1B5EC6E2ABE0BBC8A87C6F3A701477D72CEEB31DA7CA6 -E50FD5DF9EBEFA43A8F897D38D73271BC41D1EF2CD03AD5C47CE12640AD3D596 -5731B28C892383BD7EB097EBD5E5F812985B8566732F1F7D43D0433668E42067 -A01AA1001BB0A04FA4D8485292FA940A3878856B0B0DB9271447493B1929EEDA -D8BEF4AC5F75E05A2108AE0E7D635DABFCAD1901F0EBE9F12981F2FFBD474CF6 -C38CA418824C1158751F107AC39E367EF486CE57BEF0BF689FC2D283956D741B -39825C44EF7AE35AD2C9383031DD27DFCD2AE38318E2F4C15512B45222B8A3E4 -D2984E5E201EDE0B4CC8D9BC29E026F631C3584541A248E281B5A9E8F4E6B898 -CD1BA8156343F43E7CB00423F6348BE2D71010A1A32B7023C2D03AA02BB328C0 -9D567E14CB2748E07B426BCA5E69F20D327C0EB7642D7F55F6D1C7520EAB2F04 -5291C728BDC11FEE511D45904AA82945F0D532C11589240AE56361EADDB3773B -D97ABF3F77E3358595D9E8C9887B74A203DFF3C00BA8C200B31904A6667F6B9A -F90A6E5089E957BB69178B560010C8320D01BBC705C88E2F4B8F05FBA478D70C -D562AD71827ABCC77C68F54DAC047599B1ADAA0EFC8EADDA9AC1C0DA1E729281 -0840421F25093D20B4B72B264E87ED42834079987BE2AC7536405CE30BD930BB -391A11044C30197BFB452DE4CC9E5EBDF2A07BE5F388D6E9F394EA48D4209DDD -0774F3CE7D1263842078D54E2D4B69C6B6DC76717383437AFE96B4FD08436F9F -E45D3CC5222D53E6BDECBD5F6E18284A8BAB53840DA641B122AA81B8BD7016DF -1ED17A8B16F6122C5DD9EDEB538459B2C5B3B5D7CECC7AC460F694E4C4870089 -805B19FD2C4B18BF8CEBA59292F09EBDDF54428FF80A629B183ACC64E3AEC3EF -149674251C3280107EE5178CEBD14619D53B402A20489F3B64B0DB24FE5A6B0A -04E1D5472799288CE10F8B2BA741B2410AB082A10A129676FA9AB51AAA270EA3 -23A98958D9CA89E1EF4F79F5783F0AA3797F80841E0AA65E6E2EC1FED836FF95 -987B342A2B2720EC8C62BC1ACD34051C8CC269F46FDB64432326CE0F5F430A2F -A0F7024213380EB4104CB823EF574BFBE7154216407B22D0C133D02BF096192B -EED315DC961125FE73E1C7959A3B587EA380B3C02DF38EC6DDCB77A786E4A736 -F83751B4BC8FA79D9F631E72A23341D112927D6CA93DAF4E4B7AAA74A1575DC8 -C2B38659F2BBE4E37FD404D9C8455A4F823A5C8896DDE0DCBD3BF475B80B00B4 -BAA900E7260F4E08D1BFF308DDCAB302F49B515FD338DCD466BCC358E8D8872F -459DF610D01AF32532EEA6C9BEC8BC63BE6CB223242A7D206E61016CA09400E9 -9E67132FE45B344B3292B81672129EC06BBB56EB663575CEBE222888F40C7C38 -F8C0E0A40DA2E530B6D6280ADBABC497DF508BA5A38EC09A11C609FCDF9C2377 -F8E26C248701CC61B6F09D633A003CF6DD28E1B489C10AD2C2501A9856E2A9C5 -01A6111E5676BD7EEF30057233C01ACF30595EACC055F2052B03171BC69A7CA9 -D4EFF02BB0720A6AE73CF7DB1F80918D54E57BAE1F924FD2607AB5FB6FADC4B1 -79E884FB8DE9EB46A8533E1BCA01A054E324B5EE30E427894417BB4594B246B7 -73FE9B5801AC4DBEA7A77E6BFA46168FF02C8CF2656F78A55639199747A54FD4 -07E33BE3A31155FBBE6045C147D70419B8941CACBB1A552A8BD80F559AA63D7D -409D84F8C6AE7F09A631E3CF53C567E5E5C8379ED4FB393263539F6CE08BEB74 -095DD7F6ABEED5335975DFEDED8C27DF1049E2530AF72F4613880A6D7A1EAE54 -FC694E9324B63ACCD766796163EDCE4E5A9C0D7A1C18FEF3F5279EAFC32B3C3F -1FA999D53BB0FD6F62BC250BD75D8F95B17BF74F823DC61FA3C6D0D0294E1D1F -1EF4A1F472EF5B2B529ED647F279A5BEE26F594AB1A730BA4AB0EC51B4811843 -F299642D190F2C6EEC70AA016BE41091DAFF25036D2D28E9F2B97E652A250423 -9C81F7B77EE03E67BCE170FDD3C99EC7E3AECB3DEF216197FD585C4E73F32BBC -3468FDB24135669FC1D2D7671C1BD8ECD4EA541BF59148106F52A8BAF398EF96 -CDF614AC1D089A652CD5C3C2B78D4E7E6950F9B4885318DE3B18D5F2C295293F -5D47DE26C9DF16FEC283567D8239E3C97CD818C35FDD2D7EC5FB6512D53B0E57 -A086B95839129E7CA2197D95DB913C10A8381AA049801A7653490F502BD04E9A -FA322FCF369FF126837968BE92D9C6917D4D111FD79DA9DCC03710B5EE0C477D -8080679B19D7EF864AB0197B64ED78CFD8981698D92065EC1052799A0CFCAAC4 -963DDF1E7985A2C4ED0CC494FB51C6447A71BA635E7EEFB4BE5167EEDDA6A5E2 -CC60ED7887133CCFCCCEAD0AB7A4CED576CF25E374B24D7F2862E925518B4804 -2D2F72E04BEF42E8139265BF3976E82832A0B1AAF47DF21E5A5270698EB4DA6D -FFAB17C19C65827C949953C1007D294AC8053D7570C6FEBD7B7C6D0C7151C297 -8168677B605292EE83E7F4DA147D0EBA8CC04111F01C5BAD0668C9ED3F6F0C95 -7FDD094EA33E0792C9E7851D1CD4B6B3D3680FA63CC99FFBE81B77E0E7CA6D2A -E6825FA45C816C044AFD06844C7C041E624151ABE210C81A0840862DA7B6A8A8 -2C83F9BAE28E9E074962BFF8FD3B1BE17F6CAF5211E26264359C2B33E3A34F84 -62A46587D0B5DE316921BA22706DD3049A86A2F67BE34AFDD8A33809F53635A6 -853C411FE625503BE4F3192BA22C50F58F687A15E6E9E6A71CB5DDF7C69CA071 -17935B116DFAF79C6EFF26CBB637AF3C29AD9700DE81293E088E3ADF012B26E8 -79D64A84C930D5E52A93E19FB44D98B0F500050E5BBA589E7D47E38F044104A8 -57F06D30D3C1B29042BB57F45238073025EFEB0594E687461474C57B719E30F3 -34B50383F969B81C8FECF983983F639ECE5431C2DCCB62888A339A04A4A2CCCC -2CF26D24530FE48170822176CA267CADB5D5BF5B7496820BDF248BDFFF8699AE -62496B64231B937E6B5CB35D250C0261A4F02DBFE7CCC7F6F6609ACF6DFBFF90 -E59A8B13D610C235866F1A7E822B3ED2A9B3F912BDEDC1078B3A1F890D40A69C -46BEB4405E86196BA2F0C91FAFF52EE55498493309EFF19218E8BFA3210DA263 -B6BBDC1B1B7898B43FF1B3A4C11E30CD67B9C1CAFF606CB8A97F6A989C66F508 -ABF86EE9BAB0DEA4BA22051C77D2AACE1641FE9220B1CC795E99F9D77446B14E -7CF033F753901FA50DD77428E18C8F31A5947EB3EED98F159DFD8AFA98DC9DA7 -31377FD084E5ECE5D4D0A960BE68A31EFBBF1F8AF6092054A6DA276F1BA93AEA -23F4BF45D49A89A0A8CCBD44FEFA37D11F05EB76801091F170B8F2976E502F46 -6AC58EA87D933009C05F688F87B191CEEE874C87E7B3291FAD8D38DC3783F208 -C778472ED87FD648E73A5B1FC37ABC18DC9438CC6D46075EFA22E613741C4DF8 -4BBE1608EAFAAA474CDE375EB5E8F7748EBDBB8C1EC93A9226C66F5C5E503523 -AAED793996B0291CA6A92BA6F704869A3DF97F04038A8AC092D01D7D38FDBB6B -9688656C507A47B6B724312D577FBA080669DA30676E15456F7A9F12F8B6EE0E -FB505CAA25D7C4678AF5F798F14A9CBC3F3CA2C09C7DE86A52653D3AC142094B -6FA27728D6D8B3F085A38A9525F73C43A65DA88451D09E5F1BA0214246975C6E -922DDCE24AA9973F6D368903A9BA08CCA68CE2854146AAAF8CD4852B9ED84C10 -7742C94FC1BB35323A4D5306536D5545A21CD4B0FFD491BBB44BE19BCAE59E2D -E47899D8B71EA8F3CDBB5EA7FB98963F0E1DA36732EBF4B6C325E1898DD2084C -059C8E755FCB211906088A919D08387A21019EB44B909F446F328CEF9689D651 -D19E2FA25D3577556DE54C71B8D27CB5060DA2C146A0252FB6E6C3C0E82317C3 -172D8C23A67E303024271125870E0445DA5A009A6EEF6AD5BB6AF874A0C4F3F0 -34EBA8C268ABA8C159B5A9970D8996545C27149C097BC5B46268E770FD86BA13 -83C8DBBCE8D60C8E0EE9B46B7F835E16B2292DBCC58BDF25F7CB2CB91B84D398 -7615B5CA1B326BD632DF34393523494487DE624B76DD325AF6B4B0BD2875A12C -816E2E81AE7AA21284E068704B8EBA17ABB3EDEC961303602459ACA319F5AD55 -17C76BE63E1A55FD705C6213B0217B352BFC33C6C774EBC45840890AD9AA43DF -2256BD37766E42C1C0CDE1238CF532F46368FE093DFA13B836BB592D782FBD36 -C549343D026EC3DD9B0734CB666890E9E8633DCD29243CB4F28E5998D6E8F8E3 -F18D8DA3F99AE1A8386DD087DF1F16E7D588F491B53B0E45A6E1FE1E887CC293 -BB09E68B74DED8DA9AA00493D0E676ABFCC4DFCC4FF4D9783664CD13AE912975 -EB2B7709C27A62092613CC15C9228472FB8FEF513F1129D9353AEAC3EBAC8469 -849E3443F2DC4332DA38B163E949C31D333A4406FD2E25996503030BCAED1528 -198576D3B977D41B77A3A8550D69B82006ECC6822FB2DAEE326D2038352DD433 -FA6C2D8A86CBBF1219978F6E746F203BFDA12E9C65A03CA6A2BC1FBCF0A617FF -E52D5D841B162562F8D5CD989FDB0D935CB4E153FC6D7E1C318F7E95617BAC3A -19B96B3FAEF20A216D3BD8DE25B1AE598EDBDE46C1A62D3964D3767CF4399076 -DA753CD5C3BAD2AC86E0966BCA2A599F710020E6CFAB777420B31EB306994677 -818B9B1FE6D9AFF1C8DC6B88911EF793A6469524075864C9AE5F91D4579F7D74 -934D1B6E07FE3741FDE0B09BCF1BFFB4F63AD3D22E557B54C8A0EBA9AD236E45 -1EF413E03F3A6082D592ED17D4E19045BA3983BBDFE4BD3DE7A2220EE29A4C0D -6B144DBEAA490C2F8B6403AAD5BB7717AE531E3ADE789E3EDBEE53FB189B196D -F64FB7813BA7472B35742AF3AFD75ED88CF7D105C6E2079E5C071108B8A0F1ED -C68216D2A4B3AA02AFFAC4B45D22755ABC4810AA9053A76D4E89FE0B22336C60 -615584AC94FEDDEF30A59B4718DB5775DE20A3083F39CEABF6D06D94DAC9DC95 -5D5FD40E6388D07D1AE31D5CF580978A56041270D4D86AB3CDF8DC13FF173AD4 -157A73E182B861E8AF9665BF620F5B615EFB2201A3AA477C6D02361498C1F769 -D26A8EA27748CB6C8D91B47733105331E1C0C8061B079BCE8D1E1D795465445C -CA7660C46213AEFF533C5E44D2A8FC3EC147AEFDC280CE997A8A045D7E0CA2CE -85A4ABBBB416F6D8FBCE97AA63C228B02681B17D5D71C40589D1FB71BB7E32B6 -A93FF90C5604FABCDFCFC5996E4C4AA1E2718C7EEFAC9B28D164E0EEC750D2C6 -508DD9292479DFB15B31EEB0F69099CC68EE4FE40722EE00D6F505DA6DB65961 -8B6194524B30DAE671461878322FA6F914947EF5CCA5CC847664FAA4D2D5D59B -629765A3AA4B34A1C42758C4879ED92D2CB917469AE7A6530CB9A1B641F8A09D -A960BBD4AF12506DD0FEF5FF7E38ADC69746A8823030857E359ACBBF2FE785EB -D66471F479DD68BF7DB2892CA1B54084653493A43C8BB66EEC577F8B5D6484D7 -9BFDFD72A382268F4D1917D93C687B97A90E45ED0ED9B7F07A35D4989115A5F4 -3ADFEB695B223E70E24BB6170CA492EA0C9BF5ABC429C2204BF82F69DE92C7C3 -086BE7B49CA6DBED8EB43C7303DAC79C37767F5F0D5E302E3F5E2A271F5BD1D3 -DCD3F2BC370BECC49C60FC2D7EFA6A14AECD34C5DDA32A8DB25D688E2BD2F989 -90011D8600047C6422D550E1B2CC3D6A6F85E8E6FF4A1BAE2F28345662FF3CE3 -E59C19724F51F5B7545D1956C98E13C91A8F76C65E350087D686A04D4BDDFC4F -6480363C00AEE361C6FDF28FA51E572472BB5CF701F61B110D1711A19C2658F4 -F058E5D0B2829BF4828238FDCB835847C053A32C25597FB9822CE575FA21E2A4 -0B4F564FC136DD4E5B4A7F531DF2B3BD5648C8F7027622EC463737BA6E989D4E -6AD6E5474C8ECFE80C53B5003914E1DCF46C1023157819DC25274327A99A7A30 -2E2BA87A3190E5241BC9EB070CBE3CA9BD5CFCBB60A0C2AA50AB314AB1BFC499 -7CB6C8D864164D1EBFDCA99D321C66094E1A61232FC9131CD57A4210C8876DE8 -B3C7447099C6BF2C49E49B57A3E3DAED4B806B3368F3D4B5AFCF5EF81EE5AFBD -5FDB91A3A384D2C8F8490589813D8FEF57265CBDB1C17DBBEFE037AC3C227A56 -ABB9114E63FAC205478BD4BD75A9A9FE85FBDB11C691016EFBC55375ACDD0BC6 -EB7568B1A6697718420A06B8286BC097454009FC86AC7923F92E59575C7E1DB6 -CC53F93E7DB17DAB6859E65C3F303B21034B8C8F0D8DBBB210C4D1C8F4F9B3AD -CFE53352EFE9663D05E72EEF73EE36C93841DF7D318FA82E95A87DEB522CE111 -2EEB46C8A809EF588A77B9E6148D66D81035D3820A6A17776D44F0FE57D40FF8 -F48422CE909FEED7CF390A114DE170515A200A04D585C22CF51268CA8C89C0A0 -7AF1BBB4EE3A1A3658B792A8A1C629C841D05FDBAA2C95BF9B8B70174F1C81F7 -0371EB7C39D83BCAB9C3C8967CB36C9E52F34CC5F0704FE113EAC8725B7A60D4 -51414E73373A4A615DAD5851C518252E2A408E9A7BD0661F7ACEAB9464D9AE33 -AEEFB57E6711F9229C8A5943D68C340BDA682F1D2162F0594294A57C6BC9B2D0 -EB14BD58ED48731AD70E87F438AA5724776C97A89A5D8B38B2487EF0F5291133 -6276FC53AD3D1167DA2CED202B11756A91900C9AB09D6A09BC7BE3F7C39C4B3B -4F9380DE7120A4B001D808F76C54BD229ABF6DA9EAB1F640DE6A1988916A18F7 -DA865798DE1826081F7C8E187B008014D4F20C4E684359C88721EB3887B6B093 -8E68007EBE9D5D44990D5EF3A34D357BF9FE0B6D8F74CC528880E4B051DC3B80 -CD0939B888291EC81CF0174DD62C0CCC78E13133BF8168A51BE287522A8C9BD4 -3ED21691E929276EB7AA14538A5A04267708C03575860159DA9A4A9032716894 -183539193969C1D6698E53657BB57E071BE2EFFCEB47DC3111268CB1E72DF6DD -0A656288F33729FF8F49FB227FF7DBE2485D470644B6C07CF8B0B298564E41E8 -B85174E2ECE84ED00E3554F668BC02AD346F429CAB889BB13298834F18CA2A66 -41011B82F359DC27147B8030E27B9660B788AC19E93A6ACA4DEE7F14CB2B5D17 -12C5162DB9F5976071C7AA2BEACB69ACF2845347DAC20B6230C0D9B108AE4246 -DB13290C506F42957107115EBF80268C71E87EBA5F13E4EB2075CD2527DA2969 -1A8C344358C5F3FA928208B028933F2EB079D77334B1FC97FFF19C73833C7F1D -4C29326707E69DAD317099F6FAEF0448DEC23D6347DA21B42E82F3D78A12AADB -D58089919895704DC74C7F51DC08D2D06F75146098215DD6447A83F5273D1002 -E7FAE0AF95B072DE05EF580430BC0834088116B66DB032A392701970C43E18CA -B6E192D158F75C935512FF4F4D5D5B6F1C9766FF74E9ED9BA2A860FA8D59E41F -39064594748B3F329D8DA81C624C32B5E0F196F5D69AB0052D58B09F9653E15A -FADD0A1310352FA8B5650E90865F18C13A86EC50ED850AF71D2A1D526EAF4497 -5E960ED8D3FF21ED94BFDCE03B97663F5DB8F176207F7FA1E96F1BC1B8A6DF00 -FE2EE8217A304930BCA7DB53733AAB0DF733F5EC4E99AAF654FE2EF583506709 -D3BE4BBB892600018C7A1ADBC6B4EFFC5A81B3E5092F65CA6F7A5268046ADC22 -692FCC6A001841139644CE124F3C98F5EE7CA19F3B9F4EF3FDF5898ED14BB078 -9E53E0FD8D3AA9EDC78389864850AD7C55009B251ACC811309098291147AAA26 -524D48DD1CB00885188021204BF304236D6476864CDAADA0F851634027360EEC -E050532007BB84EEEDF5D6775049E3BDE78DA91F7B108637E1DC68F00B123F94 -AA03C537903B317802264C67267213A796A6FCDB107C2D6810B7766A26CB9F40 -2FDF3B6F80FACFB0F09735616A62649F28B4E5DAC6A1F149ECA2B919D1235800 -A129416943A11346EF947EF6A2B3A30008FEA9F28A929A0F33818C5E397EE1F5 -0326FFB11B2D58C31CBBB0DF5FFDE77E942E975BB80BF3B776F6BE07FBDEFE37 -80B4BB323A292EF123C185D8F7DF773193173A8E5887CBAD8E023BF28C4E24D4 -842050725584C730C7B821E2020287270E160740F6EA1F43F79101FC842E09BA -9DCB931427D84A3703A044257258DC0CB794788D1B14695CBD147DF369141C58 -9BFE9D860763D74A99E7CC02025638A15E115B49534C5E8C7DDD31DADC1CA7F9 -6329FFDEE6B8DA728345D93562596276526EA73A0AE56714AA5FA3BB7E372E2C -9D08CF5E9AAD04B1A42193DC5989FB0045E0F2C3C0CFAEC90DAD5A9566546207 -547E9D4E8AB01CA489D09ED795214CB283C3DF9FEB1587617574AA28968E050D -E45BE07CF0A0F9814AED9C690B90D193A4075F35B1A00A81D030C8DC4594FBE9 -5011FA4FA53D1E7131C5AD7559D5DEE8304DF981963FE932A5C6D83BD1650ED7 -C9EFC793B940E79A78FD92E4EA99FACB5CBA5709CA0C94D6C6E683C95CCECF82 -46AB169ADAF958EE22942EDA5442EED65432AD4D4D0579C7E9D32C4E3C996F81 -851E0A8F9C7BF9C02BAC17D72E200A25A5DBA8178D9512EA39A278395116A0DA -C261E9890CDD3A99464E6F4E6846D5FC3E52356970BCFF45820312754EF2D299 -51909A00A172A9654EFC91A3EA0020DEE1F37630AAE66BF50589D2B6C8D2C259 -75AF0F635572C8149B013EF65949AB764985E10FD9E9BD7115A1C55A7849F767 -C1379BDED08845C31D06ACA10B9076B94427D7F19959763F05840517B7B55352 -A30EA7B73B3C03C334FEF11CF62C8C766B95DACCA03319D4021FC37513D2F8D7 -73DD4604FA8DA2ECAB2CD902275D4AE194FF263A49B038DB1ADDAFE5DFF63C00 -541F314CA0125B0E2856643CEC8C46854DC6B13A03DB240CC986A33EDCD1ED6E -1F22D9C3A152EA006A570C636497189E4A177AAAF2B12D827515786DF14CA580 -D82FAA832CF3631058395549B2A249695498852E17AAC26F900DD29FB42B9B14 -DF9691858254F13A84A49DF184F56265A31960FA9864DF802E970B7C1ECF766E -FC587F2A4D4A9A538AE3B7C207F7596F643AB8504824868137E463ECC97DD238 -7FEA8FDB5F8A2A9FD79A95436232E0A7EB2CE9303305953AD9E8DC24B2FAF6A4 -76B7E8CE895D464FEC344C38346B9AD13FB32E4FADE1BBD44DD5A87BB9302584 -B7DD75DF9874C8513281CF98C740C66EA0BBF67CDDE33CDEC8700B8B00C02A7C -63BF1AD24259094B799ED502F64BFF9A17E043F48AD4C8718ABAE844DE1F74DF -7677A8329ED2A0E6EE5B22A95F9B489939421400ACF6D39BB49B6EC1343A3A72 -2971599E41BB197931D928E2CB2107D5F243DBA0ABD767B9A54D4355DC8B8702 -C8E6B84A2EA762D01B02CFCC6D03600CD187C2B08FC83AF29D1226077874A44C -DA81759E07930DD3E781196CE4570988E280653193DC0F5ADFE4D7D4AF188C26 -51C64E402BEF4CD65EC79E0FEAE901104784E23D4ADCF3A0E93835D87B992D95 -5DF80FB1F1CCA9CDF5457B7008FEBC8641423FAAB7BE59DDC52881B356A7135C -29B95BF6B552C3A8253EFC9E0F61967CE59B0BDFF1BAC8788B1323F5E76DBDE2 -5BA0F7FFDEBF22C7F851377642BCC3FD1285F4FFAB73477106A52C6DDA377D3B -C781D35A45DA3DA67A74954EF118750E3C06FAF33487EFC0CC74DE6BA1C4D973 -DD3148814CB3E430B4007E515CDCC8A1CCA0EC0F6FD2456B581C1AA45C266402 -35C268B343B44FEF8FB822AA8BD2C8E7E96B45C351A1DEB2F8F88D69E19FCED1 -36E3E70F16ADCC351DE474DF5C6F1F18869B707A4A35E2137D44543772597BA5 -0FE86DF1504074BBADCDAF0C4EC5186589B0F10A122B409154A0DC949BB78195 -52A56B59967BE621AC6A9D3F7165E2E3AF8D3FCBEDB88D66A004B96BCE8F24E7 -A5298E4F14746A2AFDD4307762D725E9C48A0ED0C3FD2E2A96BDD849BA270B30 -D8D82843593A3AACC6CAC3584111E6F182180427A07757016B0A15253B77B8B5 -67D8C5B04AC8C48B76EB92BC60AFFB7BB376E29D971CB72FB28720788634285C -9F1478226166D8B953A6A0978B24D0EF5A83F0B7A8A1A7C7CF38694CE6FA43B8 -8AFB2EB93590A366AB756AA8DA37F20AD1CD6DDA90C582C3E8CBEAF468CCC792 -49FEA18351C444976E21C4D99B683CAAF0EB682783DCF6B9262615A753150801 -B14F6451584BA046215D406A669B8F452AE0F45BA1D8CFD57E38D4E68CEB7E1B -4548AD3DE7B41B830FC2C83DC0292D4714830A5E8F47812BE422D33291DDFC8E -CBB773503921FA7A4A14B67C81D1DA6B2DF5F621B223B09BB3CBBD1C79365E03 -89D34BFFA843E343FCBB9B5C85D10CA7EB101E08E6B22538E78F72C8381C318C -ACB366A9C5EB4164ABA5F20691223F87AD1AA8A1D60D4C6990ABC487F3026DAF -CA13A23A670817D5E1DE6217150F9F88A3FE8D1661EE1A23EFCFEE6BC6DCD1AC -5EBB91F9AD25ED81E5B25719F7D3A8D42FDD215141DF82A08228CB9C0D5128F0 -E15C6A3736A79A2E695D914736DB708D9C1638CF395053ACFB7678CA86E1B8EC -3D373054240573A161EA75C11EA41F0C5548B52C58B5A6316DC97355F8D58B8E -2F978BAE2C45C104A6EDC6BD75C18AFA19634F3DB0054675CE470103BE0DABCC -F48B1E3B51318256A412BC542A0D1D1BB39426FE871BF8E0EB9E28872B5AD0F8 -32DA58781A99ED850039F22D774996F57E77C61A4CA661FFAEFBAF75BF5B6544 -3BA814FE153ECC2C561E2E21CD07BF5C1A1D94C11B7894C60741CA684EB4DA67 -B2C413EA903B46715C8EA8D89D552F784FE95D97219B9198659B5914E955631D -9A50778E607D9D9B54ADE0F791BE97C9FA35BE1083CA6AFED04897D49D0910CB -7F5FDD8C52FBDB0F2BBFE5DD0F950C460DCC540095F8B98DA3FD0EB216C6C4D3 -546D518D92BA23977CC78CC8CDFCD6F3BFD179952D414AFC1B5C1EAEBAAB1B9C -BE7D5C3E8B1480318BC04F0880596C18E83E5ACBDF2358400DDD01081AD16BE8 -BECAD72887C1D3B942FDF4AEDFFC874411079D87892FDF15BCE85458CBB6C34A -F4BB7EB60BCAB868F785D0848BA771830634B9366F487087255566198681B647 -42CBFA22F80980B0779A5D634575A767CB4A81D818204BAEA74F6AAAC637A580 -3FC8DD430398D0FCC738423D780F8E72DC6BD9D0D750F642348BD654F303F229 -72C037126C2ACABBBF595ADC89E632AAD17CB9A6A69152E8F7213703B521C22F -3A97C7DCA73EA94E62A3B9DD2DFA9995A7977B8F28F45DAB67E8DC9169F29D55 -679FED8D96E3E7DE2F8CEEADC4D9F005171D02667F6021816F46BB114CFC1F61 -F3EE667CB28BD9457DF9F690AFCFBCBDB8F32DD00FAE3004B9976FEA5A92B599 -BA4F0E1B006F7B235F3060D658086660100E0361CC2084C4395984EE86932328 -07C6D9861AC161B69DD7C8A37621C98BA781F19E08385B5D2949F697474512FE -8AD9FAB1E155C207B9F4A4B3B0971DA7806331AE8C4703BB81FE509D745A124B -110FBC72A6484527BB44C159F7DF19F4A47C3757113CFCDE2A790F09DE8C244F -D42B91782D47CF2A7DC03151E36B20E8CE904E79DA3FF07F4A598EDEBEEADA78 -C8175D7FCB87B0736A483EE1A8D2B9A6C2CFD703CD211585A84D1BA077B71D25 -8D0AED5F7EDA97FD1AD237122ECABE4DFD9B5AB9BAD811C9320727DF3398FA5E -B448111128DCF487E0F6D7C8715D8308FC53A0C8A06F5AA4C97CE2CA244BAF4A -79125D476D3D9B8CFD0E1421AAF47A06097FE0CADC027E631BE022CDF940B9AF -5DAA06D9ABEAA35E01B8905557E5D8E36B5A5D40D165D2257A3FED845DA4E7FC -B15B10BC9B02392D79C53B8F1C25895272F7B55FE0FB0746944C82E718043AAF -E9ADFB4C3A5515AA8E8CCA58FA38061D2A1F491675EAF479A3279344F20A85FD -4E7406068273B5909F9FA26A447FF55D17C2AE063B4B9A4546CDEC42FD1D4642 -9E327322346FFCC65ECD92DE5D802E4EC29FE1D3E2FA26B532A1B6BFB8DE58BF -DBEF574225E93E7836856CB751A9DD974D72D8EF55C3B4BFCA1B74660411EFE8 -F288A92BC83E7EE7CC2A85302A8046FDC70E8DF5B450A61ACA17A6BB7359FE8F -56B7F51CA0F3DC69DBEB79CEB66AA45EC776E98AB4156A67D29F9444ACCF48E5 -DE907C11B481A90D275C0C2493F247D3EA95E21A0821A001CAE7708F6B0176C2 -41F4E7C698A2256696D80FBD8D414C43E4C2AB2D2C927B1A6887772AAA189977 -685FB4537E666DABF6042013B2F5CF5EEB322C806F6265B117C276EC86A7905B -DB522EC46C02E8B72F07327EF9C8C980AC693D336E5800B5FD3E84C7DCF859A4 -5D9212FC2191ADF5F2E2FEB294AC8F014FF60E8FCD9537993488CA77D3AA8DA2 -0B72B157621AE6EE16805DBBFAA07DC73F1E1DC1E51A2644711F272BFB359C1C -5A89CED3AAB1C6FEF124EFE5C7D4006828A72C6B6389734CFEDDD0CC03856056 -EF035883DEC58509C28D5349256DBFB7605D3465C1D9F317F7D8BAE9AA53CFBC -923853EA59D8DAE0BA36E147830271B792C6CB75B41CF903DFAE6B4B5C30C312 -13E85A1DD2512AC76786E76575C3EFA5281652F5A6F06B2DBAD10A0C4B77CF12 -DAC9F1ADBA150D51F1EE6C9A5F17D2B437BF672D59C5515BAEAD714EA519DF4D -05414B78ABB12F8F69A98A9427CEFA691688A0E64309EF3D4417F3DA117178AD -C2C964C301A949E02029CF36A017D02C9EBEEBC550FFF8F41E1C20ACD25E5FA6 -4BAE6CC9F685A41504BDE6BCDDF43066E45B4F786088225FE03EB7973970486F -D96763B797424971C67826D960A8661A93E4EDCB6E544AE6283290C9575E6557 -68C39185A7964FC92181B99552FBE1C199EB12648B791C3CF11349CA0E581534 -9693D6D08922D8A8FB148BB2495B64D7674F40AA6DE6245537E86E40C8B8A625 -DF60F5DDB4A3A3F3D269628BBE87203BE0A746D33AA98689FC52719809B52DD4 -E8CC50553F2DC0F994AB25E9BC228C0771E9943A94A12EFC73343B2979161ED7 -D258BED775D280A871A562B0F7A704A0A94F36F601AFB51C8CCCFB4EA2AA9D40 -4F0DEDE814AE53347E169E1719EF5313BE390A038080D98F2ED8232E2BD759C7 -186A61DC3CC15CCACE167AB1970A0D104EC7DE511F45CB68302E3818B3757ABB -E531684333387A71D8FCBD84910ECC73550D39B11B495F181FF3B226752D55C2 -B3E8669B1D013263B8B6EB4BB6978A80B763628E51424223C10039363A6D64B9 -860266F7280812611015FFBB3D8B5B1CA65634DDD10DE619AA6ED80849297D9C -6AFB6FB5C0CC99FD438E04CFE43C187C76A5110A311DB4BB8B670505ED7DB043 -0B0A554AD69D8392CC1938E6FC27F7447278BFBAD9542A807B219591D7CC9CE1 -20961F5349962B490E0717FAC9C3314BB07CCEB6999505516E9C796B1848EF92 -6FDB2ACE69B16946AC910E6A2B7DD0A7953482676086DBA46E3FB4C0C25FE68F -080CFAFC7780CA9AE369A28BDB9C4EEB1B743B5364A34BC23B61C7434D3F107D -F47A07C8D5768F0B70C5F0144B3F8E4AA9FDA63D50BD871E1DA42FA8034DD0DE -BFD7971C26AB2F6F71C37A83D9E396C6BD14588E85901688463B405FAD35D3A4 -32AE3BA2486C9E8359AF5949B29AF91F8630CD9C6F0496387A7EEDF5D18C1615 -147BD65D33A0DC10AAADE9774375C95062C594AD8BAF93187C5C255C845C1DE8 -F0F9467142979FF5CC5F50AECED0B008D58EFDFE55A6C4D0E1AD91685C78E323 -92D2B0AF92FF0E76CAD58A5745CE9BAE6FC16993F8F3839D22B546951703337E -154B4576FC09CDE7EF75664C810D6400FFB669DA4EA2B9D361F1C07425673589 -4FFE2AA71CE04E1394ED60B1195B717A5AC19DFF305AD4F26C72551ED0FC0814 -4C97E10F078441E50C56AFBE120DA1196841D837F76ED41BBB9115E635AB2567 -0993A7D6AE33A562DF54977C034E4B7E2A4B0068615ACD9B62F694CC9C58A1D1 -F7CDB04714F5A3DD71CBB874EAF88DBB64218357A6294DC9015A0078CDFC93AD -0FCAAAB616748A4BF19C265A3FEB24521E80ECD55FC8983543B098301245CB8B -7718847705707790AC435D3F31E85AD5D3097A84DE311ABB89DA7357CDD82558 -00425C6FC81261C4F4A17C458E8AE6F9B118051549462E62934599E08762B837 -30D0A8E50D54A4AD250773E9A0644FD693E544599166C02566598A89C3F16BAE -1F924A84C1E8A07ED179DACA41F88A5006C193D6BC96567F7A13F3A5359548D2 -A233754622805C32F79CAD4F7DBDF43F9C80D9C34AEE35695B963D53D8E8DDEE -056864F3026294E045C4E3981A1CE89A452EC888C8C0287D55E192F281D96C07 -F894FFAC033B8534A4B1CE780C8628AAE08D9FD4153844F3665CC29416F2591E -5B88585CA5A6A1C3DAB903D9A6A362BADF76CFE8E2C031D479921F0A66A5D1CF -15ECBCFFBACEF3A2FC2C0CB19D4859B2D11F348F238578A2315C079C8850EBC8 -791066DE9B8F39DF2A1078845FC3991CC073A7DCBF6C72FFA90C5D5F4BFC09AB -5F13273289FA80847C8A34A29B8FCA3CD320F64DE759269D1F9A015AE49E59B1 -0797631A6A628AA469F347D79CC9C35543191F11B6FF709B9C84B6C8B729F3CE -EFF6C0491A00A3B119D40FA209059C1534836A504F05C95311C87A6122FE85D2 -D27DAF86288EF8A28B8120915FC90014F35A2A2510DF3FD43EC614F90946D5A1 -76168ED657F2AF4B4701EF58855BF5931093D26A56D2345811FEC50CEB4466C4 -786B0D360FD05DE14964F0229585BAA414DE5DA36195E959F4DFA6C05D5D2C2E -D6935443DE7CAB73DDD4F26ADBE1B7B5E16A3A192493A959F08AA460088B04F0 -18B3789637671242F9BD38987C20BD3236C8E0A888FB -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndFont -TeXDict begin 39158280 55380996 1000 600 600 (llncs.dvi) -@start /Fa 128[39 4[31 37 35 1[35 41 25 31 32 1[39 39 -43 63 20 35 1[24 39 35 24 35 39 35 35 39 9[77 2[55 43 -56 1[52 1[57 69 48 59 40 30 57 59 1[52 58 55 1[57 7[39 -2[39 39 2[39 39 2[24 27 24 2[31 31 20[39 19[{ - TeX74afc74cEncoding ReEncodeFont }52 74.7198 /CMTI9 -rf /Fb 138[44 44 44 44 1[44 44 44 44 2[44 1[44 44 44 -44 1[44 40[44 10[44 44 46[{ TeX09fbbfacEncoding ReEncodeFont }17 -83.022 /CMTT10 rf /Fc 139[24 10[22 35[45 69[{ - TeXaae443f0Encoding ReEncodeFont }3 49.8132 /CMMI6 rf -/Fd 139[22 1[22 8[17 5[25 48[28 50[{ TeX0ef0afcaEncoding ReEncodeFont } -5 41.511 /CMR5 rf /Fe 139[23 5[37 110[{ - TeXaae443f0Encoding ReEncodeFont }2 41.511 /CMMI5 rf -/Ff 149[20 55[45 49[52{ TeXbbad153fEncoding ReEncodeFont }3 -58.1154 /CMSY7 rf /Fg 134[50 50 2[53 37 38 39 1[53 48 -53 80 27 1[29 27 53 48 29 44 53 42 53 46 10[72 1[66 53 -3[72 75 91 6[60 63 1[69 1[72 9[48 48 48 48 48 48 48 2[27 -32 45[{ TeXf7b6d320Encoding ReEncodeFont }40 83.022 /CMBX10 -rf /Fh 165[55 90[{}1 83.022 /MSBM10 rf /Fi 143[83 23[120 -7[88 62[50 50 6[48 48 4[35 35 38 38{}11 83.022 /CMEX10 -rf /Fj 135[38 1[33 1[25 5[41 3[27 23 1[32 2[35 30 12[39 -1[39 12[52 1[49 7[34 61[{ TeXaae443f0Encoding ReEncodeFont }14 -58.1154 /CMMI7 rf /Fk 138[55 55 9[23 2[42 42 10[55 19[49 -11[42 4[0 3[55 83 9[65 5[83 8[65 2[65 65 1[65 15[65 1[65{ - TeXbbad153fEncoding ReEncodeFont }19 83.022 /CMSY10 -rf /Fl 134[40 39 55 38 45 28 34 35 1[42 42 47 68 21 38 -1[25 42 38 25 38 42 38 38 42 9[83 2[59 3[56 6[32 2[54 -11[25 7[42 3[25 30 25 44[{ TeX74afc74cEncoding ReEncodeFont }33 -83.022 /CMTI10 rf /Fm 134[41 47 1[40 48 30 3[42 40 50 -73 2[34 29 48 40 41 39 43 36 36 44 7[48 2[48 57 49 51 -1[66 53 63 67 81 57 2[36 1[65 1[61 1[59 1[62 2[65 42 -65 23 23 42[34 8[65 6[{ TeXaae443f0Encoding ReEncodeFont }42 -83.022 /CMMI10 rf /Fn 135[59 2[62 44 44 46 1[62 56 62 -93 31 59 1[31 62 56 34 51 62 50 1[54 9[116 2[78 1[84 -8[42 3[74 1[81 1[85 10[56 56 56 56 56 56 49[{ - TeXf7b6d320Encoding ReEncodeFont }32 99.6264 /CMBX12 -rf /Fo 135[44 55 37 44 28 5[46 68 4[44 37 2[40 33 33 -8[45 2[45 1[45 47 1[61 1[58 61 6[60 1[57 3[58 5[21 21 -58[{ TeXaae443f0Encoding ReEncodeFont }24 74.7198 /CMMI9 -rf /Fp 136[64 1[49 34 35 36 1[49 44 49 1[25 2[25 49 44 -27 41 49 39 49 43 12[62 13[56 4[67 12[44 44 44 44 2[25 -46[{ TeXf7b6d320Encoding ReEncodeFont }26 74.7198 /CMBX9 -rf /Fq 134[39 2[39 39 39 39 39 1[39 39 39 39 39 2[39 -39 39 39 39 39 39 39 33[39 17[39 1[39 44[{ - TeX09fbbfacEncoding ReEncodeFont }22 74.7198 /CMTT9 -rf /Fr 149[21 2[38 38 10[51 31[38 4[0 3[51 77 15[77 11[60 -20[60{ TeXbbad153fEncoding ReEncodeFont }11 74.7198 /CMSY9 -rf /Fs 129[38 38 1[38 34 41 41 55 41 43 30 30 30 41 43 -38 43 64 21 41 23 21 43 38 23 34 43 34 43 38 21 2[21 -1[21 47 1[58 79 58 58 55 43 57 60 52 60 58 70 48 60 39 -28 58 60 50 52 59 55 54 58 3[60 1[21 21 38 38 38 38 38 -38 38 38 38 38 1[21 26 21 60 1[30 30 21 1[64 4[21 12[38 -4[64 1[43 45 11[{ TeXf7b6d320Encoding ReEncodeFont }83 -74.7198 /CMR9 rf /Ft 139[24 24 24 3[34 4[18 5[27 33[45 -12[30 30 30 30 49[{ TeXf7b6d320Encoding ReEncodeFont }11 -49.8132 /CMR6 rf /Fu 135[35 3[26 26 26 3[37 55 3[19 1[33 -1[30 37 30 37 33 35[51 8[33 33 33 33 7[26 26 40[{ - TeXf7b6d320Encoding ReEncodeFont }20 58.1154 /CMR7 rf -/Fv 128[42 4[37 44 44 60 44 46 32 33 33 44 46 42 46 69 -23 44 25 23 46 42 25 37 46 37 46 42 3[23 42 23 51 62 -1[85 1[62 60 46 61 1[57 65 62 76 52 65 1[30 62 65 54 -57 63 60 59 62 1[39 1[65 1[23 23 42 42 42 42 42 42 42 -42 42 42 1[23 28 23 65 1[32 32 2[69 2[42 14[42 4[69 46 -46 48 11[{ TeXf7b6d320Encoding ReEncodeFont }79 83.022 -/CMR10 rf /Fw 139[52 53 55 2[67 75 112 37 2[37 75 67 -41 61 75 60 1[65 16[92 2[128 4[105 6[102 65[{ - TeXf7b6d320Encoding ReEncodeFont }19 119.552 /CMBX12 -rf end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 600dpi -TeXDict begin -%%PaperSize: A4 - end -%%EndSetup -%%Page: 1 1 -TeXDict begin 1 0 bop 456 387 a Fw(A)45 b(Practical)h(Minimal)f(P)l -(erfect)h(Hashing)g(Metho)t(d)607 676 y Fv(F)-7 b(abiano)27 -b(C.)h(Botelho,)1337 646 y Fu(1)1401 676 y Fv(Y)-7 b(oshiharu)27 -b(Koha)n(y)n(ak)-5 b(a)n(w)n(a,)2273 646 y Fu(2)2334 -676 y Fv(and)27 b(Nivio)h(Ziviani)2969 646 y Fu(1)393 -818 y Ft(1)466 850 y Fs(Dept.)d(of)h(Computer)g(Science,)g(F)-6 -b(ederal)26 b(Univ.)f(of)i(Minas)g(Gerais,)g(Belo)g(Horizon)n(te,)f -(Brazil)1258 941 y Fr(f)p Fq(fbotelho,nivio)p Fr(g)p -Fq(@dcc.ufmg.br)662 1001 y Ft(2)735 1033 y Fs(Dept.)g(of)g(Computer)g -(Science,)g(Univ.)f(of)i(S~)-38 b(ao)26 b(P)n(aulo,)h(S~)-38 -b(ao)26 b(P)n(aulo,)g(Brazil)1492 1124 y Fq(yoshi@ime.usp.br)602 -1378 y Fp(Abstract.)42 b Fs(W)-6 b(e)31 b(prop)r(ose)i(a)g(no)n(v)n(el) -e(algorithm)j(based)e(on)g(random)g(graphs)h(to)602 1470 -y(construct)27 b(minimal)i(p)r(erfect)f(hash)g(functions)d -Fo(h)p Fs(.)k(F)-6 b(or)28 b(a)g(set)g(of)d Fo(n)j Fs(k)n(eys,)g(our)g -(al-)602 1561 y(gorithm)38 b(outputs)24 b Fo(h)37 b Fs(in)h(exp)r -(ected)f(time)25 b Fo(O)r Fs(\()p Fo(n)p Fs(\).)38 b(The)g(ev)l -(aluation)g(of)25 b Fo(h)p Fs(\()p Fo(x)p Fs(\))37 b(re-)602 -1652 y(quires)23 b(t)n(w)n(o)h(memory)g(accesses)i(for)f(an)n(y)e(k)n -(ey)h Fo(x)f Fs(and)g(the)h(description)g(of)i Fo(h)e -Fs(tak)n(es)602 1744 y(up)g(1)p Fo(:)p Fs(15)p Fo(n)h -Fs(w)n(ords.)g(This)g(impro)n(v)n(es)f(the)f(space)i(requiremen)n(t)e -(to)h(55\045)h(of)f(a)h(previ-)602 1835 y(ous)e(minimal)h(p)r(erfect)g -(hashing)f(sc)n(heme)h(due)e(to)i(Czec)n(h,)g(Ha)n(v)l(as)f(and)f(Ma)t -(jewski.)602 1926 y(A)e(simple)i(heuristic)g(further)f(reduces)g(the)g -(space)h(requiremen)n(t)f(to)k(0)p Fo(:)p Fs(93)p Fo(n)e -Fs(w)n(ords,)602 2018 y(at)f(the)h(exp)r(ense)f(of)h(a)g(sligh)n(tly)g -(w)n(orse)h(constan)n(t)f(in)g(the)f(time)h(complexit)n(y)-6 -b(.)22 b(Large)602 2109 y(scale)30 b(exp)r(erimen)n(tal)e(results)i -(are)f(presen)n(ted.)g(F)-6 b(or)28 b(a)i(collection)g(of)f(100)e -(million)602 2200 y(k)n(eys,)g(eac)n(h)i(k)n(ey)e(63)f(b)n(ytes)h(long) -i(on)f(a)n(v)n(erage,)h(our)g(algorithm)g(\014nds)e(a)i(minimal)602 -2292 y(p)r(erfect)d(hash)f(function)h(in)g(811)g(seconds)g(on)g(a)n(v)n -(erage.)365 2574 y Fn(1)112 b(In)m(tro)s(duction)365 -2771 y Fv(Supp)r(ose)25 b Fm(U)39 b Fv(is)30 b(a)g(univ)n(erse)f(of)h -Fl(keys)p Fv(.)h(Let)f Fm(h)d Fv(:)g Fm(U)36 b Fk(!)27 -b Fm(M)39 b Fv(b)r(e)30 b(a)g Fl(hash)j(function)d Fv(that)h(maps)365 -2871 y(the)23 b(k)n(eys)d(from)25 b Fm(U)31 b Fv(to)21 -b(a)h(giv)n(en)f(in)n(terv)-5 b(al)21 b(of)h(in)n(tegers)e -Fm(M)32 b Fv(=)23 b([0)p Fm(;)14 b(m)7 b Fk(\000)g Fv(1])21 -b(=)i Fk(f)p Fv(0)p Fm(;)14 b Fv(1)p Fm(;)g(:)g(:)g(:)e(;)i(m)7 -b Fk(\000)g Fv(1)p Fk(g)p Fv(.)365 2971 y(Let)25 b Fm(S)35 -b Fk(\022)30 b Fm(U)41 b Fv(b)r(e)33 b(a)e(set)h(of)25 -b Fm(n)32 b Fv(k)n(eys)f(from)25 b Fm(U)9 b Fv(.)32 b(Giv)n(en)g(a)f(k) -n(ey)24 b Fm(x)31 b Fk(2)g Fm(S)5 b Fv(,)32 b(the)g(hash)g(function)25 -b Fm(h)365 3070 y Fv(computes)40 b(an)g(in)n(teger)f(in)i([0)p -Fm(;)14 b(m)26 b Fk(\000)g Fv(1])40 b(for)f(the)i(storage)d(or)h -(retriev)-5 b(al)39 b(of)25 b Fm(x)41 b Fv(in)f(a)g Fl(hash)365 -3170 y(table)p Fv(.)26 b(Hashing)f(metho)r(ds)g(for)g -Fl(non-static)i(sets)e Fv(of)g(k)n(eys)f(can)h(b)r(e)h(used)f(to)g -(construct)g(data)365 3269 y(structures)30 b(storing)g -Fm(S)35 b Fv(and)30 b(supp)r(orting)g(mem)n(b)r(ership)h(queries)f(\\)p -Fm(x)e Fk(2)g Fm(S)5 b Fv(?")30 b(in)h(exp)r(ected)365 -3369 y(time)36 b Fm(O)r Fv(\(1\).)h(Ho)n(w)n(ev)n(er,)d(they)h(in)n(v)n -(olv)n(e)f(a)i(certain)e(amoun)n(t)i(of)f(w)n(asted)g(space)g(o)n(wing) -f(to)365 3469 y(un)n(used)h(lo)r(cations)f(in)h(the)g(table)g(and)f(w)n -(aisted)h(time)g(to)f(resolv)n(e)f(collisions)h(when)h(t)n(w)n(o)365 -3568 y(k)n(eys)27 b(are)g(hashed)g(to)g(the)h(same)f(table)h(lo)r -(cation.)490 3668 y(F)-7 b(or)26 b Fl(static)k(sets)c -Fv(of)h(k)n(eys)f(it)i(is)f(p)r(ossible)f(to)h(compute)g(a)g(function)g -(to)g(\014nd)h(an)n(y)e(k)n(ey)g(in)365 3768 y(a)d(table)g(in)g(one)g -(prob)r(e;)f(suc)n(h)h(hash)f(functions)i(are)e(called)g -Fl(p)l(erfe)l(ct)p Fv(.)i(More)e(precisely)-7 b(,)22 -b(giv)n(en)365 3867 y(a)31 b(set)g(of)f(k)n(eys)24 b -Fm(S)5 b Fv(,)31 b(w)n(e)g(shall)f(sa)n(y)g(that)h(a)f(hash)h(function) -25 b Fm(h)k Fv(:)f Fm(U)37 b Fk(!)29 b Fm(M)39 b Fv(is)31 -b(a)g Fl(p)l(erfe)l(ct)i(hash)365 3967 y(function)40 -b Fv(for)25 b Fm(S)38 b Fv(if)26 b Fm(h)33 b Fv(is)h(an)f(injection)h -(on)25 b Fm(S)5 b Fv(,)33 b(that)h(is,)g(there)g(are)e(no)i -Fl(c)l(ol)t(lisions)42 b Fv(among)365 4066 y(the)e(k)n(eys)e(in)25 -b Fm(S)5 b Fv(:)39 b(if)25 b Fm(x)40 b Fv(and)24 b Fm(y)42 -b Fv(are)c(in)25 b Fm(S)44 b Fv(and)25 b Fm(x)42 b Fk(6)p -Fv(=)g Fm(y)s Fv(,)d(then)25 b Fm(h)p Fv(\()p Fm(x)p -Fv(\))43 b Fk(6)p Fv(=)f Fm(h)p Fv(\()p Fm(y)s Fv(\).)d(Figure)25 -b(1\(a\))365 4166 y(illustrates)36 b(a)g(p)r(erfect)h(hash)e(function.) -i(Since)g(no)f(collisions)f(o)r(ccur,)h(eac)n(h)f(k)n(ey)h(can)g(b)r(e) -365 4266 y(retriev)n(ed)e(from)h(the)g(table)g(with)h(a)e(single)h -(prob)r(e.)g(If)25 b Fm(m)35 b Fv(=)g Fm(n)p Fv(,)g(that)g(is,)g(the)h -(table)f(has)365 4365 y(the)28 b(same)e(size)g(as)f Fm(S)5 -b Fv(,)26 b(then)i(w)n(e)e(sa)n(y)g(that)f Fm(h)i Fv(is)f(a)h -Fl(minimal)j(p)l(erfe)l(ct)g(hash)g(function)j Fv(for)24 -b Fm(S)5 b Fv(.)365 4465 y(Figure)25 b(1\(b\))37 b(illustrates)g(a)24 -b(minimal)37 b(p)r(erfect)h(hash)f(function.)h(Minimal)f(p)r(erfect)h -(hash)365 4565 y(functions)28 b(totally)f(a)n(v)n(oid)g(the)g(problem)h -(of)f(w)n(asted)g(space)g(and)g(time.)490 4664 y(Minimal)g(p)r(erfect)h -(hash)f(functions)g(are)f(widely)i(used)f(for)f(memory)h(e\016cien)n(t) -g(storage)365 4764 y(and)i(fast)h(retriev)-5 b(al)28 -b(of)h(items)h(from)f(static)g(sets,)g(suc)n(h)g(as)f(w)n(ords)g(in)i -(natural)e(languages,)365 4863 y(reserv)n(ed)j(w)n(ords)g(in)h -(programming)e(languages)h(or)g(in)n(teractiv)n(e)g(systems,)h(univ)n -(ersal)f(re-)365 4963 y(source)38 b(lo)r(cations)g(\(URLs\))i(in)g(W)-7 -b(eb)39 b(searc)n(h)f(engines,)g(or)h(item)g(sets)g(in)g(data)g(mining) -365 5063 y(tec)n(hniques.)p eop end -%%Page: 2 2 -TeXDict begin 2 1 bop 1192 1507 a - currentpoint currentpoint translate 0.80 0.80 scale neg exch neg exch -translate - 1192 1507 a @beginspecial -0 @llx 0 @lly 279 @urx 168 @ury 2790 @rwi @setspecial -%%BeginDocument: figs/minimalperfecthash-ph-mph.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: minimalperfecthash-ph-mph.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha5 -%%CreationDate: Wed Jul 7 12:02:51 2004 -%%For: fbotelho@elias (Fabiano Cupertino Botelho,,,) -%%BoundingBox: 0 0 279 168 -%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.745 0.745 0.745 srgb} bind def - -end -save -newpath 0 168 moveto 0 0 lineto 279 0 lineto 279 168 lineto closepath clip newpath -227.7 346.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/reencdict 12 dict def /ReEncode { reencdict begin -/newcodesandnames exch def /newfontname exch def /basefontname exch def -/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def -basefontdict { exch dup /FID ne { dup /Encoding eq -{ exch dup length array copy newfont 3 1 roll put } -{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall -newfont /FontName newfontname put newcodesandnames aload pop -128 1 255 { newfont /Encoding get exch /.notdef put } for -newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat -newfontname newfont definefont pop end } def -/isovec [ -8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde -8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis -8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron -8#220 /dotlessi 8#230 /oe 8#231 /OE -8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling -8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis -8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot -8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus -8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph -8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine -8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf -8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute -8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring -8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute -8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute -8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve -8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply -8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex -8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave -8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring -8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute -8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute -8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve -8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide -8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex -8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def -/Times-Roman /Times-Roman-iso isovec ReEncode -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 45 -% Polyline -0 slj -0 slc -7.500 slw -n -2700 3060 m -2430 3060 l -2430 3240 l -2700 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3060 m -2160 3060 l -2160 3240 l -2430 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3060 m -1890 3060 l -1890 3240 l -2160 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 3060 m -1620 3060 l -1620 3240 l -1890 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3060 m -1350 3060 l -1350 3240 l -1620 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3060 m -1080 3060 l -1080 3240 l -1350 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3060 m -810 3060 l -810 3240 l -1080 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3060 m -540 3060 l -540 3240 l -810 3240 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 2970 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 2970 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 2970 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 2970 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 2970 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -n -2700 4455 m -2430 4455 l -2430 4635 l -2700 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 4455 m -2160 4455 l -2160 4635 l -2430 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 4455 m -1890 4455 l -1890 4635 l -2160 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 4455 m -1620 4455 l -1620 4635 l -1890 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 4455 m -1350 4455 l -1350 4635 l -1620 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 4455 m -1080 4455 l -1080 4635 l -1350 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 4455 m -810 4455 l -810 4635 l -1080 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 4455 m -540 4455 l -540 4635 l -810 4635 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 5085 m -2430 5085 l -2430 5265 l -2700 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 5085 m -2160 5085 l -2160 5265 l -2430 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 5085 m -1890 5085 l -1890 5265 l -2160 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1890 5085 m -1620 5085 l -1620 5265 l -1890 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 5085 m -1350 5085 l -1350 5265 l -1620 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 5085 m -1080 5085 l -1080 5265 l -1350 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 5085 m -810 5085 l -810 5265 l -1080 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 5085 m -540 5085 l -540 5265 l -810 5265 l - cp gs col7 1.00 shd ef gr gs col0 s gr -/Times-Roman-iso ff 158.75 scf sf --2610 4365 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 4365 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4365 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 4365 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 4365 m -gs 1 -1 sc (1) col0 sh gr -% Polyline -gs clippath --2073 5050 m -1986 5117 l -1949 5070 l -2037 5002 l -2037 5002 l -1996 5072 l -2073 5050 l cp -eoclip -n -2565 4635 m - -1980 5085 l gs col0 s gr gr - -% arrowhead -n -2073 5050 m -1996 5072 l -2037 5002 l -2043 5035 l -2073 5050 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 4987 m -2598 5082 l -2546 5113 l -2488 5018 l -2488 5018 l -2553 5067 l -2540 4987 l cp -eoclip -n -2295 4635 m - -2565 5085 l gs col0 s gr gr - -% arrowhead -n -2540 4987 m -2553 5067 l -2488 5018 l -2522 5015 l -2540 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2263 4989 m -2328 5080 l -2279 5114 l -2214 5023 l -2214 5023 l -2282 5068 l -2263 4989 l cp -eoclip -n -1980 4635 m - -2295 5085 l gs col0 s gr gr - -% arrowhead -n -2263 4989 m -2282 5068 l -2214 5023 l -2247 5018 l -2263 4989 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --997 5066 m -900 5118 l -872 5065 l -969 5013 l -969 5013 l -917 5075 l -997 5066 l cp -eoclip -n -1755 4635 m - -900 5085 l gs col0 s gr gr - -% arrowhead -n -997 5066 m -917 5075 l -969 5013 l -970 5047 l -997 5066 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 4987 m -1788 5082 l -1736 5113 l -1678 5018 l -1678 5018 l -1743 5067 l -1730 4987 l cp -eoclip -n -1485 4635 m - -1755 5085 l gs col0 s gr gr - -% arrowhead -n -1730 4987 m -1743 5067 l -1678 5018 l -1712 5015 l -1730 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1460 4987 m -1518 5082 l -1466 5113 l -1408 5018 l -1408 5018 l -1473 5067 l -1460 4987 l cp -eoclip -n -1215 4635 m - -1485 5085 l gs col0 s gr gr - -% arrowhead -n -1460 4987 m -1473 5067 l -1408 5018 l -1442 5015 l -1460 4987 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1159 5000 m -1245 5071 l -1207 5117 l -1121 5047 l -1121 5047 l -1198 5072 l -1159 5000 l cp -eoclip -n -675 4635 m - -1215 5085 l gs col0 s gr gr - -% arrowhead -n -1159 5000 m -1198 5072 l -1121 5047 l -1151 5033 l -1159 5000 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 5018 m -693 5113 l -641 5082 l -697 4987 l -697 4987 l -685 5067 l -749 5018 l cp -eoclip -n -945 4635 m - -675 5085 l gs col0 s gr gr - -% arrowhead -n -749 5018 m -685 5067 l -697 4987 l -715 5015 l -749 5018 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --450 5220 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 4590 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2610 5490 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --765 5490 m -gs 1 -1 sc (n-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2070 5490 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2340 5490 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 5445 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 4860 m -gs 1 -1 sc (\(b\)) col0 sh gr -% Polyline -n -1890 3690 m -1620 3690 l -1620 3870 l -1890 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1350 3690 m -1080 3690 l -1080 3870 l -1350 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -1080 3690 m -810 3690 l -810 3870 l -1080 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -810 3690 m -540 3690 l -540 3870 l -810 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -3240 3690 m -2970 3690 l -2970 3870 l -3240 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -270 3690 m 0 3690 l 0 3870 l -270 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2970 3690 m -2700 3690 l -2700 3870 l -2970 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2700 3690 m -2430 3690 l -2430 3870 l -2700 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n -2430 3690 m -2160 3690 l -2160 3870 l -2430 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -1620 3690 m -1350 3690 l -1350 3870 l -1620 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -540 3690 m -270 3690 l -270 3870 l -540 3870 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -n -2160 3690 m -1890 3690 l -1890 3870 l -2160 3870 l - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath --2116 3652 m -2032 3722 l -1994 3676 l -2078 3605 l -2078 3605 l -2040 3677 l -2116 3652 l cp -eoclip -n -2565 3240 m - -2025 3690 l gs col0 s gr gr - -% arrowhead -n -2116 3652 m -2040 3677 l -2078 3605 l -2086 3638 l -2116 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --2540 3592 m -2598 3687 l -2546 3718 l -2488 3623 l -2488 3623 l -2553 3672 l -2540 3592 l cp -eoclip -n -2295 3240 m - -2565 3690 l gs col0 s gr gr - -% arrowhead -n -2540 3592 m -2553 3672 l -2488 3623 l -2522 3620 l -2540 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --3071 3626 m -3175 3667 l -3152 3723 l -3049 3682 l -3049 3682 l -3130 3682 l -3071 3626 l cp -eoclip -n -2025 3240 m - -3150 3690 l gs col0 s gr gr - -% arrowhead -n -3071 3626 m -3130 3682 l -3049 3682 l -3074 3659 l -3071 3626 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1306 3652 m -1222 3722 l -1184 3676 l -1268 3605 l -1268 3605 l -1230 3677 l -1306 3652 l cp -eoclip -n -1755 3240 m - -1215 3690 l gs col0 s gr gr - -% arrowhead -n -1306 3652 m -1230 3677 l -1268 3605 l -1276 3638 l -1306 3652 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --1730 3592 m -1788 3687 l -1736 3718 l -1678 3623 l -1678 3623 l -1743 3672 l -1730 3592 l cp -eoclip -n -1485 3240 m - -1755 3690 l gs col0 s gr gr - -% arrowhead -n -1730 3592 m -1743 3672 l -1678 3623 l -1712 3620 l -1730 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --188 3682 m -87 3723 l -64 3667 l -166 3626 l -166 3626 l -108 3682 l -188 3682 l cp -eoclip -n -1215 3240 m - -90 3690 l gs col0 s gr gr - -% arrowhead -n -188 3682 m -108 3682 l -166 3626 l -163 3659 l -188 3682 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --920 3592 m -978 3687 l -926 3718 l -868 3623 l -868 3623 l -933 3672 l -920 3592 l cp -eoclip -n -675 3240 m - -945 3690 l gs col0 s gr gr - -% arrowhead -n -920 3592 m -933 3672 l -868 3623 l -902 3620 l -920 3592 l - cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath --749 3623 m -693 3718 l -641 3687 l -697 3592 l -697 3592 l -685 3672 l -749 3623 l cp -eoclip -n -945 3240 m - -675 3690 l gs col0 s gr gr - -% arrowhead -n -749 3623 m -685 3672 l -697 3592 l -715 3620 l -749 3623 l - cp gs 0.00 setgray ef gr col0 s -/Times-Roman-iso ff 158.75 scf sf --2610 4095 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --2880 4095 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --3150 4095 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman-iso ff 285.75 scf sf --1575 4050 m -gs 1 -1 sc (...) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --270 4095 m -gs 1 -1 sc (m-1) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf --450 3195 m -gs 1 -1 sc (Key Set) col0 sh gr -/Times-Roman-iso ff 158.75 scf sf -90 3825 m -gs 1 -1 sc (Hash Table) col0 sh gr -/Times-Roman-iso ff 174.63 scf sf --3600 3465 m -gs 1 -1 sc (\(a\)) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage -%%Trailer -%EOF - -%%EndDocument - @endspecial 1192 1507 a - currentpoint currentpoint translate 1 0.80 div 1 0.80 div scale neg -exch neg exch translate - 1192 1507 a 962 1682 a Fp(Fig.)14 -b(1.)25 b Fs(\(a\))h(P)n(erfect)h(hash)e(function)77 -b(\(b\))25 b(Minimal)i(p)r(erfect)f(hash)g(function)805 -1842 y Fv(The)19 b(aim)g(of)g(this)g(pap)r(er)g(is)g(to)f(describ)r(e)h -(a)f(new)h(w)n(a)n(y)f(of)h(constructing)f(minimal)h(p)r(erfect)681 -1941 y(hash)j(functions.)h(Our)f(algorithm)g(shares)f(sev)n(eral)g -(features)i(with)g(the)g(one)f(due)h(to)g(Czec)n(h,)681 -2041 y(Ha)n(v)-5 b(as)30 b(and)h(Ma)5 b(jewski)24 b([4)o(].)32 -b(In)f(particular,)f(our)g(algorithm)g(is)h(also)f(based)h(on)g(the)g -(gen-)681 2141 y(eration)d(of)h(random)g(graphs)23 b -Fm(G)j Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\),)30 b(where)24 -b Fm(E)34 b Fv(is)29 b(in)h(one-to-one)e(corresp)r(ondence)681 -2240 y(with)35 b(the)f(k)n(ey)g(set)25 b Fm(S)39 b Fv(for)34 -b(whic)n(h)g(w)n(e)g(wish)g(to)g(generate)g(the)g(hash)g(function.)h -(The)g(t)n(w)n(o)681 2340 y(main)22 b(di\013erences)g(b)r(et)n(w)n(een) -h(our)f(algorithm)f(and)h(theirs)h(are)e(as)h(follo)n(ws:)f(\()p -Fl(i)8 b Fv(\))27 b(w)n(e)22 b(generate)681 2440 y(random)e(graphs)f -Fm(G)k Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))21 b(with)h -Fk(j)p Fm(V)c Fk(j)24 b Fv(=)e Fm(cn)f Fv(and)f Fk(j)p -Fm(E)5 b Fk(j)24 b Fv(=)e Fk(j)p Fm(S)5 b Fk(j)23 b Fv(=)g -Fm(n)p Fv(,)e(where)j Fm(c)f Fk(\025)f Fv(1)p Fm(:)p -Fv(15,)e(and)681 2539 y(hence)25 b Fm(G)j Fv(necessarily)e(con)n(tains) -h(cycles,)h(while)g(they)g(generate)e Fl(acyclic)35 b -Fv(random)27 b(graphs)681 2639 y Fm(G)c Fv(=)g(\()p Fm(V)5 -b(;)14 b(E)5 b Fv(\))28 b(with)g Fk(j)p Fm(V)19 b Fk(j)24 -b Fv(=)e Fm(cn)28 b Fv(and)f Fk(j)p Fm(E)5 b Fk(j)24 -b Fv(=)e Fk(j)p Fm(S)5 b Fk(j)23 b Fv(=)g Fm(n)p Fv(,)28 -b(with)g(a)f(greater)f(n)n(um)n(b)r(er)h(of)h(v)n(ertices:)681 -2738 y Fk(j)p Fm(V)19 b Fk(j)k(\025)g Fv(2)p Fm(:)p Fv(09)p -Fm(n)p Fv(;)j(\()p Fl(ii)8 b Fv(\))27 b(they)h(generate)e(order)g -(preserving)g(minimal)i(p)r(erfect)g(hash)f(functions)681 -2838 y(while)i(our)f(algorithm)g(do)r(es)g(not)h(preserv)n(e)e(order)h -(\(a)h(p)r(erfect)g(hash)g(function)g Fm(h)g Fv(is)g -Fl(or)l(der)681 2938 y(pr)l(eserving)j Fv(if)25 b(the)f(k)n(eys)f(in)i -Fm(S)k Fv(are)22 b(arranged)g(in)i(some)g(giv)n(en)f(order)f(and)j -Fm(h)f Fv(preserv)n(es)d(this)681 3037 y(order)i(in)h(the)h(hash)e -(table\).)i(Th)n(us,)f(our)f(algorithm)g(impro)n(v)n(es)g(the)h(space)g -(requiremen)n(t)f(at)681 3137 y(the)28 b(exp)r(ense)f(of)h(generating)e -(functions)i(that)g(are)e(not)i(order)e(preserving.)805 -3237 y(Our)37 b(algorithm)f(is)i(e\016cien)n(t)f(and)h(ma)n(y)e(b)r(e)i -(tuned)g(to)g(yield)f(a)g(function)26 b Fm(h)37 b Fv(with)h(a)681 -3336 y(v)n(ery)30 b(economical)f(description.)i(As)g(the)g(algorithm)f -(in)25 b([4],)31 b(our)f(algorithm)g(pro)r(duces)24 b -Fm(h)681 3436 y Fv(in)h Fm(O)r Fv(\()p Fm(n)p Fv(\))35 -b(exp)r(ected)g(time)g(for)f(a)g(set)g(of)25 b Fm(n)34 -b Fv(k)n(eys.)g(The)g(description)g(of)24 b Fm(h)35 b -Fv(requires)23 b(1)p Fm(:)p Fv(15)p Fm(n)681 3535 y Fv(computer)k(w)n -(ords,)f(and)h(ev)-5 b(aluating)25 b Fm(h)p Fv(\()p Fm(x)p -Fv(\))j(requires)e(t)n(w)n(o)h(accesses)f(to)h(an)g(arra)n(y)e(of)g(1)p -Fm(:)p Fv(15)p Fm(n)681 3635 y Fv(in)n(tegers.)41 b(W)-7 -b(e)43 b(further)g(deriv)n(e)e(a)i(heuristic)f(that)h(impro)n(v)n(es)e -(the)i(space)f(requiremen)n(t)681 3735 y(from)24 b(1)p -Fm(:)p Fv(15)p Fm(n)c Fv(w)n(ords)g(do)n(wn)g(to)25 b(0)p -Fm(:)p Fv(93)p Fm(n)20 b Fv(w)n(ords.)g(Our)g(sc)n(heme)h(is)g(v)n(ery) -f(practical:)g(to)h(generate)681 3834 y(a)26 b(minimal)h(p)r(erfect)f -(hash)h(function)g(for)f(a)g(collection)g(of)g(100)d(million)k(univ)n -(erse)f(resource)681 3934 y(lo)r(cations)34 b(\(URLs\),)h(eac)n(h)f(63) -g(b)n(ytes)h(long)f(on)g(a)n(v)n(erage,)e(our)i(algorithm)g(running)h -(on)f(a)681 4034 y(commo)r(dit)n(y)27 b(PC)g(tak)n(es)g(811)f(seconds)h -(on)g(a)n(v)n(erage.)681 4214 y Fn(2)112 b(Related)38 -b(W)-9 b(ork)681 4365 y Fv(Czec)n(h,)40 b(Ha)n(v)-5 b(as)41 -b(and)g(Ma)5 b(jewski)24 b([5)o(])41 b(pro)n(vide)f(a)h(comprehensiv)n -(e)f(surv)n(ey)f(of)i(the)h(most)681 4465 y(imp)r(ortan)n(t)d -(theoretical)g(results)g(on)g(p)r(erfect)h(hashing.)e(In)i(the)g(follo) -n(wing,)e(w)n(e)i(review)681 4565 y(some)27 b(of)g(those)h(results.)805 -4664 y(F)-7 b(redman,)27 b(Koml\023)-42 b(os)26 b(and)h(Szemer)n(\023) --39 b(edi)23 b([10)o(])28 b(sho)n(w)n(ed)e(that)h(it)h(is)f(p)r -(ossible)f(to)h(construct)681 4764 y(space)37 b(e\016cien)n(t)h(p)r -(erfect)h(hash)e(functions)i(that)f(can)g(b)r(e)g(ev)-5 -b(aluated)38 b(in)g(constan)n(t)f(time)681 4863 y(with)k(table)g(sizes) -f(that)h(are)f(linear)g(in)h(the)g(n)n(um)n(b)r(er)f(of)h(k)n(eys:)f -Fm(m)k Fv(=)h Fm(O)r Fv(\()p Fm(n)p Fv(\).)d(In)f(their)681 -4963 y(mo)r(del)25 b(of)h(computation,)f(an)g(elemen)n(t)h(of)f(the)h -(univ)n(erse)e Fm(U)34 b Fv(\014ts)26 b(in)n(to)f(one)g(mac)n(hine)g(w) -n(ord,)681 5063 y(and)39 b(arithmetic)h(op)r(erations)e(and)h(memory)g -(accesses)f(ha)n(v)n(e)h(unit)h(cost.)f(Randomized)p -eop end -%%Page: 3 3 -TeXDict begin 3 2 bop 365 387 a Fv(algorithms)26 b(in)h(the)h(FKS)f(mo) -r(del)g(can)g(construct)f(a)h(p)r(erfect)g(hash)g(function)h(in)f(exp)r -(ected)365 487 y(time)f Fm(O)r Fv(\()p Fm(n)p Fv(\):)i(this)g(is)g(the) -g(case)e(of)i(our)f(algorithm)f(and)i(the)g(w)n(orks)e(in)f([4)o(,)j -(14)o(].)490 590 y(Man)n(y)23 b(metho)r(ds)h(for)g(generating)e -(minimal)i(p)r(erfect)h(hash)e(functions)h(use)g(a)g -Fl(mapping)p Fv(,)365 690 y Fl(or)l(dering)j Fv(and)e -Fl(se)l(ar)l(ching)h Fv(\(MOS\))g(approac)n(h,)e(a)g(description)h -(coined)g(b)n(y)g(F)-7 b(o)n(x,)25 b(Chen)g(and)365 789 -y(Heath)g([9].)38 b(In)f(the)h(MOS)f(approac)n(h,)f(the)i(construction) -f(of)g(a)g(minimal)h(p)r(erfect)g(hash)365 889 y(function)29 -b(is)g(accomplished)e(in)i(three)f(steps.)h(First,)f(the)h(mapping)f -(step)h(transforms)e(the)365 989 y(k)n(ey)i(set)h(from)g(the)g -(original)e(univ)n(erse)h(to)g(a)h(new)f(univ)n(erse.)g(Second,)h(the)g -(ordering)e(step)365 1088 y(places)33 b(the)h(k)n(eys)f(in)h(a)f -(sequen)n(tial)g(order)f(that)i(determines)g(the)g(order)e(in)i(whic)n -(h)g(hash)365 1188 y(v)-5 b(alues)32 b(are)f(assigned)h(to)g(k)n(eys.)f -(Third,)h(the)h(searc)n(hing)d(step)j(attempts)f(to)h(assign)e(hash)365 -1287 y(v)-5 b(alues)37 b(to)g(the)g(k)n(eys.)f(Our)g(algorithm)g(and)h -(the)g(algorithm)f(presen)n(ted)g(in)25 b([4])37 b(use)g(the)365 -1387 y(MOS)28 b(approac)n(h.)490 1490 y(P)n(agh)23 b([14)o(])i(prop)r -(osed)e(a)h(family)g(of)h(randomized)e(algorithms)g(for)h(constructing) -f(mini-)365 1590 y(mal)i(p)r(erfect)g(hash)g(functions.)g(The)g(form)g -(of)g(the)g(resulting)g(function)g(is)g Fm(h)p Fv(\()p -Fm(x)p Fv(\))f(=)f(\()p Fm(f)9 b Fv(\()p Fm(x)p Fv(\))k(+)365 -1689 y Fm(d)408 1704 y Fj(g)r Fu(\()p Fj(x)p Fu(\))537 -1689 y Fv(\))23 b(mo)r(d)g Fm(n)p Fv(,)31 b(where)f Fm(f)39 -b Fv(and)30 b Fm(g)j Fv(are)c(univ)n(ersal)h(hash)g(functions)g(and)h -Fm(d)f Fv(is)h(a)f(set)g(of)h(dis-)365 1789 y(placemen)n(t)i(v)-5 -b(alues)32 b(to)h(resolv)n(e)d(collisions)i(that)h(are)f(caused)g(b)n -(y)g(the)h(function)g Fm(f)9 b Fv(.)33 b(P)n(agh)365 -1889 y(iden)n(ti\014ed)e(a)f(set)g(of)g(conditions)g(concerning)f -Fm(f)39 b Fv(and)30 b Fm(g)j Fv(and)d(sho)n(w)n(ed)f(that)h(if)h(these) -f(con-)365 1988 y(ditions)h(are)e(satis\014ed,)h(then)h(a)f(minimal)h -(p)r(erfect)g(hash)f(function)h(can)f(b)r(e)g(computed)h(in)365 -2088 y(exp)r(ected)f(time)f Fm(O)r Fv(\()p Fm(n)p Fv(\))h(and)f(stored) -f(in)i(\(2)19 b(+)g Fm(\017)p Fv(\))p Fm(n)29 b Fv(computer)f(w)n -(ords.)g(Dietzfelbinger)h(and)365 2187 y(Hagerup)24 b([6])e(impro)n(v)n -(ed)i([14)o(],)f(reducing)e(from)i(\(2)8 b(+)g Fm(\017)p -Fv(\))p Fm(n)22 b Fv(to)g(\(1)8 b(+)g Fm(\017)p Fv(\))p -Fm(n)22 b Fv(the)h(n)n(um)n(b)r(er)f(of)h(com-)365 2287 -y(puter)29 b(w)n(ords)e(required)h(to)h(store)e(the)j(function,)f(but)g -(in)g(their)g(approac)n(h)23 b Fm(f)37 b Fv(and)25 b -Fm(g)31 b Fv(m)n(ust)365 2387 y(b)r(e)25 b(c)n(hosen)f(from)g(a)h -(class)e(of)i(hash)f(functions)h(that)g(meet)g(additional)f(requiremen) -n(ts.)g(Dif-)365 2486 y(feren)n(tly)k(of)g(the)g(w)n(orks)f(in)e([14)o -(,)j(6],)g(our)f(algorithm)g(uses)g(t)n(w)n(o)h(univ)n(ersal)e(hash)i -(functions)365 2586 y Fm(h)413 2598 y Fu(1)474 2586 y -Fv(and)23 b Fm(h)679 2598 y Fu(2)740 2586 y Fv(randomly)f(selected)h -(from)g(a)g(class)g(of)g(univ)n(ersal)f(hash)h(functions)h(that)f(do)g -(not)365 2686 y(need)28 b(to)f(meet)h(an)n(y)f(additional)g(requiremen) -n(ts.)490 2789 y(The)40 b(w)n(ork)f(in)25 b([4])40 b(presen)n(ts)f(an)h -(e\016cien)n(t)h(and)f(practical)f(algorithm)g(for)h(generat-)365 -2888 y(ing)27 b(order)f(preserving)g(minimal)h(p)r(erfect)h(hash)e -(functions.)i(Their)f(metho)r(d)g(in)n(v)n(olv)n(es)f(the)365 -2988 y(generation)34 b(of)h(acyclic)f(random)g(graphs)g -Fm(G)h Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))36 b(with)25 -b Fk(j)p Fm(V)19 b Fk(j)36 b Fv(=)f Fm(cn)g Fv(and)g -Fk(j)p Fm(E)5 b Fk(j)35 b Fv(=)g Fm(n)p Fv(,)365 3088 -y(with)41 b Fm(c)j Fk(\025)g Fv(2)p Fm(:)p Fv(09.)39 -b(They)h(sho)n(w)n(ed)f(that)h(an)g(order)f(preserving)g(minimal)h(p)r -(erfect)h(hash)365 3187 y(function)c(can)f(b)r(e)h(found)g(in)f -(optimal)g(time)h(if)25 b Fm(G)37 b Fv(is)f(acyclic.)g(T)-7 -b(o)36 b(generate)f(an)h(acyclic)365 3287 y(graph,)e(t)n(w)n(o)g(v)n -(ertices)f Fm(h)1150 3299 y Fu(1)1188 3287 y Fv(\()p -Fm(x)p Fv(\))i(and)g Fm(h)1551 3299 y Fu(2)1588 3287 -y Fv(\()p Fm(x)p Fv(\))h(are)d(computed)i(for)f(eac)n(h)g(k)n(ey)g -Fm(x)i Fk(2)f Fm(S)5 b Fv(.)34 b(Th)n(us,)365 3386 y(eac)n(h)d(set)25 -b Fm(S)36 b Fv(has)31 b(a)g(corresp)r(onding)f(graph)23 -b Fm(G)30 b Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\),)32 -b(where)f Fm(V)48 b Fv(=)29 b Fk(f)p Fv(0)p Fm(;)14 b -Fv(1)p Fm(;)g(:)g(:)g(:)e(;)i(t)p Fk(g)31 b Fv(and)365 -3486 y Fm(E)d Fv(=)542 3419 y Fi(\010)590 3486 y Fk(f)p -Fm(h)680 3498 y Fu(1)717 3486 y Fv(\()p Fm(x)p Fv(\))p -Fm(;)14 b(h)913 3498 y Fu(2)951 3486 y Fv(\()p Fm(x)p -Fv(\))p Fk(g)24 b Fv(:)f Fm(x)g Fk(2)h Fm(S)1379 3419 -y Fi(\011)1427 3486 y Fv(.)c(In)g(order)e(to)i(guaran)n(tee)e(the)j -(acyclicit)n(y)e(of)24 b Fm(G)p Fv(,)d(the)f(algo-)365 -3586 y(rithm)h(rep)r(eatedly)g(selects)f Fm(h)1289 3598 -y Fu(1)1348 3586 y Fv(and)g Fm(h)1550 3598 y Fu(2)1608 -3586 y Fv(from)h(a)g(family)g(of)f(univ)n(ersal)g(hash)h(functions)g -(un)n(til)365 3685 y(the)30 b(corresp)r(onding)d(graph)g(is)i(acyclic.) -f(Ha)n(v)-5 b(as)28 b(et)i(al.)24 b([11)o(])29 b(pro)n(v)n(ed)f(that)h -(if)g Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)27 -b Fv(=)d Fm(cn)365 3785 y Fv(and)37 b Fm(c)h(>)f Fv(2,)g(then)g(the)g -(probabilit)n(y)e(that)25 b Fm(G)37 b Fv(is)g(acyclic)f(is)g -Fm(p)i Fv(=)g Fm(e)2562 3755 y Fu(1)p Fj(=c)2662 3714 -y Fi(p)p 2745 3714 321 4 v 71 x Fv(\()p Fm(c)19 b Fk(\000)f -Fv(2\))p Fm(=c)o Fv(.)37 b(F)-7 b(or)365 3885 y Fm(c)23 -b Fv(=)g(2)p Fm(:)p Fv(09,)i(this)h(probabilit)n(y)f(is)h -Fm(p)d Fk(')g Fv(0)p Fm(:)p Fv(342,)h(and)i(the)h(exp)r(ected)f(n)n(um) -n(b)r(er)g(of)g(iterations)f(to)365 3984 y(obtain)j(an)f(acyclic)g -(graph)f(is)f(1)p Fm(=p)d Fk(')g Fv(2)p Fm(:)p Fv(92.)365 -4187 y Fn(3)112 b(The)38 b(Algorithm)365 4362 y Fv(Let)33 -b(us)f(sho)n(w)f(ho)n(w)h(the)h(minimal)f(p)r(erfect)h(hash)f(function) -25 b Fm(h)33 b Fv(will)f(b)r(e)h(constructed.)f(W)-7 -b(e)365 4462 y(mak)n(e)35 b(use)h(of)g(t)n(w)n(o)f(auxiliary)f(random)h -(functions)25 b Fm(h)2080 4474 y Fu(1)2153 4462 y Fv(and)g -Fm(h)2360 4474 y Fu(2)2434 4462 y Fv(:)37 b Fm(U)45 b -Fk(!)37 b Fm(V)19 b Fv(,)36 b(where)24 b Fm(V)56 b Fv(=)365 -4561 y([0)p Fm(;)14 b(t)23 b Fk(\000)h Fv(1])35 b(for)g(some)f -(suitably)i(c)n(hosen)e(in)n(teger)24 b Fm(t)36 b Fv(=)g -Fm(cn)p Fv(,)f(where)g Fm(n)h Fv(=)g Fk(j)p Fm(S)5 b -Fk(j)p Fv(.)35 b(W)-7 b(e)36 b(build)g(a)365 4661 y(random)28 -b(graph)c Fm(G)i Fv(=)e Fm(G)p Fv(\()p Fm(h)1229 4673 -y Fu(1)1267 4661 y Fm(;)14 b(h)1352 4673 y Fu(2)1389 -4661 y Fv(\))29 b(on)c Fm(V)19 b Fv(,)29 b(whose)f(edge)h(set)g(is)2330 -4594 y Fi(\010)2379 4661 y Fk(f)p Fm(h)2469 4673 y Fu(1)2505 -4661 y Fv(\()p Fm(x)p Fv(\))p Fm(;)14 b(h)2701 4673 y -Fu(2)2739 4661 y Fv(\()p Fm(x)p Fv(\))p Fk(g)26 b Fv(:)g -Fm(x)f Fk(2)h Fm(S)3176 4594 y Fi(\011)3224 4661 y Fv(.)365 -4760 y(There)h(is)h(an)f(edge)g(in)e Fm(G)j Fv(for)f(eac)n(h)g(k)n(ey)g -(in)h(the)g(set)g(of)f(k)n(eys)d Fm(S)5 b Fv(.)490 4863 -y(In)26 b(what)h(follo)n(ws,)e(w)n(e)i(shall)f(b)r(e)g(in)n(terested)h -(in)f(the)h Fl(2-c)l(or)l(e)33 b Fv(of)27 b(the)g(random)e(graph)f -Fm(G)p Fv(,)365 4963 y(that)36 b(is,)g(the)g(maximal)g(subgraph)e(of)25 -b Fm(G)36 b Fv(with)h(minimal)f(degree)e(at)i(least)24 -b(2)36 b(\(see,)g(e.g.,)365 5063 y([1,)e(12)o(]\).)h(Because)d(of)i -(its)h(imp)r(ortance)e(in)h(our)g(con)n(text,)f(w)n(e)h(call)f(the)i -(2-core)d(the)i Fl(crit-)365 5162 y(ic)l(al)44 b Fv(subgraph)33 -b(of)24 b Fm(G)35 b Fv(and)e(denote)h(it)h(b)n(y)24 b -Fm(G)1797 5174 y Fu(crit)1902 5162 y Fv(.)34 b(The)g(v)n(ertices)f(and) -g(edges)h(in)25 b Fm(G)2998 5174 y Fu(crit)3136 5162 -y Fv(are)p eop end -%%Page: 4 4 -TeXDict begin 4 3 bop 681 387 a Fv(said)32 b(to)h(b)r(e)g -Fl(critic)l(al)p Fv(.)h(W)-7 b(e)33 b(let)25 b Fm(V)1700 -399 y Fu(crit)1837 387 y Fv(=)31 b Fm(V)19 b Fv(\()p -Fm(G)2097 399 y Fu(crit)2202 387 y Fv(\))33 b(and)24 -b Fm(E)2486 399 y Fu(crit)2623 387 y Fv(=)31 b Fm(E)5 -b Fv(\()p Fm(G)2882 399 y Fu(crit)2987 387 y Fv(\).)33 -b(Moreo)n(v)n(er,)d(w)n(e)681 487 y(let)25 b Fm(V)846 -499 y Fu(ncrit)1010 487 y Fv(=)e Fm(V)36 b Fk(\000)16 -b Fm(V)1311 499 y Fu(crit)1443 487 y Fv(b)r(e)27 b(the)g(set)g(of)g -Fl(non-critic)l(al)h Fv(v)n(ertices)e(in)f Fm(G)p Fv(.)i(W)-7 -b(e)27 b(also)f(let)f Fm(V)3344 499 y Fu(scrit)3498 487 -y Fk(\022)681 587 y Fm(V)729 599 y Fu(crit)865 587 y -Fv(b)r(e)31 b(the)g(set)g(of)g(all)g(critical)f(v)n(ertices)g(that)h -(ha)n(v)n(e)f(at)h(least)f(one)h(non-critical)f(v)n(ertex)681 -686 y(as)e(a)h(neigh)n(b)r(our.)f(Let)h Fm(E)1478 698 -y Fu(ncrit)1644 686 y Fv(=)c Fm(E)5 b Fv(\()p Fm(G)p -Fv(\))20 b Fk(\000)f Fm(E)2094 698 y Fu(crit)2228 686 -y Fv(b)r(e)29 b(the)g(set)g(of)g Fl(non-critic)l(al)h -Fv(edges)e(in)d Fm(G)p Fv(.)681 786 y(Finally)-7 b(,)27 -b(w)n(e)g(let)e Fm(G)1283 798 y Fu(ncrit)1447 786 y Fv(=)e(\()p -Fm(V)1615 798 y Fu(ncrit)1774 786 y Fk([)18 b Fm(V)1895 -798 y Fu(scrit)2026 786 y Fm(;)c(E)2124 798 y Fu(ncrit)2266 -786 y Fv(\))27 b(b)r(e)h(the)f Fl(non-critic)l(al)h Fv(subgraph)f(of)d -Fm(G)p Fv(.)681 886 y(The)d(non-critical)f(subgraph)g -Fm(G)1696 898 y Fu(ncrit)1859 886 y Fv(corresp)r(onds)g(to)h(the)g -(\\acyclic)f(part")h(of)k Fm(G)p Fv(.)c(W)-7 b(e)22 b(ha)n(v)n(e)681 -985 y Fm(G)h Fv(=)g Fm(G)922 997 y Fu(crit)1045 985 y -Fk([)c Fm(G)1184 997 y Fu(ncrit)1325 985 y Fv(.)805 1085 -y(W)-7 b(e)35 b(then)g(construct)e(a)h(suitable)g(lab)r(elling)g -Fm(g)i Fv(:)f Fm(V)52 b Fk(!)34 b Fh(Z)h Fv(of)f(the)h(v)n(ertices)e -(of)25 b Fm(G)p Fv(:)34 b(w)n(e)681 1185 y(c)n(ho)r(ose)23 -b Fm(g)s Fv(\()p Fm(v)s Fv(\))34 b(for)f(eac)n(h)24 b -Fm(v)35 b Fk(2)e Fm(V)19 b Fv(\()p Fm(G)p Fv(\))34 b(in)f(suc)n(h)g(a)g -(w)n(a)n(y)f(that)25 b Fm(h)p Fv(\()p Fm(x)p Fv(\))33 -b(=)f Fm(g)s Fv(\()p Fm(h)2968 1197 y Fu(1)3005 1185 -y Fv(\()p Fm(x)p Fv(\)\))24 b(+)d Fm(g)s Fv(\()p Fm(h)3381 -1197 y Fu(2)3418 1185 y Fv(\()p Fm(x)p Fv(\)\))681 1285 -y(\()p Fm(x)26 b Fk(2)g Fm(S)5 b Fv(\))29 b(is)g(a)f(minimal)i(p)r -(erfect)f(hash)g(function)g(for)c Fm(S)5 b Fv(.)29 b(W)-7 -b(e)29 b(will)g(see)g(later)f(on)h(that)g(this)681 1384 -y(lab)r(elling)24 b Fm(g)29 b Fv(can)c(b)r(e)i(found)f(in)g(linear)f -(time)i(if)f(the)g(n)n(um)n(b)r(er)g(of)g(edges)f(in)h -Fm(G)3075 1396 y Fu(crit)3205 1384 y Fv(is)g(at)g(most)691 -1451 y Fu(1)p 691 1465 34 4 v 691 1512 a(2)734 1484 y -Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)805 -1584 y(Figure)25 b(2)36 b(presen)n(ts)h(a)g(pseudo)f(co)r(de)h(for)g -(the)h(algorithm.)e(The)h(pro)r(cedure)f(Gener-)681 1684 -y(ateMPHF)23 b(\()p Fm(S)5 b Fv(,)23 b Fm(g)s Fv(\))g(receiv)n(es)f(as) -h(input)h(the)g(set)f(of)g(k)n(eys)h Fm(S)k Fv(and)23 -b(pro)r(duces)g(the)g(lab)r(elling)i Fm(g)s Fv(.)681 -1783 y(The)f(metho)r(d)g(uses)f(a)g(mapping,)h(ordering)e(and)h(searc)n -(hing)f(approac)n(h.)g(W)-7 b(e)24 b(no)n(w)f(describ)r(e)681 -1883 y(eac)n(h)k(step.)p 677 2066 5 52 v 677 2019 52 -5 v 728 2019 2788 5 v 3516 2019 52 5 v 3564 2066 5 52 -v 677 2145 5 75 v 3563 2145 V 725 2122 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m -(r)m(e)39 b Fs(GenerateMPHF)45 b(\()5 b Fo(S)13 b Fs(,)49 -b Fo(g)8 b Fs(\))p 677 2223 V 3563 2223 V 844 2201 a(M)n(a)n(p)n(p)n(i) -n(n)n(g)40 b(\()5 b Fo(S)13 b Fs(,)49 b Fo(G)9 b Fs(\))g(;)p -677 2302 V 3563 2302 V 849 2279 a(O)r(r)r(d)r(e)r(r)r(i)r(n)r(g)45 -b(\()5 b Fo(G)k Fs(,)49 b Fo(G)1441 2287 y Ft(crit)1547 -2279 y Fs(,)g Fo(G)1677 2287 y Ft(ncrit)1817 2279 y Fs(\))9 -b(;)p 677 2380 V 3563 2380 V 850 2358 a(S)s(e)s(a)s(r)s(c)s(h)s(i)s(n)s -(g)49 b(\()5 b Fo(G)k Fs(,)49 b Fo(G)1481 2366 y Ft(crit)1587 -2358 y Fs(,)g Fo(G)1717 2366 y Ft(ncrit)1857 2358 y Fs(,)g -Fo(g)12 b Fs(\))d(;)p 677 2431 5 52 v 678 2431 52 5 v -728 2431 2788 5 v 3516 2431 52 5 v 3564 2431 5 52 v 697 -2598 a Fp(Fig.)k(2.)26 b Fs(Main)g(steps)g(of)g(the)g(algorithm)h(for)f -(constructing)g(a)g(minimal)h(p)r(erfect)f(hash)g(function)681 -2789 y Fg(3.1)94 b(Mapping)32 b(Step)681 2958 y Fv(The)24 -b(pro)r(cedure)f(Mapping)h(\()p Fm(S)5 b Fv(,)24 b Fm(G)p -Fv(\))h(receiv)n(es)e(as)g(input)i(the)g(set)f(of)g(k)n(eys)g -Fm(S)29 b Fv(and)24 b(generates)681 3058 y(the)41 b(random)e(graph)h -Fm(G)45 b Fv(=)f Fm(G)p Fv(\()p Fm(h)1767 3070 y Fu(1)1805 -3058 y Fm(;)14 b(h)1890 3070 y Fu(2)1927 3058 y Fv(\),)41 -b(b)n(y)f(generating)f(t)n(w)n(o)h(auxiliary)f(functions)26 -b Fm(h)3503 3070 y Fu(1)3540 3058 y Fv(,)681 3158 y Fm(h)729 -3170 y Fu(2)789 3158 y Fv(:)d Fm(U)32 b Fk(!)23 b Fv([0)p -Fm(;)14 b(t)k Fk(\000)g Fv(1].)805 3258 y(The)30 b(functions)25 -b Fm(h)1381 3270 y Fu(1)1448 3258 y Fv(and)g Fm(h)1655 -3270 y Fu(2)1722 3258 y Fv(are)k(constructed)g(as)g(follo)n(ws.)g(W)-7 -b(e)31 b(imp)r(ose)e(some)h(upp)r(er)681 3357 y(b)r(ound)25 -b Fm(L)34 b Fv(on)h(the)g(lengths)g(of)g(the)g(k)n(eys)f(in)25 -b Fm(S)5 b Fv(.)35 b(T)-7 b(o)34 b(de\014ne)25 b Fm(h)2656 -3369 y Fj(j)2726 3357 y Fv(\()p Fm(j)40 b Fv(=)35 b(1,2\),)g(w)n(e)f -(generate)681 3457 y(an)24 b Fm(L)g Fk(\002)f Fm(\006)40 -b Fv(table)35 b(of)h(random)e(in)n(tegers)24 b(table)2182 -3469 y Fj(j)2217 3457 y Fv(.)35 b(F)-7 b(or)35 b(a)g(k)n(ey)24 -b Fm(x)37 b Fk(2)f Fm(S)k Fv(of)c(length)25 b Fk(j)p -Fm(x)p Fk(j)36 b(\024)g Fm(L)681 3557 y Fv(and)24 b Fm(j)k -Fk(2)c(f)p Fv(1)p Fm(;)14 b Fv(2)p Fk(g)p Fv(,)26 b(w)n(e)h(let)1492 -3823 y Fm(h)1540 3835 y Fj(j)1575 3823 y Fv(\()p Fm(x)p -Fv(\))d(=)1798 3731 y Fi(\020)1882 3712 y Ff(j)p Fj(x)p -Ff(j)1861 3744 y Fi(X)1867 3921 y Fj(i)p Fu(=1)1995 3823 -y Fv(table)2175 3835 y Fj(j)2210 3823 y Fv([)p Fm(i;)14 -b(x)p Fv([)p Fm(i)p Fv(]])2444 3731 y Fi(\021)2516 3823 -y Fv(mo)r(d)23 b Fm(t:)681 4074 y Fv(The)37 b(random)f(graph)24 -b Fm(G)39 b Fv(=)f Fm(G)p Fv(\()p Fm(h)1760 4086 y Fu(1)1798 -4074 y Fm(;)14 b(h)1883 4086 y Fu(2)1920 4074 y Fv(\))37 -b(has)g(v)n(ertex)f(set)25 b Fm(V)58 b Fv(=)38 b([0)p -Fm(;)14 b(t)24 b Fk(\000)h Fv(1])36 b(and)h(edge)g(set)681 -4107 y Fi(\010)729 4174 y Fk(f)p Fm(h)819 4186 y Fu(1)856 -4174 y Fv(\()p Fm(x)p Fv(\))p Fm(;)14 b(h)1052 4186 y -Fu(2)1090 4174 y Fv(\()p Fm(x)p Fv(\))p Fk(g)31 b Fv(:)f -Fm(x)h Fk(2)f Fm(S)1546 4107 y Fi(\011)1594 4174 y Fv(.)i(W)-7 -b(e)33 b(need)25 b Fm(G)32 b Fv(to)g(b)r(e)g(simple,)g(i.e.,)g -Fm(G)25 b Fv(should)32 b(ha)n(v)n(e)f(neither)681 4274 -y(lo)r(ops)24 b(nor)g(m)n(ultiple)h(edges.)f(A)h(lo)r(op)f(o)r(ccurs)g -(when)h Fm(h)2384 4286 y Fu(1)2421 4274 y Fv(\()p Fm(x)p -Fv(\))f(=)f Fm(h)2692 4286 y Fu(2)2729 4274 y Fv(\()p -Fm(x)p Fv(\))j(for)e(some)g Fm(x)f Fk(2)h Fm(S)5 b Fv(.)24 -b(W)-7 b(e)681 4373 y(solv)n(e)23 b(this)j(in)f(an)f(ad)h(ho)r(c)f -(manner:)h(w)n(e)f(simply)h(let)g Fm(h)2379 4385 y Fu(2)2416 -4373 y Fv(\()p Fm(x)p Fv(\))f(=)f(\(2)p Fm(h)2761 4385 -y Fu(1)2798 4373 y Fv(\()p Fm(x)p Fv(\))13 b(+)g(1\))23 -b(mo)r(d)g Fm(t)i Fv(in)g(this)681 4473 y(case.)g(If)i(w)n(e)f(still)h -(\014nd)g(a)e(lo)r(op)h(after)g(this,)h(w)n(e)f(generate)f(another)h -(pair)f(\()p Fm(h)3039 4485 y Fu(1)3077 4473 y Fm(;)14 -b(h)3162 4485 y Fu(2)3198 4473 y Fv(\).)27 b(When)g(a)681 -4572 y(m)n(ultiple)h(edge)f(o)r(ccurs)g(w)n(e)g(ab)r(ort)g(and)g -(generate)g(a)g(new)g(pair)e(\()p Fm(h)2780 4584 y Fu(1)2817 -4572 y Fm(;)14 b(h)2902 4584 y Fu(2)2939 4572 y Fv(\).)681 -4741 y Fg(Analysis)33 b(of)g(the)h(Mapping)f(Step.)77 -b Fv(W)-7 b(e)29 b(start)g(b)n(y)g(discussing)f(some)h(facts)g(on)g -(ran-)681 4841 y(dom)k(graphs.)e(Let)25 b Fm(G)32 b Fv(=)g(\()p -Fm(V)5 b(;)14 b(E)5 b Fv(\))34 b(with)f Fk(j)p Fm(V)19 -b Fk(j)32 b Fv(=)g Fm(t)h Fv(and)f Fk(j)p Fm(E)5 b Fk(j)32 -b Fv(=)g Fm(n)h Fv(b)r(e)g(a)g(random)f(graph)f(in)681 -4963 y(the)e(uniform)f(mo)r(del)d Fk(G)5 b Fv(\()p Fm(t;)14 -b(n)p Fv(\),)29 b(the)g(mo)r(del)g(in)f(whic)n(h)h(all)f(the)2652 -4896 y Fi(\000)2690 4932 y Fv(\()2725 4899 y Fe(t)2722 -4946 y Fd(2)2751 4932 y Fv(\))2716 4992 y Fj(n)2783 4896 -y Fi(\001)2850 4963 y Fv(graphs)f(on)d Fm(V)47 b Fv(with)26 -b Fm(n)681 5063 y Fv(edges)k(are)g(equiprobable.)g(The)i(study)f(of)25 -b Fk(G)5 b Fv(\()p Fm(t;)14 b(n)p Fv(\))31 b(go)r(es)g(bac)n(k)f(to)h -(the)g(classical)f(w)n(ork)g(of)p eop end -%%Page: 5 5 -TeXDict begin 5 4 bop 365 387 a Fv(Erd\177)-42 b(os)31 -b(and)h(R)n(\023)-39 b(en)n(yi)23 b([7,)32 b(8,)g(13)o(])g(\(for)g(a)f -(mo)r(dern)h(treatmen)n(t,)g(see)24 b([1,)32 b(12)o(]\).)h(Let)f -Fm(d)e Fv(=)g(2)p Fm(n=t)365 487 y Fv(b)r(e)38 b(the)g(a)n(v)n(erage)c -(degree)i(of)h Fm(G)p Fv(.)h(It)g(is)f(w)n(ell)g(kno)n(wn)f(that,)i(if) -25 b Fm(d)39 b(>)g Fv(1,)e(or,)f(equiv)-5 b(alen)n(tly)e(,)365 -587 y(if)26 b Fm(c)h(<)g Fv(2)j(\(recall)g(that)h(w)n(e)f(ha)n(v)n(e)f -Fm(t)f Fv(=)f Fm(cn)p Fv(\),)j(then,)h(almost)f(ev)n(ery)24 -b Fm(G)30 b Fv(con)n(tains)2843 557 y Fu(3)2910 587 y -Fv(a)g(\\gian)n(t")365 686 y(comp)r(onen)n(t)24 b(of)f(order)h(\(1)10 -b(+)g Fm(o)p Fv(\(1\)\))p Fm(bt)p Fv(,)23 b(where)i Fm(b)d -Fv(=)h(1)10 b Fk(\000)g Fm(T)f(=d)p Fv(,)23 b(and)i(0)d -Fm(<)h(T)34 b(<)23 b Fv(1)g(is)g(the)h(unique)365 786 -y(solution)g(to)h(the)g(equation)f Fm(T)12 b(e)1351 756 -y Ff(\000)p Fj(T)1477 786 y Fv(=)23 b Fm(de)1647 756 -y Ff(\000)p Fj(d)1737 786 y Fv(.)i(Moreo)n(v)n(er,)d(all)i(the)h(other) -f(comp)r(onen)n(ts)g(of)h Fm(G)365 886 y Fv(ha)n(v)n(e)f -Fm(O)r Fv(\(log)15 b Fm(t)p Fv(\))26 b(v)n(ertices.)g(Also,)g(the)g(n)n -(um)n(b)r(er)g(of)g(v)n(ertices)f(in)i(the)f(2-core)f(of)g -Fm(G)h Fv(\(the)h(max-)365 985 y(imal)32 b(subgraph)f(of)h -Fm(G)g Fv(with)g(minimal)g(degree)f(at)h(least)24 b(2\))32 -b(that)g(do)g(not)g(b)r(elong)f(to)h(the)365 1085 y(gian)n(t)27 -b(comp)r(onen)n(t)g(is)e Fm(o)p Fv(\()p Fm(t)p Fv(\))k(almost)e(surely) --7 b(.)490 1185 y(Pittel)32 b(and)g(W)-7 b(ormald)24 -b([15)o(])32 b(presen)n(t)g(detailed)g(results)f(for)h(the)g(2-core)f -(of)h(the)g(gian)n(t)365 1284 y(comp)r(onen)n(t)g(of)f(the)h(random)f -(graph)23 b Fm(G)p Fv(.)32 b(Since)25 b(table)2094 1296 -y Fj(j)2161 1284 y Fv(\()p Fm(j)35 b Fk(2)30 b(f)p Fv(1)p -Fm(;)14 b Fv(2)p Fk(g)p Fv(\))29 b(are)i(random,)g Fm(G)f -Fv(=)365 1384 y Fm(G)p Fv(\()p Fm(h)510 1396 y Fu(1)548 -1384 y Fm(;)14 b(h)633 1396 y Fu(2)670 1384 y Fv(\))25 -b(is)h(a)g(random)g(graph.)f(Exp)r(erimen)n(ts)h(sho)n(w)g(that)g(this) -h(random)e(graph,)h(condi-)365 1484 y(tioned)j(on)f(b)r(eing)g(simple,) -h(strongly)d(resem)n(bles)i(the)g(random)g(graph)f(from)h(the)g -(uniform)365 1583 y(mo)r(del)d Fk(G)5 b Fv(\()p Fm(t;)14 -b(n)p Fv(\).)22 b(In)f(what)g(follo)n(ws,)g(w)n(e)f(w)n(ork)g(under)h -(the)h(h)n(yp)r(othesis)e(that)25 b Fm(G)f Fv(=)e Fm(G)p -Fv(\()p Fm(h)3055 1595 y Fu(1)3093 1583 y Fm(;)14 b(h)3178 -1595 y Fu(2)3215 1583 y Fv(\))365 1683 y(is)28 b(dra)n(wn)e(from)f -Fk(G)5 b Fv(\()p Fm(t;)14 b(n)p Fv(\).)28 b(Th)n(us,)g(follo)n(wing)23 -b([15)o(],)28 b(the)g(n)n(um)n(b)r(er)g(of)f(v)n(ertices)g(of)d -Fm(G)2938 1695 y Fu(crit)3071 1683 y Fv(is)1210 1856 -y Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1397 1868 y Fu(crit)1502 -1856 y Fv(\))p Fk(j)24 b Fv(=)e(\(1)d(+)f Fm(o)p Fv(\(1\)\)\(1)h -Fk(\000)f Fm(T)12 b Fv(\))p Fm(bt)784 b Fv(\(1\))365 -2030 y(almost)27 b(surely)-7 b(.)27 b(Moreo)n(v)n(er,)e(the)j(n)n(um)n -(b)r(er)f(of)h(edges)f(in)h(this)g(2-core)d(is)845 2223 -y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1031 2235 y Fu(crit)1136 -2223 y Fv(\))p Fk(j)24 b Fv(=)e(\(1)c(+)g Fm(o)p Fv(\(1\)\))1655 -2131 y Fi(\020)1706 2223 y Fv(\(1)g Fk(\000)g Fm(T)12 -b Fv(\))p Fm(b)17 b Fv(+)h Fm(b)p Fv(\()p Fm(d)h Fv(+)f -Fm(T)29 b Fk(\000)18 b Fv(2\))p Fm(=)p Fv(2)2642 2131 -y Fi(\021)2691 2223 y Fm(t)420 b Fv(\(2\))365 2427 y(almost)32 -b(surely)-7 b(.)32 b(Let)25 b Fm(d)1091 2439 y Fu(crit)1226 -2427 y Fv(=)31 b(2)p Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1550 -2439 y Fu(crit)1655 2427 y Fv(\))p Fk(j)p Fm(=)p Fk(j)p -Fm(V)18 b Fv(\()p Fm(G)1938 2439 y Fu(crit)2043 2427 -y Fv(\))p Fk(j)33 b Fv(b)r(e)g(the)g(a)n(v)n(erage)c(degree)j(of)24 -b Fm(G)3119 2439 y Fu(crit)3224 2427 y Fv(.)365 2526 -y(W)-7 b(e)28 b(are)f(in)n(terested)g(in)h(the)g(case)f(in)h(whic)n(h)c -Fm(d)1818 2538 y Fu(crit)1951 2526 y Fv(is)j(a)g(constan)n(t.)490 -2626 y(As)32 b(men)n(tioned)g(b)r(efore,)f(for)g(us)h(to)g(\014nd)g -(the)g(lab)r(elling)g Fm(g)h Fv(:)d Fm(V)49 b Fk(!)30 -b Fh(Z)i Fv(of)g(the)g(v)n(ertices)365 2726 y(of)25 b -Fm(G)h Fv(=)f Fm(G)p Fv(\()p Fm(h)783 2738 y Fu(1)821 -2726 y Fm(;)14 b(h)906 2738 y Fu(2)942 2726 y Fv(\))30 -b(in)f(linear)f(time,)i(w)n(e)f(require)f(that)d Fk(j)p -Fm(E)5 b Fv(\()p Fm(G)2316 2738 y Fu(crit)2421 2726 y -Fv(\))p Fk(j)26 b(\024)2602 2693 y Fu(1)p 2602 2707 34 -4 v 2602 2755 a(2)2645 2726 y Fk(j)p Fm(E)5 b Fv(\()p -Fm(G)p Fv(\))p Fk(j)26 b Fv(=)3012 2693 y Fu(1)p 3012 -2707 V 3012 2755 a(2)3055 2726 y Fk(j)p Fm(S)5 b Fk(j)26 -b Fv(=)365 2826 y Fm(n=)p Fv(2.)h(The)i(crucial)e(step)h(no)n(w)f(is)h -(to)g(determine)g(the)h(v)-5 b(alue)28 b(of)d Fm(c)j -Fv(\(in)g Fm(t)c Fv(=)g Fm(cn)p Fv(\))k(to)g(obtain)g(a)365 -2925 y(random)f(graph)f Fm(G)e Fv(=)e Fm(G)1146 2937 -y Fu(crit)1269 2925 y Fk([)d Fm(G)1408 2937 y Fu(ncrit)1577 -2925 y Fv(with)28 b Fk(j)p Fm(E)5 b Fv(\()p Fm(G)1952 -2937 y Fu(crit)2057 2925 y Fv(\))p Fk(j)24 b(\024)2233 -2893 y Fu(1)p 2233 2907 V 2233 2954 a(2)2276 2925 y Fk(j)p -Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)490 3025 -y(T)-7 b(able)24 b(1)g(giv)n(es)g(some)g(v)-5 b(alues)24 -b(for)g Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1742 3037 y Fu(crit)1847 -3025 y Fv(\))p Fk(j)25 b Fv(and)g Fk(j)p Fm(E)5 b Fv(\()p -Fm(G)2272 3037 y Fu(crit)2377 3025 y Fv(\))p Fk(j)25 -b Fv(using)f(Eqs)g(\(1\))g(and)h(\(2\).)365 3125 y(The)39 -b(theoretical)f(v)-5 b(alue)39 b(for)25 b Fm(c)39 b Fv(is)g(around)23 -b(1)p Fm(:)p Fv(152,)38 b(whic)n(h)h(is)f(remark)-5 b(ably)38 -b(close)g(to)h(the)365 3225 y(empirical)32 b(results)g(presen)n(ted)g -(in)h(T)-7 b(able)24 b(2.)33 b(In)f(this)h(table,)g(generated)e(from)h -(real)g(data,)365 3324 y(the)i(probabilit)n(y)e Fm(P)997 -3339 y Ff(j)p Fj(E)s Fu(\()p Fj(G)1147 3347 y Fd(crit)1238 -3339 y Fu(\))p Ff(j)1321 3324 y Fv(that)i Fk(j)p Fm(E)5 -b Fv(\()p Fm(G)1693 3336 y Fu(crit)1798 3324 y Fv(\))p -Fk(j)32 b(\024)1992 3292 y Fu(1)p 1992 3306 V 1992 3353 -a(2)2035 3324 y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p -Fk(j)35 b Fv(tends)e(to)25 b(0)33 b(when)g Fm(c)g(<)f -Fv(1)p Fm(:)p Fv(15)365 3424 y(and)d(it)f(tends)h(to)g(1)f(when)g -Fm(c)d Fk(\025)f Fv(1)p Fm(:)p Fv(15)j(and)h Fm(n)h Fv(increases.)e(W) --7 b(e)28 b(found)h(this)g(matc)n(h)f(b)r(et)n(w)n(een)365 -3524 y(the)g(empirical)f(and)h(the)g(theoretical)e(results)h(most)h -(pleasan)n(t.)p 1066 3650 1481 4 v 1064 3741 4 92 v 1145 -3714 a Fo(d)p 1262 3741 V 150 w(T)p 1461 3741 V 165 w(b)p -1659 3741 V 94 w Fr(j)p Fo(V)17 b Fs(\()p Fo(G)1845 3722 -y Ft(crit)1942 3714 y Fs(\))p Fr(j)p 2003 3741 V 24 w(j)p -Fo(E)t Fs(\()p Fo(G)2189 3722 y Ft(crit)2286 3714 y Fs(\))p -Fr(j)p 2347 3741 V 94 w Fo(c)p 2545 3741 V 1066 3745 -1481 4 v 1064 3836 4 92 v 1078 3809 a Fs(1.734)p 1261 -3836 V 25 w(0.510)p 1459 3836 V 25 w(0.706)p 1657 3836 -V 75 w(0.399)p Fo(n)p 2003 3836 V 125 w Fs(0.498)p Fo(n)p -2347 3836 V 75 w Fs(1.153)p 2543 3836 V 1064 3927 V 1078 -3900 a(1.736)p 1261 3927 V 25 w(0.509)p 1459 3927 V 25 -w(0.707)p 1657 3927 V 75 w(0.400)p Fo(n)p 2003 3927 V -125 w Fs(0.500)p Fo(n)p 2347 3927 V 75 w Fs(1.152)p 2543 -3927 V 1064 4019 V 1078 3991 a(1.738)p 1261 4019 V 25 -w(0.508)p 1459 4019 V 25 w(0.708)p 1657 4019 V 75 w(0.401)p -Fo(n)p 2003 4019 V 125 w Fs(0.501)p Fo(n)p 2347 4019 -V 75 w Fs(1.151)p 2543 4019 V 1064 4110 V 1078 4082 a(1.739)p -1261 4110 V 25 w(0.508)p 1459 4110 V 25 w(0.708)p 1657 -4110 V 75 w(0.401)p Fo(n)p 2003 4110 V 125 w Fs(0.501)p -Fo(n)p 2347 4110 V 75 w Fs(1.150)p 2543 4110 V 1064 4201 -V 1078 4174 a(1.740)p 1261 4201 V 25 w(0.507)p 1459 4201 -V 25 w(0.709)p 1657 4201 V 75 w(0.401)p Fo(n)p 2003 4201 -V 125 w Fs(0.502)p Fo(n)p 2347 4201 V 75 w Fs(1.149)p -2543 4201 V 1066 4205 1481 4 v 1014 4348 a Fp(T)-7 b(able)28 -b(1.)e Fs(Determining)f(the)h Fo(c)g Fs(v)l(alue)f(theoretically)490 -4511 y Fv(W)-7 b(e)23 b(no)n(w)g(brie\015y)g(argue)e(that)j(the)f(exp)r -(ected)h(n)n(um)n(b)r(er)f(of)g(iterations)f(to)h(obtain)g(a)g(sim-)365 -4611 y(ple)i(graph)e Fm(G)h Fv(=)e Fm(G)p Fv(\()p Fm(h)1049 -4623 y Fu(1)1087 4611 y Fm(;)14 b(h)1172 4623 y Fu(2)1209 -4611 y Fv(\))24 b(is)g(constan)n(t)g(for)f Fm(t)h Fv(=)e -Fm(cn)i Fv(and)g Fm(c)f Fv(=)g(1)p Fm(:)p Fv(15.)g(Let)i -Fm(p)f Fv(b)r(e)g(the)h(proba-)365 4710 y(bilit)n(y)d(of)f(generating)e -(a)i(random)f(graph)k Fm(G)d Fv(without)h(lo)r(ops)e(and)h(without)g(m) -n(ultiple)h(edges.)365 4810 y(If)k Fm(p)c Fv(is)h(b)r(ounded)g(from)g -(b)r(elo)n(w)f(b)n(y)h(some)f(p)r(ositiv)n(e)h(constan)n(t,)f(then)i(w) -n(e)e(are)g(done,)h(b)r(ecause)365 4910 y(the)33 b(exp)r(ected)h(n)n -(um)n(b)r(er)e(of)h(iterations)f(to)g(obtain)h(suc)n(h)f(a)h(graph)f -(is)g(then)26 b(1)p Fm(=p)k Fv(=)h Fm(O)r Fv(\(1\).)p -365 4985 473 4 v 382 5039 a Ft(3)442 5071 y Fs(As)h(is)h(usual)g(in)g -(the)f(theory)g(of)h(random)g(graphs,)g(w)n(e)g(use)f(the)h(terms)f -(`almost)i(ev)n(ery')e(and)442 5162 y(`almost)27 b(surely')f(to)g(mean) -g(`with)g(probabilit)n(y)g(tending)f(to)g(1)h(as)g Fo(t)21 -b Fr(!)g(1)p Fs('.)p eop end -%%Page: 6 6 -TeXDict begin 6 5 bop 936 391 2371 4 v 934 508 4 118 -v 1000 508 a Fo(c)p 1094 508 V 2040 478 a Fs(URLs)25 -b(\()p Fo(n)p Fs(\))p 3306 508 V 1096 512 2212 4 v 934 -610 4 103 v 1094 610 V 1131 596 a(1)p Fo(;)q Fs(000)47 -b(10)p Fo(;)q Fs(000)h(100)p Fo(;)r Fs(000)f(1)p Fo(;)q -Fs(000)p Fo(;)r Fs(000)g(2)p Fo(;)q Fs(000)p Fo(;)r Fs(000)g(3)p -Fo(;)q Fs(000)p Fo(;)q Fs(000)h(4)p Fo(;)q Fs(000)p Fo(;)q -Fs(000)p 3306 610 V 936 614 2371 4 v 934 705 4 92 v 948 -678 a(1.13)p 1093 705 V 67 w(0.22)106 b(0.02)144 b(0.00)193 -b(0.00)223 b(0.00)g(0.00)g(0.00)p 3306 705 V 934 796 -V 948 769 a(1.14)p 1093 796 V 67 w(0.35)106 b(0.15)144 -b(0.00)193 b(0.00)223 b(0.00)g(0.00)g(0.00)p 3306 796 -V 934 888 V 948 860 a(1.15)p 1093 888 V 67 w(0.46)106 -b(0.55)144 b(0.65)193 b(0.87)223 b(0.95)g(0.97)g(1.00)p -3306 888 V 934 979 V 948 952 a(1.16)p 1093 979 V 67 w(0.67)106 -b(0.90)144 b(1.00)193 b(1.00)223 b(1.00)g(1.00)g(1.00)p -3306 979 V 934 1070 V 948 1043 a(1.17)p 1093 1070 V 67 -w(0.82)106 b(0.99)144 b(1.00)193 b(1.00)223 b(1.00)g(1.00)g(1.00)p -3306 1070 V 936 1074 2371 4 v 681 1227 a Fg(T)-8 b(able)42 -b(2.)36 b Fv(Probabilit)n(y)g Fm(P)1560 1242 y Ff(j)p -Fj(E)1629 1250 y Fd(crit)1720 1242 y Ff(j)1780 1227 y -Fv(that)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2155 1239 y Fu(crit)2260 -1227 y Fv(\))p Fk(j)39 b(\024)f Fm(n=)p Fv(2)e(for)g(di\013eren)n(t)h -Fm(c)g Fv(v)-5 b(alues)36 b(and)681 1327 y(di\013eren)n(t)27 -b(n)n(um)n(b)r(er)h(of)f(k)n(eys)g(for)g(a)g(collections)g(of)h(URLs) -681 1488 y(T)-7 b(o)27 b(estimate)e Fm(p)p Fv(,)i(w)n(e)h(estimate)f -(the)h(probabilit)n(y)f(of)h(obtaining)c Fm(n)j Fl(distinct)36 -b Fv(ob)5 b(jects)28 b(when)681 1588 y(w)n(e)35 b(indep)r(enden)n(tly)i -(dra)n(w)e Fm(n)24 b Fv(ob)5 b(jects)36 b(from)f(a)h(univ)n(erse)f(of)g -(cardinalit)n(y)3067 1521 y Fi(\000)3109 1551 y Fj(t)3105 -1617 y Fu(2)3138 1521 y Fi(\001)3213 1588 y Fv(=)3314 -1521 y Fi(\000)3352 1551 y Fj(cn)3371 1617 y Fu(2)3423 -1521 y Fi(\001)3498 1588 y Fk(\030)681 1717 y Fm(c)717 -1687 y Fu(2)754 1717 y Fm(n)804 1687 y Fu(2)841 1717 -y Fm(=)p Fv(2,)27 b(with)h(replacemen)n(t.)g(This)f(latter)h -(probabilit)n(y)f(is)h(ab)r(out)c Fm(e)2850 1681 y Ff(\000)2902 -1687 y Fv(\()2934 1654 y Fe(n)2938 1701 y Fd(2)2971 1687 -y Fv(\))3003 1681 y Fj(=)3037 1687 y Fv(\()3072 1654 -y Fe(t)3069 1701 y Fd(2)3098 1687 y Fv(\))3162 1717 y(for)j(large)d -Fm(n)p Fv(.)681 1838 y(As)h Fm(e)840 1802 y Ff(\000)892 -1808 y Fv(\()924 1775 y Fe(n)928 1822 y Fd(2)960 1808 -y Fv(\))992 1802 y Fj(=)1026 1808 y Fv(\()1061 1775 y -Fe(t)1059 1822 y Fd(2)1087 1808 y Fv(\))1174 1838 y Fk(!)51 -b Fm(e)1347 1808 y Ff(\000)p Fu(1)p Fj(=c)1496 1783 y -Fd(2)1583 1838 y Fm(>)f Fv(0)44 b(as)24 b Fm(n)51 b Fk(!)g(1)p -Fv(,)44 b(the)h(exp)r(ected)f(n)n(um)n(b)r(er)g(of)h(iterations)681 -1938 y(is)24 b Fm(e)800 1908 y Fu(1)p Fj(=c)897 1883 -y Fd(2)964 1938 y Fv(=)31 b(2)p Fm(:)p Fv(13)g(\(recall)h -Fm(c)e Fv(=)h(1)p Fm(:)p Fv(15\).)g(As)i(the)f(exp)r(ected)h(n)n(um)n -(b)r(er)f(of)g(iterations)g(is)g Fm(O)r Fv(\(1\))681 -2038 y(then,)c(the)g(mapping)f(step)h(tak)n(es)f Fm(O)r -Fv(\()p Fm(n)p Fv(\))h(time.)681 2226 y Fg(3.2)94 b(Ordering)32 -b(Step)681 2390 y Fv(The)37 b(pro)r(cedure)g(Ordering)f(\()p -Fm(G)p Fv(,)i Fm(G)1841 2402 y Fu(crit)1946 2390 y Fv(,)f -Fm(G)2071 2402 y Fu(ncrit)2212 2390 y Fv(\))h(receiv)n(es)e(as)h(input) -h(the)g(graph)24 b Fm(G)38 b Fv(and)681 2490 y(partitions)24 -b Fm(G)j Fv(in)n(to)g(the)g(t)n(w)n(o)f(subgraphs)f Fm(G)2072 -2502 y Fu(crit)2204 2490 y Fv(and)h Fm(G)2429 2502 y -Fu(ncrit)2571 2490 y Fv(,)g(so)h(that)e Fm(G)e Fv(=)g -Fm(G)3140 2502 y Fu(crit)3261 2490 y Fk([)17 b Fm(G)3398 -2502 y Fu(ncrit)3540 2490 y Fv(.)805 2589 y(Figure)25 -b(3)38 b(presen)n(ts)g(a)h(sample)f(graph)g(with)h(9)g(v)n(ertices)f -(and)g(8)h(edges,)f(where)g(the)681 2689 y(degree)23 -b(of)i(a)f(v)n(ertex)g(is)g(sho)n(wn)g(b)r(esides)h(eac)n(h)e(v)n -(ertex.)h(Initially)-7 b(,)25 b(all)f(v)n(ertices)g(with)h(degree)681 -2789 y(1)h(are)f(added)i(to)f(a)g(queue)h Fm(Q)p Fv(.)f(F)-7 -b(or)26 b(the)h(example)f(sho)n(wn)f(in)i(Figure)d(3\(a\),)j -Fm(Q)22 b Fv(=)h Fk(f)p Fv(2)p Fk(g)i Fv(after)681 2888 -y(the)j(initialization)f(step.)804 3619 y - currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch -translate - 804 3619 a -@beginspecial 0 @llx 0 @lly 372 @urx 92 @ury 3720 @rwi -@setspecial -%%BeginDocument: figs/grafordering.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: grafordering2.fig -%%Creator: fig2dev Version 3.2 Patchlevel 4 -%%CreationDate: Mon Jan 10 18:31:19 2005 -%%For: fbotelho@tigre (Fabiano Cupertino Botelho) -%%BoundingBox: 0 0 372 92 -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.824 0.824 0.824 srgb} bind def - -end -save -newpath 0 92 moveto 0 0 lineto 372 0 lineto 372 92 lineto closepath clip newpath --17.0 416.7 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -7.500 slw -n 1800 5310 m 1980 5310 l 1980 5490 l 1800 5490 l - cp gs col0 s gr -/Times-Roman ff 120.00 scf sf -1860 5437 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 120.00 scf sf -1665 5445 m -gs 1 -1 sc (Q) col0 sh gr -% Arc -n 1080.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 967.5 5962.5 697.9 -20.8 20.8 arc -gs col0 s gr - -% Arc -n 1080.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Polyline -n 1080 5940 m - 1305 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 1080 5940 m - 855 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 1080 5940 m - 1305 6480 l gs col0 s gr -% Polyline -n 1080 5940 m - 855 6480 l gs col0 s gr -% Polyline -n 1080 5940 m - 1620 5715 l gs col0 s gr -/Times-Roman ff 120.00 scf sf -630 5310 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -810 5985 m -gs 1 -1 sc (d:5) col0 sh gr -/Times-Roman ff 120.00 scf sf -1395 5310 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -1755 5670 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -1755 6255 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 120.00 scf sf -1440 6615 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -585 6615 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -270 5715 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -270 6255 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 165.00 scf sf -270 5355 m -gs 1 -1 sc (a\)) col0 sh gr -% Arc -n 5220.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 5107.5 5962.5 697.9 -20.8 20.8 arc -gs col0 s gr - -% Arc -n 5220.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Polyline -n 5220 5940 m - 5445 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 5220 5940 m - 4995 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 5220 5940 m - 5445 6480 l gs col0 s gr -% Polyline -n 5220 5940 m - 4995 6480 l gs col0 s gr -% Polyline -n 5220 5940 m - 5760 5715 l gs col0 s gr -% Polyline -n 5221 5943 m - 5761 5718 l gs col0 s gr -/Times-Roman ff 120.00 scf sf -4770 5310 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -4950 5985 m -gs 1 -1 sc (d:4) col0 sh gr -/Times-Roman ff 120.00 scf sf -5535 5310 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -5895 5670 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -5895 6255 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -5580 6615 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -4725 6615 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -4410 5715 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -4410 6255 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 165.00 scf sf -4410 5355 m -gs 1 -1 sc (c\)) col0 sh gr -/Times-Roman ff 120.00 scf sf -5850 5445 m -gs 1 -1 sc (Q) col0 sh gr -% Polyline -n 3870 5310 m 4050 5310 l 4050 5490 l 3870 5490 l - cp gs col0 s gr -/Times-Roman ff 120.00 scf sf -3930 5437 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 120.00 scf sf -3735 5445 m -gs 1 -1 sc (Q) col0 sh gr -% Arc -n 3150.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 3037.5 5962.5 697.9 -20.8 20.8 arc -gs col0 s gr - -% Arc -n 3150.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Polyline -n 3150 5940 m - 3375 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 3150 5940 m - 2925 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 3150 5940 m - 3375 6480 l gs col0 s gr -% Polyline -n 3150 5940 m - 2925 6480 l gs col0 s gr -% Polyline -n 3150 5940 m - 3690 5715 l gs col0 s gr -% Polyline -n 3151 5943 m - 3691 5718 l gs col0 s gr -/Times-Roman ff 120.00 scf sf -2700 5310 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -2880 5985 m -gs 1 -1 sc (d:5) col0 sh gr -/Times-Roman ff 120.00 scf sf -3465 5310 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -3825 5670 m -gs 1 -1 sc (d:1) col0 sh gr -/Times-Roman ff 120.00 scf sf -3825 6255 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -3510 6615 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -2655 6615 m -gs 1 -1 sc (d:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -2340 5715 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -2340 6255 m -gs 1 -1 sc (d:0) col0 sh gr -/Times-Roman ff 165.00 scf sf -2340 5355 m -gs 1 -1 sc (b\)) col0 sh gr -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n 540 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -510 5752 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 855 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -825 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 1305 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1275 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 1620 5715 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1590 5752 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 1620 6165 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1590 6202 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 1305 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1275 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 855 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -825 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 540 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -510 6202 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 1080 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1050 5977 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 4680 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4650 5752 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 4995 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4965 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 5445 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5415 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 5445 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5415 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 4995 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4965 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 4680 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4650 6202 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 5220 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5190 5977 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 5760 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5730 6202 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 5760 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5730 5752 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 6052 5397 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -% Polyline -n 6070 5337 m - 6033 5458 l gs col32 1.00 tnt ef gr gs col0 s gr -% Ellipse -n 2610 5715 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -2580 5752 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 2925 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -2895 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 3375 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3345 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 3375 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3345 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 2925 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -2895 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 2610 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -2580 6202 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 3150 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3120 5977 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 3690 5715 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3660 5752 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 3690 6165 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3660 6202 m -gs 1 -1 sc (2) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage - -%%EndDocument - @endspecial 804 3619 a - currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg -exch neg exch translate - 804 3619 a 1011 3802 a Fg(Fig.)15 -b(3.)27 b Fv(Ordering)f(step)i(for)f(a)g(graph)g(with)h(9)f(v)n -(ertices)f(and)i(8)f(edges)805 3965 y(Next,)h(w)n(e)g(remo)n(v)n(e)e -(one)h(v)n(ertex)f Fm(v)31 b Fv(from)d(the)g(queue,)f(decremen)n(t)h -(its)f(degree)g(and)g(the)681 4065 y(degree)34 b(of)i(the)g(v)n -(ertices)e(with)i(degree)f(greater)f(than)h(0)g(in)h(the)g(adjacen)n(t) -f(list)h(of)f Fm(v)s Fv(,)h(as)681 4164 y(depicted)25 -b(in)f(Figure)h(3\(b\))f(for)g Fm(v)j Fv(=)22 b(2.)i(A)n(t)h(this)g(p)r -(oin)n(t,)f(the)h(adjacencies)f(of)g Fm(v)k Fv(with)d(degree)681 -4264 y(1)e(are)g(inserted)g(in)n(to)h(the)g(queue,)g(suc)n(h)f(as)g(v)n -(ertex)g(1.)g(This)h(pro)r(cess)e(is)i(rep)r(eated)f(un)n(til)h(the)681 -4363 y(queue)35 b(b)r(ecomes)f(empt)n(y)-7 b(.)35 b(All)g(v)n(ertices)f -(with)h(degree)f(0)h(are)f(non-critical)f(v)n(ertices)h(and)681 -4463 y(the)28 b(others)g(are)f(critical)g(v)n(ertices,)g(as)h(depicted) -h(in)f(Figure)c(3\(c\).)k(Finally)-7 b(,)29 b(to)f(determine)681 -4563 y(the)g(v)n(ertices)f(in)h Fm(V)1270 4575 y Fu(scrit)1429 -4563 y Fv(w)n(e)f(collect)h(all)f(v)n(ertices)g Fm(v)g -Fk(2)d Fm(V)19 b Fv(\()p Fm(G)2536 4575 y Fu(crit)2641 -4563 y Fv(\))28 b(with)g(at)g(least)f(one)h(v)n(ertex)681 -4662 y Fm(u)f Fv(that)h(is)f(in)h(Adj\()p Fm(v)s Fv(\))h(and)f(in)g -Fm(V)19 b Fv(\()p Fm(G)1808 4674 y Fu(ncrit)1949 4662 -y Fv(\),)28 b(as)f(the)h(v)n(ertex)f(8)g(in)h(Figure)c(3\(c\).)681 -4826 y Fg(Analysis)39 b(of)h(the)g(Ordering)g(Step.)90 -b Fv(The)35 b(initialization)f(tak)n(es)g Fm(O)r Fv(\()p -Fk(j)p Fm(V)20 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(\))36 -b(time,)681 4926 y(b)r(ecause)29 b(w)n(e)g(need)g(to)h(c)n(hec)n(k)e -(the)i(degree)e(of)h(eac)n(h)g(v)n(ertex)f(from)h Fm(V)19 -b Fv(\()p Fm(G)p Fv(\).)31 b(Next,)e(the)h(non-)681 5025 -y(critical)35 b(v)n(ertices)h(are)f(obtained.)h(This)h(pro)r(cess)e -(tak)n(es)g Fm(O)r Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)2799 -5037 y Fu(ncrit)2941 5025 y Fv(\))p Fk(j)p Fv(\),)37 -b(b)r(ecause)f(eac)n(h)681 5125 y(non-critical)30 b(v)n(ertex)h(is)h -(remo)n(v)n(ed)e(from)i(the)g(queue)g(only)g(once.)f(Finally)-7 -b(,)32 b(to)g(determine)681 5225 y(the)f(v)n(ertices)e(in)i -Fm(V)1278 5237 y Fu(scrit)1440 5225 y Fv(tak)n(es)e Fm(O)r -Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)1940 5237 y Fu(crit)2045 -5225 y Fv(\))p Fk(j)p Fv(\).)31 b(Considering)e(that)i -Fk(j)p Fm(V)19 b Fv(\()p Fm(G)3016 5237 y Fu(crit)3121 -5225 y Fv(\))p Fk(j)28 b(\024)g(j)p Fm(V)19 b Fv(\()p -Fm(G)p Fv(\))p Fk(j)p Fv(,)681 5324 y Fk(j)p Fm(V)g Fv(\()p -Fm(G)868 5336 y Fu(ncrit)1009 5324 y Fv(\))p Fk(j)24 -b(\024)e(j)p Fm(V)d Fv(\()p Fm(G)p Fv(\))p Fk(j)29 b -Fv(and)e Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)24 -b Fv(=)f Fm(t)g Fv(=)g Fm(cn)p Fv(,)k(the)h(ordering)e(step)i(tak)n(es) -e Fm(O)r Fv(\()p Fm(n)p Fv(\))j(time.)p eop end -%%Page: 7 7 -TeXDict begin 7 6 bop 365 387 a Fg(3.3)95 b(Searc)m(hing)32 -b(Step)365 548 y Fv(In)i(the)h(searc)n(hing)d(step,)i(the)g(k)n(ey)f -(part)g(is)h(the)g Fl(p)l(erfe)l(ct)i(assignment)g(pr)l(oblem)p -Fv(:)f(\014nd)f Fm(g)i Fv(:)365 647 y Fm(V)19 b Fv(\()p -Fm(G)p Fv(\))24 b Fk(!)f Fh(Z)28 b Fv(suc)n(h)f(that)h(the)g(function)g -Fm(h)23 b Fv(:)h Fm(E)5 b Fv(\()p Fm(G)p Fv(\))23 b Fk(!)h -Fh(Z)k Fv(de\014ned)g(b)n(y)1165 812 y Fm(h)p Fv(\()p -Fm(e)p Fv(\))23 b(=)g Fm(g)s Fv(\()p Fm(a)p Fv(\))18 -b(+)g Fm(g)s Fv(\()p Fm(b)p Fv(\))166 b(\()p Fm(e)23 -b Fv(=)f Fk(f)p Fm(a;)14 b(b)p Fk(g)p Fv(\))739 b(\(3\))365 -977 y(is)21 b(a)g(bijection)h(from)i Fm(E)5 b Fv(\()p -Fm(G)p Fv(\))23 b(to)h([0)p Fm(;)14 b(n)6 b Fk(\000)g -Fv(1])20 b(\(recall)k Fm(n)f Fv(=)f Fk(j)p Fm(S)5 b Fk(j)23 -b Fv(=)g Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p -Fv(\).)44 b(W)-7 b(e)21 b(are)g(in)n(terested)365 1076 -y(in)g(a)f(lab)r(elling)h Fm(g)k Fv(:)e Fm(V)42 b Fk(!)23 -b Fh(Z)e Fv(of)g(the)g(v)n(ertices)e(of)i(the)g(graph)j -Fm(G)f Fv(=)g Fm(G)p Fv(\()p Fm(h)2523 1088 y Fu(1)2560 -1076 y Fm(;)14 b(h)2645 1088 y Fu(2)2682 1076 y Fv(\))21 -b(with)g(the)g(prop-)365 1176 y(ert)n(y)g(that)g(if)k -Fm(x)d Fv(and)j Fm(y)e Fv(are)e(k)n(eys)f(in)25 b Fm(S)5 -b Fv(,)21 b(then)g Fm(g)s Fv(\()p Fm(h)1876 1188 y Fu(1)1913 -1176 y Fv(\()p Fm(x)p Fv(\)\))5 b(+)g Fm(g)s Fv(\()p -Fm(h)2254 1188 y Fu(2)2293 1176 y Fv(\()p Fm(x)p Fv(\)\))24 -b Fk(6)p Fv(=)f Fm(g)s Fv(\()p Fm(h)2671 1188 y Fu(1)2708 -1176 y Fv(\()p Fm(y)s Fv(\)\))5 b(+)g Fm(g)s Fv(\()p -Fm(h)3046 1188 y Fu(2)3084 1176 y Fv(\()p Fm(y)s Fv(\)\);)365 -1275 y(that)40 b(is,)f(if)h(w)n(e)f(asso)r(ciate)f(to)h(eac)n(h)g(edge) -f(the)i(sum)g(of)f(the)g(lab)r(els)h(on)f(its)g(endp)r(oin)n(ts,)365 -1375 y(then)29 b(these)f(v)-5 b(alues)28 b(should)g(b)r(e)h(all)f -(distinct.)h(Moreo)n(v)n(er,)d(w)n(e)i(require)f(that)i(all)f(the)g -(sums)365 1475 y Fm(g)s Fv(\()p Fm(h)488 1487 y Fu(1)525 -1475 y Fv(\()p Fm(x)p Fv(\)\))18 b(+)e Fm(g)s Fv(\()p -Fm(h)890 1487 y Fu(2)927 1475 y Fv(\()p Fm(x)p Fv(\)\))29 -b(\()p Fm(x)23 b Fk(2)h Fm(S)5 b Fv(\))26 b(fall)h(b)r(et)n(w)n(een)e -(0)h(and)f Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)18 -b(\000)e Fv(1)23 b(=)f Fm(n)17 b Fk(\000)f Fv(1,)26 b(and)h(th)n(us)g -(w)n(e)365 1574 y(ha)n(v)n(e)g(a)g(bijection)h(b)r(et)n(w)n(een)d -Fm(S)32 b Fv(and)25 b([0)p Fm(;)14 b(n)j Fk(\000)h Fv(1].)490 -1674 y(The)j(pro)r(cedure)f(Searc)n(hing)g(\()p Fm(G)p -Fv(,)h Fm(G)1609 1686 y Fu(crit)1714 1674 y Fv(,)g Fm(G)1823 -1686 y Fu(ncrit)1965 1674 y Fv(,)g Fm(g)s Fv(\))g(receiv)n(es)e(as)i -(input)26 b Fm(G)p Fv(,)21 b Fm(G)2892 1686 y Fu(crit)2997 -1674 y Fv(,)g Fm(G)3106 1686 y Fu(ncrit)365 1774 y Fv(and)31 -b(\014nds)g(a)f(suitable)g(log)1224 1794 y Fu(2)1275 -1774 y Fk(j)p Fm(V)19 b Fv(\()p Fm(G)p Fv(\))p Fk(j)i -Fv(+)f(1)30 b(bit)i(v)-5 b(alue)30 b(for)g(eac)n(h)g(v)n(ertex)g -Fm(v)h Fk(2)e Fm(V)18 b Fv(\()p Fm(G)p Fv(\),)32 b(stored)365 -1873 y(in)i(the)f(arra)n(y)23 b Fm(g)s Fv(.)32 b(This)h(step)h(is)f -(\014rst)g(p)r(erformed)f(for)h(the)g(v)n(ertices)f(in)i(the)f -(critical)g(sub-)365 1973 y(graph)24 b Fm(G)663 1985 -y Fu(crit)801 1973 y Fv(of)32 b Fm(G)i Fv(\(the)f(2-core)e(of)25 -b Fm(G)p Fv(\))33 b(and)g(then)g(it)h(is)e(p)r(erformed)h(for)f(the)h -(v)n(ertices)f(in)365 2072 y Fm(G)430 2084 y Fu(ncrit)608 -2072 y Fv(\(the)k(non-critical)f(subgraph)g(of)25 b Fm(G)36 -b Fv(that)g(con)n(tains)f(the)i(\\acyclic)e(part")g(of)h -Fm(G)p Fv(\).)365 2172 y(The)k(reason)e(the)j(assignmen)n(t)d(of)i(the) -g Fm(g)28 b Fv(v)-5 b(alues)39 b(is)h(\014rst)f(p)r(erformed)h(on)f -(the)h(v)n(ertices)365 2272 y(in)25 b Fm(G)524 2284 y -Fu(crit)659 2272 y Fv(is)k(to)g(resolv)n(e)f(reassignmen)n(ts)g(as)h -(early)f(as)h(p)r(ossible)g(\(suc)n(h)h(reassignmen)n(ts)d(are)365 -2371 y(consequences)g(of)g(the)h(cycles)f(in)e Fm(G)1501 -2383 y Fu(crit)1634 2371 y Fv(and)i(are)g(depicted)h(hereinafter\).)365 -2531 y Fg(Assignmen)m(t)f(of)g(V)-8 b(alues)28 b(to)f(Critical)h(V)-8 -b(ertices.)66 b Fv(The)24 b(lab)r(els)g Fm(g)s Fv(\()p -Fm(v)s Fv(\))h(\()p Fm(v)h Fk(2)e Fm(V)19 b Fv(\()p Fm(G)3078 -2543 y Fu(crit)3183 2531 y Fv(\)\))365 2631 y(are)g(assigned)g(in)h -(increasing)e(order)h(follo)n(wing)g(a)g(greedy)g(strategy)g(where)g -(the)h(critical)g(v)n(er-)365 2731 y(tices)25 b Fm(v)j -Fv(are)23 b(considered)h(one)g(at)g(a)g(time,)h(according)d(to)j(a)f -(breadth-\014rst)f(searc)n(h)g(on)h Fm(G)3119 2743 y -Fu(crit)3224 2731 y Fv(.)365 2830 y(If)e(a)e(candidate)h(v)-5 -b(alue)25 b Fm(x)d Fv(for)i Fm(g)s Fv(\()p Fm(v)s Fv(\))d(is)g -(forbidden)g(b)r(ecause)g(setting)k Fm(g)s Fv(\()p Fm(v)s -Fv(\))e(=)g Fm(x)f Fv(w)n(ould)e(create)365 2930 y(t)n(w)n(o)26 -b(edges)f(with)i(the)g(same)f(sum,)g(w)n(e)g(try)f Fm(x)16 -b Fv(+)g(1)26 b(for)e Fm(g)s Fv(\()p Fm(v)s Fv(\).)j(This)f(fact)g(is)h -(referred)e(to)h(as)g(a)365 3030 y Fl(r)l(e)l(assignment)p -Fv(.)490 3129 y(Let)21 b Fm(A)694 3141 y Fj(E)771 3129 -y Fv(b)r(e)g(the)g(set)f(of)h(addresses)e(assigned)h(to)g(edges)g(in)h -Fm(E)5 b Fv(\()p Fm(G)2466 3141 y Fu(crit)2571 3129 y -Fv(\).)21 b(Initially)g Fm(A)3016 3141 y Fj(E)3095 3129 -y Fv(=)i Fk(;)p Fv(.)365 3229 y(Let)32 b Fm(x)g Fv(b)r(e)f(a)g -(candidate)g(v)-5 b(alue)32 b(for)f Fm(g)s Fv(\()p Fm(v)s -Fv(\).)g(Initially)h Fm(x)e Fv(=)f(0.)i(Considering)f(the)h(subgraph) -365 3328 y Fm(G)430 3340 y Fu(crit)555 3328 y Fv(in)20 -b(Figure)k(3\(c\),)c(a)g(step)g(b)n(y)g(step)g(example)f(of)h(the)g -(assignmen)n(t)f(of)h(v)-5 b(alues)20 b(to)f(v)n(ertices)365 -3428 y(in)32 b Fm(G)531 3440 y Fu(crit)667 3428 y Fv(is)f(presen)n(ted) -g(in)g(Figure)24 b(4.)31 b(Initially)-7 b(,)32 b(a)e(v)n(ertex)h -Fm(v)j Fv(is)d(c)n(hosen,)g(the)g(assignmen)n(t)365 3528 -y Fm(g)s Fv(\()p Fm(v)s Fv(\))f(=)e Fm(x)k Fv(is)f(made)g(and)g -Fm(x)g Fv(is)g(set)g(to)g Fm(x)22 b Fv(+)e(1.)31 b(F)-7 -b(or)30 b(example,)h(supp)r(ose)g(that)g(v)n(ertex)f(8)h(in)365 -3627 y(Figure)25 b(4\(a\))i(is)g(c)n(hosen,)g(the)h(assignmen)n(t)f -Fm(g)s Fv(\(8\))22 b(=)h(0)k(is)h(made)f(and)g Fm(x)i -Fv(is)e(set)h(to)f(1.)560 4524 y - currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch -translate - 560 4524 a @beginspecial -0 @llx 0 @lly 352 @urx 115 @ury 3520 @rwi @setspecial -%%BeginDocument: figs/grafsearching.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: grafsearching2.fig -%%Creator: fig2dev Version 3.2 Patchlevel 4 -%%CreationDate: Mon Jan 10 18:31:58 2005 -%%For: fbotelho@tigre (Fabiano Cupertino Botelho) -%%BoundingBox: 0 0 352 115 -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.824 0.824 0.824 srgb} bind def - -end -save -newpath 0 115 moveto 0 0 lineto 352 0 lineto 352 115 lineto closepath clip newpath --272.1 431.6 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Arc -7.500 slw -n 6210.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 6210.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Arc -n 7740.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 7740.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Arc -n 9270.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 9270.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Arc -n 4860.0 5940.0 585.0 -112.6 -67.4 arc -gs col0 s gr - -% Arc -n 4860.0 5940.0 585.0 67.4 112.6 arc -gs col0 s gr - -% Polyline -n 6210 5940 m - 6435 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 6210 5940 m - 5985 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 6210 5940 m - 6435 6480 l gs col0 s gr -% Polyline -n 6210 5940 m - 5985 6480 l gs col0 s gr -% Polyline -n 7740 5940 m - 7965 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 7740 5940 m - 7515 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 7740 5940 m - 7965 6480 l gs col0 s gr -% Polyline -n 7740 5940 m - 7515 6480 l gs col0 s gr -% Polyline -n 9270 5940 m - 9495 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 9270 5940 m - 9045 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 9270 5940 m - 9495 6480 l gs col0 s gr -% Polyline -n 9270 5940 m - 9045 6480 l gs col0 s gr -% Polyline -n 4860 5940 m - 5085 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 4860 5940 m - 4635 5400 l gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -n 4860 5940 m - 5085 6480 l gs col0 s gr -% Polyline -n 4860 5940 m - 4635 6480 l gs col0 s gr -/Times-Roman ff 165.00 scf sf -5490 5445 m -gs 1 -1 sc (b\)) col0 sh gr -/Times-Roman ff 165.00 scf sf -7020 5445 m -gs 1 -1 sc (c\)) col0 sh gr -/Times-Roman ff 165.00 scf sf -8550 5445 m -gs 1 -1 sc (d\)) col0 sh gr -/Times-Roman ff 165.00 scf sf -4320 5445 m -gs 1 -1 sc (a\)) col0 sh gr -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n 5985 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5955 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 6435 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -6405 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 6435 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -6405 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 5985 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5955 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 6210 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -6180 5977 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 7515 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -7485 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 7965 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -7935 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 7965 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -7935 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 7515 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -7485 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 7740 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -7710 5977 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 9045 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -9015 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 9495 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -9465 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 9495 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -9465 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 9045 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -9015 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 9270 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -9240 5977 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 4635 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4605 5437 m -gs 1 -1 sc (7) col0 sh gr -% Ellipse -n 5085 5400 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5055 5437 m -gs 1 -1 sc (0) col0 sh gr -% Ellipse -n 5085 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5055 6517 m -gs 1 -1 sc (3) col0 sh gr -% Ellipse -n 4635 6480 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4605 6517 m -gs 1 -1 sc (4) col0 sh gr -% Ellipse -n 4860 5940 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4830 5977 m -gs 1 -1 sc (8) col0 sh gr -% Polyline -gs clippath -6228 5199 m 6255 5253 l 6389 5186 l 6269 5213 l 6362 5132 l cp -eoclip -n 6255 5220 m - 6615 5040 l gs col7 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 6362 5132 m 6269 5213 l 6389 5186 l 6362 5132 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6146 6680 m 6120 6626 l 5985 6693 l 6106 6667 l 6012 6747 l cp -eoclip -n 5760 6840 m - 6120 6660 l gs col7 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 6012 6747 m 6106 6667 l 5985 6693 l 6012 6747 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7676 6680 m 7650 6626 l 7515 6693 l 7636 6667 l 7542 6747 l cp -eoclip -n 7290 6840 m - 7650 6660 l gs col7 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7542 6747 m 7636 6667 l 7515 6693 l 7542 6747 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7496 5735 m 7470 5681 l 7335 5748 l 7456 5722 l 7362 5802 l cp -eoclip -n 7110 5895 m - 7470 5715 l gs col7 1.00 shd ef gr gs col0 s gr gr - -% arrowhead -n 7362 5802 m 7456 5722 l 7335 5748 l 7362 5802 l cp gs 0.00 setgray ef gr col0 s -/Times-Roman ff 120.00 scf sf -6345 5985 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -6570 5310 m -gs 1 -1 sc (g:1) col0 sh gr -/Times-Roman ff 120.00 scf sf -5715 5310 m -gs 1 -1 sc (g:4) col0 sh gr -/Times-Roman ff 120.00 scf sf -6165 5310 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 120.00 scf sf -5985 5715 m -gs 1 -1 sc (4) col0 sh gr -/Times-Roman ff 120.00 scf sf -5985 6255 m -gs 1 -1 sc (3) col0 sh gr -/Times-Roman ff 120.00 scf sf -6390 6255 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 120.00 scf sf -6390 5715 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 120.00 scf sf -6165 6660 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 120.00 scf sf -6525 6660 m -gs 1 -1 sc (g:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -5715 6660 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 120.00 scf sf -7875 5985 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -8100 5310 m -gs 1 -1 sc (g:1) col0 sh gr -/Times-Roman ff 120.00 scf sf -7245 5310 m -gs 1 -1 sc (g:5) col0 sh gr -/Times-Roman ff 120.00 scf sf -7695 5310 m -gs 1 -1 sc (6) col0 sh gr -/Times-Roman ff 120.00 scf sf -7515 5715 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 120.00 scf sf -7515 6255 m -gs 1 -1 sc (3) col0 sh gr -/Times-Roman ff 120.00 scf sf -7920 6255 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 120.00 scf sf -7920 5715 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 120.00 scf sf -7695 6660 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 120.00 scf sf -8055 6660 m -gs 1 -1 sc (g:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -7245 6660 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 120.00 scf sf -9405 5985 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -9630 5310 m -gs 1 -1 sc (g:1) col0 sh gr -/Times-Roman ff 120.00 scf sf -8775 5310 m -gs 1 -1 sc (g:6) col0 sh gr -/Times-Roman ff 120.00 scf sf -9225 5310 m -gs 1 -1 sc (7) col0 sh gr -/Times-Roman ff 120.00 scf sf -9045 5715 m -gs 1 -1 sc (6) col0 sh gr -/Times-Roman ff 120.00 scf sf -9045 6255 m -gs 1 -1 sc (3) col0 sh gr -/Times-Roman ff 120.00 scf sf -9450 6255 m -gs 1 -1 sc (2) col0 sh gr -/Times-Roman ff 120.00 scf sf -9450 5715 m -gs 1 -1 sc (1) col0 sh gr -/Times-Roman ff 120.00 scf sf -9225 6660 m -gs 1 -1 sc (5) col0 sh gr -/Times-Roman ff 120.00 scf sf -9585 6660 m -gs 1 -1 sc (g:2) col0 sh gr -/Times-Roman ff 120.00 scf sf -8775 6660 m -gs 1 -1 sc (g:3) col0 sh gr -/Times-Roman ff 120.00 scf sf -4995 5985 m -gs 1 -1 sc (g:0) col0 sh gr -% here ends figure; -$F2psEnd -rs -showpage - -%%EndDocument - @endspecial 560 4524 a - currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg -exch neg exch translate - 560 4524 a 665 4707 a Fg(Fig.)15 -b(4.)27 b Fv(Example)g(of)g(the)h(assignmen)n(t)f(of)h(v)-5 -b(alues)27 b(to)g(critical)g(v)n(ertices)490 4863 y(In)h(Figure)c -(4\(b\),)k(follo)n(wing)f(the)h(adjacen)n(t)f(list)h(of)f(v)n(ertex)g -(8,)g(the)i(unassigned)d(v)n(ertex)365 4963 y(0)c(is)h(reac)n(hed.)e(A) -n(t)i(this)g(p)r(oin)n(t,)g(w)n(e)f(collect)h(in)g(the)g(temp)r(orary)e -(v)-5 b(ariable)21 b Fm(Y)42 b Fv(all)22 b(adjacencies)365 -5063 y(of)h(v)n(ertex)e(0)h(that)h(ha)n(v)n(e)e(b)r(een)i(assigned)e -(an)h Fm(x)h Fv(v)-5 b(alue,)22 b(and)g Fm(Y)42 b Fv(=)23 -b Fk(f)p Fv(8)p Fk(g)p Fv(.)e(Next,)i(for)e(all)h Fm(u)h -Fk(2)g Fm(Y)c Fv(,)p eop end -%%Page: 8 8 -TeXDict begin 8 7 bop 681 387 a Fv(w)n(e)32 b(c)n(hec)n(k)h(if)g -Fm(g)s Fv(\()p Fm(u)p Fv(\))22 b(+)g Fm(x)32 b Fk(62)h -Fm(A)1612 399 y Fj(E)1668 387 y Fv(.)g(Since)h Fm(g)s -Fv(\(8\))21 b(+)h(1)32 b(=)f(1)h Fk(62)h Fm(A)2598 399 -y Fj(E)2654 387 y Fv(,)g(then)h Fm(g)s Fv(\(0\))f(is)f(set)i(to)f(1,)f -Fm(x)681 487 y Fv(is)e(incremen)n(ted)h(b)n(y)f(1)g(\(no)n(w)g -Fm(x)f Fv(=)e(2\))k(and)f Fm(A)2136 499 y Fj(E)2221 487 -y Fv(=)d Fm(A)2375 499 y Fj(E)2452 487 y Fk([)21 b(f)p -Fv(1)p Fk(g)26 b Fv(=)i Fk(f)p Fv(1)p Fk(g)p Fv(.)h(Next,)i(v)n(ertex)f -(3)g(is)681 587 y(reac)n(hed,)21 b Fm(g)s Fv(\(3\))i(is)f(set)h(to)f -(2,)g Fm(x)i Fv(is)e(set)h(to)f(3)g(and)h Fm(A)2212 599 -y Fj(E)2291 587 y Fv(=)g Fm(A)2441 599 y Fj(E)2506 587 -y Fk([)8 b(f)p Fv(2)p Fk(g)22 b Fv(=)h Fk(f)p Fv(1)p -Fm(;)14 b Fv(2)p Fk(g)p Fv(.)21 b(Next,)i(v)n(ertex)e(4)681 -686 y(is)k(reac)n(hed)e(and)i Fm(Y)42 b Fv(=)23 b Fk(f)p -Fv(3)p Fm(;)14 b Fv(8)p Fk(g)p Fv(.)23 b(Since)i Fm(g)s -Fv(\(3\))13 b(+)g(3)22 b(=)h(5)f Fk(62)i Fm(A)2460 698 -y Fj(E)2541 686 y Fv(and)h Fm(g)s Fv(\(8\))13 b(+)g(3)22 -b(=)h(3)f Fk(62)i Fm(A)3297 698 y Fj(E)3353 686 y Fv(,)h(then)681 -786 y Fm(g)s Fv(\(4\))19 b(is)g(set)g(to)g(3,)g Fm(x)g -Fv(is)g(set)h(to)f(4)f(and)h Fm(A)1853 798 y Fj(E)1933 -786 y Fv(=)j Fm(A)2082 798 y Fj(E)2140 786 y Fk([)r(f)p -Fv(3)p Fm(;)14 b Fv(5)p Fk(g)21 b Fv(=)i Fk(f)p Fv(1)p -Fm(;)14 b Fv(2)p Fm(;)g Fv(3)p Fm(;)g Fv(5)p Fk(g)p Fv(.)i(Finally)-7 -b(,)19 b(v)n(ertex)f(7)h(is)681 886 y(reac)n(hed)g(and)g -Fm(Y)42 b Fv(=)23 b Fk(f)p Fv(0)p Fm(;)14 b Fv(8)p Fk(g)p -Fv(.)k(Since)i Fm(g)s Fv(\(0\))s(+)s(4)j(=)f(5)h Fk(2)g -Fm(A)2339 898 y Fj(E)2396 886 y Fv(,)d Fm(x)h Fv(is)f(incremen)n(ted)f -(b)n(y)h(1)g(and)g(set)g(to)681 985 y(5,)j(as)g(depicted)h(in)g(Figure) -g(4\(c\).)f(Since)h Fm(g)s Fv(\(8\))10 b(+)g(5)22 b(=)h(5)g -Fk(2)g Fm(A)2540 997 y Fj(E)2596 985 y Fv(,)h Fm(x)g -Fv(is)f(again)g(incremen)n(ted)g(b)n(y)681 1085 y(1)f(and)h(set)g(to)f -(6,)h(as)f(depicted)h(in)g(Figure)h(4\(d\).)f(These)g(t)n(w)n(o)f -(reassignmen)n(ts)f(are)h(indicated)681 1184 y(b)n(y)33 -b(the)i(arro)n(ws)c(in)k(Figure)24 b(4.)33 b(Since)i -Fm(g)s Fv(\(0\))22 b(+)g(6)33 b(=)h(7)f Fk(62)h Fm(A)2567 -1196 y Fj(E)2657 1184 y Fv(and)g Fm(g)s Fv(\(8\))22 b(+)h(6)33 -b(=)g(6)g Fk(62)h Fm(A)3483 1196 y Fj(E)3540 1184 y Fv(,)681 -1284 y(then)d Fm(g)s Fv(\(7\))f(is)h(set)f(to)h(6)f(and)h -Fm(A)1675 1296 y Fj(E)1759 1284 y Fv(=)d Fm(A)1914 1296 -y Fj(E)1990 1284 y Fk([)21 b(f)p Fv(6)p Fm(;)14 b Fv(7)p -Fk(g)26 b Fv(=)i Fk(f)p Fv(1)p Fm(;)14 b Fv(2)p Fm(;)g -Fv(3)p Fm(;)g Fv(5)p Fm(;)g Fv(6)p Fm(;)g Fv(7)p Fk(g)p -Fv(.)26 b(This)31 b(\014nishes)f(the)681 1384 y(algorithm.)805 -1483 y(A)j(pseudo)e(co)r(de)h(for)f(the)i(assignmen)n(t)e(of)h(v)-5 -b(alues)31 b(to)h(critical)g(v)n(ertices)e(is)i(presen)n(ted)681 -1583 y(in)c(the)g(App)r(endix.)681 1730 y Fg(Assignmen)m(t)k(of)i(V)-8 -b(alues)33 b(to)h(Non-Critical)f(V)-8 b(ertices.)76 b -Fv(As)30 b Fm(G)2918 1742 y Fu(ncrit)3088 1730 y Fv(is)g(acyclic,)e(w)n -(e)681 1830 y(can)37 b(imp)r(ose)g(the)h(order)e(in)i(whic)n(h)f -(addresses)f(are)h(asso)r(ciated)f(with)i(edges)f(in)g -Fm(G)3398 1842 y Fu(ncrit)3540 1830 y Fv(,)681 1930 y(making)g(this)h -(step)g(simple)g(to)g(solv)n(e)f(b)n(y)h(a)f(standard)g(depth)i -(\014rst)e(searc)n(h)g(algorithm.)681 2029 y(Therefore,)29 -b(in)h(the)g(assignmen)n(t)g(of)g(v)-5 b(alues)29 b(to)h(v)n(ertices)f -(in)i Fm(G)2676 2041 y Fu(ncrit)2847 2029 y Fv(w)n(e)f(b)r(ene\014t)h -(from)e(the)681 2129 y(un)n(used)23 b(addresses)f(in)i(the)g(gaps)e -(left)i(b)n(y)g(the)f(assignmen)n(t)g(of)g(v)-5 b(alues)23 -b(to)h(v)n(ertices)e(in)i Fm(G)3435 2141 y Fu(crit)3540 -2129 y Fv(.)681 2229 y(F)-7 b(or)25 b(that,)h(w)n(e)f(start)g(the)h -(depth-\014rst)f(searc)n(h)f(from)h(the)h(v)n(ertices)f(in)g -Fm(V)2917 2241 y Fu(scrit)3074 2229 y Fv(b)r(ecause)g(the)h -Fm(g)681 2328 y Fv(v)-5 b(alues)27 b(for)g(these)h(critical)f(v)n -(ertices)f(w)n(ere)h(already)f(assigned)g(and)i(cannot)f(b)r(e)h(c)n -(hanged.)805 2428 y(Considering)22 b(the)h(subgraph)f -Fm(G)1817 2440 y Fu(ncrit)1981 2428 y Fv(in)h(Figure)h(3\(c\),)f(a)f -(step)h(b)n(y)f(step)h(example)g(of)f(the)681 2527 y(assignmen)n(t)33 -b(of)g(v)-5 b(alues)34 b(to)g(v)n(ertices)f(in)h Fm(G)2052 -2539 y Fu(ncrit)2227 2527 y Fv(is)g(presen)n(ted)f(in)h(Figure)24 -b(5.)34 b(Figure)24 b(5\(a\))681 2627 y(presen)n(ts)29 -b(the)h(initial)g(state)g(of)g(the)h(algorithm.)d(The)i(critical)g(v)n -(ertex)f(8)g(is)h(the)h(only)e(one)681 2727 y(that)e(has)g -(non-critical)e(v)n(ertices)h(as)h(adjacen)n(t.)f(In)h(the)h(example)e -(presen)n(ted)h(in)g(Figure)d(4,)681 2826 y(the)h(addresses)e -Fk(f)p Fv(0)p Fm(;)14 b Fv(4)p Fk(g)23 b Fv(w)n(ere)h(not)g(used.)h -(So,)g(taking)f(the)h(\014rst)f(un)n(used)h(address)e(0)i(and)f(the)681 -2926 y(v)n(ertex)e(1,)h(whic)n(h)h(is)f(reac)n(hed)f(from)h(the)h(v)n -(ertex)e(8,)h Fm(g)s Fv(\(1\))g(is)h(set)f(to)g(0)10 -b Fk(\000)g Fm(g)s Fv(\(8\))22 b(=)h(0,)g(as)g(sho)n(wn)681 -3026 y(in)37 b(Figure)24 b(5\(b\).)38 b(The)f(only)g(v)n(ertex)f(that)i -(is)f(reac)n(hed)f(from)g(v)n(ertex)h(1)f(is)h(v)n(ertex)g(2,)f(so)681 -3125 y(taking)23 b(the)h(un)n(used)g(address)f(4)g(w)n(e)h(set)g -Fm(g)s Fv(\(2\))g(to)f(4)11 b Fk(\000)g Fm(g)s Fv(\(1\))23 -b(=)f(4,)i(as)f(sho)n(wn)g(in)h(Figure)h(5\(c\).)681 -3225 y(This)i(pro)r(cess)g(is)g(rep)r(eated)g(un)n(til)i(the)e -(UnAssignedAddresses)g(list)h(b)r(ecomes)f(empt)n(y)-7 -b(.)765 3864 y - currentpoint currentpoint translate 0.85 0.85 scale neg exch neg exch -translate - 765 3864 a @beginspecial 0 @llx 0 @lly -383 @urx 86 @ury 3830 @rwi @setspecial -%%BeginDocument: figs/grafsearchingncv.ps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: grafsearchingncv.fig -%%Creator: fig2dev Version 3.2 Patchlevel 4 -%%CreationDate: Wed Jan 12 17:46:18 2005 -%%For: fbotelho@tigre (Fabiano Cupertino Botelho) -%%BoundingBox: 0 0 383 86 -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def -/col32 {0.824 0.824 0.824 srgb} bind def - -end -save -newpath 0 86 moveto 0 0 lineto 383 0 lineto 383 86 lineto closepath clip newpath --19.8 144.8 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def - -$F2psBegin -10 setmiterlimit -0 slj 0 slc - 0.06299 0.06299 sc -% -% Fig objects follow -% -% -% here starts figure with depth 50 -% Polyline -7.500 slw -n 1035 1890 m 1215 1890 l 1215 2070 l 1035 2070 l - cp gs col0 s gr -/Times-Roman ff 120.00 scf sf -1095 2017 m -gs 1 -1 sc (0) col0 sh gr -% Polyline -n 1215 1890 m 1395 1890 l 1395 2070 l 1215 2070 l - cp gs col0 s gr -/Times-Roman ff 120.00 scf sf -1275 2017 m -gs 1 -1 sc (4) col0 sh gr -% Polyline -n 3015 1890 m 3195 1890 l 3195 2070 l 3015 2070 l - cp gs col0 s gr -/Times-Roman ff 120.00 scf sf -3075 2017 m -gs 1 -1 sc (4) col0 sh gr -% Arc -n 1102.5 1462.5 697.9 -20.8 20.8 arc -gs col0 s gr - -% Arc -n 2992.5 1462.5 697.9 -20.8 20.8 arc -gs col0 s gr - -% Arc -n 5107.5 1462.5 697.9 -20.8 20.8 arc -gs col0 s gr - -% Polyline -n 1215 1440 m - 1755 1215 l gs col0 s gr -% Polyline -n 1216 1443 m - 1756 1218 l gs col0 s gr -% Polyline -n 3105 1440 m - 3645 1215 l gs col0 s gr -% Polyline -n 3106 1443 m - 3646 1218 l gs col0 s gr -% Polyline -n 5220 1440 m - 5760 1215 l gs col0 s gr -% Polyline -n 5221 1443 m - 5761 1218 l gs col0 s gr -/Times-Roman ff 120.00 scf sf -945 1485 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -630 2250 m -gs 1 -1 sc (UnAssignedAddresses) col0 sh gr -/Times-Roman ff 120.00 scf sf -2835 1485 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -3285 1305 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 120.00 scf sf -2520 2250 m -gs 1 -1 sc (UnAssignedAddresses) col0 sh gr -/Times-Roman ff 120.00 scf sf -4950 1485 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -5400 1305 m -gs 1 -1 sc (0) col0 sh gr -/Times-Roman ff 120.00 scf sf -4635 2250 m -gs 1 -1 sc (UnAssignedAddresses) col0 sh gr -/Times-Roman ff 120.00 scf sf -4590 1890 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -5670 1890 m -gs 1 -1 sc (g:4) col0 sh gr -/Times-Roman ff 120.00 scf sf -5670 1080 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 120.00 scf sf -4590 1080 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 165.00 scf sf -4320 1125 m -gs 1 -1 sc (c\)) col0 sh gr -/Times-Roman ff 120.00 scf sf -3555 1080 m -gs 1 -1 sc (g:0) col0 sh gr -/Times-Roman ff 165.00 scf sf -2205 1125 m -gs 1 -1 sc (b\)) col0 sh gr -/Times-Roman ff 165.00 scf sf -315 1125 m -gs 1 -1 sc (a\)) col0 sh gr -/Times-Roman ff 120.00 scf sf -5850 1485 m -gs 1 -1 sc (4) col0 sh gr -% here ends figure; -% -% here starts figure with depth 45 -% Ellipse -7.500 slw -n 675 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -645 1252 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 675 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -645 1702 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 1215 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1185 1477 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 1755 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1725 1702 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 1755 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -1725 1252 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 2565 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -2535 1252 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 2565 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -2535 1702 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 3105 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3075 1477 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 3645 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3615 1702 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 3645 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -3615 1252 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 4680 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4650 1252 m -gs 1 -1 sc (6) col0 sh gr -% Ellipse -n 4680 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -4650 1702 m -gs 1 -1 sc (5) col0 sh gr -% Ellipse -n 5220 1440 90 90 0 360 DrawEllipse gs col32 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5190 1477 m -gs 1 -1 sc (8) col0 sh gr -% Ellipse -n 5760 1665 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5730 1702 m -gs 1 -1 sc (2) col0 sh gr -% Ellipse -n 5760 1215 90 90 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr - -/Times-Roman ff 120.00 scf sf -5730 1252 m -gs 1 -1 sc (1) col0 sh gr -% Ellipse -n 5217 2000 44 52 0 360 DrawEllipse gs col32 1.00 tnt ef gr gs col0 s gr - -% Polyline -n 5235 1940 m - 5198 2061 l gs col32 1.00 tnt ef gr gs col0 s gr -% here ends figure; -$F2psEnd -rs -showpage - -%%EndDocument - @endspecial 765 3864 a - currentpoint currentpoint translate 1 0.85 div 1 0.85 div scale neg -exch neg exch translate - 765 3864 a 900 4005 a Fg(Fig.)15 -b(5.)27 b Fv(Example)g(of)g(the)h(assignmen)n(t)f(of)g(v)-5 -b(alues)28 b(to)f(non-critical)f(v)n(ertices)805 4118 -y(A)19 b(pseudo)f(co)r(de)h(for)f(the)h(assignmen)n(t)e(of)i(v)-5 -b(alues)18 b(to)g(non-critical)g(v)n(ertices)f(is)h(presen)n(ted)681 -4218 y(in)28 b(the)g(App)r(endix.)681 4365 y Fg(Analysis)21 -b(of)h(the)g(Searc)m(hing)h(Step.)56 b Fv(W)-7 b(e)19 -b(shall)g(demonstrate)f(that)i(\(i\))f(the)h(maxim)n(um)681 -4465 y(v)-5 b(alue)23 b(assigned)e(to)i(an)f(edge)h(is)f(at)h(most)g -Fm(n)9 b Fk(\000)g Fv(1)22 b(\(that)h(is,)g(w)n(e)f(generate)g(a)g -(minimal)h(p)r(erfect)681 4565 y(hash)38 b(function\),)i(and)f(\(ii\))h -(the)f(p)r(erfect)h(assignmen)n(t)e(problem)g(\(determination)h(of)25 -b Fm(g)s Fv(\))681 4664 y(can)k(b)r(e)h(solv)n(ed)f(in)h(exp)r(ected)g -(time)g Fm(O)r Fv(\()p Fm(n)p Fv(\))h(if)g(the)f(n)n(um)n(b)r(er)f(of)h -(edges)f(in)h Fm(G)3063 4676 y Fu(crit)3198 4664 y Fv(is)f(at)h(most) -691 4731 y Fu(1)p 691 4745 34 4 v 691 4792 a(2)734 4764 -y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)p Fv(.)805 -4863 y(W)-7 b(e)31 b(fo)r(cus)f(on)g(the)g(analysis)f(of)h(the)g -(assignmen)n(t)g(of)g(v)-5 b(alues)29 b(to)h(critical)g(v)n(ertices)f -(b)r(e-)681 4963 y(cause)34 b(the)i(assignmen)n(t)e(of)i(v)-5 -b(alues)35 b(to)g(non-critical)f(v)n(ertices)g(can)h(b)r(e)h(solv)n(ed) -e(in)h(linear)681 5063 y(time)28 b(b)n(y)f(a)g(depth)i(\014rst)e(searc) -n(h)f(algorithm.)p eop end -%%Page: 9 9 -TeXDict begin 9 8 bop 490 387 a Fv(W)-7 b(e)24 b(no)n(w)e(de\014ne)i -(certain)f(complexit)n(y)f(measures.)g(Let)i Fm(I)7 b -Fv(\()p Fm(v)s Fv(\))24 b(b)r(e)g(the)g(n)n(um)n(b)r(er)f(of)g(times) -365 487 y(a)h(candidate)g(v)-5 b(alue)24 b Fm(x)g Fv(for)g -Fm(g)s Fv(\()p Fm(v)s Fv(\))g(is)g(incremen)n(ted.)g(Let)g -Fm(N)2166 499 y Fj(t)2219 487 y Fv(b)r(e)h(the)f(total)g(n)n(um)n(b)r -(er)g(of)g(times)365 587 y(that)g(candidate)g(v)-5 b(alues)23 -b Fm(x)i Fv(are)d(incremen)n(ted.)i(Th)n(us,)g(w)n(e)f(ha)n(v)n(e)h -Fm(N)2457 599 y Fj(t)2509 587 y Fv(=)2596 524 y Fi(P)2698 -587 y Fm(I)7 b Fv(\()p Fm(v)s Fv(\),)25 b(where)e(the)365 -686 y(sum)28 b(is)g(o)n(v)n(er)d(all)g Fm(v)h Fk(2)e -Fm(V)18 b Fv(\()p Fm(G)1223 698 y Fu(crit)1328 686 y -Fv(\).)490 786 y(Com)n(bining)23 b(the)h(fact)g(that)g -Fm(G)1448 798 y Fu(crit)1552 786 y Fv(,)g(the)g(2-core)e(of)i -Fm(G)p Fv(,)g(is)f(almost)g(surely)g(connected)h(for)365 -886 y Fm(c)i Fv(=)g(1)p Fm(:)p Fv(15)i(\(see)h([1,)g(12)o(,)g(15)o(]\)) -h(and)f(the)h(fact)g(that)f(ev)n(ery)f(edge)h(is)g(either)g(a)g(tree)g -(edge)g(or)g(a)365 985 y(bac)n(k)e(edge)g(\(see,)h(e.g.,)f([3]\),)h(w)n -(e)f(see)g(that)h(the)g(follo)n(wing)e(holds.)365 1167 -y Fg(Theorem)16 b(1.)41 b Fl(The)28 b(numb)l(er)e(of)j(b)l(ack)f(e)l -(dges)f Fm(N)1887 1179 y Fu(b)r(edges)2112 1167 y Fl(of)h -Fm(G)c Fv(=)e Fm(G)2448 1179 y Fu(crit)2566 1167 y Fk([)13 -b Fm(G)2699 1179 y Fu(ncrit)2868 1167 y Fl(is)28 b(given)g(by)365 -1266 y Fm(N)432 1278 y Fu(b)r(edges)653 1266 y Fv(=)22 -b Fk(j)p Fm(E)5 b Fv(\()p Fm(G)926 1278 y Fu(crit)1031 -1266 y Fv(\))p Fk(j)19 b(\000)f(j)p Fm(V)h Fv(\()p Fm(G)1375 -1278 y Fu(crit)1480 1266 y Fv(\))p Fk(j)g Fv(+)f(1)p -Fl(.)1488 b Fk(u)-55 b(t)490 1448 y Fv(Our)32 b(next)g(result)g -(concerns)g(the)h(maximal)e(v)-5 b(alue)33 b Fm(A)2209 -1460 y Fu(max)2368 1448 y Fv(assigned)f(to)g(an)g(edge)g -Fm(e)f Fk(2)365 1548 y Fm(E)5 b Fv(\()p Fm(G)528 1560 -y Fu(crit)633 1548 y Fv(\))28 b(after)g(the)f(assignmen)n(t)g(of)h -Fm(g)i Fv(v)-5 b(alues)27 b(to)h(critical)f(v)n(ertices.)365 -1729 y Fg(Theorem)16 b(2.)41 b Fl(We)29 b(have)i Fm(A)1274 -1741 y Fu(max)1424 1729 y Fk(\024)23 b Fv(2)p Fk(j)p -Fm(V)18 b Fv(\()p Fm(G)1740 1741 y Fu(crit)1845 1729 -y Fv(\))p Fk(j)h(\000)f Fv(3)g(+)g(2)p Fm(N)2254 1741 -y Fj(t)2283 1729 y Fl(.)365 1911 y(Pr)l(o)l(of.)43 b -Fv(\(Sk)n(etc)n(h\))24 b(The)f(assignmen)n(t)g(of)g Fm(g)j -Fv(v)-5 b(alues)23 b(to)g(critical)g(v)n(ertices)f(starts)g(from)h(0,)g -(and)365 2011 y(eac)n(h)c(edge)25 b Fm(e)19 b Fv(receiv)n(es)f(the)j -(lab)r(el)e Fm(h)p Fv(\()p Fm(e)p Fv(\))h(as)f(giv)n(en)g(b)n(y)h(Eq.)k -(\(3\).)c(The)g Fm(g)i Fv(v)-5 b(alue)20 b(for)f(eac)n(h)g(v)n(ertex) -365 2110 y Fm(v)41 b Fv(in)c Fm(V)19 b Fv(\()p Fm(G)716 -2122 y Fu(crit)821 2110 y Fv(\))37 b(is)g(assigned)e(only)i(once.)f(A)i -(little)f(though)n(t)g(sho)n(ws)f(that)25 b(max)2940 -2122 y Fj(v)2994 2110 y Fm(g)s Fv(\()p Fm(v)s Fv(\))39 -b Fk(\024)365 2210 y(j)p Fm(V)19 b Fv(\()p Fm(G)552 2222 -y Fu(crit)657 2210 y Fv(\))p Fk(j)e(\000)f Fv(1)g(+)g -Fm(N)1016 2222 y Fj(t)1045 2210 y Fv(,)27 b(where)f(the)h(maxim)n(um)g -(is)f(tak)n(en)g(o)n(v)n(er)f(all)h(v)n(ertices)e Fm(v)30 -b Fv(in)25 b Fm(V)19 b Fv(\()p Fm(G)3087 2222 y Fu(crit)3192 -2210 y Fv(\).)365 2309 y(Moreo)n(v)n(er,)f(t)n(w)n(o)i(distinct)h(v)n -(ertices)e(get)h(distinct)26 b Fm(g)d Fv(v)-5 b(alues.)20 -b(Hence,)g Fm(A)2561 2321 y Fu(max)2711 2309 y Fk(\024)j -Fv(\()p Fk(j)p Fm(V)c Fv(\()p Fm(G)3018 2321 y Fu(crit)3123 -2309 y Fv(\))p Fk(j)t(\000)365 2409 y Fv(1)f(+)g Fm(N)575 -2421 y Fj(t)604 2409 y Fv(\))h(+)f(\()p Fk(j)p Fm(V)h -Fv(\()p Fm(G)957 2421 y Fu(crit)1062 2409 y Fv(\))p Fk(j)g(\000)f -Fv(2)g(+)g Fm(N)1429 2421 y Fj(t)1458 2409 y Fv(\))23 -b Fk(\024)g Fv(2)p Fk(j)p Fm(V)18 b Fv(\()p Fm(G)1829 -2421 y Fu(crit)1934 2409 y Fv(\))p Fk(j)h(\000)f Fv(3)g(+)g(2)p -Fm(N)2343 2421 y Fj(t)2371 2409 y Fv(,)28 b(as)f(required.)346 -b Fk(u)-55 b(t)365 2573 y Fg(Maximal)46 b(V)-8 b(alue)46 -b(Assigned)f(to)h(An)g(Edge.)103 b Fv(In)40 b(this)g(section)g(w)n(e)f -(presen)n(t)h(the)365 2673 y(follo)n(wing)27 b(conjecture.)365 -2805 y Fg(Conjecture)17 b(1.)40 b Fl(F)-6 b(or)41 b(a)h(r)l(andom)f(gr) -l(aph)h Fm(G)f Fl(with)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2239 -2817 y Fu(crit)2344 2805 y Fv(\))p Fk(j)44 b(\024)e Fm(n=)p -Fv(2)e Fl(and)i Fk(j)p Fm(V)18 b Fv(\()p Fm(G)p Fv(\))p -Fk(j)45 b Fv(=)365 2904 y(1)p Fm(:)p Fv(15)p Fm(n)p Fl(,)30 -b(it)i(is)f(always)i(p)l(ossible)g(to)e(gener)l(ate)g(a)h(minimal)g(p)l -(erfe)l(ct)g(hash)g(function)f(b)l(e)l(c)l(ause)365 3004 -y(the)f(maximal)h(value)f Fm(A)1115 3016 y Fu(max)1272 -3004 y Fl(assigne)l(d)g(to)g(an)g(e)l(dge)g Fm(e)23 b -Fk(2)h Fm(E)5 b Fv(\()p Fm(G)2303 3016 y Fu(crit)2408 -3004 y Fv(\))30 b Fl(is)g(at)f(most)h Fm(n)18 b Fk(\000)g -Fv(1)p Fl(.)490 3169 y Fv(Let)32 b(us)h(assume)f(for)f(the)i(momen)n(t) -g(that)f Fm(N)1903 3181 y Fj(t)1963 3169 y Fk(\024)f -Fm(N)2126 3181 y Fu(b)r(edges)2324 3169 y Fv(.)h(Then,)h(from)f -(Theorems)24 b(1)365 3269 y(and)h(2,)34 b(w)n(e)g(ha)n(v)n(e)f -Fm(A)1012 3281 y Fu(max)1173 3269 y Fk(\024)g Fv(2)p -Fk(j)p Fm(V)19 b Fv(\()p Fm(G)1500 3281 y Fu(crit)1605 -3269 y Fv(\))p Fk(j)k(\000)f Fv(3)g(+)h(2)p Fm(N)2031 -3281 y Fj(t)2093 3269 y Fk(\024)34 b Fv(2)p Fk(j)p Fm(V)18 -b Fv(\()p Fm(G)2420 3281 y Fu(crit)2525 3269 y Fv(\))p -Fk(j)23 b(\000)g Fv(3)f(+)h(2)p Fm(N)2952 3281 y Fu(b)r(edges)3183 -3269 y Fk(\024)365 3369 y Fv(2)p Fk(j)p Fm(V)c Fv(\()p -Fm(G)594 3381 y Fu(crit)699 3369 y Fv(\))p Fk(j)9 b(\000)g -Fv(3)g(+)g(2\()p Fk(j)p Fm(E)c Fv(\()p Fm(G)1222 3381 -y Fu(crit)1326 3369 y Fv(\))p Fk(j)k(\000)g(j)p Fm(V)19 -b Fv(\()p Fm(G)1651 3381 y Fu(crit)1756 3369 y Fv(\))p -Fk(j)9 b Fv(+)g(1\))23 b Fk(\024)g Fv(2)p Fk(j)p Fm(E)5 -b Fv(\()p Fm(G)2307 3381 y Fu(crit)2411 3369 y Fv(\))p -Fk(j)k(\000)g Fv(1.)23 b(As)g(b)n(y)g(h)n(yp)r(othesis)365 -3468 y Fk(j)p Fm(E)5 b Fv(\()p Fm(G)551 3480 y Fu(crit)656 -3468 y Fv(\))p Fk(j)24 b(\024)e Fm(n=)p Fv(2,)27 b(w)n(e)g(ha)n(v)n(e)g -Fm(A)1382 3480 y Fu(max)1532 3468 y Fk(\024)22 b Fm(n)d -Fk(\000)f Fv(1,)27 b(as)g(required.)490 3568 y Fl(In)33 -b(the)h(mathematic)l(al)h(analysis)g(of)f(our)g(algorithm,)h(what)g(is) -f(left)g(op)l(en)g(is)g(a)g(single)365 3667 y(pr)l(oblem:)e(pr)l(ove)e -(that)g Fm(N)1160 3679 y Fj(t)1212 3667 y Fk(\024)23 -b Fm(N)1367 3679 y Fu(b)r(edges)1564 3667 y Fl(.)1589 -3637 y Fu(4)490 3767 y Fv(W)-7 b(e)26 b(no)n(w)e(sho)n(w)h(exp)r -(erimen)n(tal)g(evidence)g(that)g Fm(N)2075 3779 y Fj(t)2127 -3767 y Fk(\024)e Fm(N)2282 3779 y Fu(b)r(edges)2480 3767 -y Fv(.)i(Considering)f(Eqs)g(\(1\))365 3867 y(and)h(\(2\),)g(the)g(exp) -r(ected)g(v)-5 b(alues)24 b(for)g Fk(j)p Fm(V)19 b Fv(\()p -Fm(G)1716 3879 y Fu(crit)1821 3867 y Fv(\))p Fk(j)24 -b Fv(and)h Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2245 3879 y Fu(crit)2350 -3867 y Fv(\))p Fk(j)25 b Fv(for)f Fm(c)f Fv(=)g(1)p Fm(:)p -Fv(15)g(are)g(0)p Fm(:)p Fv(401)p Fm(n)365 3966 y Fv(and)37 -b(0)p Fm(:)p Fv(501)p Fm(n)p Fv(,)e(resp)r(ectiv)n(ely)-7 -b(.)36 b(F)-7 b(rom)37 b(Theorem)24 b(1,)36 b Fm(N)2057 -3978 y Fu(b)r(edges)2293 3966 y Fv(=)j(0)p Fm(:)p Fv(501)p -Fm(n)22 b Fk(\000)j Fv(0)p Fm(:)p Fv(401)p Fm(n)d Fv(+)i(1)39 -b(=)365 4066 y(0)p Fm(:)p Fv(1)p Fm(n)19 b Fv(+)h(1.)30 -b(T)-7 b(able)24 b(3)30 b(presen)n(ts)f(the)h(maximal)g(v)-5 -b(alue)30 b(of)g Fm(N)2210 4078 y Fj(t)2269 4066 y Fv(obtained)f -(during)h(10,000)e(ex-)365 4166 y(ecutions)h(of)g(the)h(algorithm)e -(for)h(di\013eren)n(t)g(sizes)g(of)g Fm(S)5 b Fv(.)29 -b(The)g(maximal)g(v)-5 b(alue)29 b(of)g Fm(N)3057 4178 -y Fj(t)3115 4166 y Fv(w)n(as)365 4265 y(alw)n(a)n(ys)d(smaller)h(than)g -Fm(N)1178 4277 y Fu(b)r(edges)1399 4265 y Fv(=)22 b(0)p -Fm(:)p Fv(1)p Fm(n)c Fv(+)g(1)27 b(and)g(tends)h(to)g(0)p -Fm(:)p Fv(059)p Fm(n)d Fv(for)i Fm(n)c Fk(\025)g Fv(1)p -Fm(;)p Fv(000)p Fm(;)n Fv(000.)365 4430 y Fg(Time)e(Complexit)m(y)-8 -b(.)54 b Fv(W)-7 b(e)20 b(no)n(w)e(sho)n(w)g(that)h(the)g(time)g -(complexit)n(y)f(of)h(determining)25 b Fm(g)s Fv(\()p -Fm(v)s Fv(\))365 4530 y(for)d(all)g(critical)f(v)n(ertices)j -Fm(x)f Fk(2)h Fm(V)19 b Fv(\()p Fm(G)1479 4542 y Fu(crit)1584 -4530 y Fv(\))j(is)g Fm(O)r Fv(\()p Fk(j)p Fm(V)e Fv(\()p -Fm(G)2001 4542 y Fu(crit)2106 4530 y Fv(\))p Fk(j)p Fv(\))k(=)e -Fm(O)r Fv(\()p Fm(n)p Fv(\).)h(F)-7 b(or)22 b(eac)n(h)f(unassigned)365 -4630 y(v)n(ertex)d Fm(v)s Fv(,)h(the)h(adjacency)e(list)h(of)g -Fm(v)s Fv(,)g(whic)n(h)g(w)n(e)g(call)f(Adj\()p Fm(v)s -Fv(\),)j(m)n(ust)e(b)r(e)g(tra)n(v)n(ersed)e(to)i(collect)365 -4729 y(the)25 b(set)f Fm(Y)43 b Fv(of)24 b(adjacen)n(t)g(v)n(ertices)f -(that)i(ha)n(v)n(e)e(already)g(b)r(een)h(assigned)f(a)h(v)-5 -b(alue.)24 b(Then,)h(for)365 4829 y(eac)n(h)g(v)n(ertex)g(in)h -Fm(Y)18 b Fv(,)26 b(w)n(e)g(c)n(hec)n(k)e(if)j(the)f(curren)n(t)e -(candidate)i(v)-5 b(alue)25 b Fm(x)i Fv(is)e(forbidden)h(b)r(ecause)365 -4929 y(setting)32 b Fm(g)s Fv(\()p Fm(v)s Fv(\))d(=)g -Fm(x)i Fv(w)n(ould)g(create)f(t)n(w)n(o)h(edges)f(with)i(the)g(same)e -(endp)r(oin)n(t)i(sum.)f(Finally)-7 b(,)p 365 5002 473 -4 v 382 5056 a Ft(4)442 5088 y Fs(Bollob\023)-38 b(as)24 -b(and)e(Pikh)n(urk)n(o)i([2])e(ha)n(v)n(e)g(in)n(v)n(estigated)g(a)g(v) -n(ery)f(close)i(v)n(ertex)e(lab)r(elling)i(problem)f(for)442 -5179 y(random)k(graphs.)g(Ho)n(w)n(ev)n(er,)g(their)g(in)n(terest)f(w)n -(as)i(on)f(denser)f(random)h(graphs,)g(and)g(it)f(seems)442 -5270 y(that)30 b(di\013eren)n(t)f(metho)r(ds)h(will)h(ha)n(v)n(e)f(to)g -(b)r(e)f(used)h(to)g(attac)n(k)g(the)f(sparser)i(case)g(that)e(w)n(e)i -(are)442 5362 y(in)n(terested)26 b(in)f(here.)p eop end -%%Page: 10 10 -TeXDict begin 10 9 bop 1595 391 1054 4 v 1593 482 4 92 -v 1739 455 a Fo(n)p 1928 482 V 157 w Fs(Maximal)26 b(v)l(alue)g(of)g -Fo(N)2608 463 y Fc(t)p 2647 482 V 1595 485 1054 4 v 1593 -577 4 92 v 1656 549 a Fs(10)p Fo(;)q Fs(000)p 1928 577 -V 310 w(0)p Fo(:)p Fs(067)p Fo(n)p 2647 577 V 1593 668 -V 1637 641 a Fs(100)p Fo(;)q Fs(000)p 1928 668 V 291 -w(0)p Fo(:)p Fs(061)p Fo(n)p 2647 668 V 1593 759 V 1607 -732 a Fs(1)p Fo(;)q Fs(000)p Fo(;)q Fs(000)p 1927 759 -V 261 w(0)p Fo(:)p Fs(059)p Fo(n)p 2647 759 V 1593 851 -V 1607 823 a Fs(2)p Fo(;)q Fs(000)p Fo(;)q Fs(000)p 1927 -851 V 261 w(0)p Fo(:)p Fs(059)p Fo(n)p 2647 851 V 1593 -1002 4 152 v 1752 909 a Fs(.)1752 942 y(.)1752 975 y(.)p -1928 1002 V 2278 909 a(.)2278 942 y(.)2278 975 y(.)p -2647 1002 V 1595 1006 1054 4 v 1028 1149 a Fp(T)-7 b(able)28 -b(3.)d Fs(The)h(maximal)h(v)l(alue)e(of)h Fo(N)2181 1157 -y Fc(t)2235 1149 y Fs(for)h(di\013eren)n(t)e(n)n(um)n(b)r(er)g(of)h -(URLs)681 1292 y Fv(the)38 b(edge)f(linking)h Fm(v)j -Fv(and)d Fm(u)p Fv(,)f(for)g(all)h Fm(u)h Fk(2)i Fm(Y)18 -b Fv(,)38 b(is)g(asso)r(ciated)e(with)j(the)f(address)e(that)681 -1392 y(corresp)r(onds)d(to)j(the)g(sum)f(of)h(its)f(endp)r(oin)n(ts.)h -(Let)g Fm(d)2424 1404 y Fu(crit)2564 1392 y Fv(=)g(2)p -Fk(j)p Fm(E)5 b Fv(\()p Fm(G)2893 1404 y Fu(crit)2998 -1392 y Fv(\))p Fk(j)p Fm(=)p Fk(j)p Fm(V)19 b Fv(\()p -Fm(G)3282 1404 y Fu(crit)3386 1392 y Fv(\))p Fk(j)36 -b Fv(b)r(e)681 1492 y(the)27 b(a)n(v)n(erage)d(degree)i(of)h -Fm(G)1537 1504 y Fu(crit)1641 1492 y Fv(,)g(note)g(that)e -Fk(j)p Fm(Y)19 b Fk(j)k(\024)g(j)p Fv(Adj\()p Fm(v)s -Fv(\))p Fk(j)p Fv(,)28 b(and)f(supp)r(ose)f(for)h(simplicit)n(y)681 -1591 y(that)e Fk(j)p Fv(Adj)q(\()p Fm(v)s Fv(\))p Fk(j)i -Fv(=)e Fm(O)r Fv(\()p Fm(d)1402 1603 y Fu(crit)1508 1591 -y Fv(\).)k(Then,)h(putting)g(all)f(these)g(together,)g(w)n(e)g(see)g -(that)g(the)h(time)681 1691 y(complexit)n(y)d(of)g(this)h(pro)r(cedure) -f(is)1051 1849 y Fm(C)6 b Fv(\()p Fk(j)p Fm(V)19 b Fv(\()p -Fm(G)1335 1861 y Fu(crit)1440 1849 y Fv(\))p Fk(j)p Fv(\))24 -b(=)1638 1787 y Fi(P)1726 1874 y Fj(v)r Ff(2)p Fj(V)14 -b Fu(\()p Fj(G)1937 1882 y Fd(crit)2028 1874 y Fu(\))2072 -1782 y Fi(\002)2125 1849 y Fk(j)p Fv(Adj)q(\()p Fm(v)s -Fv(\))p Fk(j)19 b Fv(+)f(\()p Fm(I)7 b Fv(\()p Fm(v)s -Fv(\))20 b Fk(\002)e(j)p Fm(Y)h Fk(j)p Fv(\))g(+)f Fk(j)p -Fm(Y)g Fk(j)3158 1782 y Fi(\003)1295 1984 y Fk(\024)1383 -1922 y Fi(P)1471 2009 y Fj(v)r Ff(2)p Fj(V)c Fu(\()p -Fj(G)1682 2017 y Fd(crit)1773 2009 y Fu(\))1803 1984 -y Fv(\(2)k(+)g Fm(I)7 b Fv(\()p Fm(v)s Fv(\)\))p Fk(j)p -Fv(Adj)r(\()p Fm(v)s Fv(\))p Fk(j)24 b Fv(=)f(4)p Fk(j)p -Fm(E)5 b Fv(\()p Fm(G)2788 1996 y Fu(crit)2893 1984 y -Fv(\))p Fk(j)18 b Fv(+)g Fm(O)r Fv(\()p Fm(N)3213 1996 -y Fj(t)3243 1984 y Fm(d)3286 1996 y Fu(crit)3391 1984 -y Fv(\))p Fm(:)681 2153 y Fv(As)38 b Fm(d)857 2165 y -Fu(crit)1002 2153 y Fv(=)i(2)25 b Fk(\002)g Fv(0)p Fm(:)p -Fv(501)p Fm(n=)p Fv(0)p Fm(:)p Fv(401)p Fm(n)36 b Fk(')k -Fv(2)p Fm(:)p Fv(499)d(\(a)h(constan)n(t\))f(w)n(e)h(ha)n(v)n(e)f -Fm(O)r Fv(\()p Fk(j)p Fm(E)5 b Fv(\()p Fm(G)3264 2165 -y Fu(crit)3370 2153 y Fv(\))p Fk(j)p Fv(\))41 b(=)681 -2253 y Fm(O)r Fv(\()p Fk(j)p Fm(V)20 b Fv(\()p Fm(G)966 -2265 y Fu(crit)1071 2253 y Fv(\))p Fk(j)p Fv(\).)39 b(Supp)r(osing)g -(that)g Fm(N)1889 2265 y Fj(t)1960 2253 y Fk(\024)i Fm(N)2133 -2265 y Fu(b)r(edges)2330 2253 y Fv(,)e(w)n(e)g(ha)n(v)n(e,)f(from)g -(Theorem)24 b(1,)38 b(that)681 2352 y Fm(N)748 2364 y -Fj(t)800 2352 y Fk(\024)22 b(j)p Fm(E)5 b Fv(\()p Fm(G)1073 -2364 y Fu(crit)1178 2352 y Fv(\))p Fk(j\000j)p Fm(V)19 -b Fv(\()p Fm(G)1485 2364 y Fu(crit)1590 2352 y Fv(\))p -Fk(j)p Fv(+1)k(=)f Fm(O)r Fv(\()p Fk(j)p Fm(E)5 b Fv(\()p -Fm(G)2145 2364 y Fu(crit)2251 2352 y Fv(\))p Fk(j)p Fv(\).)19 -b(W)-7 b(e)19 b(conclude)f(that)h Fm(C)6 b Fv(\()p Fk(j)p -Fm(V)19 b Fv(\()p Fm(G)3301 2364 y Fu(crit)3406 2352 -y Fv(\))p Fk(j)p Fv(\))24 b(=)681 2452 y Fm(O)r Fv(\()p -Fk(j)p Fm(E)5 b Fv(\()p Fm(G)964 2464 y Fu(crit)1070 -2452 y Fv(\))p Fk(j)p Fv(\))23 b(=)g Fm(O)r Fv(\()p Fk(j)p -Fm(V)d Fv(\()p Fm(G)1553 2464 y Fu(crit)1658 2452 y Fv(\))p -Fk(j)p Fv(\).)h(As)g Fk(j)p Fm(V)e Fv(\()p Fm(G)2092 -2464 y Fu(crit)2197 2452 y Fv(\))p Fk(j)24 b(\024)e(j)p -Fm(V)d Fv(\()p Fm(G)p Fv(\))p Fk(j)j Fv(and)f Fk(j)p -Fm(V)e Fv(\()p Fm(G)p Fv(\))p Fk(j)24 b Fv(=)e Fm(cn)p -Fv(,)f(the)g(time)681 2551 y(required)26 b(to)i(determine)d -Fm(g)30 b Fv(on)d(the)h(critical)f(v)n(ertices)g(is)g -Fm(O)r Fv(\()p Fm(n)p Fv(\).)681 2725 y Fn(4)112 b(Exp)s(erimen)m(tal) -38 b(Results)681 2871 y Fv(W)-7 b(e)40 b(no)n(w)g(presen)n(t)g(some)f -(exp)r(erimen)n(tal)h(results.)g(The)g(same)g(exp)r(erimen)n(ts)g(w)n -(ere)f(run)681 2971 y(with)c(our)f(algorithm)f(and)h(the)h(algorithm)f -(due)g(to)h(Czec)n(h,)f(Ha)n(v)-5 b(as)34 b(and)g(Ma)5 -b(jewski)24 b([4],)681 3070 y(referred)36 b(to)i(as)f(CHM)h(algorithm.) -e(The)i(t)n(w)n(o)e(algorithms)h(w)n(ere)f(implemen)n(ted)j(in)e(the) -681 3170 y(C)32 b(language)e(and)i(are)f(a)n(v)-5 b(ailable)30 -b(at)i Fb(https://sourcefor)o(ge)o(.ne)o(t/)o(pro)o(je)o(cts)o(/c)o(mp) -o(h/)p Fv(.)681 3269 y(Our)18 b(data)g(consists)f(of)i(a)f(collection)g -(of)g(100)g(million)g(univ)n(erse)g(resource)e(lo)r(cations)i(\(URLs\)) -681 3369 y(collected)h(from)h(the)g(W)-7 b(eb.)21 b(The)f(a)n(v)n -(erage)d(length)j(of)g(a)f(URL)h(in)h(the)f(collection)f(is)h(63)f(b)n -(ytes.)681 3469 y(All)i(exp)r(erimen)n(ts)g(w)n(ere)f(carried)g(on)h(a) -f(computer)h(running)g(the)g(Lin)n(ux)g(op)r(erating)f(system,)681 -3568 y(v)n(ersion)26 b(2.6.7,)g(with)i(a)g(2.4)e(gigahertz)g(pro)r -(cessor)g(and)h(4)g(gigab)n(ytes)f(of)i(main)f(memory)-7 -b(.)805 3668 y(T)g(able)25 b(4)f(presen)n(ts)g(the)i(main)f(c)n -(haracteristics)d(of)j(the)g(t)n(w)n(o)f(algorithms.)g(The)h(n)n(um)n -(b)r(er)681 3768 y(of)33 b(edges)g(in)h(the)g(graph)e -Fm(G)h Fv(=)g(\()p Fm(V)5 b(;)14 b(E)5 b Fv(\))34 b(is)25 -b Fk(j)p Fm(S)5 b Fk(j)32 b Fv(=)h Fm(n)p Fv(,)g(the)h(n)n(um)n(b)r(er) -f(of)h(k)n(eys)e(in)i(the)g(input)681 3867 y(set)25 b -Fm(S)5 b Fv(.)24 b(The)g(n)n(um)n(b)r(er)g(of)h(v)n(ertices)e(of)h -Fm(G)h Fv(is)f(equal)g(to)g(1)p Fm(:)p Fv(15)p Fm(n)f -Fv(and)i(2)p Fm(:)p Fv(09)p Fm(n)d Fv(for)i(our)g(algorithm)681 -3967 y(and)j(the)g(CHM)h(algorithm,)e(resp)r(ectiv)n(ely)-7 -b(.)26 b(This)h(measure)f(is)h(related)g(to)g(the)g(amoun)n(t)g(of)681 -4066 y(space)20 b(to)h(store)f(the)i(arra)n(y)d Fm(g)s -Fv(.)i(This)g(impro)n(v)n(es)e(the)j(space)e(required)h(to)g(store)f(a) -h(function)g(in)681 4166 y(our)i(algorithm)h(to)g(55\045)g(of)g(the)h -(space)e(required)h(b)n(y)g(the)h(CHM)f(algorithm.)g(The)g(n)n(um)n(b)r -(er)681 4266 y(of)33 b(critical)f(edges)h(is)1389 4233 -y Fu(1)p 1389 4247 34 4 v 1389 4294 a(2)1433 4266 y Fk(j)p -Fm(E)5 b Fv(\()p Fm(G)p Fv(\))p Fk(j)34 b Fv(and)f(0,)f(for)h(our)f -(algorithm)g(and)h(the)g(CHM)h(algorithm,)681 4365 y(resp)r(ectiv)n -(ely)-7 b(.)31 b(Our)g(algorithm)g(generates)f(random)h(graphs)f(that)j -(necessarily)d(con)n(tains)681 4465 y(cycles)36 b(and)g(the)h(CHM)g -(algorithm)f(generates)f(acyclic)h(random)f(graphs.)h(Finally)-7 -b(,)36 b(the)681 4565 y(CHM)c(algorithm)e(generates)g(order)g -(preserving)g(functions)h(while)h(our)f(algorithm)f(do)r(es)681 -4664 y(not)d(preserv)n(e)f(order.)805 4764 y(T)-7 b(able)25 -b(5)39 b(presen)n(ts)g(time)i(measuremen)n(ts.)d(All)j(times)f(are)f -(in)h(seconds.)f(The)h(table)681 4863 y(en)n(tries)31 -b(represen)n(t)g(a)n(v)n(erages)d(o)n(v)n(er)j(50)g(trials.)g(The)h -(column)g(lab)r(elled)g(as)f Fm(N)3140 4875 y Fj(i)3199 -4863 y Fv(represen)n(ts)p eop end -%%Page: 11 11 -TeXDict begin 11 10 bop 1215 391 1182 4 v 1213 508 4 -118 v 1260 508 a Fs(Characteristics)p 1804 508 V 1914 -455 a(Algorithms)p 2395 508 V 1805 512 592 4 v 1213 600 -4 92 v 1804 600 V 1911 572 a(Our)p 2148 600 V 138 w(CHM)p -2395 600 V 1215 603 1182 4 v 1213 694 4 92 v 1494 667 -a Fo(c)p 1804 694 V 382 w Fs(1.15)p 2148 694 V 161 w(2.09)p -2395 694 V 1213 786 V 1399 758 a Fr(j)p Fo(E)t Fs(\()p -Fo(G)p Fs(\))p Fr(j)p 1804 786 V 332 w Fo(n)p 2148 786 -V 250 w(n)p 2395 786 V 1213 877 V 1306 850 a Fr(j)p Fo(V)17 -b Fs(\()p Fo(G)p Fs(\))p Fr(j)22 b Fs(=)f Fr(j)p Fo(g)s -Fr(j)p 1804 877 V 223 w Fo(cn)p 2148 877 V 217 w(cn)p -2395 877 V 1213 968 V 1350 941 a Fr(j)p Fo(E)t Fs(\()p -Fo(G)1522 949 y Ft(crit)1619 941 y Fs(\))p Fr(j)p 1804 -968 V 147 w Fs(0)p Fo(:)p Fs(5)p Fr(j)p Fo(E)t Fs(\()p -Fo(G)p Fs(\))p Fr(j)p 2147 968 V 117 w Fs(0)p 2395 968 -V 1213 1060 V 1480 1032 a Fo(G)p 1804 1060 V 345 w Fs(cyclic)p -2148 1060 V 91 w(acyclic)p 2394 1060 V 1213 1151 V 1227 -1124 a(Order)k(preserving)p 1803 1151 V 144 w(no)p 2148 -1151 V 204 w(y)n(es)p 2395 1151 V 1215 1154 1182 4 v -1001 1298 a Fp(T)-7 b(able)28 b(4.)d Fs(Main)i(c)n(haracteristics)g(of) -g(the)e(algorithms)p 471 1482 2670 4 v 469 1599 4 118 -v 654 1599 a Fo(n)p 881 1599 V 1145 1569 a Fs(Our)g(algorithm)p -1888 1599 V 529 w(CHM)i(algorithm)p 2954 1599 V 2967 -1561 a(Gain)p 3139 1599 V 883 1603 1007 4 v 1889 1603 -1067 4 v 469 1709 4 110 v 881 1709 V 919 1694 a Fo(N)980 -1702 y Fc(i)1054 1694 y Fs(Map+Ord)c(Searc)n(h)41 b(T)-6 -b(otal)p 1888 1709 V 67 w Fo(N)1986 1702 y Fc(i)2061 -1694 y Fs(Map+Ord)22 b(Searc)n(h)72 b(T)-6 b(otal)p 2954 -1709 V 2986 1655 a(\(\045\))p 3139 1709 V 471 1712 2670 -4 v 469 1803 4 92 v 521 1776 a(1,562,500)p 881 1803 V -65 w(2.28)129 b(8.54)170 b(2.37)85 b(10.91)p 1888 1803 -V 45 w(2.70)109 b(14.56)151 b(1.57)116 b(16.13)p 2954 -1803 V 117 w(48)p 3139 1803 V 469 1895 V 521 1867 a(3,125,000)p -881 1895 V 65 w(2.16)110 b(15.92)151 b(4.88)85 b(20.80)p -1888 1895 V 45 w(2.85)109 b(30.36)151 b(3.20)116 b(33.56)p -2954 1895 V 117 w(61)p 3139 1895 V 469 1986 V 521 1959 -a(6,250,000)p 881 1986 V 65 w(2.20)110 b(33.09)132 b(10.48)66 -b(43.57)p 1888 1986 V 45 w(2.90)109 b(62.26)151 b(6.76)116 -b(69.02)p 2954 1986 V 117 w(58)p 3139 1986 V 469 2077 -V 502 2050 a(12,500,000)p 881 2077 V 46 w(2.00)110 b(63.26)132 -b(23.04)66 b(86.30)p 1888 2077 V 45 w(2.60)90 b(117.99)113 -b(14.94)77 b(132.92)p 2954 2077 V 99 w(54)p 3139 2077 -V 469 2169 V 502 2141 a(25,000,000)p 881 2169 V 46 w(2.00)90 -b(130.79)114 b(51.55)47 b(182.34)p 1885 2169 V 26 w(2.80)90 -b(262.05)113 b(33.68)77 b(295.73)p 2954 2169 V 99 w(62)p -3139 2169 V 469 2260 V 502 2233 a(50,000,000)p 881 2260 -V 46 w(2.07)90 b(273.75)k(114.12)29 b(387.87)p 1885 2260 -V 26 w(2.90)90 b(577.59)113 b(73.97)77 b(651.56)p 2954 -2260 V 99 w(68)p 3139 2260 V 469 2351 V 483 2324 a(100,000,000)p -877 2351 V 27 w(2.07)90 b(567.47)k(243.13)29 b(810.60)p -1885 2351 V 26 w(2.80)60 b(1,131.06)65 b(157.23)29 b(1,288.29)p -2951 2351 V 69 w(59)p 3139 2351 V 471 2355 2670 4 v 480 -2504 a Fg(T)-8 b(able)32 b(5.)27 b Fv(Time)h(measuremen)n(ts)f(for)g -(our)f(algorithm)h(and)g(the)h(CHM)g(algorithm)365 2734 -y(the)j(n)n(um)n(b)r(er)f(of)g(iterations)f(to)h(generate)f(the)i -(random)e(graph)g Fm(G)h Fv(in)h(the)f(mapping)g(step)365 -2833 y(of)k(the)f(algorithms.)g(The)g(next)h(columns)f(represen)n(t)f -(the)i(run)f(times)h(for)f(the)h(mapping)365 2933 y(plus)27 -b(ordering)d(steps)i(together)g(and)g(the)g(searc)n(hing)f(step)h(for)g -(eac)n(h)f(algorithm.)g(The)i(last)365 3033 y(column)h(represen)n(ts)e -(the)i(p)r(ercen)n(t)f(gain)g(of)h(our)f(algorithm)f(o)n(v)n(er)g(the)i -(CHM)g(algorithm.)490 3145 y(The)e(mapping)h(step)f(of)h(the)g(new)g -(algorithm)e(is)h(faster)g(b)r(ecause)h(the)f(exp)r(ected)h(n)n(um-)365 -3244 y(b)r(er)34 b(of)f(iterations)g(in)h(the)g(mapping)f(step)h(to)g -(generate)e Fm(G)i Fv(are)f(2.13)f(and)i(2.92)e(for)h(our)365 -3344 y(algorithm)26 b(and)g(the)h(CHM)g(algorithm,)f(resp)r(ectiv)n -(ely)-7 b(.)26 b(The)h(graph)e Fm(G)i Fv(generated)f(b)n(y)g(our)365 -3444 y(algorithm)j(has)h(1)p Fm(:)p Fv(15)p Fm(n)f Fv(v)n(ertices,)g -(against)g(2)p Fm(:)p Fv(09)p Fm(n)f Fv(for)i(the)h(CHM)f(algorithm.)f -(These)h(t)n(w)n(o)365 3543 y(facts)h(mak)n(e)f(our)h(algorithm)e -(faster)i(in)g(the)h(mapping)e(step.)i(The)f(ordering)e(step)i(of)g -(our)365 3643 y(algorithm)36 b(is)h(appro)n(ximately)e(equal)h(to)h -(the)h(time)f(to)g(c)n(hec)n(k)f(if)h Fm(G)h Fv(is)e(acyclic)g(for)h -(the)365 3743 y(CHM)g(algorithm.)d(The)j(searc)n(hing)d(step)i(of)g -(the)g(CHM)g(algorithm)f(is)h(faster,)f(but)i(the)365 -3842 y(total)c(time)h(of)f(our)f(algorithm)g(is,)h(on)g(a)n(v)n(erage,) -d(appro)n(ximately)i(59\045)g(faster)h(than)g(the)365 -3942 y(CHM)28 b(algorithm.)490 4054 y(The)j(exp)r(erimen)n(tal)f -(results)g(fully)i(bac)n(ks)d(the)i(theoretical)f(results.)h(It)g(is)g -(imp)r(ortan)n(t)365 4154 y(to)e(notice)g(the)g(times)g(for)f(the)h -(searc)n(hing)e(step:)i(for)g(b)r(oth)g(algorithms)e(they)i(are)f(not)h -(the)365 4253 y(dominan)n(t)e(times,)g(and)g(the)g(exp)r(erimen)n(tal)f -(results)g(clearly)g(sho)n(w)g(a)g(linear)g(b)r(eha)n(vior)g(for)365 -4353 y(the)i(searc)n(hing)e(step.)490 4465 y(W)-7 b(e)27 -b(no)n(w)g(presen)n(t)g(a)g(heuristic)g(that)g(reduces)g(the)h(space)e -(requiremen)n(t)g(to)i(an)n(y)e(giv)n(en)365 4565 y(v)-5 -b(alue)22 b(b)r(et)n(w)n(een)f(1)p Fm(:)p Fv(15)p Fm(n)g -Fv(w)n(ords)f(and)h(0)p Fm(:)p Fv(93)p Fm(n)f Fv(w)n(ords.)h(The)h -(heuristic)f(reuses,)g(when)h(p)r(ossible,)365 4664 y(the)41 -b(set)g(of)g Fm(x)g Fv(v)-5 b(alues)40 b(that)h(caused)f(reassignmen)n -(ts,)f(just)i(b)r(efore)g(trying)f Fm(x)27 b Fv(+)g(1)40 -b(\(see)365 4764 y(Section)25 b(3.3\).)37 b(Decreasing)e(the)j(v)-5 -b(alue)36 b(of)h Fm(c)g Fv(leads)g(to)g(an)f(increase)g(in)h(the)h(n)n -(um)n(b)r(er)e(of)365 4863 y(iterations)e(to)g(generate)f -Fm(G)p Fv(.)i(F)-7 b(or)34 b(example,)g(for)g Fm(c)g -Fv(=)g(1)g(and)g Fm(c)g Fv(=)g(0)p Fm(:)p Fv(93,)g(the)g(analytical)p -eop end -%%Page: 12 12 -TeXDict begin 12 11 bop 929 391 2386 4 v 927 508 4 118 -v 1092 508 a Fo(n)p 1300 508 V 1415 478 a Fs(Our)25 b(algorithm)i -Fo(c)22 b Fs(=)f(1)p Fo(:)p Fs(00)p 2307 508 V 227 w(Our)k(algorithm)i -Fo(c)22 b Fs(=)f(0)p Fo(:)p Fs(93)p 3313 508 V 1302 512 -1007 4 v 2308 512 V 927 610 4 103 v 1300 610 V 1338 596 -a Fo(N)1399 604 y Fc(i)1473 596 y Fs(Map+Ord)i(Searc)n(h)41 -b(T)-6 b(otal)p 2307 610 V 67 w Fo(N)2405 604 y Fc(i)2480 -596 y Fs(Map+Ord)23 b(Searc)n(h)41 b(T)-6 b(otal)p 3313 -610 V 929 614 2386 4 v 927 705 4 92 v 941 678 a(12,500,000)p -1297 705 V 27 w(2.78)109 b(76.68)132 b(25.06)47 b(101.74)p -2304 705 V 26 w(3.04)109 b(76.39)132 b(25.80)48 b(102.19)p -3311 705 V 929 708 2386 4 v 681 857 a Fg(T)-8 b(able)22 -b(6.)d Fv(Time)h(measuremen)n(ts)e(for)h(our)g(tuned)h(algorithm)e -(with)i Fm(c)j Fv(=)g(1)p Fm(:)p Fv(00)18 b(and)h Fm(c)k -Fv(=)g(0)p Fm(:)p Fv(93)681 1013 y(exp)r(ected)d(n)n(um)n(b)r(er)f(of)h -(iterations)f(are)g(2)p Fm(:)p Fv(72)f(and)i(3)p Fm(:)p -Fv(17,)e(resp)r(ectiv)n(ely)h(\(for)h Fm(n)j Fv(=)f(12)p -Fm(;)o Fv(500)p Fm(;)o Fv(000,)681 1112 y(the)d(n)n(um)n(b)r(er)g(of)f -(iterations)g(are)g(2.78)g(for)g Fm(c)23 b Fv(=)f(1)d(and)f(3.04)g(for) -g Fm(c)23 b Fv(=)g(0)p Fm(:)p Fv(93\).)18 b(T)-7 b(able)24 -b(6)19 b(presen)n(ts)681 1212 y(the)24 b(total)f(times)h(to)g -(construct)f(a)h(function)g(for)f Fm(n)g Fv(=)g(12)p -Fm(;)o Fv(500)p Fm(;)n Fv(000,)g(with)h(an)g(increase)e(from)681 -1312 y(86)p Fm(:)p Fv(31)e(seconds)h(for)g Fm(c)i Fv(=)g(1)p -Fm(:)p Fv(15)d(\(see)i(T)-7 b(able)24 b(5\))e(to)g(101)p -Fm(:)p Fv(74)d(seconds)i(for)h Fm(c)h Fv(=)f(1)g(and)f(to)h(102)p -Fm(:)p Fv(19)681 1411 y(seconds)27 b(for)g Fm(c)c Fv(=)f(0)p -Fm(:)p Fv(93.)805 1511 y(Finally)-7 b(,)29 b(w)n(e)f(run)g(1,000,000)d -(ev)-5 b(aluations)28 b(of)g(the)h(function)g(generated)e(b)n(y)h(our)f -(algo-)681 1610 y(rithm)32 b(for)f(the)h(set)g(of)f(100)f(million)i -(URLs)g(and)f(it)i(to)r(ok)e(3.06)f(seconds.)h(An)h(equiv)-5 -b(alen)n(t)681 1710 y(time)28 b(w)n(as)e(obtained)i(for)f(the)h(CHM)g -(algorithm.)681 1888 y Fn(5)112 b(Conclusion)681 2037 -y Fv(W)-7 b(e)30 b(ha)n(v)n(e)e(presen)n(ted)h(a)g(practical)f(metho)r -(d)i(to)f(construct)g(minimal)h(p)r(erfect)f(hash)g(func-)681 -2137 y(tions)d(for)h(static)f(sets)h(whic)n(h)f(is)h(e\016cien)n(t)g -(and)g(ma)n(y)f(b)r(e)h(tuned)g(to)g(yield)g(a)f(function)h(with)681 -2237 y(a)g(v)n(ery)f(economical)h(description.)681 2456 -y Fn(References)719 2638 y Fs(1.)42 b(B.)26 b(Bollob\023)-38 -b(as.)37 b Fa(R)l(andom)27 b(gr)l(aphs)p Fs(,)h(v)n(olume)d(73)h(of)h -Fa(Cambridge)h(Studies)g(in)f(A)l(dvanc)l(e)l(d)j(Math-)820 -2730 y(ematics)p Fs(.)36 b(Cam)n(bridge)26 b(Univ)n(ersit)n(y)f(Press,) -i(Cam)n(bridge,)g(second)f(edition,)g(2001.)719 2821 -y(2.)42 b(B.)26 b(Bollob\023)-38 b(as)39 b(and)e(O.)25 -b(Pikh)n(urk)n(o.)67 b(In)n(teger)37 b(sets)g(with)h(prescrib)r(ed)f -(pairwise)h(di\013erences)820 2912 y(b)r(eing)26 b(distinct.)35 -b Fa(Eur)l(op)l(e)l(an)29 b(Journal)f(of)g(Combinatorics)p -Fs(.)35 b(T)-6 b(o)26 b(App)r(ear.)719 3004 y(3.)42 b(T.)26 -b(H.)i(Cormen,)h(C.)d(E.)j(Leiserson,)h(R.)24 b(L.)29 -b(Riv)n(est,)f(and)g(C.)d(Stein.)42 b Fa(Intr)l(o)l(duction)32 -b(to)e(A)n(lgo-)820 3095 y(rithms)p Fs(.)35 b(MIT)27 -b(Press,)g(second)e(edition,)i(2001.)719 3186 y(4.)42 -b(Z.J.)33 b(Czec)n(h,)g(G.)26 b(Ha)n(v)l(as,)32 b(and)g(B.S.)g(Ma)t -(jewski.)56 b(An)31 b(optimal)i(algorithm)h(for)f(generating)820 -3278 y(minimal)j(p)r(erfect)g(hash)f(functions.)62 b -Fa(Information)36 b(Pr)l(o)l(c)l(essing)i(L)l(etters)p -Fs(,)f(43\(5\):257{264,)820 3369 y(1992.)719 3460 y(5.)42 -b(Z.J.)35 b(Czec)n(h,)g(G.)26 b(Ha)n(v)l(as,)34 b(and)g(B.S.)g(Ma)t -(jewski.)62 b(F)-6 b(undamen)n(tal)33 b(study)g(p)r(erfect)i(hashing.) -820 3552 y Fa(The)l(or)l(etic)l(al)29 b(Computer)g(Scienc)l(e)p -Fs(,)e(182:1{143,)j(1997.)719 3643 y(6.)42 b(M.)26 b(Dietzfelbinger)j -(and)e(T.)f(Hagerup.)41 b(Simple)27 b(minimal)i(p)r(erfect)f(hashing)g -(in)g(less)h(space.)820 3734 y(In)k Fa(The)h(9th)h(Eur)l(op)l(e)l(an)h -(Symp)l(osium)f(on)f(A)n(lgorithms)h(\(ESA\),)f(volume)h(2161)g(of)e(L) -l(e)l(ctur)l(e)820 3826 y(Notes)c(in)e(Computer)i(Scienc)l(e)p -Fs(,)e(pages)f(109{120,)j(2001.)719 3917 y(7.)42 b(P)-6 -b(.)26 b(Erd})-38 b(os)32 b(and)g(A.)25 b(R)n(\023)-36 -b(en)n(yi.)53 b(On)32 b(random)g(graphs)h(I.)53 b Fa(Pub.)34 -b(Math.)f(Debr)l(e)l(c)l(en)p Fs(,)i(6:290{297,)820 4008 -y(1959.)719 4100 y(8.)42 b(P)-6 b(.)26 b(Erd})-38 b(os)28 -b(and)g(A.)d(R)n(\023)-36 b(en)n(yi.)41 b(On)27 b(the)h(ev)n(olution)g -(of)h(random)g(graphs.)42 b Fa(Magyar)31 b(T)-6 b(ud.)29 -b(A)n(kad.)820 4191 y(Mat.)f(Kutat\023)-39 b(o)29 b(Int.)e(K\177)-39 -b(ozl.)p Fs(,)26 b(5:17{61,)i(1960.)719 4282 y(9.)42 -b(E.A.)23 b(F)-6 b(o)n(x,)21 b(Q.F.)h(Chen,)g(and)f(L.S.)h(Heath.)33 -b(A)21 b(faster)i(algorithm)g(for)g(constructing)f(minimal)820 -4374 y(p)r(erfect)39 b(hash)e(functions.)71 b(In)37 b -Fa(Pr)l(o)l(c)l(e)l(e)l(dings)k(of)d(the)i(15th)f(A)n(nnual)g -(International)h(A)n(CM)820 4465 y(SIGIR)29 b(Confer)l(enc)l(e)i(on)e -(R)l(ese)l(ar)l(ch)i(and)f(Development)g(in)f(Information)g(R)l -(etrieval)p Fs(,)g(pages)820 4556 y(266{273,)g(1992.)681 -4648 y(10.)42 b(M.)26 b(L.)32 b(F)-6 b(redman,)32 b(J.)26 -b(Koml\023)-38 b(os,)33 b(and)e(E.)26 b(Szemer)n(\023)-36 -b(edi.)53 b(Storing)32 b(a)g(sparse)h(table)f(with)g(O\(1\))820 -4739 y(w)n(orst)27 b(case)g(access)g(time.)34 b Fa(J.)27 -b(A)n(CM)p Fs(,)f(31\(3\):538{544,)k(July)c(1984.)681 -4830 y(11.)42 b(G.)26 b(Ha)n(v)l(as,)31 b(B.S.)h(Ma)t(jewski,)i(N.C.)e -(W)-6 b(ormald,)32 b(and)f(Z.J.)i(Czec)n(h.)51 b(Graphs,)32 -b(h)n(yp)r(ergraphs)820 4922 y(and)k(hashing.)67 b(In)36 -b Fa(19th)i(International)h(Workshop)f(on)g(Gr)l(aph-The)l(or)l(etic)j -(Conc)l(epts)e(in)820 5013 y(Computer)d(Scienc)l(e)p -Fs(,)f(pages)f(153{165.)i(Springer)d(Lecture)g(Notes)h(in)f(Computer)g -(Science)820 5104 y(v)n(ol.)26 b(790,)i(1993.)681 5196 -y(12.)42 b(S.)25 b(Janson,)i(T.)i( )-25 b(L)q(uczak,)26 -b(and)f(A.)g(Ruci)r(\023)-41 b(nski.)35 b Fa(R)l(andom)28 -b(gr)l(aphs)p Fs(.)36 b(Wiley-In)n(ter.,)25 b(2000.)681 -5287 y(13.)42 b(P)-6 b(.)26 b(Erd})-38 b(os)21 b(and)f(A.)25 -b(R)n(\023)-36 b(en)n(yi.)32 b(On)20 b(the)h(strength)f(of)i -(connectedness)f(of)h(a)f(random)g(graph.)33 b Fa(A)l(cta)820 -5378 y(Mathematic)l(a)c(Scientia)f(Hungary)p Fs(,)g(12:261{267,)h -(1961.)681 5469 y(14.)42 b(R.)25 b(P)n(agh.)33 b(Hash)19 -b(and)g(displace:)h(E\016cien)n(t)f(ev)l(aluation)h(of)g(minimal)g(p)r -(erfect)g(hash)f(functions.)820 5561 y(In)25 b Fa(Workshop)k(on)f(A)n -(lgorithms)g(and)g(Data)h(Structur)l(es)p Fs(,)g(pages)d(49{54,)i -(1999.)p eop end -%%Page: 13 13 -TeXDict begin 13 12 bop 365 387 a Fs(15.)43 b(B.)26 b(Pittel)j(and)f -(N.)d(C.)k(W)-6 b(ormald.)44 b(Coun)n(ting)29 b(connected)f(graphs)h -(inside-out.)43 b Fa(Journal)31 b(of)505 479 y(Combinatorial)d(The)l -(ory)p Fs(.)35 b(T)-6 b(o)26 b(App)r(ear.)365 673 y Fn(6)112 -b(App)s(endix)p 361 875 5 52 v 361 828 52 5 v 413 828 -2788 5 v 3201 828 52 5 v 3249 875 5 52 v 361 953 5 75 -v 3247 953 V 410 931 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m(r)m(e)42 -b Fs(C)t(r)t(i)t(t)t(i)t(c)t(a)t(l)t(V)t(e)t(r)t(t)t(i)t(c)t(e)t(s)t(A) -t(s)t(s)5 b(i)t(g)g(n)t(m)t(e)t(n)t(t)15 b(\()5 b Fo(G)k -Fs(,)49 b Fo(G)2075 939 y Ft(crit)2181 931 y Fs(,)g Fo(g)12 -b Fs(,)49 b Fo(A)2428 939 y Fc(E)2484 931 y Fs(\))p 361 -1032 V 3247 1032 V 494 1009 a Fp(f)s(o)s(r)43 b Fo(v)24 -b Fr(2)e Fo(V)829 1017 y Ft(crit)960 1009 y Fp(d)-5 b(o)36 -b Fo(g)s Fs(\()p Fo(v)s Fs(\))h(:)o(=)j Fr(\0001)9 b -Fs(;)p 361 1110 V 3247 1110 V 492 1088 a Fo(A)550 1096 -y Fc(E)622 1088 y Fs(:=)22 b Fr(;)9 b Fs(;)p 361 1189 -V 3247 1189 V 494 1166 a Fp(f)s(o)s(r)43 b Fo(v)24 b -Fr(2)e Fo(V)829 1174 y Ft(crit)960 1166 y Fp(d)-5 b(o)45 -b(i)9 b(f)48 b Fo(g)s Fs(\()p Fo(v)s Fs(\))29 b(=)g Fr(\0001)36 -b Fp(t)m(h)m(e)m(n)42 b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s) -50 b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)2666 -1174 y Ft(crit)2772 1166 y Fs(,)g Fo(g)12 b Fs(,)49 b -Fo(A)3019 1174 y Fc(E)3079 1166 y Fs(\))9 b(;)p 361 1263 -V 3247 1263 V 361 1342 V 3247 1342 V 410 1319 a Fp(p)m(r)m(o)m(c)m(e)m -(d)m(u)m(r)m(e)43 b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(B)g(f)g(s)50 -b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1640 -1327 y Ft(crit)1747 1319 y Fs(,)g Fo(g)12 b Fs(,)48 b -Fo(A)1993 1327 y Fc(E)2049 1319 y Fs(\))p 361 1420 V -3247 1420 V 492 1398 a Fo(x)38 b Fs(:)o(=)46 b(0)6 b(;)87 -b Fo(g)s Fs(\()p Fo(v)s Fs(\))37 b(:)o(=)j Fo(x)9 b Fs(;)84 -b(E)l(n)l(Q)l(u)l(e)l(u)l(e)40 b(\()5 b Fo(v)12 b Fs(,)49 -b Fo(Q)9 b Fs(\))g(;)p 361 1499 V 3247 1499 V 491 1476 -a Fp(w)o(h)o(i)o(l)o(e)38 b Fo(Q)21 b Fr(6)p Fs(=)g Fr(;)35 -b Fp(d)-5 b(o)p 361 1577 V 3247 1577 V 571 1555 a Fo(v)42 -b Fs(:)o(=)35 b(D)l(e)l(Q)l(u)l(e)l(u)l(e)42 b(\()5 b -Fo(Q)k Fs(\))g(;)p 361 1656 V 3247 1656 V 573 1633 a -Fp(f)s(o)s(r)43 b Fo(u)21 b Fr(2)h Fs(Adj)17 b(\(v\))33 -b Fp(a)-6 b(n)g(d)35 b Fo(g)s Fs(\()p Fo(u)p Fs(\))28 -b(=)i Fr(\0001)k Fp(d)-5 b(o)p 361 1734 V 3247 1734 V -650 1712 a Fo(Y)55 b Fs(:)o(=)40 b Fr(;)9 b Fs(;)p 361 -1813 V 3247 1813 V 653 1790 a Fp(f)s(o)s(r)42 b Fo(w)23 -b Fr(2)f Fs(Adj)17 b(\(u\))33 b Fp(a)-6 b(n)g(d)35 b -Fo(g)s Fs(\()p Fo(w)r Fs(\))j Fr(6)p Fs(=)i Fr(\0001)34 -b Fp(d)-5 b(o)35 b Fo(Y)56 b Fs(:)o(=)39 b Fo(Y)57 b -Fr([)39 b(f)p Fo(w)r Fr(g)9 b Fs(;)p 361 1887 V 3247 -1887 V 649 1865 a Fp(r)o(e)o(p)o(e)o(a)o(t)p 361 1962 -V 3247 1962 V 730 1940 a Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q(n)q(m)q(e)q(n)q -(t)39 b(:)o(=)44 b Fp(f)5 b(a)g(l)g(s)g(e)12 b Fs(;)88 -b Fo(x)39 b Fs(:)o(=)g Fo(x)29 b Fs(+)35 b(1)6 b(;)p -361 2037 V 3247 2037 V 732 2014 a Fp(f)s(o)s(r)42 b Fo(w)24 -b Fr(2)39 b Fo(Y)51 b Fp(a)-6 b(n)g(d)36 b Fs(R)q(e)q(a)q(s)q(s)q(i)q -(g)q(n)q(m)q(e)q(n)q(t)30 b(=)k Fp(f)5 b(a)g(l)g(s)g(e)36 -b(d)-5 b(o)p 361 2115 V 3247 2115 V 817 2093 a(i)9 b(f)49 -b Fs(\()p Fo(x)29 b Fs(+)g Fo(g)s Fs(\()p Fo(w)r Fs(\)\))20 -b Fr(\025)h Fo(m)36 b Fp(t)m(h)m(e)m(n)h Fs(restart)26 -b(mapping)g(step)9 b(;)p 361 2194 V 3247 2194 V 817 2171 -a Fp(i)g(f)49 b Fo(x)29 b Fs(+)g Fo(g)s Fs(\()p Fo(w)r -Fs(\))38 b Fr(2)22 b Fo(A)1415 2179 y Fc(E)1503 2171 -y Fp(t)m(h)m(e)m(n)37 b Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q(n)q(m)q(e)q(n)q -(t)j(:)o(=)f Fp(true)8 b Fs(;)p 361 2268 V 3247 2268 -V 653 2246 a Fp(u)s(n)s(t)s(i)s(l)41 b Fs(R)q(e)q(a)q(s)q(s)q(i)q(g)q -(n)q(m)q(e)q(n)q(t)30 b(=)k Fp(f)5 b(a)g(l)g(s)g(e)11 -b Fs(;)p 361 2347 V 3247 2347 V 650 2324 a Fo(g)s Fs(\()p -Fo(u)p Fs(\))38 b(:)o(=)h Fo(x)9 b Fs(;)49 b Fr(f)8 b -Fa(s)f(e)g(t)51 b(t)5 b(h)g(e)45 b Fo(g)h Fa(v)5 b(a)g(l)g(u)g(e)48 -b(t)5 b(o)50 b(v)5 b(e)g(x)g(t)g(e)g(x)46 b Fo(u)q Fr(g)p -361 2425 V 3247 2425 V 653 2403 a Fp(f)s(o)s(r)c Fo(w)23 -b Fr(2)40 b Fo(Y)52 b Fp(d)-5 b(o)35 b Fo(A)1255 2411 -y Fc(E)1345 2403 y Fs(:)o(=)k Fo(A)1522 2411 y Fc(E)1591 -2403 y Fr([)17 b(f)p Fo(x)29 b Fs(+)h Fo(g)s Fs(\()p -Fo(w)r Fs(\))p Fr(g)9 b Fs(;)p 361 2504 V 3247 2504 V -646 2481 a(E)l(n)l(Q)l(u)l(e)l(u)l(e)40 b(\()5 b Fo(u)k -Fs(,)49 b Fo(Q)9 b Fs(\))g(;)p 361 2555 5 52 v 362 2555 -52 5 v 413 2555 2788 5 v 3201 2555 52 5 v 3249 2555 5 -52 v 904 2728 a Fg(Fig.)14 b(6.)27 b Fv(The)h(critical)f(v)n(ertices)f -(assignmen)n(t)h(algorithm)p 361 2974 V 361 2927 52 5 -v 413 2927 2788 5 v 3201 2927 52 5 v 3249 2974 5 52 v -361 3053 5 75 v 3247 3053 V 410 3030 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m -(r)m(e)41 b Fs(N)s(o)s(n)s(C)s(r)s(i)s(t)s(i)s(c)s(a)s(l)s(V)s(e)s(r)s -(t)s(i)s(c)s(e)s(s)s(A)s(s)s(s)s(i)s(g)s(n)s(m)s(e)s(n)s(t)53 -b(\()5 b Fo(G)k Fs(,)49 b Fo(G)2233 3038 y Ft(ncrit)2373 -3030 y Fs(,)g Fo(A)2501 3038 y Fc(E)2561 3030 y Fs(,)g -Fo(g)8 b Fs(\))p 361 3128 V 3247 3128 V 494 3105 a Fp(f)s(o)s(r)52 -b Fs(i)c(:)o(=)40 b(0)h Fp(to)f Fo(m)17 b Fr(\000)g Fs(1)35 -b Fp(d)-5 b(o)p 361 3206 V 3247 3206 V 580 3184 a(i)9 -b(f)48 b Fs(i)22 b Fr(62)g Fo(A)863 3192 y Fc(E)950 3184 -y Fp(t)m(h)m(e)m(n)38 b Fs(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q -(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)j(:)o(=)g(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n) -q(e)q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)h Fr([)d(f)p -Fs(i)p Fr(g)9 b Fs(;)p 361 3281 V 3247 3281 V 494 3258 -a Fp(f)s(o)s(r)43 b Fo(v)24 b Fr(2)47 b Fo(V)854 3266 -y Ft(scrit)1010 3258 y Fp(d)-5 b(o)p 361 3359 V 3247 -3359 V 575 3337 a Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 -b(\()5 b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1403 -3345 y Ft(ncrit)1543 3337 y Fs(,)g Fo(g)s Fs(\()p Fo(v)s -Fs(\))9 b(,)48 b Fo(g)12 b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e) -q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)11 b(\))e(;)p -361 3438 V 3247 3438 V 494 3415 a Fp(f)s(o)s(r)43 b Fo(v)24 -b Fr(2)e Fo(V)829 3423 y Ft(ncrit)993 3415 y Fp(a)-6 -b(n)g(d)74 b Fo(g)s Fs(\()p Fo(v)s Fs(\))29 b(=)g Fr(\0001)34 -b Fp(d)-5 b(o)p 361 3516 V 3247 3516 V 575 3494 a Fs(t)5 -b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 b(\()5 b Fo(G)k -Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1403 3502 y Ft(ncrit)1543 -3494 y Fs(,)g(0)9 b(,)49 b Fo(g)12 b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q -(g)q(n)q(e)q(d)q(A)q(d)q(d)q(r)q(e)q(s)q(s)q(e)q(s)12 -b(\))d(;)p 361 3591 V 3247 3591 V 361 3669 V 3247 3669 -V 410 3647 a Fp(p)m(r)m(o)m(c)m(e)m(d)m(u)m(r)m(e)43 -b Fs(t)5 b(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)45 b(\()5 -b Fo(G)k Fs(,)49 b Fo(v)12 b Fs(,)49 b Fo(G)1640 3655 -y Ft(ncrit)1780 3647 y Fs(,)g Fo(x)9 b Fs(,)49 b Fo(g)12 -b Fs(,)49 b(u)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(E)q(d)q(g)q(e)q(s)s -(\))p 361 3748 V 3247 3748 V 492 3725 a Fo(g)s Fs(\()p -Fo(v)s Fs(\))38 b(:)o(=)h Fo(x)9 b Fs(;)p 361 3826 V -3247 3826 V 494 3804 a Fp(f)s(o)s(r)43 b Fo(u)21 b Fr(2)h -Fs(Adj)17 b(\(v\))33 b Fp(a)-6 b(n)g(d)35 b Fo(g)s Fs(\()p -Fo(u)p Fs(\))28 b(=)i Fr(\0001)k Fp(d)-5 b(o)p 361 3905 -V 3247 3905 V 610 3882 a Fo(x)39 b Fs(:)o(=)g(NextUnusedA)o(d)o(d)o -(res)o(s)o(\()6 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q(d)q(d)q -(r)q(e)q(s)q(s)q(e)q(s)h(\))34 b Fr(\000)c Fo(g)s Fs(\()p -Fo(v)s Fs(\))9 b(;)p 361 3983 V 3247 3983 V 615 3961 -a(t)c(r)g(a)g(v)g(e)g(r)g(s)g(e)g(D)g(f)g(s)46 b(\()t -Fo(G)9 b Fs(,)50 b Fo(u)9 b Fs(,)49 b Fo(G)1447 3969 -y Ft(ncrit)1587 3961 y Fs(,)g Fo(x)9 b Fs(,)48 b Fo(g)12 -b Fs(,)50 b(U)q(n)q(A)q(s)q(s)q(i)q(g)q(n)q(e)q(d)q(A)q(d)q(d)q(r)q(e)q -(s)q(s)q(e)q(s)11 b(\))e(;)p 361 4034 5 52 v 362 4034 -52 5 v 413 4034 2788 5 v 3201 4034 52 5 v 3249 4034 5 -52 v 689 4207 a Fg(Fig.)15 b(7.)27 b Fv(The)g(algorithm)g(to)g(assign)g -(v)-5 b(alues)27 b(to)g(non-critical)g(v)n(ertices)365 -4847 y Fs(This)g(article)f(w)n(as)h(pro)r(cessed)g(using)f(the)f(L)1621 -4830 y Ft(A)1654 4847 y Fs(T)1696 4863 y(E)1740 4847 -y(X)g(macro)h(pac)n(k)l(age)g(with)g(LLNCS)f(st)n(yle)p -eop end -%%Trailer - -userdict /end-hook known{end-hook}if -%%EOF diff --git a/papers/bmz_wea2005.ps.gz b/papers/bmz_wea2005.ps.gz new file mode 100755 index 0000000000000000000000000000000000000000..7a5447e9f221114d55bc12b7efd311f4b42e50e8 GIT binary patch literal 184899 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